diff --git a/AUTHORS.txt b/AUTHORS.txt index 0ad8438eb..15e3e13d4 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -3,8 +3,9 @@ Project initiator: Gábor Horváth -Developement contributors, in last name alphabetical order: +Development contributors, in last name alphabetical order: + Roel Baars Martin Burri Javier Celaya Jacques Desmis @@ -43,6 +44,7 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati Rodrigo Nuno Bragança da Cunha Pat David Reine Edvardsson + Andrea Ferrero André Gauthier Sébastien Guyader M. Dávid Gyurkó @@ -61,4 +63,5 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati Johan Thor Vitalis Tiknius TooWaBoo + Franz Trischberger Colin Walker diff --git a/CMakeLists.txt b/CMakeLists.txt index fa153855b..c1141caa4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,11 @@ -if(WIN32) - cmake_minimum_required(VERSION 2.8.4) -elseif(APPLE) +if(APPLE) cmake_minimum_required(VERSION 3.3) - CMAKE_POLICY(SET CMP0025 NEW) + cmake_policy(SET CMP0025 NEW) else() - cmake_minimum_required(VERSION 2.6) + cmake_minimum_required(VERSION 2.8.8) endif() -# Must stay before the PROJECT() command: +# Must stay before the project() command: if(${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4") set(CMAKE_CXX_COMPILER_ARG1 "-std=c++11" CACHE STRING "C++ version for eclipse" FORCE) # Users building with Eclipse should set CMAKE_ECLIPSE_VERSION through the @@ -15,18 +13,18 @@ if(${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4") #set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE) endif() -PROJECT(RawTherapee) +project(RawTherapee) # The default target is Debug: if(CMAKE_BUILD_TYPE STREQUAL "") - set (CMAKE_BUILD_TYPE Debug CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel" FORCE) + set(CMAKE_BUILD_TYPE Debug CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel" FORCE) endif() string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE) # Set required C and C++ standards and check GCC version: -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") message(FATAL_ERROR "Building RawTherapee requires using GCC version 4.9 or higher!") @@ -34,14 +32,14 @@ endif() # We might want to build using the old C++ ABI, even when using a new GCC version: if(USE_OLD_CXX_ABI) - add_definitions (-D_GLIBCXX_USE_CXX11_ABI=0) + add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) endif() if(UPPER_CMAKE_BUILD_TYPE STREQUAL "DEBUG") - add_definitions (-D_DEBUG) + add_definitions(-D_DEBUG) else() - add_definitions (-DNDEBUG) - add_definitions (-D_DNDEBUG) + add_definitions(-DNDEBUG) + add_definitions(-D_DNDEBUG) endif() message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") @@ -92,6 +90,20 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}") # 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: @@ -129,7 +141,7 @@ if(WIN32 OR APPLE) if(BUILD_BUNDLE) message(STATUS "You have set BUILD_BUNDLE=ON but this is not necessary - the option is forced to ON for Windows and macOS.") endif() - set (BUILD_BUNDLE ON FORCE) + set(BUILD_BUNDLE ON FORCE) endif() if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR) @@ -240,11 +252,17 @@ if(DEFINED LENSFUNDBDIR AND NOT IS_ABSOLUTE "${LENSFUNDBDIR}") set(LENSFUNDBDIR "${DATADIR}/${LENSFUNDBDIR}") endif() +if(APPLE) + if("${CODESIGNID}") + set(CODESIGNID "${CODESIGNID}" CACHE STRING "Codesigning Identity") + endif() +endif() + # Enforce absolute paths for non-bundle builds: if(NOT BUILD_BUNDLE) foreach(path BINDIR DATADIR LIBDIR DOCDIR CREDITSDIR LICENCEDIR) if(NOT (IS_ABSOLUTE "${${path}}")) - message (FATAL_ERROR "The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF") + message(FATAL_ERROR "The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF") endif() endforeach() endif() @@ -304,9 +322,9 @@ pkg_check_modules(LCMS REQUIRED lcms2>=2.6) pkg_check_modules(EXPAT REQUIRED expat>=2.1) pkg_check_modules(FFTW3F REQUIRED fftw3f) pkg_check_modules(IPTCDATA REQUIRED libiptcdata) +pkg_check_modules(TIFF REQUIRED libtiff-4>=4.0.4) find_package(JPEG REQUIRED) find_package(PNG REQUIRED) -find_package(TIFF REQUIRED) find_package(ZLIB REQUIRED) if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) @@ -323,27 +341,43 @@ if(WITH_MYFILE_MMAP) endif() if(WITH_LTO) - 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") + # 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") endif() if(WITH_SAN) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${WITH_SAN}") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${WITH_SAN}") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${WITH_SAN}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${WITH_SAN}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}") endif() if(WITH_PROF) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") endif() +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-unused-result") if(OPTION_OMP) find_package(OpenMP) if(OPENMP_FOUND) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas -Wall -Wno-unused-result -Wno-deprecated-declarations") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas") endif() endif() @@ -482,7 +516,7 @@ if(WIN32) endif() if(UNIX) - install(FILES rawtherapee.appdata.xml DESTINATION "${APPDATADIR}") + install(FILES com.rawtherapee.RawTherapee.appdata.xml DESTINATION "${APPDATADIR}") endif() # check whether the used version of lensfun has lfDatabase::LoadDirectory diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 257eb9708..f94454b63 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,5 +16,13 @@ The most useful feedback is based on the latest development code, and in the cas - 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 +- Use C++11. +- To break header dependencies use forward declarations as much as possible. See [#5197](https://github.com/Beep6581/RawTherapee/pull/5197#issuecomment-468938190) for some tips. +- The naming isn't homogeneous throughout the code but here is a rough guideline: + - *Identifiers* (variables, functions, methods, keys, enums, etc.) should be clear and unambiguous. Make them as long as necessary to ensure that your code is understandable to others. + - *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`. + - 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 --git a/LICENSE.txt b/LICENSE.txt index 44a4cfcc8..7fb1c6515 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ RawTherapee - A powerful, cross-platform raw image processing program. Copyright (C) 2004-2012 Gabor Horvath - Copyright (C) 2010-2017 RawTherapee development team. + Copyright (C) 2010-2018 RawTherapee development team. RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/README.md b/README.md index 62a91a2bb..6d2c04875 100644 --- a/README.md +++ b/README.md @@ -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 @@ http://rawtherapee.com/downloads 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 --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index ee44c6de1..248d27f36 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,10 +1,9 @@ -RAWTHERAPEE 5.3-dev RELEASE NOTES ------------------------------ +RAWTHERAPEE 5.5-dev RELEASE NOTES + This is a development version of RawTherapee. We update the code almost daily. Every few months, once enough changes have accumulated and the code is stabilized, we make a new official release. Every code change between these releases is known as a "development" version, and this is one of them. -RawTherapee provides you with a selection of powerful tools with which you can practise 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. +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. While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that: - Development versions only had limited testing, so there may be bugs unknown to us. @@ -13,71 +12,78 @@ While we only commit tested and relatively stable code and so the development ve - The way new tools work in the development versions is likely to change as we tweak and tune them, so your processing profiles may produce different results when used in a future stable version. - Bugs present in the stable versions get fixed in the development versions, and make it into the next stable version when we make a new official release. That means that in some ways the development versions can be "more stable" than the latest stable release. At the same time, new features may introduce new bugs. This is a trade-off you should be aware of. -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.3: -- To be filled in when 5.4 is released. +New features since 5.5: +TODO. + + + +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: -- To be filled in when 5.4 is released. -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 + REVISION HISTORY ----------------- + The complete changelog is available at: https://github.com/Beep6581/RawTherapee/commits/ diff --git a/UpdateInfo.cmake b/UpdateInfo.cmake index 8ffaf0636..d1f532506 100644 --- a/UpdateInfo.cmake +++ b/UpdateInfo.cmake @@ -2,25 +2,25 @@ # If we find ReleaseInfo.cmake we use the info from there and don't need Git to be installed find_file(REL_INFO_FILE ReleaseInfo.cmake PATHS "${PROJECT_SOURCE_DIR}" NO_DEFAULT_PATH) -if (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) +if(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) # we look for the git command in this paths by order of preference - if (WIN32) + if(WIN32) find_program(GIT_CMD git.exe HINTS ENV Path PATH_SUFFIXES ../) - elseif (APPLE) + elseif(APPLE) find_program(GIT_CMD git PATHS "/opt/local/bin" "/usr/local/bin" "/usr/bin") find_program(GIT_CMD git) - set (SHELL "/bin/bash") - else (WIN32) # Linux + set(SHELL "/bin/bash") + else(WIN32) # Linux find_program(GIT_CMD git) - set (SHELL "/bin/bash") - endif (WIN32) + set(SHELL "/bin/bash") + endif(WIN32) # Fail if Git is not installed - if (GIT_CMD STREQUAL GIT_CMD-NOTFOUND) + if(GIT_CMD STREQUAL GIT_CMD-NOTFOUND) message(FATAL_ERROR "git command not found!") - else () + else() message(STATUS "git command found: ${GIT_CMD}") - endif () + endif() # Get version description. # Depending on whether you checked out a branch (dev) or a tag (release), @@ -50,19 +50,19 @@ if (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD --not --tags OUTPUT_VARIABLE GIT_COMMITS_SINCE_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") # If user checked-out something which is not a branch, use the description as branch name. - if (GIT_BRANCH STREQUAL "") - set (GIT_BRANCH "${GIT_DESCRIBE}") + if(GIT_BRANCH STREQUAL "") + set(GIT_BRANCH "${GIT_DESCRIBE}") endif() # Create numeric version. # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). - if (GIT_COMMITS_SINCE_TAG STREQUAL "") - set (GIT_NUMERIC_VERSION_BS "0.0.0") - else () + if(GIT_COMMITS_SINCE_TAG STREQUAL "") + set(GIT_NUMERIC_VERSION_BS "0.0.0") + else() string(REGEX REPLACE "-.*" "" GIT_NUMERIC_VERSION_BS ${GIT_DESCRIBE}) set(GIT_NUMERIC_VERSION_BS "${GIT_NUMERIC_VERSION_BS}.${GIT_COMMITS_SINCE_TAG}") - endif () + endif() message(STATUS "Git checkout information:") message(STATUS " Commit description: ${GIT_DESCRIBE}") @@ -73,38 +73,38 @@ if (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) message(STATUS " Commits since branch: ${GIT_COMMITS_SINCE_BRANCH}") message(STATUS " Version (unreliable): ${GIT_NUMERIC_VERSION_BS}") - if (NOT DEFINED CACHE_NAME_SUFFIX) + if(NOT DEFINED CACHE_NAME_SUFFIX) set(CACHE_NAME_SUFFIX "${GIT_DESCRIBE}") message(STATUS "CACHE_NAME_SUFFIX was not defined, it is now \"${CACHE_NAME_SUFFIX}\"") - else () + else() message(STATUS "CACHE_NAME_SUFFIX is \"${CACHE_NAME_SUFFIX}\"") - endif () + endif() -else (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) +else(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) include("${PROJECT_SOURCE_DIR}/ReleaseInfo.cmake") -endif (REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) +endif(REL_INFO_FILE STREQUAL REL_INFO_FILE-NOTFOUND) -if (WIN32) - if (BIT_DEPTH EQUAL 4) +if(WIN32) + if(BIT_DEPTH EQUAL 4) set(BUILD_BIT_DEPTH 32) # 32 bits builds has to be installable on 64 bits system, to support WinXP/64. set(ARCHITECTURE_ALLOWED "x86 x64 ia64") # installing in 32 bits mode even on 64 bits OS and architecture set(INSTALL_MODE "") - elseif (BIT_DEPTH EQUAL 8) + elseif(BIT_DEPTH EQUAL 8) set(BUILD_BIT_DEPTH 64) # Restricting the 64 bits builds to 64 bits systems only set(ARCHITECTURE_ALLOWED "x64 ia64") # installing in 64 bits mode for all 64 bits processors, even for itanium architecture set(INSTALL_MODE "x64 ia64") - endif (BIT_DEPTH EQUAL 4) + endif(BIT_DEPTH EQUAL 4) # set part of the output archive name set(SYSTEM_NAME "WinVista") - configure_file ("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") -endif (WIN32) + configure_file("${PROJECT_SOURCE_DIR}/tools/win/InnoSetup/WindowsInnoSetup.iss.in" "${CMAKE_BINARY_DIR}/rtdata/WindowsInnoSetup.iss") +endif(WIN32) # build version.h from template -configure_file ("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") +configure_file("${PROJECT_SOURCE_DIR}/rtgui/version.h.in" "${CMAKE_BINARY_DIR}/rtgui/version.h") # build AboutThisBuild.txt from template -configure_file ("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") +configure_file("${PROJECT_SOURCE_DIR}/AboutThisBuild.txt.in" "${CMAKE_BINARY_DIR}/AboutThisBuild.txt") diff --git a/cmake/modules/FindUnalignedMalloc.cmake b/cmake/modules/FindUnalignedMalloc.cmake new file mode 100644 index 000000000..4ddfb2afc --- /dev/null +++ b/cmake/modules/FindUnalignedMalloc.cmake @@ -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 --git a/cmake/modules/FindX87Math.cmake b/cmake/modules/FindX87Math.cmake new file mode 100644 index 000000000..b25ba3292 --- /dev/null +++ b/cmake/modules/FindX87Math.cmake @@ -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 --git a/com.rawtherapee.RawTherapee.appdata.xml b/com.rawtherapee.RawTherapee.appdata.xml new file mode 100644 index 000000000..0dace6772 --- /dev/null +++ b/com.rawtherapee.RawTherapee.appdata.xml @@ -0,0 +1,59 @@ + + + com.rawtherapee.RawTherapee + RawTherapee + 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, 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. +

+

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

+
+ + 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 + rawtherapee.desktop + + + + + rawtherapee + rawtherapee-cli + + + + 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 --git a/rawtherapee.appdata.xml b/rawtherapee.appdata.xml deleted file mode 100644 index c1a1bf6a7..000000000 --- a/rawtherapee.appdata.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - rawtherapee.desktop - CC-BY-SA-4.0 - GPL-3.0+ - RawTherapee - A powerful cross-platform raw image processing program - -

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

-

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

-
- - - 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 - photography - develop - pp3 - graphics - - http://rawtherapee.com/ - contactus@rawtherapee.com -
diff --git a/rtdata/CMakeLists.txt b/rtdata/CMakeLists.txt index e320969c3..f8efa1523 100644 --- a/rtdata/CMakeLists.txt +++ b/rtdata/CMakeLists.txt @@ -1,4 +1,3 @@ - file(GLOB LANGUAGEFILES "languages/*") file(GLOB SOUNDFILES "sounds/*") file(GLOB INPUTICCFILES "iccprofiles/input/*") @@ -7,11 +6,17 @@ file(GLOB DCPFILES "dcpprofiles/*") file(GLOB FONTS "fonts/*") set(PROFILESDIR "profiles") -set(IMAGESDIR "images") - -# THEMEDIR includes subfolders for image resources for some themes; doing the normal glob won't work. set(THEMEDIR "themes") +# Images, mostly icons, which are generated using the generatePngIcons script: +set(IMAGES_THEMED + "images/themed/png/dark" + "images/themed/png/light" + ) + +# Other images which are generated manually: +file(GLOB IMAGES_NONTHEMED "images/non-themed/png/*") + if(WIN32) set(OPTIONSFILE "options/options.win") elseif(APPLE) @@ -25,17 +30,15 @@ if(WIN32) endif() if(UNIX) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/icons/rawtherapee.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/rawtherapee.desktop") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rawtherapee.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/rawtherapee.desktop") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/rawtherapee.desktop" DESTINATION ${DESKTOPDIR}) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi16-app-rawtherapee.png" DESTINATION "${ICONSDIR}/hicolor/16x16/apps" RENAME rawtherapee.png) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi24-app-rawtherapee.png" DESTINATION "${ICONSDIR}/hicolor/24x24/apps" RENAME rawtherapee.png) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi32-app-rawtherapee.png" DESTINATION "${ICONSDIR}/hicolor/32x32/apps" RENAME rawtherapee.png) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi48-app-rawtherapee.png" DESTINATION "${ICONSDIR}/hicolor/48x48/apps" RENAME rawtherapee.png) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi128-app-rawtherapee.png" DESTINATION "${ICONSDIR}/hicolor/128x128/apps" RENAME rawtherapee.png) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/icons/hi256-app-rawtherapee.png" DESTINATION "${ICONSDIR}/hicolor/256x256/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/non-themed/png/rawtherapee-logo-16.png" DESTINATION "${ICONSDIR}/hicolor/16x16/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/non-themed/png/rawtherapee-logo-24.png" DESTINATION "${ICONSDIR}/hicolor/24x24/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/non-themed/png/rawtherapee-logo-48.png" DESTINATION "${ICONSDIR}/hicolor/48x48/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/non-themed/png/rawtherapee-logo-128.png" DESTINATION "${ICONSDIR}/hicolor/128x128/apps" RENAME rawtherapee.png) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/non-themed/png/rawtherapee-logo-256.png" DESTINATION "${ICONSDIR}/hicolor/256x256/apps" RENAME rawtherapee.png) endif() -install(FILES ${IMAGEFILES} DESTINATION "${DATADIR}/images") install(FILES ${LANGUAGEFILES} DESTINATION "${DATADIR}/languages") install(FILES ${SOUNDFILES} DESTINATION "${DATADIR}/sounds") install(FILES ${INPUTICCFILES} DESTINATION "${DATADIR}/iccprofiles/input") @@ -48,8 +51,14 @@ endif() install(DIRECTORY ${PROFILESDIR} DESTINATION "${DATADIR}" FILES_MATCHING PATTERN "*.pp3") install(DIRECTORY ${THEMEDIR} DESTINATION "${DATADIR}") -install(DIRECTORY ${IMAGESDIR} DESTINATION "${DATADIR}" FILES_MATCHING PATTERN "index.theme") -install(DIRECTORY ${IMAGESDIR} DESTINATION "${DATADIR}" FILES_MATCHING PATTERN "*.png") + +foreach(theme ${IMAGES_THEMED}) + install(DIRECTORY ${theme} DESTINATION "${DATADIR}/images") +endforeach() + +#install(DIRECTORY ${IMAGES_NONTHEMED} DESTINATION "${DATADIR}/images" FILES_MATCHING PATTERN "*.png") +#install(DIRECTORY ${IMAGES_NONTHEMED} DESTINATION "${DATADIR}/images/") +install(FILES ${IMAGES_NONTHEMED} DESTINATION "${DATADIR}/images") if(APPLE) # CMake escapes first item quote character. Do not remove 'DUMMY_VARIABLE=' diff --git a/rtdata/dcpprofiles/Canon EOS 1300D.dcp b/rtdata/dcpprofiles/Canon EOS 1300D.dcp index e6fa7ac41..52e961776 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 1300D.dcp and b/rtdata/dcpprofiles/Canon EOS 1300D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 20D.dcp b/rtdata/dcpprofiles/Canon EOS 20D.dcp index 1ce4c5d0b..578517437 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 20D.dcp and b/rtdata/dcpprofiles/Canon EOS 20D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 400D.dcp b/rtdata/dcpprofiles/Canon EOS 400D.dcp index f598507a6..af382bf6f 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 400D.dcp and b/rtdata/dcpprofiles/Canon EOS 400D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 40D.dcp b/rtdata/dcpprofiles/Canon EOS 40D.dcp index a6117dfa5..288ce384b 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 40D.dcp and b/rtdata/dcpprofiles/Canon EOS 40D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 50D.dcp b/rtdata/dcpprofiles/Canon EOS 50D.dcp index a99da9e61..5e80fe47b 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 50D.dcp and b/rtdata/dcpprofiles/Canon EOS 50D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 600D.dcp b/rtdata/dcpprofiles/Canon EOS 600D.dcp new file mode 100644 index 000000000..711064951 Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS 600D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 60D.dcp b/rtdata/dcpprofiles/Canon EOS 60D.dcp index 24e7e04b6..ad14659ff 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 60D.dcp and b/rtdata/dcpprofiles/Canon EOS 60D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 650D.dcp b/rtdata/dcpprofiles/Canon EOS 650D.dcp new file mode 100644 index 000000000..c8b1f6314 Binary files /dev/null and b/rtdata/dcpprofiles/Canon EOS 650D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 6D Mark II.dcp b/rtdata/dcpprofiles/Canon EOS 6D Mark II.dcp index 69a131bd3..18ddfeb95 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 6D Mark II.dcp and b/rtdata/dcpprofiles/Canon EOS 6D Mark II.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 6D.dcp b/rtdata/dcpprofiles/Canon EOS 6D.dcp index 3dc00a95f..de1f74f22 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 6D.dcp and b/rtdata/dcpprofiles/Canon EOS 6D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 7D Mark II.dcp b/rtdata/dcpprofiles/Canon EOS 7D Mark II.dcp index 1c153e82a..84b5838da 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 7D Mark II.dcp and b/rtdata/dcpprofiles/Canon EOS 7D Mark II.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS 7D.dcp b/rtdata/dcpprofiles/Canon EOS 7D.dcp index dd31e64f5..1f20c02d5 100644 Binary files a/rtdata/dcpprofiles/Canon EOS 7D.dcp and b/rtdata/dcpprofiles/Canon EOS 7D.dcp differ diff --git a/rtdata/dcpprofiles/Canon EOS Digital Rebel XSi.dcp b/rtdata/dcpprofiles/Canon EOS Digital Rebel XSi.dcp deleted file mode 100644 index 1db7ee1cd..000000000 Binary files a/rtdata/dcpprofiles/Canon EOS Digital Rebel XSi.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Canon EOS Digital Rebel XTi.dcp b/rtdata/dcpprofiles/Canon EOS Digital Rebel XTi.dcp deleted file mode 100644 index f598507a6..000000000 Binary files a/rtdata/dcpprofiles/Canon EOS Digital Rebel XTi.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Canon EOS Kiss X7.dcp b/rtdata/dcpprofiles/Canon EOS Kiss X7.dcp deleted file mode 100644 index d87aa024d..000000000 Binary files a/rtdata/dcpprofiles/Canon EOS Kiss X7.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Canon EOS Rebel SL1.dcp b/rtdata/dcpprofiles/Canon EOS Rebel SL1.dcp deleted file mode 100644 index 2d342ba69..000000000 Binary files a/rtdata/dcpprofiles/Canon EOS Rebel SL1.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Canon EOS Rebel T2i.dcp b/rtdata/dcpprofiles/Canon EOS Rebel T2i.dcp deleted file mode 100644 index 4f286ec90..000000000 Binary files a/rtdata/dcpprofiles/Canon EOS Rebel T2i.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Canon PowerShot G7 X.dcp b/rtdata/dcpprofiles/Canon PowerShot G7 X.dcp index bcfdfcdf4..7c49f34fe 100644 Binary files a/rtdata/dcpprofiles/Canon PowerShot G7 X.dcp and b/rtdata/dcpprofiles/Canon PowerShot G7 X.dcp differ diff --git a/rtdata/dcpprofiles/Canon PowerShot S110.dcp b/rtdata/dcpprofiles/Canon PowerShot S110.dcp index 9a372a36f..edd27115a 100644 Binary files a/rtdata/dcpprofiles/Canon PowerShot S110.dcp and b/rtdata/dcpprofiles/Canon PowerShot S110.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM FinePix F600EXR.dcp b/rtdata/dcpprofiles/FUJIFILM FinePix F600EXR.dcp new file mode 100644 index 000000000..fab567029 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM FinePix F600EXR.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM GFX 50R.dcp b/rtdata/dcpprofiles/FUJIFILM GFX 50R.dcp new file mode 100644 index 000000000..a17d5e02d Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM GFX 50R.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-Pro2.dcp b/rtdata/dcpprofiles/FUJIFILM X-Pro2.dcp index 1172b17bb..57dd04e62 100644 Binary files a/rtdata/dcpprofiles/FUJIFILM X-Pro2.dcp and b/rtdata/dcpprofiles/FUJIFILM X-Pro2.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-S1.dcp b/rtdata/dcpprofiles/FUJIFILM X-S1.dcp new file mode 100644 index 000000000..2df794b21 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-S1.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-T1.dcp b/rtdata/dcpprofiles/FUJIFILM X-T1.dcp index fb9ecff4d..fbe9da058 100644 Binary files a/rtdata/dcpprofiles/FUJIFILM X-T1.dcp and b/rtdata/dcpprofiles/FUJIFILM X-T1.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-T10.dcp b/rtdata/dcpprofiles/FUJIFILM X-T10.dcp new file mode 100644 index 000000000..9b360b244 Binary files /dev/null and b/rtdata/dcpprofiles/FUJIFILM X-T10.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X-T20.dcp b/rtdata/dcpprofiles/FUJIFILM X-T20.dcp index 1c631fd2a..3442f4f04 100644 Binary files a/rtdata/dcpprofiles/FUJIFILM X-T20.dcp and b/rtdata/dcpprofiles/FUJIFILM X-T20.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X100S.dcp b/rtdata/dcpprofiles/FUJIFILM X100S.dcp index 962d58469..bdeeaf7a7 100644 Binary files a/rtdata/dcpprofiles/FUJIFILM X100S.dcp and b/rtdata/dcpprofiles/FUJIFILM X100S.dcp differ diff --git a/rtdata/dcpprofiles/FUJIFILM X100T.dcp b/rtdata/dcpprofiles/FUJIFILM X100T.dcp index b2823ccce..129ad0d55 100644 Binary files a/rtdata/dcpprofiles/FUJIFILM X100T.dcp and b/rtdata/dcpprofiles/FUJIFILM X100T.dcp differ diff --git a/rtdata/dcpprofiles/Fujifilm X-T10.dcp b/rtdata/dcpprofiles/Fujifilm X-T10.dcp deleted file mode 100644 index 9794624a5..000000000 Binary files a/rtdata/dcpprofiles/Fujifilm X-T10.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/LG Mobile LG-H815.dcp b/rtdata/dcpprofiles/LG Mobile LG-H815.dcp index d8a4539db..bb616ba2d 100644 Binary files a/rtdata/dcpprofiles/LG Mobile LG-H815.dcp and b/rtdata/dcpprofiles/LG Mobile LG-H815.dcp differ diff --git a/rtdata/dcpprofiles/MINOLTA DYNAX 7D.dcp b/rtdata/dcpprofiles/MINOLTA DYNAX 7D.dcp new file mode 100644 index 000000000..67a023f57 Binary files /dev/null and b/rtdata/dcpprofiles/MINOLTA DYNAX 7D.dcp differ diff --git a/rtdata/dcpprofiles/NIKON COOLPIX P7800.dcp b/rtdata/dcpprofiles/NIKON COOLPIX P7800.dcp new file mode 100644 index 000000000..5361e35d4 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON COOLPIX P7800.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D300.dcp b/rtdata/dcpprofiles/NIKON D300.dcp index 008383c59..f0d707849 100644 Binary files a/rtdata/dcpprofiles/NIKON D300.dcp and b/rtdata/dcpprofiles/NIKON D300.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D50.dcp b/rtdata/dcpprofiles/NIKON D50.dcp new file mode 100644 index 000000000..ee479b3ed Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D50.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D5000.dcp b/rtdata/dcpprofiles/NIKON D5000.dcp new file mode 100644 index 000000000..13ce18123 Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D5000.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D5600.dcp b/rtdata/dcpprofiles/NIKON D5600.dcp index 00367d43d..57d635224 100644 Binary files a/rtdata/dcpprofiles/NIKON D5600.dcp and b/rtdata/dcpprofiles/NIKON D5600.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D600.dcp b/rtdata/dcpprofiles/NIKON D600.dcp index 039989c2c..74f8a9541 100644 Binary files a/rtdata/dcpprofiles/NIKON D600.dcp and b/rtdata/dcpprofiles/NIKON D600.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D700.dcp b/rtdata/dcpprofiles/NIKON D700.dcp index 1ae994439..5802812f8 100644 Binary files a/rtdata/dcpprofiles/NIKON D700.dcp and b/rtdata/dcpprofiles/NIKON D700.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D70s.dcp b/rtdata/dcpprofiles/NIKON D70s.dcp new file mode 100644 index 000000000..15c6171cb Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D70s.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D7200.dcp b/rtdata/dcpprofiles/NIKON D7200.dcp index 742bd3ead..9cc976fd0 100644 Binary files a/rtdata/dcpprofiles/NIKON D7200.dcp and b/rtdata/dcpprofiles/NIKON D7200.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D750.dcp b/rtdata/dcpprofiles/NIKON D750.dcp index 6dcef8386..94cc493d3 100644 Binary files a/rtdata/dcpprofiles/NIKON D750.dcp and b/rtdata/dcpprofiles/NIKON D750.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D80.dcp b/rtdata/dcpprofiles/NIKON D80.dcp index 965c358aa..d8e49bbe2 100644 Binary files a/rtdata/dcpprofiles/NIKON D80.dcp and b/rtdata/dcpprofiles/NIKON D80.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D800E.dcp b/rtdata/dcpprofiles/NIKON D800E.dcp new file mode 100644 index 000000000..ffd7cc2af Binary files /dev/null and b/rtdata/dcpprofiles/NIKON D800E.dcp differ diff --git a/rtdata/dcpprofiles/NIKON D810.dcp b/rtdata/dcpprofiles/NIKON D810.dcp index 2a32a1376..5558c2b2d 100644 Binary files a/rtdata/dcpprofiles/NIKON D810.dcp and b/rtdata/dcpprofiles/NIKON D810.dcp differ diff --git a/rtdata/dcpprofiles/Nikon D50.dcp b/rtdata/dcpprofiles/Nikon D50.dcp deleted file mode 100644 index 0b8a082f4..000000000 Binary files a/rtdata/dcpprofiles/Nikon D50.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Nikon D800.dcp b/rtdata/dcpprofiles/Nikon D800.dcp deleted file mode 100644 index c0a4a5586..000000000 Binary files a/rtdata/dcpprofiles/Nikon D800.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/OLYMPUS E-510.dcp b/rtdata/dcpprofiles/OLYMPUS E-510.dcp new file mode 100644 index 000000000..4361f13f8 Binary files /dev/null and b/rtdata/dcpprofiles/OLYMPUS E-510.dcp differ diff --git a/rtdata/dcpprofiles/OLYMPUS E-M10.dcp b/rtdata/dcpprofiles/OLYMPUS E-M10.dcp index d10459c83..8d1b6413e 100644 Binary files a/rtdata/dcpprofiles/OLYMPUS E-M10.dcp and b/rtdata/dcpprofiles/OLYMPUS E-M10.dcp differ diff --git a/rtdata/dcpprofiles/OLYMPUS E-M1MarkII.dcp b/rtdata/dcpprofiles/OLYMPUS E-M1MarkII.dcp index f32d01302..15cb8679f 100644 Binary files a/rtdata/dcpprofiles/OLYMPUS E-M1MarkII.dcp and b/rtdata/dcpprofiles/OLYMPUS E-M1MarkII.dcp differ diff --git a/rtdata/dcpprofiles/Olympus E-510.dcp b/rtdata/dcpprofiles/Olympus E-510.dcp deleted file mode 100644 index 14de9a405..000000000 Binary files a/rtdata/dcpprofiles/Olympus E-510.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/PENTAX K-5 II.dcp b/rtdata/dcpprofiles/PENTAX K-5 II.dcp index 307a40689..3c61743ec 100644 Binary files a/rtdata/dcpprofiles/PENTAX K-5 II.dcp and b/rtdata/dcpprofiles/PENTAX K-5 II.dcp differ diff --git a/rtdata/dcpprofiles/PENTAX K-5.dcp b/rtdata/dcpprofiles/PENTAX K-5.dcp index c3e496fab..b4efc37d1 100644 Binary files a/rtdata/dcpprofiles/PENTAX K-5.dcp and b/rtdata/dcpprofiles/PENTAX K-5.dcp differ diff --git a/rtdata/dcpprofiles/PENTAX K10D.dcp b/rtdata/dcpprofiles/PENTAX K10D.dcp index cda2456d0..367678690 100644 Binary files a/rtdata/dcpprofiles/PENTAX K10D.dcp and b/rtdata/dcpprofiles/PENTAX K10D.dcp differ diff --git a/rtdata/dcpprofiles/Panasonic DC-G9.dcp b/rtdata/dcpprofiles/Panasonic DC-G9.dcp new file mode 100644 index 000000000..64f1203a9 Binary files /dev/null and b/rtdata/dcpprofiles/Panasonic DC-G9.dcp differ diff --git a/rtdata/dcpprofiles/Panasonic DC-GX9.dcp b/rtdata/dcpprofiles/Panasonic DC-GX9.dcp new file mode 100644 index 000000000..7b8414e97 Binary files /dev/null and b/rtdata/dcpprofiles/Panasonic DC-GX9.dcp differ diff --git a/rtdata/dcpprofiles/Panasonic DC-TZ90.dcp b/rtdata/dcpprofiles/Panasonic DC-TZ90.dcp deleted file mode 100644 index 2a3abfaed..000000000 Binary files a/rtdata/dcpprofiles/Panasonic DC-TZ90.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Panasonic DC-TZ91.dcp b/rtdata/dcpprofiles/Panasonic DC-TZ91.dcp index 2a3abfaed..b645987cf 100644 Binary files a/rtdata/dcpprofiles/Panasonic DC-TZ91.dcp and b/rtdata/dcpprofiles/Panasonic DC-TZ91.dcp differ diff --git a/rtdata/dcpprofiles/Panasonic DC-TZ92.dcp b/rtdata/dcpprofiles/Panasonic DC-TZ92.dcp deleted file mode 100644 index 2a3abfaed..000000000 Binary files a/rtdata/dcpprofiles/Panasonic DC-TZ92.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Panasonic DC-TZ93.dcp b/rtdata/dcpprofiles/Panasonic DC-TZ93.dcp deleted file mode 100644 index 2a3abfaed..000000000 Binary files a/rtdata/dcpprofiles/Panasonic DC-TZ93.dcp and /dev/null differ diff --git a/rtdata/dcpprofiles/Panasonic DMC-FZ1000.dcp b/rtdata/dcpprofiles/Panasonic DMC-FZ1000.dcp new file mode 100644 index 000000000..e99ebf0d9 Binary files /dev/null and b/rtdata/dcpprofiles/Panasonic DMC-FZ1000.dcp differ diff --git a/rtdata/dcpprofiles/Panasonic DMC-GX85.dcp b/rtdata/dcpprofiles/Panasonic DMC-GX85.dcp index 82d722a8c..84cb7a321 100644 Binary files a/rtdata/dcpprofiles/Panasonic DMC-GX85.dcp and b/rtdata/dcpprofiles/Panasonic DMC-GX85.dcp differ diff --git a/rtdata/dcpprofiles/RICOH PENTAX K-1.dcp b/rtdata/dcpprofiles/RICOH PENTAX K-1.dcp index 87028cba6..6d33b63f2 100644 Binary files a/rtdata/dcpprofiles/RICOH PENTAX K-1.dcp and b/rtdata/dcpprofiles/RICOH PENTAX K-1.dcp differ diff --git a/rtdata/dcpprofiles/RICOH PENTAX K-3.dcp b/rtdata/dcpprofiles/RICOH PENTAX K-3.dcp index f04e0b2ad..0e2273cb2 100644 Binary files a/rtdata/dcpprofiles/RICOH PENTAX K-3.dcp and b/rtdata/dcpprofiles/RICOH PENTAX K-3.dcp differ diff --git a/rtdata/dcpprofiles/SONY DSLR-A580.dcp b/rtdata/dcpprofiles/SONY DSLR-A580.dcp new file mode 100644 index 000000000..cf81687a5 Binary files /dev/null and b/rtdata/dcpprofiles/SONY DSLR-A580.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-6000.dcp b/rtdata/dcpprofiles/SONY ILCE-6000.dcp index d0d1c3ae5..3832c514d 100644 Binary files a/rtdata/dcpprofiles/SONY ILCE-6000.dcp and b/rtdata/dcpprofiles/SONY ILCE-6000.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-7M2.dcp b/rtdata/dcpprofiles/SONY ILCE-7M2.dcp index b46343181..fc0627d2a 100644 Binary files a/rtdata/dcpprofiles/SONY ILCE-7M2.dcp and b/rtdata/dcpprofiles/SONY ILCE-7M2.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-7M3.dcp b/rtdata/dcpprofiles/SONY ILCE-7M3.dcp new file mode 100644 index 000000000..b736c1281 Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-7M3.dcp differ diff --git a/rtdata/dcpprofiles/SONY ILCE-7RM3.dcp b/rtdata/dcpprofiles/SONY ILCE-7RM3.dcp new file mode 100644 index 000000000..5237dfc75 Binary files /dev/null and b/rtdata/dcpprofiles/SONY ILCE-7RM3.dcp differ diff --git a/rtdata/dcpprofiles/SONY SLT-A99V.dcp b/rtdata/dcpprofiles/SONY SLT-A99V.dcp index 94a0767ed..a91d01a42 100644 Binary files a/rtdata/dcpprofiles/SONY SLT-A99V.dcp and b/rtdata/dcpprofiles/SONY SLT-A99V.dcp differ diff --git a/rtdata/dcpprofiles/YI TECHNOLOGY M1.dcp b/rtdata/dcpprofiles/YI TECHNOLOGY M1.dcp index d21ace365..c27af7614 100644 Binary files a/rtdata/dcpprofiles/YI TECHNOLOGY M1.dcp and b/rtdata/dcpprofiles/YI TECHNOLOGY M1.dcp differ diff --git a/rtdata/dcpprofiles/camera_model_aliases.json b/rtdata/dcpprofiles/camera_model_aliases.json new file mode 100644 index 000000000..0caf5804b --- /dev/null +++ b/rtdata/dcpprofiles/camera_model_aliases.json @@ -0,0 +1,34 @@ +{ + "Canon EOS 100D": ["Canon EOS Kiss X7", "Canon EOS REBEL SL1"], + "Canon EOS 200D": ["Canon EOS Kiss X9", "Canon EOS Rebel SL2"], + "Canon EOS 300D": ["Canon EOS Kiss Digital", "Canon EOS Digital Rebel"], + "Canon EOS 350D": ["Canon EOS 350D DIGITAL", "Canon EOS Kiss Digital N", "Canon EOS DIGITAL REBEL XT"], + "Canon EOS 400D": ["Canon EOS 400D DIGITAL", "Canon EOS Kiss Digital X", "Canon EOS DIGITAL REBEL XTi"], + "Canon EOS 450D": ["Canon EOS Kiss Digital X2", "Canon EOS Kiss X2", "Canon EOS DIGITAL REBEL XSi"], + "Canon EOS 500D": ["Canon EOS Kiss X3", "Canon EOS REBEL T1i"], + "Canon EOS 550D": ["Canon EOS Kiss X4", "Canon EOS REBEL T2i"], + "Canon EOS 600D": ["Canon EOS Kiss X5", "Canon EOS REBEL T3i"], + "Canon EOS 650D": ["Canon EOS Kiss X6i", "Canon EOS REBEL T4i"], + "Canon EOS 700D": ["Canon EOS Kiss X7i", "Canon EOS REBEL T5i"], + "Canon EOS 750D": ["Canon EOS Kiss X8i", "Canon EOS Rebel T6i"], + "Canon EOS 760D": ["Canon EOS 8000D", "Canon EOS Rebel T6s"], + "Canon EOS 800D": ["Canon EOS Kiss X9i", "Canon EOS Rebel T7i"], + "Canon EOS 1000D": ["Canon EOS Kiss Digital F", "Canon EOS DIGITAL REBEL XS"], + "Canon EOS 1200D": ["Canon EOS Kiss X70", "Canon EOS REBEL T5"], + "Canon EOS 1300D": ["Canon EOS Kiss X80", "Canon EOS Rebel T6"], + + "MINOLTA DYNAX 5D": ["Minolta Maxxum 5D", "Minolta Alpha 5D", "Minolta Alpha Sweet"], + "MINOLTA DYNAX 7D": ["Minolta Maxxum 7D", "Minolta Alpha 7D"], + + "NIKON D800E": ["NIKON D800"], + + "Panasonic DC-FZ82": ["Panasonic DMC-FZ80", "Panasonic DMC-FZ85"], + "Panasonic DC-TZ91": ["Panasonic DC-TZ90", "Panasonic DC-TZ92", "Panasonic DC-TZ93", "Panasonic DC-ZS70"], + "Panasonic DMC-G8": ["Panasonic DMC-G80", "Panasonic DMC-G81", "Panasonic DMC-G85"], + "Panasonic DMC-GX85": ["Panasonic DMC-GX80", "Panasonic DMC-GX7MK2"], + "Panasonic DMC-LX15": ["Panasonic DMC-LX9", "Panasonic DMC-LX10"], + "Panasonic DC-TZ100": ["Panasonic DC-ZS100", "Panasonic DC-ZS110", "Panasonic DC-TZ101", "Panasonic DC-TZ110"], + "Panasonic DMC-TZ61": ["Panasonic DMC-TZ60", "Panasonic DMC-ZS40"], + "Panasonic DMC-TZ71": ["Panasonic DMC-TZ70", "Panasonic DMC-ZS50"], + "Panasonic DMC-TZ81": ["Panasonic DMC-TZ80", "Panasonic DMC-TZ85", "Panasonic DMC-ZS60"] +} diff --git a/rtdata/iccprofiles/input/Canon EOS Digital Rebel XSi.icc b/rtdata/iccprofiles/input/Canon EOS Digital Rebel XSi.icc deleted file mode 100644 index e3229b821..000000000 Binary files a/rtdata/iccprofiles/input/Canon EOS Digital Rebel XSi.icc and /dev/null differ diff --git a/rtdata/iccprofiles/input/Canon EOS Rebel T2i.icc b/rtdata/iccprofiles/input/Canon EOS Rebel T2i.icc deleted file mode 100644 index c6b37c6c4..000000000 Binary files a/rtdata/iccprofiles/input/Canon EOS Rebel T2i.icc and /dev/null differ diff --git a/rtdata/iccprofiles/output/ACES.icc b/rtdata/iccprofiles/output/ACES.icc deleted file mode 100644 index cb87b8bf2..000000000 Binary files a/rtdata/iccprofiles/output/ACES.icc and /dev/null differ diff --git a/rtdata/iccprofiles/output/RT_Large_g10.icc b/rtdata/iccprofiles/output/RT_Large_g10.icc deleted file mode 100644 index 1889a5457..000000000 Binary files a/rtdata/iccprofiles/output/RT_Large_g10.icc and /dev/null differ diff --git a/rtdata/iccprofiles/output/RT_Large_gBT709.icc b/rtdata/iccprofiles/output/RT_Large_gBT709.icc deleted file mode 100644 index bd9785f14..000000000 Binary files a/rtdata/iccprofiles/output/RT_Large_gBT709.icc and /dev/null differ diff --git a/rtdata/iccprofiles/output/RT_Large_gsRGB.icc b/rtdata/iccprofiles/output/RT_Large_gsRGB.icc deleted file mode 100644 index 11be3c733..000000000 Binary files a/rtdata/iccprofiles/output/RT_Large_gsRGB.icc and /dev/null differ diff --git a/rtdata/iccprofiles/output/RT_Medium_gsRGB.icc b/rtdata/iccprofiles/output/RT_Medium_gsRGB.icc deleted file mode 100644 index 6c6233d74..000000000 Binary files a/rtdata/iccprofiles/output/RT_Medium_gsRGB.icc and /dev/null differ diff --git a/rtdata/iccprofiles/output/RT_sRGB.icm b/rtdata/iccprofiles/output/RT_sRGB.icm deleted file mode 100644 index 3d0822ef7..000000000 Binary files a/rtdata/iccprofiles/output/RT_sRGB.icm and /dev/null differ diff --git a/rtdata/iccprofiles/output/RT_sRGB_g10.icm b/rtdata/iccprofiles/output/RT_sRGB_g10.icm deleted file mode 100644 index f8afb8e17..000000000 Binary files a/rtdata/iccprofiles/output/RT_sRGB_g10.icm and /dev/null differ diff --git a/rtdata/iccprofiles/output/RT_sRGB_gBT709.icm b/rtdata/iccprofiles/output/RT_sRGB_gBT709.icm deleted file mode 100644 index c5c44b7a4..000000000 Binary files a/rtdata/iccprofiles/output/RT_sRGB_gBT709.icm and /dev/null differ diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc new file mode 100644 index 000000000..dce81742c Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_ACES-AP0.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc new file mode 100644 index 000000000..65af92f1c Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_ACES-AP1.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_Best.icc b/rtdata/iccprofiles/output/RTv2_Best.icc new file mode 100644 index 000000000..6390b1f34 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_Best.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_Beta.icc b/rtdata/iccprofiles/output/RTv2_Beta.icc new file mode 100644 index 000000000..13907b35a Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_Beta.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_Bruce.icc b/rtdata/iccprofiles/output/RTv2_Bruce.icc new file mode 100644 index 000000000..7dd7f383c Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_Bruce.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_Large.icc b/rtdata/iccprofiles/output/RTv2_Large.icc new file mode 100644 index 000000000..9d2c3fc01 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_Large.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_Medium.icc b/rtdata/iccprofiles/output/RTv2_Medium.icc new file mode 100644 index 000000000..ebaf4d133 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_Medium.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_Rec2020.icc b/rtdata/iccprofiles/output/RTv2_Rec2020.icc new file mode 100644 index 000000000..5a1614bed Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_Rec2020.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_Wide.icc b/rtdata/iccprofiles/output/RTv2_Wide.icc new file mode 100644 index 000000000..e17668966 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_Wide.icc differ diff --git a/rtdata/iccprofiles/output/RTv2_sRGB.icc b/rtdata/iccprofiles/output/RTv2_sRGB.icc new file mode 100644 index 000000000..eb841129e Binary files /dev/null and b/rtdata/iccprofiles/output/RTv2_sRGB.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_ACES-AP0.icc b/rtdata/iccprofiles/output/RTv4_ACES-AP0.icc new file mode 100644 index 000000000..e07da6e04 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_ACES-AP0.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc b/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc new file mode 100644 index 000000000..7194ff6da Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_ACES-AP1.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_Best.icc b/rtdata/iccprofiles/output/RTv4_Best.icc new file mode 100644 index 000000000..8d40518ad Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_Best.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_Beta.icc b/rtdata/iccprofiles/output/RTv4_Beta.icc new file mode 100644 index 000000000..118615326 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_Beta.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_Bruce.icc b/rtdata/iccprofiles/output/RTv4_Bruce.icc new file mode 100644 index 000000000..d61767305 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_Bruce.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_Large.icc b/rtdata/iccprofiles/output/RTv4_Large.icc new file mode 100644 index 000000000..9aef72934 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_Large.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_Medium.icc b/rtdata/iccprofiles/output/RTv4_Medium.icc new file mode 100644 index 000000000..075e9637c Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_Medium.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_Rec2020.icc b/rtdata/iccprofiles/output/RTv4_Rec2020.icc new file mode 100644 index 000000000..9fcb5d263 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_Rec2020.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_Wide.icc b/rtdata/iccprofiles/output/RTv4_Wide.icc new file mode 100644 index 000000000..6dca43823 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_Wide.icc differ diff --git a/rtdata/iccprofiles/output/RTv4_sRGB.icc b/rtdata/iccprofiles/output/RTv4_sRGB.icc new file mode 100644 index 000000000..60607da55 Binary files /dev/null and b/rtdata/iccprofiles/output/RTv4_sRGB.icc differ diff --git a/rtdata/iccprofiles/output/Rec2020.icm b/rtdata/iccprofiles/output/Rec2020.icm deleted file mode 100644 index 0decaf6dc..000000000 Binary files a/rtdata/iccprofiles/output/Rec2020.icm and /dev/null differ diff --git a/rtdata/icons/hi128-app-rawtherapee.png b/rtdata/icons/hi128-app-rawtherapee.png deleted file mode 100644 index 979183116..000000000 Binary files a/rtdata/icons/hi128-app-rawtherapee.png and /dev/null differ diff --git a/rtdata/icons/hi16-app-rawtherapee.png b/rtdata/icons/hi16-app-rawtherapee.png deleted file mode 100644 index 8c4731848..000000000 Binary files a/rtdata/icons/hi16-app-rawtherapee.png and /dev/null differ diff --git a/rtdata/icons/hi24-app-rawtherapee.png b/rtdata/icons/hi24-app-rawtherapee.png deleted file mode 100644 index f6c8ef1a0..000000000 Binary files a/rtdata/icons/hi24-app-rawtherapee.png and /dev/null differ diff --git a/rtdata/icons/hi256-app-rawtherapee.png b/rtdata/icons/hi256-app-rawtherapee.png deleted file mode 100644 index 5cb7d751f..000000000 Binary files a/rtdata/icons/hi256-app-rawtherapee.png and /dev/null differ diff --git a/rtdata/icons/hi32-app-rawtherapee.png b/rtdata/icons/hi32-app-rawtherapee.png deleted file mode 100644 index 380429e13..000000000 Binary files a/rtdata/icons/hi32-app-rawtherapee.png and /dev/null differ diff --git a/rtdata/icons/hi48-app-rawtherapee.png b/rtdata/icons/hi48-app-rawtherapee.png deleted file mode 100644 index fc82d5ae3..000000000 Binary files a/rtdata/icons/hi48-app-rawtherapee.png and /dev/null differ diff --git a/rtdata/icons/rawtherapee.desktop.in b/rtdata/icons/rawtherapee.desktop.in deleted file mode 100644 index a573f19d3..000000000 --- a/rtdata/icons/rawtherapee.desktop.in +++ /dev/null @@ -1,18 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=RawTherapee -GenericName=Raw photo editor -GenericName[cs]=Editor raw obrázků -GenericName[fr]=Éditeur d'images raw -GenericName[pl]=Edytor zdjęć raw -Comment=An advanced raw photo development program -Comment[cs]=Program pro konverzi a zpracování digitálních raw fotografií -Comment[fr]=Logiciel de conversion et de traitement de photos numériques de format raw (but de capteur) -Comment[pl]=Zaawansowany program do wywoływania zdjęć typu raw -Icon=rawtherapee -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; -Categories=Photography;Graphics;2DGraphics;RasterGraphics;GTK; -Keywords=raw;photography;develop;pp3;graphics; diff --git a/rtdata/images/Chanmixer-B.png b/rtdata/images/Chanmixer-B.png deleted file mode 100644 index 0e12209f2..000000000 Binary files a/rtdata/images/Chanmixer-B.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-BB.png b/rtdata/images/Chanmixer-BB.png deleted file mode 100644 index 6804bdf4a..000000000 Binary files a/rtdata/images/Chanmixer-BB.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-BG.png b/rtdata/images/Chanmixer-BG.png deleted file mode 100644 index 58012aa55..000000000 Binary files a/rtdata/images/Chanmixer-BG.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-BR.png b/rtdata/images/Chanmixer-BR.png deleted file mode 100644 index 1c3457e14..000000000 Binary files a/rtdata/images/Chanmixer-BR.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-BY.png b/rtdata/images/Chanmixer-BY.png deleted file mode 100644 index c630ffb29..000000000 Binary files a/rtdata/images/Chanmixer-BY.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-C.png b/rtdata/images/Chanmixer-C.png deleted file mode 100644 index 15aa0c08c..000000000 Binary files a/rtdata/images/Chanmixer-C.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-G.png b/rtdata/images/Chanmixer-G.png deleted file mode 100644 index 566babb8b..000000000 Binary files a/rtdata/images/Chanmixer-G.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-GB.png b/rtdata/images/Chanmixer-GB.png deleted file mode 100644 index cfceceaea..000000000 Binary files a/rtdata/images/Chanmixer-GB.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-GG.png b/rtdata/images/Chanmixer-GG.png deleted file mode 100644 index 00f928236..000000000 Binary files a/rtdata/images/Chanmixer-GG.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-GR.png b/rtdata/images/Chanmixer-GR.png deleted file mode 100644 index 827210e97..000000000 Binary files a/rtdata/images/Chanmixer-GR.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-M.png b/rtdata/images/Chanmixer-M.png deleted file mode 100644 index b10dc5790..000000000 Binary files a/rtdata/images/Chanmixer-M.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-O.png b/rtdata/images/Chanmixer-O.png deleted file mode 100644 index 8f90ae8bb..000000000 Binary files a/rtdata/images/Chanmixer-O.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-P.png b/rtdata/images/Chanmixer-P.png deleted file mode 100644 index c3c412807..000000000 Binary files a/rtdata/images/Chanmixer-P.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-R.png b/rtdata/images/Chanmixer-R.png deleted file mode 100644 index 5a75d9f88..000000000 Binary files a/rtdata/images/Chanmixer-R.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-RB.png b/rtdata/images/Chanmixer-RB.png deleted file mode 100644 index 42cf9bd1b..000000000 Binary files a/rtdata/images/Chanmixer-RB.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-RG.png b/rtdata/images/Chanmixer-RG.png deleted file mode 100644 index f74600517..000000000 Binary files a/rtdata/images/Chanmixer-RG.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-RR.png b/rtdata/images/Chanmixer-RR.png deleted file mode 100644 index 300b0429e..000000000 Binary files a/rtdata/images/Chanmixer-RR.png and /dev/null differ diff --git a/rtdata/images/Chanmixer-Y.png b/rtdata/images/Chanmixer-Y.png deleted file mode 100644 index 98d9b6f83..000000000 Binary files a/rtdata/images/Chanmixer-Y.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/Chanmixer-Bgamma.png b/rtdata/images/Dark/actions/Chanmixer-Bgamma.png deleted file mode 100644 index 8698988a9..000000000 Binary files a/rtdata/images/Dark/actions/Chanmixer-Bgamma.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/Chanmixer-Ggamma.png b/rtdata/images/Dark/actions/Chanmixer-Ggamma.png deleted file mode 100644 index d0539758c..000000000 Binary files a/rtdata/images/Dark/actions/Chanmixer-Ggamma.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/Chanmixer-Rgamma.png b/rtdata/images/Dark/actions/Chanmixer-Rgamma.png deleted file mode 100644 index b1b7fb604..000000000 Binary files a/rtdata/images/Dark/actions/Chanmixer-Rgamma.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/HDR-thumbnail.png b/rtdata/images/Dark/actions/HDR-thumbnail.png deleted file mode 100644 index 182e603e8..000000000 Binary files a/rtdata/images/Dark/actions/HDR-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/PanelEnding.png b/rtdata/images/Dark/actions/PanelEnding.png deleted file mode 100644 index be7729164..000000000 Binary files a/rtdata/images/Dark/actions/PanelEnding.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/PixelShift-thumbnail.png b/rtdata/images/Dark/actions/PixelShift-thumbnail.png deleted file mode 100644 index 4bbea1aee..000000000 Binary files a/rtdata/images/Dark/actions/PixelShift-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-ca-blue1.png b/rtdata/images/Dark/actions/ajd-ca-blue1.png deleted file mode 100644 index 7a47267df..000000000 Binary files a/rtdata/images/Dark/actions/ajd-ca-blue1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-ca-blue2.png b/rtdata/images/Dark/actions/ajd-ca-blue2.png deleted file mode 100644 index dfb458300..000000000 Binary files a/rtdata/images/Dark/actions/ajd-ca-blue2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-ca-red1.png b/rtdata/images/Dark/actions/ajd-ca-red1.png deleted file mode 100644 index 1e45c5035..000000000 Binary files a/rtdata/images/Dark/actions/ajd-ca-red1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-ca-red2.png b/rtdata/images/Dark/actions/ajd-ca-red2.png deleted file mode 100644 index e5da9e005..000000000 Binary files a/rtdata/images/Dark/actions/ajd-ca-red2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-wb-bluered1.png b/rtdata/images/Dark/actions/ajd-wb-bluered1.png deleted file mode 100644 index 3c8473451..000000000 Binary files a/rtdata/images/Dark/actions/ajd-wb-bluered1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-wb-bluered2.png b/rtdata/images/Dark/actions/ajd-wb-bluered2.png deleted file mode 100644 index 0f06a770e..000000000 Binary files a/rtdata/images/Dark/actions/ajd-wb-bluered2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-wb-green1.png b/rtdata/images/Dark/actions/ajd-wb-green1.png deleted file mode 100644 index 4f33551d6..000000000 Binary files a/rtdata/images/Dark/actions/ajd-wb-green1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-wb-green2.png b/rtdata/images/Dark/actions/ajd-wb-green2.png deleted file mode 100644 index a9a7e8553..000000000 Binary files a/rtdata/images/Dark/actions/ajd-wb-green2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-wb-temp1.png b/rtdata/images/Dark/actions/ajd-wb-temp1.png deleted file mode 100644 index 3c8473451..000000000 Binary files a/rtdata/images/Dark/actions/ajd-wb-temp1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ajd-wb-temp2.png b/rtdata/images/Dark/actions/ajd-wb-temp2.png deleted file mode 100644 index 2b0c7c0ef..000000000 Binary files a/rtdata/images/Dark/actions/ajd-wb-temp2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-down-small.png b/rtdata/images/Dark/actions/arrow-down-small.png deleted file mode 100644 index d631a72f5..000000000 Binary files a/rtdata/images/Dark/actions/arrow-down-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-down.png b/rtdata/images/Dark/actions/arrow-down.png deleted file mode 100644 index 417038d15..000000000 Binary files a/rtdata/images/Dark/actions/arrow-down.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-left-small.png b/rtdata/images/Dark/actions/arrow-left-small.png deleted file mode 100644 index d61abd8a3..000000000 Binary files a/rtdata/images/Dark/actions/arrow-left-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-left.png b/rtdata/images/Dark/actions/arrow-left.png deleted file mode 100644 index a30aeadef..000000000 Binary files a/rtdata/images/Dark/actions/arrow-left.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-right-small.png b/rtdata/images/Dark/actions/arrow-right-small.png deleted file mode 100644 index fa0741927..000000000 Binary files a/rtdata/images/Dark/actions/arrow-right-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-right.png b/rtdata/images/Dark/actions/arrow-right.png deleted file mode 100644 index 2f426f9f1..000000000 Binary files a/rtdata/images/Dark/actions/arrow-right.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-up-small.png b/rtdata/images/Dark/actions/arrow-up-small.png deleted file mode 100644 index 21f8f61eb..000000000 Binary files a/rtdata/images/Dark/actions/arrow-up-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/arrow-up.png b/rtdata/images/Dark/actions/arrow-up.png deleted file mode 100644 index 2f4a9d228..000000000 Binary files a/rtdata/images/Dark/actions/arrow-up.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/atom.png b/rtdata/images/Dark/actions/atom.png deleted file mode 100644 index 1e7ce3da0..000000000 Binary files a/rtdata/images/Dark/actions/atom.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/beforeafter.png b/rtdata/images/Dark/actions/beforeafter.png deleted file mode 100644 index cd4e1a792..000000000 Binary files a/rtdata/images/Dark/actions/beforeafter.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/cglabel0.png b/rtdata/images/Dark/actions/cglabel0.png deleted file mode 100644 index af4abc914..000000000 Binary files a/rtdata/images/Dark/actions/cglabel0.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/cglabel1.png b/rtdata/images/Dark/actions/cglabel1.png deleted file mode 100644 index 6337a6476..000000000 Binary files a/rtdata/images/Dark/actions/cglabel1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/cglabel2.png b/rtdata/images/Dark/actions/cglabel2.png deleted file mode 100644 index a5b843c0c..000000000 Binary files a/rtdata/images/Dark/actions/cglabel2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/cglabel3.png b/rtdata/images/Dark/actions/cglabel3.png deleted file mode 100644 index a3f3da7a9..000000000 Binary files a/rtdata/images/Dark/actions/cglabel3.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/cglabel4.png b/rtdata/images/Dark/actions/cglabel4.png deleted file mode 100644 index 3e048f36c..000000000 Binary files a/rtdata/images/Dark/actions/cglabel4.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/cglabel5.png b/rtdata/images/Dark/actions/cglabel5.png deleted file mode 100644 index 323be0cb9..000000000 Binary files a/rtdata/images/Dark/actions/cglabel5.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/clabel0.png b/rtdata/images/Dark/actions/clabel0.png deleted file mode 100644 index 5c2484a36..000000000 Binary files a/rtdata/images/Dark/actions/clabel0.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/clabel1.png b/rtdata/images/Dark/actions/clabel1.png deleted file mode 100644 index 87bd0ea83..000000000 Binary files a/rtdata/images/Dark/actions/clabel1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/clabel2.png b/rtdata/images/Dark/actions/clabel2.png deleted file mode 100644 index b8ca4f72b..000000000 Binary files a/rtdata/images/Dark/actions/clabel2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/clabel3.png b/rtdata/images/Dark/actions/clabel3.png deleted file mode 100644 index d9dced467..000000000 Binary files a/rtdata/images/Dark/actions/clabel3.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/clabel4.png b/rtdata/images/Dark/actions/clabel4.png deleted file mode 100644 index 2afb44650..000000000 Binary files a/rtdata/images/Dark/actions/clabel4.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/clabel5.png b/rtdata/images/Dark/actions/clabel5.png deleted file mode 100644 index aef022fce..000000000 Binary files a/rtdata/images/Dark/actions/clabel5.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/closedhand.png b/rtdata/images/Dark/actions/closedhand.png deleted file mode 100644 index e9560f5a7..000000000 Binary files a/rtdata/images/Dark/actions/closedhand.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/colorPickers-hide.png b/rtdata/images/Dark/actions/colorPickers-hide.png deleted file mode 100644 index 54b33a7fb..000000000 Binary files a/rtdata/images/Dark/actions/colorPickers-hide.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/colorPickers-show.png b/rtdata/images/Dark/actions/colorPickers-show.png deleted file mode 100644 index d9d039c2b..000000000 Binary files a/rtdata/images/Dark/actions/colorPickers-show.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/colour.png b/rtdata/images/Dark/actions/colour.png deleted file mode 100644 index e518dfa3a..000000000 Binary files a/rtdata/images/Dark/actions/colour.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/crop-auto.png b/rtdata/images/Dark/actions/crop-auto.png deleted file mode 100644 index 8cb57e799..000000000 Binary files a/rtdata/images/Dark/actions/crop-auto.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/crop.png b/rtdata/images/Dark/actions/crop.png deleted file mode 100644 index a9a339020..000000000 Binary files a/rtdata/images/Dark/actions/crop.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/crossed-arrows-in.png b/rtdata/images/Dark/actions/crossed-arrows-in.png deleted file mode 100644 index b2a2d8820..000000000 Binary files a/rtdata/images/Dark/actions/crossed-arrows-in.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/crossed-arrows-out.png b/rtdata/images/Dark/actions/crossed-arrows-out.png deleted file mode 100644 index e552d55ca..000000000 Binary files a/rtdata/images/Dark/actions/crossed-arrows-out.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/curveType-NURBS.png b/rtdata/images/Dark/actions/curveType-NURBS.png deleted file mode 100644 index b891c89c7..000000000 Binary files a/rtdata/images/Dark/actions/curveType-NURBS.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/curveType-controlPoints.png b/rtdata/images/Dark/actions/curveType-controlPoints.png deleted file mode 100644 index 54dbcc540..000000000 Binary files a/rtdata/images/Dark/actions/curveType-controlPoints.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/curveType-flatLinear.png b/rtdata/images/Dark/actions/curveType-flatLinear.png deleted file mode 100644 index 6049e658c..000000000 Binary files a/rtdata/images/Dark/actions/curveType-flatLinear.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/curveType-linear.png b/rtdata/images/Dark/actions/curveType-linear.png deleted file mode 100644 index 67ff4390c..000000000 Binary files a/rtdata/images/Dark/actions/curveType-linear.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/curveType-parametric.png b/rtdata/images/Dark/actions/curveType-parametric.png deleted file mode 100644 index dcf7b02b5..000000000 Binary files a/rtdata/images/Dark/actions/curveType-parametric.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/curveType-spline.png b/rtdata/images/Dark/actions/curveType-spline.png deleted file mode 100644 index b9c0527d3..000000000 Binary files a/rtdata/images/Dark/actions/curveType-spline.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/detail.png b/rtdata/images/Dark/actions/detail.png deleted file mode 100644 index b1af89c9e..000000000 Binary files a/rtdata/images/Dark/actions/detail.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/distorsion.png b/rtdata/images/Dark/actions/distorsion.png deleted file mode 100644 index fc5200391..000000000 Binary files a/rtdata/images/Dark/actions/distorsion.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/distortion-auto.png b/rtdata/images/Dark/actions/distortion-auto.png deleted file mode 100644 index cc5ced965..000000000 Binary files a/rtdata/images/Dark/actions/distortion-auto.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/distortion-barrel.png b/rtdata/images/Dark/actions/distortion-barrel.png deleted file mode 100644 index 0a19ac097..000000000 Binary files a/rtdata/images/Dark/actions/distortion-barrel.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/distortion-pincushion.png b/rtdata/images/Dark/actions/distortion-pincushion.png deleted file mode 100644 index cfdcfaf63..000000000 Binary files a/rtdata/images/Dark/actions/distortion-pincushion.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/document-open-recent.png b/rtdata/images/Dark/actions/document-open-recent.png deleted file mode 100644 index f2c126cb7..000000000 Binary files a/rtdata/images/Dark/actions/document-open-recent.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/document-open.png b/rtdata/images/Dark/actions/document-open.png deleted file mode 100644 index 6d2ea0f34..000000000 Binary files a/rtdata/images/Dark/actions/document-open.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/edit-copy.png b/rtdata/images/Dark/actions/edit-copy.png deleted file mode 100644 index 4736313a2..000000000 Binary files a/rtdata/images/Dark/actions/edit-copy.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/edit-find.png b/rtdata/images/Dark/actions/edit-find.png deleted file mode 100644 index d560c644b..000000000 Binary files a/rtdata/images/Dark/actions/edit-find.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/edit-paste.png b/rtdata/images/Dark/actions/edit-paste.png deleted file mode 100644 index 38871deec..000000000 Binary files a/rtdata/images/Dark/actions/edit-paste.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/edited-small.png b/rtdata/images/Dark/actions/edited-small.png deleted file mode 100644 index f25997a59..000000000 Binary files a/rtdata/images/Dark/actions/edited-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/edited.png b/rtdata/images/Dark/actions/edited.png deleted file mode 100644 index 95d058454..000000000 Binary files a/rtdata/images/Dark/actions/edited.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/editedg-small.png b/rtdata/images/Dark/actions/editedg-small.png deleted file mode 100644 index 9eb229e75..000000000 Binary files a/rtdata/images/Dark/actions/editedg-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/editednot-small.png b/rtdata/images/Dark/actions/editednot-small.png deleted file mode 100644 index 410bff81b..000000000 Binary files a/rtdata/images/Dark/actions/editednot-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/editednotg-small.png b/rtdata/images/Dark/actions/editednotg-small.png deleted file mode 100644 index 55bc28f2b..000000000 Binary files a/rtdata/images/Dark/actions/editednotg-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/editmodehand.png b/rtdata/images/Dark/actions/editmodehand.png deleted file mode 100644 index 2b231db06..000000000 Binary files a/rtdata/images/Dark/actions/editmodehand.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/equalizer-narrow.png b/rtdata/images/Dark/actions/equalizer-narrow.png deleted file mode 100644 index dcf484ea7..000000000 Binary files a/rtdata/images/Dark/actions/equalizer-narrow.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/equalizer-wide.png b/rtdata/images/Dark/actions/equalizer-wide.png deleted file mode 100644 index 50cfed8fa..000000000 Binary files a/rtdata/images/Dark/actions/equalizer-wide.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/expanderClosed.png b/rtdata/images/Dark/actions/expanderClosed.png deleted file mode 100644 index 559f201db..000000000 Binary files a/rtdata/images/Dark/actions/expanderClosed.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/expanderDisabled.png b/rtdata/images/Dark/actions/expanderDisabled.png deleted file mode 100644 index 7e35c7266..000000000 Binary files a/rtdata/images/Dark/actions/expanderDisabled.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/expanderEnabled.png b/rtdata/images/Dark/actions/expanderEnabled.png deleted file mode 100644 index 33e8515af..000000000 Binary files a/rtdata/images/Dark/actions/expanderEnabled.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/expanderInconsistent.png b/rtdata/images/Dark/actions/expanderInconsistent.png deleted file mode 100644 index e19f8e106..000000000 Binary files a/rtdata/images/Dark/actions/expanderInconsistent.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/expanderOpened.png b/rtdata/images/Dark/actions/expanderOpened.png deleted file mode 100644 index 9a7f161ee..000000000 Binary files a/rtdata/images/Dark/actions/expanderOpened.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/exposure.png b/rtdata/images/Dark/actions/exposure.png deleted file mode 100644 index f6abf8b87..000000000 Binary files a/rtdata/images/Dark/actions/exposure.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/filter-original-1.png b/rtdata/images/Dark/actions/filter-original-1.png deleted file mode 100644 index 9b4e47ce9..000000000 Binary files a/rtdata/images/Dark/actions/filter-original-1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/filter-original-2.png b/rtdata/images/Dark/actions/filter-original-2.png deleted file mode 100644 index 03531e921..000000000 Binary files a/rtdata/images/Dark/actions/filter-original-2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/filter.png b/rtdata/images/Dark/actions/filter.png deleted file mode 100644 index bd5dcb5f4..000000000 Binary files a/rtdata/images/Dark/actions/filter.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/filterclear.png b/rtdata/images/Dark/actions/filterclear.png deleted file mode 100644 index 28c93061e..000000000 Binary files a/rtdata/images/Dark/actions/filterclear.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/fullscreen-exit.png b/rtdata/images/Dark/actions/fullscreen-exit.png deleted file mode 100644 index 55eb8e06d..000000000 Binary files a/rtdata/images/Dark/actions/fullscreen-exit.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/fullscreen.png b/rtdata/images/Dark/actions/fullscreen.png deleted file mode 100644 index 963409e9a..000000000 Binary files a/rtdata/images/Dark/actions/fullscreen.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gamut-hist.png b/rtdata/images/Dark/actions/gamut-hist.png deleted file mode 100644 index 8a60118dd..000000000 Binary files a/rtdata/images/Dark/actions/gamut-hist.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/grayrated.png b/rtdata/images/Dark/actions/grayrated.png deleted file mode 100644 index 6866bc1d6..000000000 Binary files a/rtdata/images/Dark/actions/grayrated.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-add.png b/rtdata/images/Dark/actions/gtk-add.png deleted file mode 100644 index 80abd6bfd..000000000 Binary files a/rtdata/images/Dark/actions/gtk-add.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-apply.png b/rtdata/images/Dark/actions/gtk-apply.png deleted file mode 100644 index 4790895e7..000000000 Binary files a/rtdata/images/Dark/actions/gtk-apply.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-cancel.png b/rtdata/images/Dark/actions/gtk-cancel.png deleted file mode 100644 index c76033ee9..000000000 Binary files a/rtdata/images/Dark/actions/gtk-cancel.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-close-small.png b/rtdata/images/Dark/actions/gtk-close-small.png deleted file mode 100644 index 7abb7a95a..000000000 Binary files a/rtdata/images/Dark/actions/gtk-close-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-close.png b/rtdata/images/Dark/actions/gtk-close.png deleted file mode 100644 index c76033ee9..000000000 Binary files a/rtdata/images/Dark/actions/gtk-close.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-color-picker-add.png b/rtdata/images/Dark/actions/gtk-color-picker-add.png deleted file mode 100644 index 77a30c250..000000000 Binary files a/rtdata/images/Dark/actions/gtk-color-picker-add.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-color-picker-small.png b/rtdata/images/Dark/actions/gtk-color-picker-small.png deleted file mode 100644 index f10b7f0fe..000000000 Binary files a/rtdata/images/Dark/actions/gtk-color-picker-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-color-picker.png b/rtdata/images/Dark/actions/gtk-color-picker.png deleted file mode 100644 index c79c3f3e9..000000000 Binary files a/rtdata/images/Dark/actions/gtk-color-picker.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-copy.png b/rtdata/images/Dark/actions/gtk-copy.png deleted file mode 100644 index 4736313a2..000000000 Binary files a/rtdata/images/Dark/actions/gtk-copy.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-edit.png b/rtdata/images/Dark/actions/gtk-edit.png deleted file mode 100644 index 8eabf5f09..000000000 Binary files a/rtdata/images/Dark/actions/gtk-edit.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-find.png b/rtdata/images/Dark/actions/gtk-find.png deleted file mode 100644 index d560c644b..000000000 Binary files a/rtdata/images/Dark/actions/gtk-find.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-media-play.png b/rtdata/images/Dark/actions/gtk-media-play.png deleted file mode 100644 index 2bd7ded54..000000000 Binary files a/rtdata/images/Dark/actions/gtk-media-play.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-media-stop.png b/rtdata/images/Dark/actions/gtk-media-stop.png deleted file mode 100644 index 9d3b25ba0..000000000 Binary files a/rtdata/images/Dark/actions/gtk-media-stop.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-ok.png b/rtdata/images/Dark/actions/gtk-ok.png deleted file mode 100644 index 4790895e7..000000000 Binary files a/rtdata/images/Dark/actions/gtk-ok.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-open.png b/rtdata/images/Dark/actions/gtk-open.png deleted file mode 100644 index 6d2ea0f34..000000000 Binary files a/rtdata/images/Dark/actions/gtk-open.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-paste.png b/rtdata/images/Dark/actions/gtk-paste.png deleted file mode 100644 index 38871deec..000000000 Binary files a/rtdata/images/Dark/actions/gtk-paste.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-preferences.png b/rtdata/images/Dark/actions/gtk-preferences.png deleted file mode 100644 index 1d3c0f398..000000000 Binary files a/rtdata/images/Dark/actions/gtk-preferences.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-remove.png b/rtdata/images/Dark/actions/gtk-remove.png deleted file mode 100644 index b789b5130..000000000 Binary files a/rtdata/images/Dark/actions/gtk-remove.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-save-large.png b/rtdata/images/Dark/actions/gtk-save-large.png deleted file mode 100644 index 9b1ba463e..000000000 Binary files a/rtdata/images/Dark/actions/gtk-save-large.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-save.png b/rtdata/images/Dark/actions/gtk-save.png deleted file mode 100644 index d72b9a2ad..000000000 Binary files a/rtdata/images/Dark/actions/gtk-save.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-undo-ltr-small.png b/rtdata/images/Dark/actions/gtk-undo-ltr-small.png deleted file mode 100644 index b0dbf0b98..000000000 Binary files a/rtdata/images/Dark/actions/gtk-undo-ltr-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-undo-ltr.png b/rtdata/images/Dark/actions/gtk-undo-ltr.png deleted file mode 100644 index f66791abb..000000000 Binary files a/rtdata/images/Dark/actions/gtk-undo-ltr.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-undo-rtl-small.png b/rtdata/images/Dark/actions/gtk-undo-rtl-small.png deleted file mode 100644 index 7ef3d5f67..000000000 Binary files a/rtdata/images/Dark/actions/gtk-undo-rtl-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-undo-rtl.png b/rtdata/images/Dark/actions/gtk-undo-rtl.png deleted file mode 100644 index 1c6fc0537..000000000 Binary files a/rtdata/images/Dark/actions/gtk-undo-rtl.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-undoall-ltr.png b/rtdata/images/Dark/actions/gtk-undoall-ltr.png deleted file mode 100644 index 00c61c2a8..000000000 Binary files a/rtdata/images/Dark/actions/gtk-undoall-ltr.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-undoall-rtl.png b/rtdata/images/Dark/actions/gtk-undoall-rtl.png deleted file mode 100644 index cf92a7017..000000000 Binary files a/rtdata/images/Dark/actions/gtk-undoall-rtl.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-100-small.png b/rtdata/images/Dark/actions/gtk-zoom-100-small.png deleted file mode 100644 index 43abd73a4..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-100-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-100.png b/rtdata/images/Dark/actions/gtk-zoom-100.png deleted file mode 100644 index a00a78d68..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-100.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-crop.png b/rtdata/images/Dark/actions/gtk-zoom-crop.png deleted file mode 100644 index f20e826ba..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-crop.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-fit.png b/rtdata/images/Dark/actions/gtk-zoom-fit.png deleted file mode 100644 index 670515eb4..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-fit.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-in-small.png b/rtdata/images/Dark/actions/gtk-zoom-in-small.png deleted file mode 100644 index 291c8ecac..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-in-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-in.png b/rtdata/images/Dark/actions/gtk-zoom-in.png deleted file mode 100644 index ee8688d43..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-in.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-out-small.png b/rtdata/images/Dark/actions/gtk-zoom-out-small.png deleted file mode 100644 index 93b771182..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-out-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/gtk-zoom-out.png b/rtdata/images/Dark/actions/gtk-zoom-out.png deleted file mode 100644 index aeec6b0fc..000000000 Binary files a/rtdata/images/Dark/actions/gtk-zoom-out.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histBar.png b/rtdata/images/Dark/actions/histBar.png deleted file mode 100644 index 24ef6b45f..000000000 Binary files a/rtdata/images/Dark/actions/histBar.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histBarg.png b/rtdata/images/Dark/actions/histBarg.png deleted file mode 100644 index 89d20ccff..000000000 Binary files a/rtdata/images/Dark/actions/histBarg.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histBlue.png b/rtdata/images/Dark/actions/histBlue.png deleted file mode 100644 index 53c447a1c..000000000 Binary files a/rtdata/images/Dark/actions/histBlue.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histBlueg.png b/rtdata/images/Dark/actions/histBlueg.png deleted file mode 100644 index ac205219d..000000000 Binary files a/rtdata/images/Dark/actions/histBlueg.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histChro.png b/rtdata/images/Dark/actions/histChro.png deleted file mode 100644 index 021a18222..000000000 Binary files a/rtdata/images/Dark/actions/histChro.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histChrog.png b/rtdata/images/Dark/actions/histChrog.png deleted file mode 100644 index 342311f5f..000000000 Binary files a/rtdata/images/Dark/actions/histChrog.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histFull.png b/rtdata/images/Dark/actions/histFull.png deleted file mode 100644 index 78f9ee96c..000000000 Binary files a/rtdata/images/Dark/actions/histFull.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histFullg.png b/rtdata/images/Dark/actions/histFullg.png deleted file mode 100644 index ffbbe1c2b..000000000 Binary files a/rtdata/images/Dark/actions/histFullg.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histGreen.png b/rtdata/images/Dark/actions/histGreen.png deleted file mode 100644 index 54eebe37e..000000000 Binary files a/rtdata/images/Dark/actions/histGreen.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histGreeng.png b/rtdata/images/Dark/actions/histGreeng.png deleted file mode 100644 index 33c138cae..000000000 Binary files a/rtdata/images/Dark/actions/histGreeng.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histRaw.png b/rtdata/images/Dark/actions/histRaw.png deleted file mode 100644 index 36e1a5a31..000000000 Binary files a/rtdata/images/Dark/actions/histRaw.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histRawg.png b/rtdata/images/Dark/actions/histRawg.png deleted file mode 100644 index 1b9d286b3..000000000 Binary files a/rtdata/images/Dark/actions/histRawg.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histRed.png b/rtdata/images/Dark/actions/histRed.png deleted file mode 100644 index ce7fddcd3..000000000 Binary files a/rtdata/images/Dark/actions/histRed.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histRedg.png b/rtdata/images/Dark/actions/histRedg.png deleted file mode 100644 index b75a66995..000000000 Binary files a/rtdata/images/Dark/actions/histRedg.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histValue.png b/rtdata/images/Dark/actions/histValue.png deleted file mode 100644 index 451004889..000000000 Binary files a/rtdata/images/Dark/actions/histValue.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/histValueg.png b/rtdata/images/Dark/actions/histValueg.png deleted file mode 100644 index 31d6f63e5..000000000 Binary files a/rtdata/images/Dark/actions/histValueg.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/image-editor.png b/rtdata/images/Dark/actions/image-editor.png deleted file mode 100644 index cf87bc311..000000000 Binary files a/rtdata/images/Dark/actions/image-editor.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/info.png b/rtdata/images/Dark/actions/info.png deleted file mode 100644 index 6ce41bad3..000000000 Binary files a/rtdata/images/Dark/actions/info.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/intent-absolute.png b/rtdata/images/Dark/actions/intent-absolute.png deleted file mode 100644 index 6d274a2c0..000000000 Binary files a/rtdata/images/Dark/actions/intent-absolute.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/intent-perceptual.png b/rtdata/images/Dark/actions/intent-perceptual.png deleted file mode 100644 index 821a714ae..000000000 Binary files a/rtdata/images/Dark/actions/intent-perceptual.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/intent-relative.png b/rtdata/images/Dark/actions/intent-relative.png deleted file mode 100644 index d586b47b2..000000000 Binary files a/rtdata/images/Dark/actions/intent-relative.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/intent-saturation.png b/rtdata/images/Dark/actions/intent-saturation.png deleted file mode 100644 index 0654f78b6..000000000 Binary files a/rtdata/images/Dark/actions/intent-saturation.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/list-add-small.png b/rtdata/images/Dark/actions/list-add-small.png deleted file mode 100644 index 15002fe13..000000000 Binary files a/rtdata/images/Dark/actions/list-add-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/list-add.png b/rtdata/images/Dark/actions/list-add.png deleted file mode 100644 index 80abd6bfd..000000000 Binary files a/rtdata/images/Dark/actions/list-add.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/list-remove-red-small.png b/rtdata/images/Dark/actions/list-remove-red-small.png deleted file mode 100644 index 71650328f..000000000 Binary files a/rtdata/images/Dark/actions/list-remove-red-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/list-remove.png b/rtdata/images/Dark/actions/list-remove.png deleted file mode 100644 index b789b5130..000000000 Binary files a/rtdata/images/Dark/actions/list-remove.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/lock-off.png b/rtdata/images/Dark/actions/lock-off.png deleted file mode 100644 index c4dbfe1af..000000000 Binary files a/rtdata/images/Dark/actions/lock-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/lock-on.png b/rtdata/images/Dark/actions/lock-on.png deleted file mode 100644 index 23366d571..000000000 Binary files a/rtdata/images/Dark/actions/lock-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/media-usb.png b/rtdata/images/Dark/actions/media-usb.png deleted file mode 100644 index 5c46c9464..000000000 Binary files a/rtdata/images/Dark/actions/media-usb.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/meta.png b/rtdata/images/Dark/actions/meta.png deleted file mode 100644 index 5c9c05d3f..000000000 Binary files a/rtdata/images/Dark/actions/meta.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/nav-next.png b/rtdata/images/Dark/actions/nav-next.png deleted file mode 100644 index a3e8ed0b0..000000000 Binary files a/rtdata/images/Dark/actions/nav-next.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/nav-prev.png b/rtdata/images/Dark/actions/nav-prev.png deleted file mode 100644 index cd621d372..000000000 Binary files a/rtdata/images/Dark/actions/nav-prev.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/nav-sync.png b/rtdata/images/Dark/actions/nav-sync.png deleted file mode 100644 index cbad9711e..000000000 Binary files a/rtdata/images/Dark/actions/nav-sync.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/new-detail-window.png b/rtdata/images/Dark/actions/new-detail-window.png deleted file mode 100644 index 43b39decf..000000000 Binary files a/rtdata/images/Dark/actions/new-detail-window.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/openhand.png b/rtdata/images/Dark/actions/openhand.png deleted file mode 100644 index 66c13d890..000000000 Binary files a/rtdata/images/Dark/actions/openhand.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/panel-to-bottom.png b/rtdata/images/Dark/actions/panel-to-bottom.png deleted file mode 100644 index 7e4905a9c..000000000 Binary files a/rtdata/images/Dark/actions/panel-to-bottom.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/panel-to-left.png b/rtdata/images/Dark/actions/panel-to-left.png deleted file mode 100644 index 97f7494a1..000000000 Binary files a/rtdata/images/Dark/actions/panel-to-left.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/panel-to-right.png b/rtdata/images/Dark/actions/panel-to-right.png deleted file mode 100644 index d6af36001..000000000 Binary files a/rtdata/images/Dark/actions/panel-to-right.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/panel-to-top.png b/rtdata/images/Dark/actions/panel-to-top.png deleted file mode 100644 index d628cc598..000000000 Binary files a/rtdata/images/Dark/actions/panel-to-top.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/perspective-h1.png b/rtdata/images/Dark/actions/perspective-h1.png deleted file mode 100644 index ea470842d..000000000 Binary files a/rtdata/images/Dark/actions/perspective-h1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/perspective-h2.png b/rtdata/images/Dark/actions/perspective-h2.png deleted file mode 100644 index 5cd371dfc..000000000 Binary files a/rtdata/images/Dark/actions/perspective-h2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/perspective-v1.png b/rtdata/images/Dark/actions/perspective-v1.png deleted file mode 100644 index e42755116..000000000 Binary files a/rtdata/images/Dark/actions/perspective-v1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/perspective-v2.png b/rtdata/images/Dark/actions/perspective-v2.png deleted file mode 100644 index 489e3bd02..000000000 Binary files a/rtdata/images/Dark/actions/perspective-v2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/popuparrow.png b/rtdata/images/Dark/actions/popuparrow.png deleted file mode 100644 index 6e67d45b4..000000000 Binary files a/rtdata/images/Dark/actions/popuparrow.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeB-off.png b/rtdata/images/Dark/actions/previewmodeB-off.png deleted file mode 100644 index 0c9890437..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeB-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeB-on.png b/rtdata/images/Dark/actions/previewmodeB-on.png deleted file mode 100644 index 466192b3a..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeB-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC0-off.png b/rtdata/images/Dark/actions/previewmodeBC0-off.png deleted file mode 100644 index 28c024555..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC0-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC0-on.png b/rtdata/images/Dark/actions/previewmodeBC0-on.png deleted file mode 100644 index f5e0b8000..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC0-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC1-off.png b/rtdata/images/Dark/actions/previewmodeBC1-off.png deleted file mode 100644 index 4ac160b05..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC1-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC1-on.png b/rtdata/images/Dark/actions/previewmodeBC1-on.png deleted file mode 100644 index 3e9b6874c..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC1-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC2-off.png b/rtdata/images/Dark/actions/previewmodeBC2-off.png deleted file mode 100644 index bf3d97b2d..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC2-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC2-on.png b/rtdata/images/Dark/actions/previewmodeBC2-on.png deleted file mode 100644 index 457453166..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC2-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC3-off.png b/rtdata/images/Dark/actions/previewmodeBC3-off.png deleted file mode 100644 index 487ec777e..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC3-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeBC3-on.png b/rtdata/images/Dark/actions/previewmodeBC3-on.png deleted file mode 100644 index 670b5b8b4..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeBC3-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeF-focusScreen-off.png b/rtdata/images/Dark/actions/previewmodeF-focusScreen-off.png deleted file mode 100644 index 75a285de2..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeF-focusScreen-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeF-focusScreen-on.png b/rtdata/images/Dark/actions/previewmodeF-focusScreen-on.png deleted file mode 100644 index 3d46dedc7..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeF-focusScreen-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeF-off.png b/rtdata/images/Dark/actions/previewmodeF-off.png deleted file mode 100644 index 5d52af569..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeF-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeF-on.png b/rtdata/images/Dark/actions/previewmodeF-on.png deleted file mode 100644 index f0d0ef230..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeF-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeG-off.png b/rtdata/images/Dark/actions/previewmodeG-off.png deleted file mode 100644 index 5c076c989..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeG-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeG-on.png b/rtdata/images/Dark/actions/previewmodeG-on.png deleted file mode 100644 index ecc75c8e7..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeG-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeL-off.png b/rtdata/images/Dark/actions/previewmodeL-off.png deleted file mode 100644 index 939dec642..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeL-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeL-on.png b/rtdata/images/Dark/actions/previewmodeL-on.png deleted file mode 100644 index 92fe937e8..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeL-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeR-off.png b/rtdata/images/Dark/actions/previewmodeR-off.png deleted file mode 100644 index b96e22c31..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeR-off.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/previewmodeR-on.png b/rtdata/images/Dark/actions/previewmodeR-on.png deleted file mode 100644 index fb1e46e98..000000000 Binary files a/rtdata/images/Dark/actions/previewmodeR-on.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/processing-pause.png b/rtdata/images/Dark/actions/processing-pause.png deleted file mode 100644 index 967c4a339..000000000 Binary files a/rtdata/images/Dark/actions/processing-pause.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/processing-play.png b/rtdata/images/Dark/actions/processing-play.png deleted file mode 100644 index d959d4a7c..000000000 Binary files a/rtdata/images/Dark/actions/processing-play.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/processing-thumbnail.png b/rtdata/images/Dark/actions/processing-thumbnail.png deleted file mode 100644 index 15a8af3f1..000000000 Binary files a/rtdata/images/Dark/actions/processing-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/processing.png b/rtdata/images/Dark/actions/processing.png deleted file mode 100644 index 78592c44a..000000000 Binary files a/rtdata/images/Dark/actions/processing.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/profile-filled.png b/rtdata/images/Dark/actions/profile-filled.png deleted file mode 100644 index 8e39de5f2..000000000 Binary files a/rtdata/images/Dark/actions/profile-filled.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/profile-partial.png b/rtdata/images/Dark/actions/profile-partial.png deleted file mode 100644 index 70c77fdff..000000000 Binary files a/rtdata/images/Dark/actions/profile-partial.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rated.png b/rtdata/images/Dark/actions/rated.png deleted file mode 100644 index ff1b949d2..000000000 Binary files a/rtdata/images/Dark/actions/rated.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ratednot.png b/rtdata/images/Dark/actions/ratednot.png deleted file mode 100644 index 82af59b91..000000000 Binary files a/rtdata/images/Dark/actions/ratednot.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/ratednotg.png b/rtdata/images/Dark/actions/ratednotg.png deleted file mode 100644 index 4bf6f1a0c..000000000 Binary files a/rtdata/images/Dark/actions/ratednotg.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/raw.png b/rtdata/images/Dark/actions/raw.png deleted file mode 100644 index d42599483..000000000 Binary files a/rtdata/images/Dark/actions/raw.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/refresh-red.png b/rtdata/images/Dark/actions/refresh-red.png deleted file mode 100644 index 8850fe544..000000000 Binary files a/rtdata/images/Dark/actions/refresh-red.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/refresh-white.png b/rtdata/images/Dark/actions/refresh-white.png deleted file mode 100644 index 40f625275..000000000 Binary files a/rtdata/images/Dark/actions/refresh-white.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-left-1.png b/rtdata/images/Dark/actions/rotate-left-1.png deleted file mode 100644 index 937598ca3..000000000 Binary files a/rtdata/images/Dark/actions/rotate-left-1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-left-2.png b/rtdata/images/Dark/actions/rotate-left-2.png deleted file mode 100644 index 20b3ff5da..000000000 Binary files a/rtdata/images/Dark/actions/rotate-left-2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-left-3.png b/rtdata/images/Dark/actions/rotate-left-3.png deleted file mode 100644 index 635a50da6..000000000 Binary files a/rtdata/images/Dark/actions/rotate-left-3.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-left.png b/rtdata/images/Dark/actions/rotate-left.png deleted file mode 100644 index 2f28a8cff..000000000 Binary files a/rtdata/images/Dark/actions/rotate-left.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-right-1.png b/rtdata/images/Dark/actions/rotate-right-1.png deleted file mode 100644 index 5bd9960ad..000000000 Binary files a/rtdata/images/Dark/actions/rotate-right-1.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-right-2.png b/rtdata/images/Dark/actions/rotate-right-2.png deleted file mode 100644 index 5da99f01e..000000000 Binary files a/rtdata/images/Dark/actions/rotate-right-2.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-right-3.png b/rtdata/images/Dark/actions/rotate-right-3.png deleted file mode 100644 index 9d2dd0e4f..000000000 Binary files a/rtdata/images/Dark/actions/rotate-right-3.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rotate-right.png b/rtdata/images/Dark/actions/rotate-right.png deleted file mode 100644 index b28d601c5..000000000 Binary files a/rtdata/images/Dark/actions/rotate-right.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/rtwindow.png b/rtdata/images/Dark/actions/rtwindow.png deleted file mode 100644 index 8fcc7a7c4..000000000 Binary files a/rtdata/images/Dark/actions/rtwindow.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/softProof.png b/rtdata/images/Dark/actions/softProof.png deleted file mode 100644 index 5f17df3ea..000000000 Binary files a/rtdata/images/Dark/actions/softProof.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/spGamutCheck.png b/rtdata/images/Dark/actions/spGamutCheck.png deleted file mode 100644 index ab812272a..000000000 Binary files a/rtdata/images/Dark/actions/spGamutCheck.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/stock-flip-horizontal.png b/rtdata/images/Dark/actions/stock-flip-horizontal.png deleted file mode 100644 index a963c9d6f..000000000 Binary files a/rtdata/images/Dark/actions/stock-flip-horizontal.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/stock-flip-vertical.png b/rtdata/images/Dark/actions/stock-flip-vertical.png deleted file mode 100644 index 65779151a..000000000 Binary files a/rtdata/images/Dark/actions/stock-flip-vertical.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/stock-rotate-270.png b/rtdata/images/Dark/actions/stock-rotate-270.png deleted file mode 100644 index cb6d50093..000000000 Binary files a/rtdata/images/Dark/actions/stock-rotate-270.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/stock-rotate-90.png b/rtdata/images/Dark/actions/stock-rotate-90.png deleted file mode 100644 index bb697dc3a..000000000 Binary files a/rtdata/images/Dark/actions/stock-rotate-90.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/straighten-small.png b/rtdata/images/Dark/actions/straighten-small.png deleted file mode 100644 index b7a2be89e..000000000 Binary files a/rtdata/images/Dark/actions/straighten-small.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/straighten.png b/rtdata/images/Dark/actions/straighten.png deleted file mode 100644 index a1bfdf507..000000000 Binary files a/rtdata/images/Dark/actions/straighten.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/toleftend.png b/rtdata/images/Dark/actions/toleftend.png deleted file mode 100644 index a37b37d41..000000000 Binary files a/rtdata/images/Dark/actions/toleftend.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/torightend.png b/rtdata/images/Dark/actions/torightend.png deleted file mode 100644 index 3ae0d4edd..000000000 Binary files a/rtdata/images/Dark/actions/torightend.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/transform.png b/rtdata/images/Dark/actions/transform.png deleted file mode 100644 index ed030de57..000000000 Binary files a/rtdata/images/Dark/actions/transform.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/trash-hide-deleted.png b/rtdata/images/Dark/actions/trash-hide-deleted.png deleted file mode 100644 index 59137cf35..000000000 Binary files a/rtdata/images/Dark/actions/trash-hide-deleted.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/trash-show-empty.png b/rtdata/images/Dark/actions/trash-show-empty.png deleted file mode 100644 index 0c5da5cda..000000000 Binary files a/rtdata/images/Dark/actions/trash-show-empty.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/trash-show-full.png b/rtdata/images/Dark/actions/trash-show-full.png deleted file mode 100644 index cc374db46..000000000 Binary files a/rtdata/images/Dark/actions/trash-show-full.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/trash-thumbnail.png b/rtdata/images/Dark/actions/trash-thumbnail.png deleted file mode 100644 index fad0363e0..000000000 Binary files a/rtdata/images/Dark/actions/trash-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/trash.png b/rtdata/images/Dark/actions/trash.png deleted file mode 100644 index 0c5da5cda..000000000 Binary files a/rtdata/images/Dark/actions/trash.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/unchanged-18.png b/rtdata/images/Dark/actions/unchanged-18.png deleted file mode 100644 index 9d08dda26..000000000 Binary files a/rtdata/images/Dark/actions/unchanged-18.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/unchanged-22.png b/rtdata/images/Dark/actions/unchanged-22.png deleted file mode 100644 index db03d456a..000000000 Binary files a/rtdata/images/Dark/actions/unchanged-22.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/undelete-rtl.png b/rtdata/images/Dark/actions/undelete-rtl.png deleted file mode 100644 index c8e052aed..000000000 Binary files a/rtdata/images/Dark/actions/undelete-rtl.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/undelete-thumbnail-rtl.png b/rtdata/images/Dark/actions/undelete-thumbnail-rtl.png deleted file mode 100644 index adcf65e9a..000000000 Binary files a/rtdata/images/Dark/actions/undelete-thumbnail-rtl.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/undelete-thumbnail.png b/rtdata/images/Dark/actions/undelete-thumbnail.png deleted file mode 100644 index adcf65e9a..000000000 Binary files a/rtdata/images/Dark/actions/undelete-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/undelete.png b/rtdata/images/Dark/actions/undelete.png deleted file mode 100644 index c8e052aed..000000000 Binary files a/rtdata/images/Dark/actions/undelete.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/warnhl.png b/rtdata/images/Dark/actions/warnhl.png deleted file mode 100644 index 4ca870ec5..000000000 Binary files a/rtdata/images/Dark/actions/warnhl.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/warnsh.png b/rtdata/images/Dark/actions/warnsh.png deleted file mode 100644 index d8d558ccf..000000000 Binary files a/rtdata/images/Dark/actions/warnsh.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wavelet.png b/rtdata/images/Dark/actions/wavelet.png deleted file mode 100644 index 97f4ce673..000000000 Binary files a/rtdata/images/Dark/actions/wavelet.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-auto.png b/rtdata/images/Dark/actions/wb-auto.png deleted file mode 100644 index be4114604..000000000 Binary files a/rtdata/images/Dark/actions/wb-auto.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-camera.png b/rtdata/images/Dark/actions/wb-camera.png deleted file mode 100644 index 372fd14bb..000000000 Binary files a/rtdata/images/Dark/actions/wb-camera.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-cloudy.png b/rtdata/images/Dark/actions/wb-cloudy.png deleted file mode 100644 index cdef40096..000000000 Binary files a/rtdata/images/Dark/actions/wb-cloudy.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-custom.png b/rtdata/images/Dark/actions/wb-custom.png deleted file mode 100644 index cc7b6ef3c..000000000 Binary files a/rtdata/images/Dark/actions/wb-custom.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-flash.png b/rtdata/images/Dark/actions/wb-flash.png deleted file mode 100644 index e8115b3d4..000000000 Binary files a/rtdata/images/Dark/actions/wb-flash.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-fluorescent.png b/rtdata/images/Dark/actions/wb-fluorescent.png deleted file mode 100644 index 4861c54b4..000000000 Binary files a/rtdata/images/Dark/actions/wb-fluorescent.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-lamp.png b/rtdata/images/Dark/actions/wb-lamp.png deleted file mode 100644 index 5086e362b..000000000 Binary files a/rtdata/images/Dark/actions/wb-lamp.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-led.png b/rtdata/images/Dark/actions/wb-led.png deleted file mode 100644 index 749b2e703..000000000 Binary files a/rtdata/images/Dark/actions/wb-led.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-shade.png b/rtdata/images/Dark/actions/wb-shade.png deleted file mode 100644 index 3b908909c..000000000 Binary files a/rtdata/images/Dark/actions/wb-shade.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-sun.png b/rtdata/images/Dark/actions/wb-sun.png deleted file mode 100644 index 880fd13f0..000000000 Binary files a/rtdata/images/Dark/actions/wb-sun.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-tungsten.png b/rtdata/images/Dark/actions/wb-tungsten.png deleted file mode 100644 index 48aef24a3..000000000 Binary files a/rtdata/images/Dark/actions/wb-tungsten.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/wb-water.png b/rtdata/images/Dark/actions/wb-water.png deleted file mode 100644 index 196869abf..000000000 Binary files a/rtdata/images/Dark/actions/wb-water.png and /dev/null differ diff --git a/rtdata/images/Dark/actions/zoom-100-identifier.png b/rtdata/images/Dark/actions/zoom-100-identifier.png deleted file mode 100644 index 7452d50dd..000000000 Binary files a/rtdata/images/Dark/actions/zoom-100-identifier.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/computer.png b/rtdata/images/Dark/devices/computer.png deleted file mode 100644 index 4bd0885b7..000000000 Binary files a/rtdata/images/Dark/devices/computer.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/drive-harddisk.png b/rtdata/images/Dark/devices/drive-harddisk.png deleted file mode 100644 index 4bd0885b7..000000000 Binary files a/rtdata/images/Dark/devices/drive-harddisk.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/drive-optical.png b/rtdata/images/Dark/devices/drive-optical.png deleted file mode 100644 index b4d20cc2e..000000000 Binary files a/rtdata/images/Dark/devices/drive-optical.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/drive-removable-media.png b/rtdata/images/Dark/devices/drive-removable-media.png deleted file mode 100644 index ee41f6a5c..000000000 Binary files a/rtdata/images/Dark/devices/drive-removable-media.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/gtk-cdrom.png b/rtdata/images/Dark/devices/gtk-cdrom.png deleted file mode 100644 index b4d20cc2e..000000000 Binary files a/rtdata/images/Dark/devices/gtk-cdrom.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/media-flash.png b/rtdata/images/Dark/devices/media-flash.png deleted file mode 100644 index 4bd0885b7..000000000 Binary files a/rtdata/images/Dark/devices/media-flash.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/media-floppy.png b/rtdata/images/Dark/devices/media-floppy.png deleted file mode 100644 index ee41f6a5c..000000000 Binary files a/rtdata/images/Dark/devices/media-floppy.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/media-optical-bd.png b/rtdata/images/Dark/devices/media-optical-bd.png deleted file mode 100644 index b4d20cc2e..000000000 Binary files a/rtdata/images/Dark/devices/media-optical-bd.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/media-optical-dvd.png b/rtdata/images/Dark/devices/media-optical-dvd.png deleted file mode 100644 index b4d20cc2e..000000000 Binary files a/rtdata/images/Dark/devices/media-optical-dvd.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/media-optical.png b/rtdata/images/Dark/devices/media-optical.png deleted file mode 100644 index b4d20cc2e..000000000 Binary files a/rtdata/images/Dark/devices/media-optical.png and /dev/null differ diff --git a/rtdata/images/Dark/devices/media-tape.png b/rtdata/images/Dark/devices/media-tape.png deleted file mode 100644 index 4bd0885b7..000000000 Binary files a/rtdata/images/Dark/devices/media-tape.png and /dev/null differ diff --git a/rtdata/images/Dark/index.theme b/rtdata/images/Dark/index.theme deleted file mode 100644 index 8912f3f5d..000000000 --- a/rtdata/images/Dark/index.theme +++ /dev/null @@ -1,42 +0,0 @@ -[Icon Theme] -Name=RawTherapee-Dark -Comment=Dark theme for RawTherapee -Inherits=hicolor -Example=folder - -Directories=actions,apps,categories,devices,emblems,places,status - -[actions] -Size=22 -Context=Actions -Type=Fixed - -[apps] -Size=22 -Context=Applications -Type=Fixed - -[categories] -Size=22 -Context=Categories -Type=Fixed - -[devices] -Size=22 -Context=Devices -Type=Fixed - -[emblems] -Size=22 -Context=Emblems -Type=Fixed - -[places] -Size=22 -Context=Places -Type=Fixed - -[status] -Size=22 -Context=Status -Type=Fixed diff --git a/rtdata/images/Dark/places/folder.png b/rtdata/images/Dark/places/folder.png deleted file mode 100644 index cc268ed89..000000000 Binary files a/rtdata/images/Dark/places/folder.png and /dev/null differ diff --git a/rtdata/images/Dark/places/gtk-directory.png b/rtdata/images/Dark/places/gtk-directory.png deleted file mode 100644 index cc268ed89..000000000 Binary files a/rtdata/images/Dark/places/gtk-directory.png and /dev/null differ diff --git a/rtdata/images/Dark/places/user-desktop.png b/rtdata/images/Dark/places/user-desktop.png deleted file mode 100644 index e973ac169..000000000 Binary files a/rtdata/images/Dark/places/user-desktop.png and /dev/null differ diff --git a/rtdata/images/Dark/places/user-home.png b/rtdata/images/Dark/places/user-home.png deleted file mode 100644 index 93d09835d..000000000 Binary files a/rtdata/images/Dark/places/user-home.png and /dev/null differ diff --git a/rtdata/images/Light/actions/Chanmixer-Bgamma.png b/rtdata/images/Light/actions/Chanmixer-Bgamma.png deleted file mode 100644 index 95503a367..000000000 Binary files a/rtdata/images/Light/actions/Chanmixer-Bgamma.png and /dev/null differ diff --git a/rtdata/images/Light/actions/Chanmixer-Ggamma.png b/rtdata/images/Light/actions/Chanmixer-Ggamma.png deleted file mode 100644 index 13f937ae0..000000000 Binary files a/rtdata/images/Light/actions/Chanmixer-Ggamma.png and /dev/null differ diff --git a/rtdata/images/Light/actions/Chanmixer-Rgamma.png b/rtdata/images/Light/actions/Chanmixer-Rgamma.png deleted file mode 100644 index 5e423fe18..000000000 Binary files a/rtdata/images/Light/actions/Chanmixer-Rgamma.png and /dev/null differ diff --git a/rtdata/images/Light/actions/HDR-thumbnail.png b/rtdata/images/Light/actions/HDR-thumbnail.png deleted file mode 100644 index 182e603e8..000000000 Binary files a/rtdata/images/Light/actions/HDR-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Light/actions/PanelEnding.png b/rtdata/images/Light/actions/PanelEnding.png deleted file mode 100644 index d7c3cc37d..000000000 Binary files a/rtdata/images/Light/actions/PanelEnding.png and /dev/null differ diff --git a/rtdata/images/Light/actions/PixelShift-thumbnail.png b/rtdata/images/Light/actions/PixelShift-thumbnail.png deleted file mode 100644 index 4bbea1aee..000000000 Binary files a/rtdata/images/Light/actions/PixelShift-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-ca-blue1.png b/rtdata/images/Light/actions/ajd-ca-blue1.png deleted file mode 100644 index 7a47267df..000000000 Binary files a/rtdata/images/Light/actions/ajd-ca-blue1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-ca-blue2.png b/rtdata/images/Light/actions/ajd-ca-blue2.png deleted file mode 100644 index dfb458300..000000000 Binary files a/rtdata/images/Light/actions/ajd-ca-blue2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-ca-red1.png b/rtdata/images/Light/actions/ajd-ca-red1.png deleted file mode 100644 index 1e45c5035..000000000 Binary files a/rtdata/images/Light/actions/ajd-ca-red1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-ca-red2.png b/rtdata/images/Light/actions/ajd-ca-red2.png deleted file mode 100644 index e5da9e005..000000000 Binary files a/rtdata/images/Light/actions/ajd-ca-red2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-wb-bluered1.png b/rtdata/images/Light/actions/ajd-wb-bluered1.png deleted file mode 100644 index 3c8473451..000000000 Binary files a/rtdata/images/Light/actions/ajd-wb-bluered1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-wb-bluered2.png b/rtdata/images/Light/actions/ajd-wb-bluered2.png deleted file mode 100644 index 0f06a770e..000000000 Binary files a/rtdata/images/Light/actions/ajd-wb-bluered2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-wb-green1.png b/rtdata/images/Light/actions/ajd-wb-green1.png deleted file mode 100644 index 4f33551d6..000000000 Binary files a/rtdata/images/Light/actions/ajd-wb-green1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-wb-green2.png b/rtdata/images/Light/actions/ajd-wb-green2.png deleted file mode 100644 index a9a7e8553..000000000 Binary files a/rtdata/images/Light/actions/ajd-wb-green2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-wb-temp1.png b/rtdata/images/Light/actions/ajd-wb-temp1.png deleted file mode 100644 index 3c8473451..000000000 Binary files a/rtdata/images/Light/actions/ajd-wb-temp1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ajd-wb-temp2.png b/rtdata/images/Light/actions/ajd-wb-temp2.png deleted file mode 100644 index 2b0c7c0ef..000000000 Binary files a/rtdata/images/Light/actions/ajd-wb-temp2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-down-small.png b/rtdata/images/Light/actions/arrow-down-small.png deleted file mode 100644 index 21f25626c..000000000 Binary files a/rtdata/images/Light/actions/arrow-down-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-down.png b/rtdata/images/Light/actions/arrow-down.png deleted file mode 100644 index 36c366bd3..000000000 Binary files a/rtdata/images/Light/actions/arrow-down.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-left-small.png b/rtdata/images/Light/actions/arrow-left-small.png deleted file mode 100644 index 5dfd88f09..000000000 Binary files a/rtdata/images/Light/actions/arrow-left-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-left.png b/rtdata/images/Light/actions/arrow-left.png deleted file mode 100644 index 711ad1016..000000000 Binary files a/rtdata/images/Light/actions/arrow-left.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-right-small.png b/rtdata/images/Light/actions/arrow-right-small.png deleted file mode 100644 index 310e87b9c..000000000 Binary files a/rtdata/images/Light/actions/arrow-right-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-right.png b/rtdata/images/Light/actions/arrow-right.png deleted file mode 100644 index 933e84025..000000000 Binary files a/rtdata/images/Light/actions/arrow-right.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-up-small.png b/rtdata/images/Light/actions/arrow-up-small.png deleted file mode 100644 index 9b8884c5e..000000000 Binary files a/rtdata/images/Light/actions/arrow-up-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/arrow-up.png b/rtdata/images/Light/actions/arrow-up.png deleted file mode 100644 index df6b022a3..000000000 Binary files a/rtdata/images/Light/actions/arrow-up.png and /dev/null differ diff --git a/rtdata/images/Light/actions/atom.png b/rtdata/images/Light/actions/atom.png deleted file mode 100644 index 55feaf8d7..000000000 Binary files a/rtdata/images/Light/actions/atom.png and /dev/null differ diff --git a/rtdata/images/Light/actions/beforeafter.png b/rtdata/images/Light/actions/beforeafter.png deleted file mode 100644 index cdbc49dc4..000000000 Binary files a/rtdata/images/Light/actions/beforeafter.png and /dev/null differ diff --git a/rtdata/images/Light/actions/cglabel0.png b/rtdata/images/Light/actions/cglabel0.png deleted file mode 100644 index 72cb8f15b..000000000 Binary files a/rtdata/images/Light/actions/cglabel0.png and /dev/null differ diff --git a/rtdata/images/Light/actions/cglabel1.png b/rtdata/images/Light/actions/cglabel1.png deleted file mode 100644 index 6337a6476..000000000 Binary files a/rtdata/images/Light/actions/cglabel1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/cglabel2.png b/rtdata/images/Light/actions/cglabel2.png deleted file mode 100644 index a5b843c0c..000000000 Binary files a/rtdata/images/Light/actions/cglabel2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/cglabel3.png b/rtdata/images/Light/actions/cglabel3.png deleted file mode 100644 index a3f3da7a9..000000000 Binary files a/rtdata/images/Light/actions/cglabel3.png and /dev/null differ diff --git a/rtdata/images/Light/actions/cglabel4.png b/rtdata/images/Light/actions/cglabel4.png deleted file mode 100644 index 3e048f36c..000000000 Binary files a/rtdata/images/Light/actions/cglabel4.png and /dev/null differ diff --git a/rtdata/images/Light/actions/cglabel5.png b/rtdata/images/Light/actions/cglabel5.png deleted file mode 100644 index 323be0cb9..000000000 Binary files a/rtdata/images/Light/actions/cglabel5.png and /dev/null differ diff --git a/rtdata/images/Light/actions/clabel0.png b/rtdata/images/Light/actions/clabel0.png deleted file mode 100644 index 64de8ead0..000000000 Binary files a/rtdata/images/Light/actions/clabel0.png and /dev/null differ diff --git a/rtdata/images/Light/actions/clabel1.png b/rtdata/images/Light/actions/clabel1.png deleted file mode 100644 index 73e267c2a..000000000 Binary files a/rtdata/images/Light/actions/clabel1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/clabel2.png b/rtdata/images/Light/actions/clabel2.png deleted file mode 100644 index 3e6eca725..000000000 Binary files a/rtdata/images/Light/actions/clabel2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/clabel3.png b/rtdata/images/Light/actions/clabel3.png deleted file mode 100644 index e291a0df6..000000000 Binary files a/rtdata/images/Light/actions/clabel3.png and /dev/null differ diff --git a/rtdata/images/Light/actions/clabel4.png b/rtdata/images/Light/actions/clabel4.png deleted file mode 100644 index 89066bc43..000000000 Binary files a/rtdata/images/Light/actions/clabel4.png and /dev/null differ diff --git a/rtdata/images/Light/actions/clabel5.png b/rtdata/images/Light/actions/clabel5.png deleted file mode 100644 index 9944eaf69..000000000 Binary files a/rtdata/images/Light/actions/clabel5.png and /dev/null differ diff --git a/rtdata/images/Light/actions/closedhand.png b/rtdata/images/Light/actions/closedhand.png deleted file mode 100644 index a1aea95f2..000000000 Binary files a/rtdata/images/Light/actions/closedhand.png and /dev/null differ diff --git a/rtdata/images/Light/actions/colorPickers-hide.png b/rtdata/images/Light/actions/colorPickers-hide.png deleted file mode 100644 index 434087f1c..000000000 Binary files a/rtdata/images/Light/actions/colorPickers-hide.png and /dev/null differ diff --git a/rtdata/images/Light/actions/colorPickers-show.png b/rtdata/images/Light/actions/colorPickers-show.png deleted file mode 100644 index d93deb3eb..000000000 Binary files a/rtdata/images/Light/actions/colorPickers-show.png and /dev/null differ diff --git a/rtdata/images/Light/actions/colour.png b/rtdata/images/Light/actions/colour.png deleted file mode 100644 index d473e8a0b..000000000 Binary files a/rtdata/images/Light/actions/colour.png and /dev/null differ diff --git a/rtdata/images/Light/actions/crop-auto.png b/rtdata/images/Light/actions/crop-auto.png deleted file mode 100644 index a4c6c897e..000000000 Binary files a/rtdata/images/Light/actions/crop-auto.png and /dev/null differ diff --git a/rtdata/images/Light/actions/crop.png b/rtdata/images/Light/actions/crop.png deleted file mode 100644 index 16ca56996..000000000 Binary files a/rtdata/images/Light/actions/crop.png and /dev/null differ diff --git a/rtdata/images/Light/actions/crossed-arrows-in.png b/rtdata/images/Light/actions/crossed-arrows-in.png deleted file mode 100644 index da0e44b8b..000000000 Binary files a/rtdata/images/Light/actions/crossed-arrows-in.png and /dev/null differ diff --git a/rtdata/images/Light/actions/crossed-arrows-out.png b/rtdata/images/Light/actions/crossed-arrows-out.png deleted file mode 100644 index 8bc1a8819..000000000 Binary files a/rtdata/images/Light/actions/crossed-arrows-out.png and /dev/null differ diff --git a/rtdata/images/Light/actions/curveType-NURBS.png b/rtdata/images/Light/actions/curveType-NURBS.png deleted file mode 100644 index 2a025b1ba..000000000 Binary files a/rtdata/images/Light/actions/curveType-NURBS.png and /dev/null differ diff --git a/rtdata/images/Light/actions/curveType-controlPoints.png b/rtdata/images/Light/actions/curveType-controlPoints.png deleted file mode 100644 index eae5a3875..000000000 Binary files a/rtdata/images/Light/actions/curveType-controlPoints.png and /dev/null differ diff --git a/rtdata/images/Light/actions/curveType-flatLinear.png b/rtdata/images/Light/actions/curveType-flatLinear.png deleted file mode 100644 index 6fb01eba8..000000000 Binary files a/rtdata/images/Light/actions/curveType-flatLinear.png and /dev/null differ diff --git a/rtdata/images/Light/actions/curveType-linear.png b/rtdata/images/Light/actions/curveType-linear.png deleted file mode 100644 index f58b3ab51..000000000 Binary files a/rtdata/images/Light/actions/curveType-linear.png and /dev/null differ diff --git a/rtdata/images/Light/actions/curveType-parametric.png b/rtdata/images/Light/actions/curveType-parametric.png deleted file mode 100644 index 287a37ab0..000000000 Binary files a/rtdata/images/Light/actions/curveType-parametric.png and /dev/null differ diff --git a/rtdata/images/Light/actions/curveType-spline.png b/rtdata/images/Light/actions/curveType-spline.png deleted file mode 100644 index e3e5e08d9..000000000 Binary files a/rtdata/images/Light/actions/curveType-spline.png and /dev/null differ diff --git a/rtdata/images/Light/actions/detail.png b/rtdata/images/Light/actions/detail.png deleted file mode 100644 index 1fc314fd3..000000000 Binary files a/rtdata/images/Light/actions/detail.png and /dev/null differ diff --git a/rtdata/images/Light/actions/distorsion.png b/rtdata/images/Light/actions/distorsion.png deleted file mode 100644 index 18b4a01df..000000000 Binary files a/rtdata/images/Light/actions/distorsion.png and /dev/null differ diff --git a/rtdata/images/Light/actions/distortion-auto.png b/rtdata/images/Light/actions/distortion-auto.png deleted file mode 100644 index 759c8e463..000000000 Binary files a/rtdata/images/Light/actions/distortion-auto.png and /dev/null differ diff --git a/rtdata/images/Light/actions/distortion-barrel.png b/rtdata/images/Light/actions/distortion-barrel.png deleted file mode 100644 index 836be0ac2..000000000 Binary files a/rtdata/images/Light/actions/distortion-barrel.png and /dev/null differ diff --git a/rtdata/images/Light/actions/distortion-pincushion.png b/rtdata/images/Light/actions/distortion-pincushion.png deleted file mode 100644 index f64574151..000000000 Binary files a/rtdata/images/Light/actions/distortion-pincushion.png and /dev/null differ diff --git a/rtdata/images/Light/actions/document-open-recent.png b/rtdata/images/Light/actions/document-open-recent.png deleted file mode 100644 index 5ef8724f2..000000000 Binary files a/rtdata/images/Light/actions/document-open-recent.png and /dev/null differ diff --git a/rtdata/images/Light/actions/document-open.png b/rtdata/images/Light/actions/document-open.png deleted file mode 100644 index f7b57849a..000000000 Binary files a/rtdata/images/Light/actions/document-open.png and /dev/null differ diff --git a/rtdata/images/Light/actions/edit-copy.png b/rtdata/images/Light/actions/edit-copy.png deleted file mode 100644 index 12e49387f..000000000 Binary files a/rtdata/images/Light/actions/edit-copy.png and /dev/null differ diff --git a/rtdata/images/Light/actions/edit-find.png b/rtdata/images/Light/actions/edit-find.png deleted file mode 100644 index d15687e7d..000000000 Binary files a/rtdata/images/Light/actions/edit-find.png and /dev/null differ diff --git a/rtdata/images/Light/actions/edit-paste.png b/rtdata/images/Light/actions/edit-paste.png deleted file mode 100644 index d7e924562..000000000 Binary files a/rtdata/images/Light/actions/edit-paste.png and /dev/null differ diff --git a/rtdata/images/Light/actions/edited-small.png b/rtdata/images/Light/actions/edited-small.png deleted file mode 100644 index f25997a59..000000000 Binary files a/rtdata/images/Light/actions/edited-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/edited.png b/rtdata/images/Light/actions/edited.png deleted file mode 100644 index 95d058454..000000000 Binary files a/rtdata/images/Light/actions/edited.png and /dev/null differ diff --git a/rtdata/images/Light/actions/editedg-small.png b/rtdata/images/Light/actions/editedg-small.png deleted file mode 100644 index 9eb229e75..000000000 Binary files a/rtdata/images/Light/actions/editedg-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/editednot-small.png b/rtdata/images/Light/actions/editednot-small.png deleted file mode 100644 index 410bff81b..000000000 Binary files a/rtdata/images/Light/actions/editednot-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/editednotg-small.png b/rtdata/images/Light/actions/editednotg-small.png deleted file mode 100644 index 55bc28f2b..000000000 Binary files a/rtdata/images/Light/actions/editednotg-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/editmodehand.png b/rtdata/images/Light/actions/editmodehand.png deleted file mode 100644 index a3ec816bb..000000000 Binary files a/rtdata/images/Light/actions/editmodehand.png and /dev/null differ diff --git a/rtdata/images/Light/actions/equalizer-narrow.png b/rtdata/images/Light/actions/equalizer-narrow.png deleted file mode 100644 index c9e2c5b26..000000000 Binary files a/rtdata/images/Light/actions/equalizer-narrow.png and /dev/null differ diff --git a/rtdata/images/Light/actions/equalizer-wide.png b/rtdata/images/Light/actions/equalizer-wide.png deleted file mode 100644 index f5b0aca68..000000000 Binary files a/rtdata/images/Light/actions/equalizer-wide.png and /dev/null differ diff --git a/rtdata/images/Light/actions/expanderClosed.png b/rtdata/images/Light/actions/expanderClosed.png deleted file mode 100644 index 81a7d85ab..000000000 Binary files a/rtdata/images/Light/actions/expanderClosed.png and /dev/null differ diff --git a/rtdata/images/Light/actions/expanderDisabled.png b/rtdata/images/Light/actions/expanderDisabled.png deleted file mode 100644 index 8fcef1b01..000000000 Binary files a/rtdata/images/Light/actions/expanderDisabled.png and /dev/null differ diff --git a/rtdata/images/Light/actions/expanderEnabled.png b/rtdata/images/Light/actions/expanderEnabled.png deleted file mode 100644 index 7e2006eb3..000000000 Binary files a/rtdata/images/Light/actions/expanderEnabled.png and /dev/null differ diff --git a/rtdata/images/Light/actions/expanderInconsistent.png b/rtdata/images/Light/actions/expanderInconsistent.png deleted file mode 100644 index 3c2339b60..000000000 Binary files a/rtdata/images/Light/actions/expanderInconsistent.png and /dev/null differ diff --git a/rtdata/images/Light/actions/expanderOpened.png b/rtdata/images/Light/actions/expanderOpened.png deleted file mode 100644 index 5b003e3f7..000000000 Binary files a/rtdata/images/Light/actions/expanderOpened.png and /dev/null differ diff --git a/rtdata/images/Light/actions/exposure.png b/rtdata/images/Light/actions/exposure.png deleted file mode 100644 index 8675d8e15..000000000 Binary files a/rtdata/images/Light/actions/exposure.png and /dev/null differ diff --git a/rtdata/images/Light/actions/filter-original-1.png b/rtdata/images/Light/actions/filter-original-1.png deleted file mode 100644 index 2daef11fb..000000000 Binary files a/rtdata/images/Light/actions/filter-original-1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/filter-original-2.png b/rtdata/images/Light/actions/filter-original-2.png deleted file mode 100644 index 37727f3be..000000000 Binary files a/rtdata/images/Light/actions/filter-original-2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/filter.png b/rtdata/images/Light/actions/filter.png deleted file mode 100644 index 7c69d18ee..000000000 Binary files a/rtdata/images/Light/actions/filter.png and /dev/null differ diff --git a/rtdata/images/Light/actions/filterclear.png b/rtdata/images/Light/actions/filterclear.png deleted file mode 100644 index bd4f651f8..000000000 Binary files a/rtdata/images/Light/actions/filterclear.png and /dev/null differ diff --git a/rtdata/images/Light/actions/fullscreen-exit.png b/rtdata/images/Light/actions/fullscreen-exit.png deleted file mode 100644 index 01df3044c..000000000 Binary files a/rtdata/images/Light/actions/fullscreen-exit.png and /dev/null differ diff --git a/rtdata/images/Light/actions/fullscreen.png b/rtdata/images/Light/actions/fullscreen.png deleted file mode 100644 index e08067584..000000000 Binary files a/rtdata/images/Light/actions/fullscreen.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gamut-hist.png b/rtdata/images/Light/actions/gamut-hist.png deleted file mode 100644 index 8c81e0213..000000000 Binary files a/rtdata/images/Light/actions/gamut-hist.png and /dev/null differ diff --git a/rtdata/images/Light/actions/grayrated.png b/rtdata/images/Light/actions/grayrated.png deleted file mode 100644 index 813af1cee..000000000 Binary files a/rtdata/images/Light/actions/grayrated.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-add.png b/rtdata/images/Light/actions/gtk-add.png deleted file mode 100644 index 9a982056c..000000000 Binary files a/rtdata/images/Light/actions/gtk-add.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-apply.png b/rtdata/images/Light/actions/gtk-apply.png deleted file mode 100644 index e1224bca3..000000000 Binary files a/rtdata/images/Light/actions/gtk-apply.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-cancel.png b/rtdata/images/Light/actions/gtk-cancel.png deleted file mode 100644 index 65740aaf1..000000000 Binary files a/rtdata/images/Light/actions/gtk-cancel.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-close-small.png b/rtdata/images/Light/actions/gtk-close-small.png deleted file mode 100644 index ef2ac03d8..000000000 Binary files a/rtdata/images/Light/actions/gtk-close-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-close.png b/rtdata/images/Light/actions/gtk-close.png deleted file mode 100644 index 65740aaf1..000000000 Binary files a/rtdata/images/Light/actions/gtk-close.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-color-picker-add.png b/rtdata/images/Light/actions/gtk-color-picker-add.png deleted file mode 100644 index 01d2b6a0b..000000000 Binary files a/rtdata/images/Light/actions/gtk-color-picker-add.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-color-picker-small.png b/rtdata/images/Light/actions/gtk-color-picker-small.png deleted file mode 100644 index 834848607..000000000 Binary files a/rtdata/images/Light/actions/gtk-color-picker-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-color-picker.png b/rtdata/images/Light/actions/gtk-color-picker.png deleted file mode 100644 index f2fbc5cf9..000000000 Binary files a/rtdata/images/Light/actions/gtk-color-picker.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-copy.png b/rtdata/images/Light/actions/gtk-copy.png deleted file mode 100644 index 12e49387f..000000000 Binary files a/rtdata/images/Light/actions/gtk-copy.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-edit.png b/rtdata/images/Light/actions/gtk-edit.png deleted file mode 100644 index d76e57227..000000000 Binary files a/rtdata/images/Light/actions/gtk-edit.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-find.png b/rtdata/images/Light/actions/gtk-find.png deleted file mode 100644 index d15687e7d..000000000 Binary files a/rtdata/images/Light/actions/gtk-find.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-media-play.png b/rtdata/images/Light/actions/gtk-media-play.png deleted file mode 100644 index 2f97b3fec..000000000 Binary files a/rtdata/images/Light/actions/gtk-media-play.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-media-stop.png b/rtdata/images/Light/actions/gtk-media-stop.png deleted file mode 100644 index ea1b0e8a1..000000000 Binary files a/rtdata/images/Light/actions/gtk-media-stop.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-ok.png b/rtdata/images/Light/actions/gtk-ok.png deleted file mode 100644 index e1224bca3..000000000 Binary files a/rtdata/images/Light/actions/gtk-ok.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-open.png b/rtdata/images/Light/actions/gtk-open.png deleted file mode 100644 index f7b57849a..000000000 Binary files a/rtdata/images/Light/actions/gtk-open.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-paste.png b/rtdata/images/Light/actions/gtk-paste.png deleted file mode 100644 index d7e924562..000000000 Binary files a/rtdata/images/Light/actions/gtk-paste.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-preferences.png b/rtdata/images/Light/actions/gtk-preferences.png deleted file mode 100644 index edb354e1a..000000000 Binary files a/rtdata/images/Light/actions/gtk-preferences.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-remove.png b/rtdata/images/Light/actions/gtk-remove.png deleted file mode 100644 index f198bce68..000000000 Binary files a/rtdata/images/Light/actions/gtk-remove.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-save-large.png b/rtdata/images/Light/actions/gtk-save-large.png deleted file mode 100644 index a55dfe04c..000000000 Binary files a/rtdata/images/Light/actions/gtk-save-large.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-save.png b/rtdata/images/Light/actions/gtk-save.png deleted file mode 100644 index 64f9e44a2..000000000 Binary files a/rtdata/images/Light/actions/gtk-save.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-undo-ltr-small.png b/rtdata/images/Light/actions/gtk-undo-ltr-small.png deleted file mode 100644 index 86d0fa28f..000000000 Binary files a/rtdata/images/Light/actions/gtk-undo-ltr-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-undo-ltr.png b/rtdata/images/Light/actions/gtk-undo-ltr.png deleted file mode 100644 index ee15060e9..000000000 Binary files a/rtdata/images/Light/actions/gtk-undo-ltr.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-undo-rtl-small.png b/rtdata/images/Light/actions/gtk-undo-rtl-small.png deleted file mode 100644 index f8b4d4586..000000000 Binary files a/rtdata/images/Light/actions/gtk-undo-rtl-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-undo-rtl.png b/rtdata/images/Light/actions/gtk-undo-rtl.png deleted file mode 100644 index 22c6f2212..000000000 Binary files a/rtdata/images/Light/actions/gtk-undo-rtl.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-undoall-ltr.png b/rtdata/images/Light/actions/gtk-undoall-ltr.png deleted file mode 100644 index dca3f3d01..000000000 Binary files a/rtdata/images/Light/actions/gtk-undoall-ltr.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-undoall-rtl.png b/rtdata/images/Light/actions/gtk-undoall-rtl.png deleted file mode 100644 index ac051c8e6..000000000 Binary files a/rtdata/images/Light/actions/gtk-undoall-rtl.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-100-small.png b/rtdata/images/Light/actions/gtk-zoom-100-small.png deleted file mode 100644 index 23e694f6e..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-100-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-100.png b/rtdata/images/Light/actions/gtk-zoom-100.png deleted file mode 100644 index 656274a75..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-100.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-crop.png b/rtdata/images/Light/actions/gtk-zoom-crop.png deleted file mode 100644 index c83bac4fe..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-crop.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-fit.png b/rtdata/images/Light/actions/gtk-zoom-fit.png deleted file mode 100644 index 7f3452eed..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-fit.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-in-small.png b/rtdata/images/Light/actions/gtk-zoom-in-small.png deleted file mode 100644 index f5e381ca8..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-in-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-in.png b/rtdata/images/Light/actions/gtk-zoom-in.png deleted file mode 100644 index 0cafb1e36..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-in.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-out-small.png b/rtdata/images/Light/actions/gtk-zoom-out-small.png deleted file mode 100644 index 4605917bc..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-out-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/gtk-zoom-out.png b/rtdata/images/Light/actions/gtk-zoom-out.png deleted file mode 100644 index f3d914d93..000000000 Binary files a/rtdata/images/Light/actions/gtk-zoom-out.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histBar.png b/rtdata/images/Light/actions/histBar.png deleted file mode 100644 index 84bbecad8..000000000 Binary files a/rtdata/images/Light/actions/histBar.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histBarg.png b/rtdata/images/Light/actions/histBarg.png deleted file mode 100644 index 789ee931c..000000000 Binary files a/rtdata/images/Light/actions/histBarg.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histBlue.png b/rtdata/images/Light/actions/histBlue.png deleted file mode 100644 index 53c447a1c..000000000 Binary files a/rtdata/images/Light/actions/histBlue.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histBlueg.png b/rtdata/images/Light/actions/histBlueg.png deleted file mode 100644 index ac205219d..000000000 Binary files a/rtdata/images/Light/actions/histBlueg.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histChro.png b/rtdata/images/Light/actions/histChro.png deleted file mode 100644 index efbf75aa5..000000000 Binary files a/rtdata/images/Light/actions/histChro.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histChrog.png b/rtdata/images/Light/actions/histChrog.png deleted file mode 100644 index 8349d5089..000000000 Binary files a/rtdata/images/Light/actions/histChrog.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histFull.png b/rtdata/images/Light/actions/histFull.png deleted file mode 100644 index edabaa2bd..000000000 Binary files a/rtdata/images/Light/actions/histFull.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histFullg.png b/rtdata/images/Light/actions/histFullg.png deleted file mode 100644 index ce3cf8ddc..000000000 Binary files a/rtdata/images/Light/actions/histFullg.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histGreen.png b/rtdata/images/Light/actions/histGreen.png deleted file mode 100644 index 54eebe37e..000000000 Binary files a/rtdata/images/Light/actions/histGreen.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histGreeng.png b/rtdata/images/Light/actions/histGreeng.png deleted file mode 100644 index 33c138cae..000000000 Binary files a/rtdata/images/Light/actions/histGreeng.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histRaw.png b/rtdata/images/Light/actions/histRaw.png deleted file mode 100644 index 36e1a5a31..000000000 Binary files a/rtdata/images/Light/actions/histRaw.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histRawg.png b/rtdata/images/Light/actions/histRawg.png deleted file mode 100644 index 1b9d286b3..000000000 Binary files a/rtdata/images/Light/actions/histRawg.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histRed.png b/rtdata/images/Light/actions/histRed.png deleted file mode 100644 index ce7fddcd3..000000000 Binary files a/rtdata/images/Light/actions/histRed.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histRedg.png b/rtdata/images/Light/actions/histRedg.png deleted file mode 100644 index b75a66995..000000000 Binary files a/rtdata/images/Light/actions/histRedg.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histValue.png b/rtdata/images/Light/actions/histValue.png deleted file mode 100644 index 7f807ec9b..000000000 Binary files a/rtdata/images/Light/actions/histValue.png and /dev/null differ diff --git a/rtdata/images/Light/actions/histValueg.png b/rtdata/images/Light/actions/histValueg.png deleted file mode 100644 index 28f5dbe18..000000000 Binary files a/rtdata/images/Light/actions/histValueg.png and /dev/null differ diff --git a/rtdata/images/Light/actions/image-editor.png b/rtdata/images/Light/actions/image-editor.png deleted file mode 100644 index 3061ad89e..000000000 Binary files a/rtdata/images/Light/actions/image-editor.png and /dev/null differ diff --git a/rtdata/images/Light/actions/info.png b/rtdata/images/Light/actions/info.png deleted file mode 100644 index db3f654de..000000000 Binary files a/rtdata/images/Light/actions/info.png and /dev/null differ diff --git a/rtdata/images/Light/actions/intent-absolute.png b/rtdata/images/Light/actions/intent-absolute.png deleted file mode 100644 index fb5919181..000000000 Binary files a/rtdata/images/Light/actions/intent-absolute.png and /dev/null differ diff --git a/rtdata/images/Light/actions/intent-perceptual.png b/rtdata/images/Light/actions/intent-perceptual.png deleted file mode 100644 index 88de7b5e9..000000000 Binary files a/rtdata/images/Light/actions/intent-perceptual.png and /dev/null differ diff --git a/rtdata/images/Light/actions/intent-relative.png b/rtdata/images/Light/actions/intent-relative.png deleted file mode 100644 index f952f4ab7..000000000 Binary files a/rtdata/images/Light/actions/intent-relative.png and /dev/null differ diff --git a/rtdata/images/Light/actions/intent-saturation.png b/rtdata/images/Light/actions/intent-saturation.png deleted file mode 100644 index 92908b030..000000000 Binary files a/rtdata/images/Light/actions/intent-saturation.png and /dev/null differ diff --git a/rtdata/images/Light/actions/list-add-small.png b/rtdata/images/Light/actions/list-add-small.png deleted file mode 100644 index 9d06f0303..000000000 Binary files a/rtdata/images/Light/actions/list-add-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/list-add.png b/rtdata/images/Light/actions/list-add.png deleted file mode 100644 index 9a982056c..000000000 Binary files a/rtdata/images/Light/actions/list-add.png and /dev/null differ diff --git a/rtdata/images/Light/actions/list-remove-red-small.png b/rtdata/images/Light/actions/list-remove-red-small.png deleted file mode 100644 index 866a2b2d2..000000000 Binary files a/rtdata/images/Light/actions/list-remove-red-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/list-remove.png b/rtdata/images/Light/actions/list-remove.png deleted file mode 100644 index f198bce68..000000000 Binary files a/rtdata/images/Light/actions/list-remove.png and /dev/null differ diff --git a/rtdata/images/Light/actions/lock-off.png b/rtdata/images/Light/actions/lock-off.png deleted file mode 100644 index af4489e34..000000000 Binary files a/rtdata/images/Light/actions/lock-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/lock-on.png b/rtdata/images/Light/actions/lock-on.png deleted file mode 100644 index 3c664e73e..000000000 Binary files a/rtdata/images/Light/actions/lock-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/media-usb.png b/rtdata/images/Light/actions/media-usb.png deleted file mode 100644 index e8b990a03..000000000 Binary files a/rtdata/images/Light/actions/media-usb.png and /dev/null differ diff --git a/rtdata/images/Light/actions/meta.png b/rtdata/images/Light/actions/meta.png deleted file mode 100644 index a2f61665a..000000000 Binary files a/rtdata/images/Light/actions/meta.png and /dev/null differ diff --git a/rtdata/images/Light/actions/nav-next.png b/rtdata/images/Light/actions/nav-next.png deleted file mode 100644 index d68e1df60..000000000 Binary files a/rtdata/images/Light/actions/nav-next.png and /dev/null differ diff --git a/rtdata/images/Light/actions/nav-prev.png b/rtdata/images/Light/actions/nav-prev.png deleted file mode 100644 index ad37367ba..000000000 Binary files a/rtdata/images/Light/actions/nav-prev.png and /dev/null differ diff --git a/rtdata/images/Light/actions/nav-sync.png b/rtdata/images/Light/actions/nav-sync.png deleted file mode 100644 index eb8445a40..000000000 Binary files a/rtdata/images/Light/actions/nav-sync.png and /dev/null differ diff --git a/rtdata/images/Light/actions/new-detail-window.png b/rtdata/images/Light/actions/new-detail-window.png deleted file mode 100644 index 23ae12faf..000000000 Binary files a/rtdata/images/Light/actions/new-detail-window.png and /dev/null differ diff --git a/rtdata/images/Light/actions/openhand.png b/rtdata/images/Light/actions/openhand.png deleted file mode 100644 index 28da9e5e6..000000000 Binary files a/rtdata/images/Light/actions/openhand.png and /dev/null differ diff --git a/rtdata/images/Light/actions/panel-to-bottom.png b/rtdata/images/Light/actions/panel-to-bottom.png deleted file mode 100644 index cc3b45b64..000000000 Binary files a/rtdata/images/Light/actions/panel-to-bottom.png and /dev/null differ diff --git a/rtdata/images/Light/actions/panel-to-left.png b/rtdata/images/Light/actions/panel-to-left.png deleted file mode 100644 index 2562b8f00..000000000 Binary files a/rtdata/images/Light/actions/panel-to-left.png and /dev/null differ diff --git a/rtdata/images/Light/actions/panel-to-right.png b/rtdata/images/Light/actions/panel-to-right.png deleted file mode 100644 index 3e05a3813..000000000 Binary files a/rtdata/images/Light/actions/panel-to-right.png and /dev/null differ diff --git a/rtdata/images/Light/actions/panel-to-top.png b/rtdata/images/Light/actions/panel-to-top.png deleted file mode 100644 index ff453efac..000000000 Binary files a/rtdata/images/Light/actions/panel-to-top.png and /dev/null differ diff --git a/rtdata/images/Light/actions/perspective-h1.png b/rtdata/images/Light/actions/perspective-h1.png deleted file mode 100644 index c857a1df5..000000000 Binary files a/rtdata/images/Light/actions/perspective-h1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/perspective-h2.png b/rtdata/images/Light/actions/perspective-h2.png deleted file mode 100644 index 0fb23ea9c..000000000 Binary files a/rtdata/images/Light/actions/perspective-h2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/perspective-v1.png b/rtdata/images/Light/actions/perspective-v1.png deleted file mode 100644 index eb94f4b9b..000000000 Binary files a/rtdata/images/Light/actions/perspective-v1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/perspective-v2.png b/rtdata/images/Light/actions/perspective-v2.png deleted file mode 100644 index 1b983a78d..000000000 Binary files a/rtdata/images/Light/actions/perspective-v2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/popuparrow.png b/rtdata/images/Light/actions/popuparrow.png deleted file mode 100644 index ba3956421..000000000 Binary files a/rtdata/images/Light/actions/popuparrow.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeB-off.png b/rtdata/images/Light/actions/previewmodeB-off.png deleted file mode 100644 index 0c9890437..000000000 Binary files a/rtdata/images/Light/actions/previewmodeB-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeB-on.png b/rtdata/images/Light/actions/previewmodeB-on.png deleted file mode 100644 index 466192b3a..000000000 Binary files a/rtdata/images/Light/actions/previewmodeB-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC0-off.png b/rtdata/images/Light/actions/previewmodeBC0-off.png deleted file mode 100644 index 28c024555..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC0-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC0-on.png b/rtdata/images/Light/actions/previewmodeBC0-on.png deleted file mode 100644 index f5e0b8000..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC0-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC1-off.png b/rtdata/images/Light/actions/previewmodeBC1-off.png deleted file mode 100644 index 4ac160b05..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC1-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC1-on.png b/rtdata/images/Light/actions/previewmodeBC1-on.png deleted file mode 100644 index 3e9b6874c..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC1-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC2-off.png b/rtdata/images/Light/actions/previewmodeBC2-off.png deleted file mode 100644 index bf3d97b2d..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC2-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC2-on.png b/rtdata/images/Light/actions/previewmodeBC2-on.png deleted file mode 100644 index 457453166..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC2-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC3-off.png b/rtdata/images/Light/actions/previewmodeBC3-off.png deleted file mode 100644 index 487ec777e..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC3-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeBC3-on.png b/rtdata/images/Light/actions/previewmodeBC3-on.png deleted file mode 100644 index 670b5b8b4..000000000 Binary files a/rtdata/images/Light/actions/previewmodeBC3-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeF-focusScreen-off.png b/rtdata/images/Light/actions/previewmodeF-focusScreen-off.png deleted file mode 100644 index 0aa81a705..000000000 Binary files a/rtdata/images/Light/actions/previewmodeF-focusScreen-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeF-focusScreen-on.png b/rtdata/images/Light/actions/previewmodeF-focusScreen-on.png deleted file mode 100644 index 3d46dedc7..000000000 Binary files a/rtdata/images/Light/actions/previewmodeF-focusScreen-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeF-off.png b/rtdata/images/Light/actions/previewmodeF-off.png deleted file mode 100644 index 5d52af569..000000000 Binary files a/rtdata/images/Light/actions/previewmodeF-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeF-on.png b/rtdata/images/Light/actions/previewmodeF-on.png deleted file mode 100644 index f0d0ef230..000000000 Binary files a/rtdata/images/Light/actions/previewmodeF-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeG-off.png b/rtdata/images/Light/actions/previewmodeG-off.png deleted file mode 100644 index 5c076c989..000000000 Binary files a/rtdata/images/Light/actions/previewmodeG-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeG-on.png b/rtdata/images/Light/actions/previewmodeG-on.png deleted file mode 100644 index ecc75c8e7..000000000 Binary files a/rtdata/images/Light/actions/previewmodeG-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeL-off.png b/rtdata/images/Light/actions/previewmodeL-off.png deleted file mode 100644 index 939dec642..000000000 Binary files a/rtdata/images/Light/actions/previewmodeL-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeL-on.png b/rtdata/images/Light/actions/previewmodeL-on.png deleted file mode 100644 index 92fe937e8..000000000 Binary files a/rtdata/images/Light/actions/previewmodeL-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeR-off.png b/rtdata/images/Light/actions/previewmodeR-off.png deleted file mode 100644 index b96e22c31..000000000 Binary files a/rtdata/images/Light/actions/previewmodeR-off.png and /dev/null differ diff --git a/rtdata/images/Light/actions/previewmodeR-on.png b/rtdata/images/Light/actions/previewmodeR-on.png deleted file mode 100644 index fb1e46e98..000000000 Binary files a/rtdata/images/Light/actions/previewmodeR-on.png and /dev/null differ diff --git a/rtdata/images/Light/actions/processing-pause.png b/rtdata/images/Light/actions/processing-pause.png deleted file mode 100644 index 36660d7e6..000000000 Binary files a/rtdata/images/Light/actions/processing-pause.png and /dev/null differ diff --git a/rtdata/images/Light/actions/processing-play.png b/rtdata/images/Light/actions/processing-play.png deleted file mode 100644 index 5e1acbac7..000000000 Binary files a/rtdata/images/Light/actions/processing-play.png and /dev/null differ diff --git a/rtdata/images/Light/actions/processing-thumbnail.png b/rtdata/images/Light/actions/processing-thumbnail.png deleted file mode 100644 index c95ce2ffa..000000000 Binary files a/rtdata/images/Light/actions/processing-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Light/actions/processing.png b/rtdata/images/Light/actions/processing.png deleted file mode 100644 index 28a598856..000000000 Binary files a/rtdata/images/Light/actions/processing.png and /dev/null differ diff --git a/rtdata/images/Light/actions/profile-filled.png b/rtdata/images/Light/actions/profile-filled.png deleted file mode 100644 index 7e5ae44bf..000000000 Binary files a/rtdata/images/Light/actions/profile-filled.png and /dev/null differ diff --git a/rtdata/images/Light/actions/profile-partial.png b/rtdata/images/Light/actions/profile-partial.png deleted file mode 100644 index 9bb666ae3..000000000 Binary files a/rtdata/images/Light/actions/profile-partial.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rated.png b/rtdata/images/Light/actions/rated.png deleted file mode 100644 index 6b238da70..000000000 Binary files a/rtdata/images/Light/actions/rated.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ratednot.png b/rtdata/images/Light/actions/ratednot.png deleted file mode 100644 index 33bc1935f..000000000 Binary files a/rtdata/images/Light/actions/ratednot.png and /dev/null differ diff --git a/rtdata/images/Light/actions/ratednotg.png b/rtdata/images/Light/actions/ratednotg.png deleted file mode 100644 index ff55f1646..000000000 Binary files a/rtdata/images/Light/actions/ratednotg.png and /dev/null differ diff --git a/rtdata/images/Light/actions/raw.png b/rtdata/images/Light/actions/raw.png deleted file mode 100644 index bf3e8f631..000000000 Binary files a/rtdata/images/Light/actions/raw.png and /dev/null differ diff --git a/rtdata/images/Light/actions/refresh-red.png b/rtdata/images/Light/actions/refresh-red.png deleted file mode 100644 index 157c4bd70..000000000 Binary files a/rtdata/images/Light/actions/refresh-red.png and /dev/null differ diff --git a/rtdata/images/Light/actions/refresh-white.png b/rtdata/images/Light/actions/refresh-white.png deleted file mode 100644 index 4536ce00d..000000000 Binary files a/rtdata/images/Light/actions/refresh-white.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-left-1.png b/rtdata/images/Light/actions/rotate-left-1.png deleted file mode 100644 index 869c9ed4a..000000000 Binary files a/rtdata/images/Light/actions/rotate-left-1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-left-2.png b/rtdata/images/Light/actions/rotate-left-2.png deleted file mode 100644 index 7aa5bd1ba..000000000 Binary files a/rtdata/images/Light/actions/rotate-left-2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-left-3.png b/rtdata/images/Light/actions/rotate-left-3.png deleted file mode 100644 index 5bf87bb2b..000000000 Binary files a/rtdata/images/Light/actions/rotate-left-3.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-left.png b/rtdata/images/Light/actions/rotate-left.png deleted file mode 100644 index f3851ba12..000000000 Binary files a/rtdata/images/Light/actions/rotate-left.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-right-1.png b/rtdata/images/Light/actions/rotate-right-1.png deleted file mode 100644 index 9d4d477cb..000000000 Binary files a/rtdata/images/Light/actions/rotate-right-1.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-right-2.png b/rtdata/images/Light/actions/rotate-right-2.png deleted file mode 100644 index bb4d98c66..000000000 Binary files a/rtdata/images/Light/actions/rotate-right-2.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-right-3.png b/rtdata/images/Light/actions/rotate-right-3.png deleted file mode 100644 index 4bf41091c..000000000 Binary files a/rtdata/images/Light/actions/rotate-right-3.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rotate-right.png b/rtdata/images/Light/actions/rotate-right.png deleted file mode 100644 index f9a728b8a..000000000 Binary files a/rtdata/images/Light/actions/rotate-right.png and /dev/null differ diff --git a/rtdata/images/Light/actions/rtwindow.png b/rtdata/images/Light/actions/rtwindow.png deleted file mode 100644 index 19dfa521a..000000000 Binary files a/rtdata/images/Light/actions/rtwindow.png and /dev/null differ diff --git a/rtdata/images/Light/actions/softProof.png b/rtdata/images/Light/actions/softProof.png deleted file mode 100644 index 3e5eb2f18..000000000 Binary files a/rtdata/images/Light/actions/softProof.png and /dev/null differ diff --git a/rtdata/images/Light/actions/spGamutCheck.png b/rtdata/images/Light/actions/spGamutCheck.png deleted file mode 100644 index b1ae3e423..000000000 Binary files a/rtdata/images/Light/actions/spGamutCheck.png and /dev/null differ diff --git a/rtdata/images/Light/actions/stock-flip-horizontal.png b/rtdata/images/Light/actions/stock-flip-horizontal.png deleted file mode 100644 index af8b4ac95..000000000 Binary files a/rtdata/images/Light/actions/stock-flip-horizontal.png and /dev/null differ diff --git a/rtdata/images/Light/actions/stock-flip-vertical.png b/rtdata/images/Light/actions/stock-flip-vertical.png deleted file mode 100644 index baf393fed..000000000 Binary files a/rtdata/images/Light/actions/stock-flip-vertical.png and /dev/null differ diff --git a/rtdata/images/Light/actions/stock-rotate-270.png b/rtdata/images/Light/actions/stock-rotate-270.png deleted file mode 100644 index ae46db66d..000000000 Binary files a/rtdata/images/Light/actions/stock-rotate-270.png and /dev/null differ diff --git a/rtdata/images/Light/actions/stock-rotate-90.png b/rtdata/images/Light/actions/stock-rotate-90.png deleted file mode 100644 index a125fe413..000000000 Binary files a/rtdata/images/Light/actions/stock-rotate-90.png and /dev/null differ diff --git a/rtdata/images/Light/actions/straighten-small.png b/rtdata/images/Light/actions/straighten-small.png deleted file mode 100644 index 5090d70f9..000000000 Binary files a/rtdata/images/Light/actions/straighten-small.png and /dev/null differ diff --git a/rtdata/images/Light/actions/straighten.png b/rtdata/images/Light/actions/straighten.png deleted file mode 100644 index 3810c5e8a..000000000 Binary files a/rtdata/images/Light/actions/straighten.png and /dev/null differ diff --git a/rtdata/images/Light/actions/toleftend.png b/rtdata/images/Light/actions/toleftend.png deleted file mode 100644 index 3fae3eae5..000000000 Binary files a/rtdata/images/Light/actions/toleftend.png and /dev/null differ diff --git a/rtdata/images/Light/actions/torightend.png b/rtdata/images/Light/actions/torightend.png deleted file mode 100644 index a6b33af2d..000000000 Binary files a/rtdata/images/Light/actions/torightend.png and /dev/null differ diff --git a/rtdata/images/Light/actions/transform.png b/rtdata/images/Light/actions/transform.png deleted file mode 100644 index 48f23e0b6..000000000 Binary files a/rtdata/images/Light/actions/transform.png and /dev/null differ diff --git a/rtdata/images/Light/actions/trash-hide-deleted.png b/rtdata/images/Light/actions/trash-hide-deleted.png deleted file mode 100644 index 95aaecdba..000000000 Binary files a/rtdata/images/Light/actions/trash-hide-deleted.png and /dev/null differ diff --git a/rtdata/images/Light/actions/trash-show-empty.png b/rtdata/images/Light/actions/trash-show-empty.png deleted file mode 100644 index dd35e4b30..000000000 Binary files a/rtdata/images/Light/actions/trash-show-empty.png and /dev/null differ diff --git a/rtdata/images/Light/actions/trash-show-full.png b/rtdata/images/Light/actions/trash-show-full.png deleted file mode 100644 index fd6eff338..000000000 Binary files a/rtdata/images/Light/actions/trash-show-full.png and /dev/null differ diff --git a/rtdata/images/Light/actions/trash-thumbnail.png b/rtdata/images/Light/actions/trash-thumbnail.png deleted file mode 100644 index 4adf53ebf..000000000 Binary files a/rtdata/images/Light/actions/trash-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Light/actions/trash.png b/rtdata/images/Light/actions/trash.png deleted file mode 100644 index dd35e4b30..000000000 Binary files a/rtdata/images/Light/actions/trash.png and /dev/null differ diff --git a/rtdata/images/Light/actions/unchanged-18.png b/rtdata/images/Light/actions/unchanged-18.png deleted file mode 100644 index 9d08dda26..000000000 Binary files a/rtdata/images/Light/actions/unchanged-18.png and /dev/null differ diff --git a/rtdata/images/Light/actions/unchanged-22.png b/rtdata/images/Light/actions/unchanged-22.png deleted file mode 100644 index db03d456a..000000000 Binary files a/rtdata/images/Light/actions/unchanged-22.png and /dev/null differ diff --git a/rtdata/images/Light/actions/undelete-rtl.png b/rtdata/images/Light/actions/undelete-rtl.png deleted file mode 100644 index 27f273bd6..000000000 Binary files a/rtdata/images/Light/actions/undelete-rtl.png and /dev/null differ diff --git a/rtdata/images/Light/actions/undelete-thumbnail-rtl.png b/rtdata/images/Light/actions/undelete-thumbnail-rtl.png deleted file mode 100644 index 7c26653a8..000000000 Binary files a/rtdata/images/Light/actions/undelete-thumbnail-rtl.png and /dev/null differ diff --git a/rtdata/images/Light/actions/undelete-thumbnail.png b/rtdata/images/Light/actions/undelete-thumbnail.png deleted file mode 100644 index 7c26653a8..000000000 Binary files a/rtdata/images/Light/actions/undelete-thumbnail.png and /dev/null differ diff --git a/rtdata/images/Light/actions/undelete.png b/rtdata/images/Light/actions/undelete.png deleted file mode 100644 index 27f273bd6..000000000 Binary files a/rtdata/images/Light/actions/undelete.png and /dev/null differ diff --git a/rtdata/images/Light/actions/warnhl.png b/rtdata/images/Light/actions/warnhl.png deleted file mode 100644 index 066241abc..000000000 Binary files a/rtdata/images/Light/actions/warnhl.png and /dev/null differ diff --git a/rtdata/images/Light/actions/warnsh.png b/rtdata/images/Light/actions/warnsh.png deleted file mode 100644 index 5621b88b4..000000000 Binary files a/rtdata/images/Light/actions/warnsh.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wavelet.png b/rtdata/images/Light/actions/wavelet.png deleted file mode 100644 index 3de85a8f1..000000000 Binary files a/rtdata/images/Light/actions/wavelet.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-auto.png b/rtdata/images/Light/actions/wb-auto.png deleted file mode 100644 index fa5c582ad..000000000 Binary files a/rtdata/images/Light/actions/wb-auto.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-camera.png b/rtdata/images/Light/actions/wb-camera.png deleted file mode 100644 index e3f4b9a01..000000000 Binary files a/rtdata/images/Light/actions/wb-camera.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-cloudy.png b/rtdata/images/Light/actions/wb-cloudy.png deleted file mode 100644 index a04cc56b5..000000000 Binary files a/rtdata/images/Light/actions/wb-cloudy.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-custom.png b/rtdata/images/Light/actions/wb-custom.png deleted file mode 100644 index 2cc95a999..000000000 Binary files a/rtdata/images/Light/actions/wb-custom.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-flash.png b/rtdata/images/Light/actions/wb-flash.png deleted file mode 100644 index 35f643e46..000000000 Binary files a/rtdata/images/Light/actions/wb-flash.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-fluorescent.png b/rtdata/images/Light/actions/wb-fluorescent.png deleted file mode 100644 index f0da5ba72..000000000 Binary files a/rtdata/images/Light/actions/wb-fluorescent.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-lamp.png b/rtdata/images/Light/actions/wb-lamp.png deleted file mode 100644 index 47f12d904..000000000 Binary files a/rtdata/images/Light/actions/wb-lamp.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-led.png b/rtdata/images/Light/actions/wb-led.png deleted file mode 100644 index 5c2ef46d7..000000000 Binary files a/rtdata/images/Light/actions/wb-led.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-shade.png b/rtdata/images/Light/actions/wb-shade.png deleted file mode 100644 index 617123893..000000000 Binary files a/rtdata/images/Light/actions/wb-shade.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-sun.png b/rtdata/images/Light/actions/wb-sun.png deleted file mode 100644 index 115c8a0cb..000000000 Binary files a/rtdata/images/Light/actions/wb-sun.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-tungsten.png b/rtdata/images/Light/actions/wb-tungsten.png deleted file mode 100644 index 61ad022c4..000000000 Binary files a/rtdata/images/Light/actions/wb-tungsten.png and /dev/null differ diff --git a/rtdata/images/Light/actions/wb-water.png b/rtdata/images/Light/actions/wb-water.png deleted file mode 100644 index a1ae414af..000000000 Binary files a/rtdata/images/Light/actions/wb-water.png and /dev/null differ diff --git a/rtdata/images/Light/actions/zoom-100-identifier.png b/rtdata/images/Light/actions/zoom-100-identifier.png deleted file mode 100644 index a07b63b83..000000000 Binary files a/rtdata/images/Light/actions/zoom-100-identifier.png and /dev/null differ diff --git a/rtdata/images/Light/devices/computer.png b/rtdata/images/Light/devices/computer.png deleted file mode 100644 index 5969fae78..000000000 Binary files a/rtdata/images/Light/devices/computer.png and /dev/null differ diff --git a/rtdata/images/Light/devices/drive-harddisk.png b/rtdata/images/Light/devices/drive-harddisk.png deleted file mode 100644 index 5969fae78..000000000 Binary files a/rtdata/images/Light/devices/drive-harddisk.png and /dev/null differ diff --git a/rtdata/images/Light/devices/drive-optical.png b/rtdata/images/Light/devices/drive-optical.png deleted file mode 100644 index 5e4ba680d..000000000 Binary files a/rtdata/images/Light/devices/drive-optical.png and /dev/null differ diff --git a/rtdata/images/Light/devices/drive-removable-media.png b/rtdata/images/Light/devices/drive-removable-media.png deleted file mode 100644 index 378f0cbbe..000000000 Binary files a/rtdata/images/Light/devices/drive-removable-media.png and /dev/null differ diff --git a/rtdata/images/Light/devices/gtk-cdrom.png b/rtdata/images/Light/devices/gtk-cdrom.png deleted file mode 100644 index 5e4ba680d..000000000 Binary files a/rtdata/images/Light/devices/gtk-cdrom.png and /dev/null differ diff --git a/rtdata/images/Light/devices/media-flash.png b/rtdata/images/Light/devices/media-flash.png deleted file mode 100644 index 5969fae78..000000000 Binary files a/rtdata/images/Light/devices/media-flash.png and /dev/null differ diff --git a/rtdata/images/Light/devices/media-floppy.png b/rtdata/images/Light/devices/media-floppy.png deleted file mode 100644 index 378f0cbbe..000000000 Binary files a/rtdata/images/Light/devices/media-floppy.png and /dev/null differ diff --git a/rtdata/images/Light/devices/media-optical-bd.png b/rtdata/images/Light/devices/media-optical-bd.png deleted file mode 100644 index 5e4ba680d..000000000 Binary files a/rtdata/images/Light/devices/media-optical-bd.png and /dev/null differ diff --git a/rtdata/images/Light/devices/media-optical-dvd.png b/rtdata/images/Light/devices/media-optical-dvd.png deleted file mode 100644 index 5e4ba680d..000000000 Binary files a/rtdata/images/Light/devices/media-optical-dvd.png and /dev/null differ diff --git a/rtdata/images/Light/devices/media-optical.png b/rtdata/images/Light/devices/media-optical.png deleted file mode 100644 index 5e4ba680d..000000000 Binary files a/rtdata/images/Light/devices/media-optical.png and /dev/null differ diff --git a/rtdata/images/Light/devices/media-tape.png b/rtdata/images/Light/devices/media-tape.png deleted file mode 100644 index 5969fae78..000000000 Binary files a/rtdata/images/Light/devices/media-tape.png and /dev/null differ diff --git a/rtdata/images/Light/index.theme b/rtdata/images/Light/index.theme deleted file mode 100644 index 1188aa465..000000000 --- a/rtdata/images/Light/index.theme +++ /dev/null @@ -1,42 +0,0 @@ -[Icon Theme] -Name=RawTherapee-Light -Comment=Light theme for RawTherapee -Inherits=hicolor -Example=folder - -Directories=actions,apps,categories,devices,emblems,places,status - -[actions] -Size=22 -Context=Actions -Type=Fixed - -[apps] -Size=22 -Context=Applications -Type=Fixed - -[categories] -Size=22 -Context=Categories -Type=Fixed - -[devices] -Size=22 -Context=Devices -Type=Fixed - -[emblems] -Size=22 -Context=Emblems -Type=Fixed - -[places] -Size=22 -Context=Places -Type=Fixed - -[status] -Size=22 -Context=Status -Type=Fixed diff --git a/rtdata/images/Light/places/folder.png b/rtdata/images/Light/places/folder.png deleted file mode 100644 index 19ea93f4c..000000000 Binary files a/rtdata/images/Light/places/folder.png and /dev/null differ diff --git a/rtdata/images/Light/places/gtk-directory.png b/rtdata/images/Light/places/gtk-directory.png deleted file mode 100644 index 19ea93f4c..000000000 Binary files a/rtdata/images/Light/places/gtk-directory.png and /dev/null differ diff --git a/rtdata/images/Light/places/user-desktop.png b/rtdata/images/Light/places/user-desktop.png deleted file mode 100644 index e11d7388e..000000000 Binary files a/rtdata/images/Light/places/user-desktop.png and /dev/null differ diff --git a/rtdata/images/Light/places/user-home.png b/rtdata/images/Light/places/user-home.png deleted file mode 100644 index 69868e8d5..000000000 Binary files a/rtdata/images/Light/places/user-home.png and /dev/null differ diff --git a/rtdata/images/PanelEnding.png b/rtdata/images/PanelEnding.png deleted file mode 100644 index b540adc66..000000000 Binary files a/rtdata/images/PanelEnding.png and /dev/null differ diff --git a/rtdata/images/beforeafter.png b/rtdata/images/beforeafter.png deleted file mode 100644 index a4b3fac7b..000000000 Binary files a/rtdata/images/beforeafter.png and /dev/null differ diff --git a/rtdata/images/cglabel0.png b/rtdata/images/cglabel0.png deleted file mode 100644 index f3f0a3b27..000000000 Binary files a/rtdata/images/cglabel0.png and /dev/null differ diff --git a/rtdata/images/cglabel1.png b/rtdata/images/cglabel1.png deleted file mode 100644 index 3d5d745b2..000000000 Binary files a/rtdata/images/cglabel1.png and /dev/null differ diff --git a/rtdata/images/cglabel2.png b/rtdata/images/cglabel2.png deleted file mode 100644 index f0bfb2e02..000000000 Binary files a/rtdata/images/cglabel2.png and /dev/null differ diff --git a/rtdata/images/cglabel3.png b/rtdata/images/cglabel3.png deleted file mode 100644 index 84aeceb47..000000000 Binary files a/rtdata/images/cglabel3.png and /dev/null differ diff --git a/rtdata/images/cglabel4.png b/rtdata/images/cglabel4.png deleted file mode 100644 index c6d2286ed..000000000 Binary files a/rtdata/images/cglabel4.png and /dev/null differ diff --git a/rtdata/images/cglabel5.png b/rtdata/images/cglabel5.png deleted file mode 100644 index 48568972d..000000000 Binary files a/rtdata/images/cglabel5.png and /dev/null differ diff --git a/rtdata/images/clabel0.png b/rtdata/images/clabel0.png deleted file mode 100644 index 65410ff22..000000000 Binary files a/rtdata/images/clabel0.png and /dev/null differ diff --git a/rtdata/images/clabel1.png b/rtdata/images/clabel1.png deleted file mode 100644 index 39d679aaa..000000000 Binary files a/rtdata/images/clabel1.png and /dev/null differ diff --git a/rtdata/images/clabel2.png b/rtdata/images/clabel2.png deleted file mode 100644 index b9316398a..000000000 Binary files a/rtdata/images/clabel2.png and /dev/null differ diff --git a/rtdata/images/clabel3.png b/rtdata/images/clabel3.png deleted file mode 100644 index e804d36a1..000000000 Binary files a/rtdata/images/clabel3.png and /dev/null differ diff --git a/rtdata/images/clabel4.png b/rtdata/images/clabel4.png deleted file mode 100644 index 5ac41db81..000000000 Binary files a/rtdata/images/clabel4.png and /dev/null differ diff --git a/rtdata/images/clabel5.png b/rtdata/images/clabel5.png deleted file mode 100644 index dbe190966..000000000 Binary files a/rtdata/images/clabel5.png and /dev/null differ diff --git a/rtdata/images/closedhand.png b/rtdata/images/closedhand.png deleted file mode 100644 index a08542071..000000000 Binary files a/rtdata/images/closedhand.png and /dev/null differ diff --git a/rtdata/images/colour.png b/rtdata/images/colour.png deleted file mode 100644 index e38094f02..000000000 Binary files a/rtdata/images/colour.png and /dev/null differ diff --git a/rtdata/images/crop-auto.png b/rtdata/images/crop-auto.png deleted file mode 100644 index 015a9555e..000000000 Binary files a/rtdata/images/crop-auto.png and /dev/null differ diff --git a/rtdata/images/crop.png b/rtdata/images/crop.png deleted file mode 100644 index 345fa209e..000000000 Binary files a/rtdata/images/crop.png and /dev/null differ diff --git a/rtdata/images/cross.png b/rtdata/images/cross.png deleted file mode 100644 index 6be9dde06..000000000 Binary files a/rtdata/images/cross.png and /dev/null differ diff --git a/rtdata/images/crossed-arrows-out.png b/rtdata/images/crossed-arrows-out.png deleted file mode 100644 index d4b8c2f8f..000000000 Binary files a/rtdata/images/crossed-arrows-out.png and /dev/null differ diff --git a/rtdata/images/curveType-NURBS.png b/rtdata/images/curveType-NURBS.png deleted file mode 100644 index b18128159..000000000 Binary files a/rtdata/images/curveType-NURBS.png and /dev/null differ diff --git a/rtdata/images/curveType-controlPoints.png b/rtdata/images/curveType-controlPoints.png deleted file mode 100644 index b8c4f447e..000000000 Binary files a/rtdata/images/curveType-controlPoints.png and /dev/null differ diff --git a/rtdata/images/curveType-flatLinear.png b/rtdata/images/curveType-flatLinear.png deleted file mode 100644 index ad061ef27..000000000 Binary files a/rtdata/images/curveType-flatLinear.png and /dev/null differ diff --git a/rtdata/images/curveType-linear.png b/rtdata/images/curveType-linear.png deleted file mode 100644 index a76331321..000000000 Binary files a/rtdata/images/curveType-linear.png and /dev/null differ diff --git a/rtdata/images/curveType-parametric.png b/rtdata/images/curveType-parametric.png deleted file mode 100644 index e1df7b699..000000000 Binary files a/rtdata/images/curveType-parametric.png and /dev/null differ diff --git a/rtdata/images/curveType-spline.png b/rtdata/images/curveType-spline.png deleted file mode 100644 index a179b901d..000000000 Binary files a/rtdata/images/curveType-spline.png and /dev/null differ diff --git a/rtdata/images/curveType-unchanged.png b/rtdata/images/curveType-unchanged.png deleted file mode 100644 index 825b94b4b..000000000 Binary files a/rtdata/images/curveType-unchanged.png and /dev/null differ diff --git a/rtdata/images/default-settings-ltr.png b/rtdata/images/default-settings-ltr.png deleted file mode 100644 index cb1cfbe12..000000000 Binary files a/rtdata/images/default-settings-ltr.png and /dev/null differ diff --git a/rtdata/images/default-settings-rtl.png b/rtdata/images/default-settings-rtl.png deleted file mode 100644 index cb1cfbe12..000000000 Binary files a/rtdata/images/default-settings-rtl.png and /dev/null differ diff --git a/rtdata/images/detail.png b/rtdata/images/detail.png deleted file mode 100644 index f4ad6e440..000000000 Binary files a/rtdata/images/detail.png and /dev/null differ diff --git a/rtdata/images/distortion-auto.png b/rtdata/images/distortion-auto.png deleted file mode 100644 index a0b9c114d..000000000 Binary files a/rtdata/images/distortion-auto.png and /dev/null differ diff --git a/rtdata/images/distortion.png b/rtdata/images/distortion.png deleted file mode 100644 index 2d606c4e7..000000000 Binary files a/rtdata/images/distortion.png and /dev/null differ diff --git a/rtdata/images/edited-small.png b/rtdata/images/edited-small.png deleted file mode 100644 index 7d6ecdede..000000000 Binary files a/rtdata/images/edited-small.png and /dev/null differ diff --git a/rtdata/images/edited.png b/rtdata/images/edited.png deleted file mode 100644 index 85c81b2e1..000000000 Binary files a/rtdata/images/edited.png and /dev/null differ diff --git a/rtdata/images/editedg-small.png b/rtdata/images/editedg-small.png deleted file mode 100644 index 1de271128..000000000 Binary files a/rtdata/images/editedg-small.png and /dev/null differ diff --git a/rtdata/images/editednot-small.png b/rtdata/images/editednot-small.png deleted file mode 100644 index c1a0299ed..000000000 Binary files a/rtdata/images/editednot-small.png and /dev/null differ diff --git a/rtdata/images/editednotg-small.png b/rtdata/images/editednotg-small.png deleted file mode 100644 index fa0de4fdf..000000000 Binary files a/rtdata/images/editednotg-small.png and /dev/null differ diff --git a/rtdata/images/empty.png b/rtdata/images/empty.png deleted file mode 100644 index fc5838fdb..000000000 Binary files a/rtdata/images/empty.png and /dev/null differ diff --git a/rtdata/images/exposure.png b/rtdata/images/exposure.png deleted file mode 100644 index 0579cdd75..000000000 Binary files a/rtdata/images/exposure.png and /dev/null differ diff --git a/rtdata/images/filter.png b/rtdata/images/filter.png deleted file mode 100644 index 1059a8122..000000000 Binary files a/rtdata/images/filter.png and /dev/null differ diff --git a/rtdata/images/filterclear.png b/rtdata/images/filterclear.png deleted file mode 100644 index 47b3f2725..000000000 Binary files a/rtdata/images/filterclear.png and /dev/null differ diff --git a/rtdata/images/folder.png b/rtdata/images/folder.png deleted file mode 100644 index 551db978a..000000000 Binary files a/rtdata/images/folder.png and /dev/null differ diff --git a/rtdata/images/fullscreen-exit.png b/rtdata/images/fullscreen-exit.png deleted file mode 100644 index 2946010be..000000000 Binary files a/rtdata/images/fullscreen-exit.png and /dev/null differ diff --git a/rtdata/images/fullscreen.png b/rtdata/images/fullscreen.png deleted file mode 100644 index 3d9fccc28..000000000 Binary files a/rtdata/images/fullscreen.png and /dev/null differ diff --git a/rtdata/images/grayrated.png b/rtdata/images/grayrated.png deleted file mode 100644 index c71a6d0c0..000000000 Binary files a/rtdata/images/grayrated.png and /dev/null differ diff --git a/rtdata/images/gtk-add.png b/rtdata/images/gtk-add.png deleted file mode 100644 index 21fc43cf3..000000000 Binary files a/rtdata/images/gtk-add.png and /dev/null differ diff --git a/rtdata/images/gtk-apply.png b/rtdata/images/gtk-apply.png deleted file mode 100644 index f0bb96bfe..000000000 Binary files a/rtdata/images/gtk-apply.png and /dev/null differ diff --git a/rtdata/images/gtk-close-small.png b/rtdata/images/gtk-close-small.png deleted file mode 100644 index b92be85b1..000000000 Binary files a/rtdata/images/gtk-close-small.png and /dev/null differ diff --git a/rtdata/images/gtk-close.png b/rtdata/images/gtk-close.png deleted file mode 100644 index a25b8c29a..000000000 Binary files a/rtdata/images/gtk-close.png and /dev/null differ diff --git a/rtdata/images/gtk-color-picker-small.png b/rtdata/images/gtk-color-picker-small.png deleted file mode 100644 index 2f7b6cc87..000000000 Binary files a/rtdata/images/gtk-color-picker-small.png and /dev/null differ diff --git a/rtdata/images/gtk-color-picker.png b/rtdata/images/gtk-color-picker.png deleted file mode 100644 index 0ad9bc4f6..000000000 Binary files a/rtdata/images/gtk-color-picker.png and /dev/null differ diff --git a/rtdata/images/gtk-open.png b/rtdata/images/gtk-open.png deleted file mode 100644 index 5e6286c37..000000000 Binary files a/rtdata/images/gtk-open.png and /dev/null differ diff --git a/rtdata/images/gtk-save-large.png b/rtdata/images/gtk-save-large.png deleted file mode 100644 index 11170bd22..000000000 Binary files a/rtdata/images/gtk-save-large.png and /dev/null differ diff --git a/rtdata/images/gtk-undo-ltr.png b/rtdata/images/gtk-undo-ltr.png deleted file mode 100644 index 343eda063..000000000 Binary files a/rtdata/images/gtk-undo-ltr.png and /dev/null differ diff --git a/rtdata/images/gtk-undo-rtl.png b/rtdata/images/gtk-undo-rtl.png deleted file mode 100644 index 404ec98a5..000000000 Binary files a/rtdata/images/gtk-undo-rtl.png and /dev/null differ diff --git a/rtdata/images/gtk-undoall-ltr.png b/rtdata/images/gtk-undoall-ltr.png deleted file mode 100644 index 4a9a30d39..000000000 Binary files a/rtdata/images/gtk-undoall-ltr.png and /dev/null differ diff --git a/rtdata/images/gtk-undoall-rtl.png b/rtdata/images/gtk-undoall-rtl.png deleted file mode 100644 index 35303720e..000000000 Binary files a/rtdata/images/gtk-undoall-rtl.png and /dev/null differ diff --git a/rtdata/images/gtk-zoom-100.png b/rtdata/images/gtk-zoom-100.png deleted file mode 100644 index c7fae09c3..000000000 Binary files a/rtdata/images/gtk-zoom-100.png and /dev/null differ diff --git a/rtdata/images/gtk-zoom-fit.png b/rtdata/images/gtk-zoom-fit.png deleted file mode 100644 index 799a99ba0..000000000 Binary files a/rtdata/images/gtk-zoom-fit.png and /dev/null differ diff --git a/rtdata/images/gtk-zoom-in.png b/rtdata/images/gtk-zoom-in.png deleted file mode 100644 index 913e61968..000000000 Binary files a/rtdata/images/gtk-zoom-in.png and /dev/null differ diff --git a/rtdata/images/gtk-zoom-out.png b/rtdata/images/gtk-zoom-out.png deleted file mode 100644 index 298138baa..000000000 Binary files a/rtdata/images/gtk-zoom-out.png and /dev/null differ diff --git a/rtdata/images/histBar.png b/rtdata/images/histBar.png deleted file mode 100644 index 8ebdf4fab..000000000 Binary files a/rtdata/images/histBar.png and /dev/null differ diff --git a/rtdata/images/histBlue.png b/rtdata/images/histBlue.png deleted file mode 100644 index b49a01dc7..000000000 Binary files a/rtdata/images/histBlue.png and /dev/null differ diff --git a/rtdata/images/histGreen.png b/rtdata/images/histGreen.png deleted file mode 100644 index 559b7d78a..000000000 Binary files a/rtdata/images/histGreen.png and /dev/null differ diff --git a/rtdata/images/histRaw.png b/rtdata/images/histRaw.png deleted file mode 100644 index 30e10cf09..000000000 Binary files a/rtdata/images/histRaw.png and /dev/null differ diff --git a/rtdata/images/histRed.png b/rtdata/images/histRed.png deleted file mode 100644 index 91bb9f2f5..000000000 Binary files a/rtdata/images/histRed.png and /dev/null differ diff --git a/rtdata/images/histValue.png b/rtdata/images/histValue.png deleted file mode 100644 index 36d47564e..000000000 Binary files a/rtdata/images/histValue.png and /dev/null differ diff --git a/rtdata/images/image-editor.png b/rtdata/images/image-editor.png deleted file mode 100644 index 9f9a335dc..000000000 Binary files a/rtdata/images/image-editor.png and /dev/null differ diff --git a/rtdata/images/info.png b/rtdata/images/info.png deleted file mode 100644 index 94245aefd..000000000 Binary files a/rtdata/images/info.png and /dev/null differ diff --git a/rtdata/images/list-add-small.png b/rtdata/images/list-add-small.png deleted file mode 100644 index d26852798..000000000 Binary files a/rtdata/images/list-add-small.png and /dev/null differ diff --git a/rtdata/images/list-remove-red-small.png b/rtdata/images/list-remove-red-small.png deleted file mode 100644 index ea67d1221..000000000 Binary files a/rtdata/images/list-remove-red-small.png and /dev/null differ diff --git a/rtdata/images/list-remove.png b/rtdata/images/list-remove.png deleted file mode 100644 index 85e1c30b3..000000000 Binary files a/rtdata/images/list-remove.png and /dev/null differ diff --git a/rtdata/images/lock-off.png b/rtdata/images/lock-off.png deleted file mode 100644 index 976af2977..000000000 Binary files a/rtdata/images/lock-off.png and /dev/null differ diff --git a/rtdata/images/lock-on.png b/rtdata/images/lock-on.png deleted file mode 100644 index 9c4bcd046..000000000 Binary files a/rtdata/images/lock-on.png and /dev/null differ diff --git a/rtdata/images/logoicon-wind.png b/rtdata/images/logoicon-wind.png deleted file mode 100644 index 39e2819da..000000000 Binary files a/rtdata/images/logoicon-wind.png and /dev/null differ diff --git a/rtdata/images/media-usb.png b/rtdata/images/media-usb.png deleted file mode 100644 index e9a279da1..000000000 Binary files a/rtdata/images/media-usb.png and /dev/null differ diff --git a/rtdata/images/meta.png b/rtdata/images/meta.png deleted file mode 100644 index 6f0c4185d..000000000 Binary files a/rtdata/images/meta.png and /dev/null differ diff --git a/rtdata/images/move-1D-h.png b/rtdata/images/move-1D-h.png deleted file mode 100644 index 44babcfb4..000000000 Binary files a/rtdata/images/move-1D-h.png and /dev/null differ diff --git a/rtdata/images/move-1D-v.png b/rtdata/images/move-1D-v.png deleted file mode 100644 index cbc1c7e68..000000000 Binary files a/rtdata/images/move-1D-v.png and /dev/null differ diff --git a/rtdata/images/move-2D.png b/rtdata/images/move-2D.png deleted file mode 100644 index 27e7c1e67..000000000 Binary files a/rtdata/images/move-2D.png and /dev/null differ diff --git a/rtdata/images/move-rotate.png b/rtdata/images/move-rotate.png deleted file mode 100644 index 70309972b..000000000 Binary files a/rtdata/images/move-rotate.png and /dev/null differ diff --git a/rtdata/images/network.png b/rtdata/images/network.png deleted file mode 100644 index 8a77e5d92..000000000 Binary files a/rtdata/images/network.png and /dev/null differ diff --git a/rtdata/images/nocolorlabel.png b/rtdata/images/nocolorlabel.png deleted file mode 100644 index be61570b0..000000000 Binary files a/rtdata/images/nocolorlabel.png and /dev/null differ diff --git a/rtdata/images/non-themed/png/empty.png b/rtdata/images/non-themed/png/empty.png new file mode 100644 index 000000000..534ddcb72 Binary files /dev/null and b/rtdata/images/non-themed/png/empty.png differ diff --git a/rtdata/images/non-themed/png/rawtherapee-logo-128.png b/rtdata/images/non-themed/png/rawtherapee-logo-128.png new file mode 100644 index 000000000..0a224b3d9 Binary files /dev/null and b/rtdata/images/non-themed/png/rawtherapee-logo-128.png differ diff --git a/rtdata/images/non-themed/png/rawtherapee-logo-16.png b/rtdata/images/non-themed/png/rawtherapee-logo-16.png new file mode 100644 index 000000000..7b67f7408 Binary files /dev/null and b/rtdata/images/non-themed/png/rawtherapee-logo-16.png differ diff --git a/rtdata/images/non-themed/png/rawtherapee-logo-24.png b/rtdata/images/non-themed/png/rawtherapee-logo-24.png new file mode 100644 index 000000000..6b13e0c98 Binary files /dev/null and b/rtdata/images/non-themed/png/rawtherapee-logo-24.png differ diff --git a/rtdata/images/non-themed/png/rawtherapee-logo-256.png b/rtdata/images/non-themed/png/rawtherapee-logo-256.png new file mode 100644 index 000000000..00fdb390f Binary files /dev/null and b/rtdata/images/non-themed/png/rawtherapee-logo-256.png differ diff --git a/rtdata/images/non-themed/png/rawtherapee-logo-48.png b/rtdata/images/non-themed/png/rawtherapee-logo-48.png new file mode 100644 index 000000000..cbd46b20e Binary files /dev/null and b/rtdata/images/non-themed/png/rawtherapee-logo-48.png differ diff --git a/rtdata/images/non-themed/png/splash.png b/rtdata/images/non-themed/png/splash.png new file mode 100644 index 000000000..f3c523b88 Binary files /dev/null and b/rtdata/images/non-themed/png/splash.png differ diff --git a/rtdata/icons/RT.ico b/rtdata/images/non-themed/rawtherapee.ico similarity index 100% rename from rtdata/icons/RT.ico rename to rtdata/images/non-themed/rawtherapee.ico diff --git a/rtdata/images/non-themed/rt-splash.svg b/rtdata/images/non-themed/rt-splash.svg new file mode 100644 index 000000000..46afaa0ba --- /dev/null +++ b/rtdata/images/non-themed/rt-splash.svg @@ -0,0 +1,922 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + Each logo element has a filter effect (ring*). Additionally, the logo as a whole (all elements grouped) also has a filter effect (logo glow)."Raw": font Eras Ultra ITC, 60pt, -3px spacing between characters."Therapee": font Eras Medium ITC, 60pt, +1px spacing between characters.Version: font Eras Bold ITC, 64pt, skewed -3°. RawTherapee splash screen design version 1.2 from 2019-02-27 | www.rawtherapee.com + GNU GPLv3 + + + Development + + + Release Candidate 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + . 5 + Therapee + Raw + Therapee + Raw + + diff --git a/rtdata/images/notrated.png b/rtdata/images/notrated.png deleted file mode 100644 index f6b897b12..000000000 Binary files a/rtdata/images/notrated.png and /dev/null differ diff --git a/rtdata/images/openhand.png b/rtdata/images/openhand.png deleted file mode 100644 index e52a28067..000000000 Binary files a/rtdata/images/openhand.png and /dev/null differ diff --git a/rtdata/images/panel-to-bottom.png b/rtdata/images/panel-to-bottom.png deleted file mode 100644 index 4e3b6057d..000000000 Binary files a/rtdata/images/panel-to-bottom.png and /dev/null differ diff --git a/rtdata/images/panel-to-left.png b/rtdata/images/panel-to-left.png deleted file mode 100644 index 99821881d..000000000 Binary files a/rtdata/images/panel-to-left.png and /dev/null differ diff --git a/rtdata/images/panel-to-right.png b/rtdata/images/panel-to-right.png deleted file mode 100644 index 6037c1fa9..000000000 Binary files a/rtdata/images/panel-to-right.png and /dev/null differ diff --git a/rtdata/images/panel-to-top.png b/rtdata/images/panel-to-top.png deleted file mode 100644 index b129e9d4c..000000000 Binary files a/rtdata/images/panel-to-top.png and /dev/null differ diff --git a/rtdata/images/popuparrow.png b/rtdata/images/popuparrow.png deleted file mode 100644 index f933a71ca..000000000 Binary files a/rtdata/images/popuparrow.png and /dev/null differ diff --git a/rtdata/images/processing-pause.png b/rtdata/images/processing-pause.png deleted file mode 100644 index dc3c6b633..000000000 Binary files a/rtdata/images/processing-pause.png and /dev/null differ diff --git a/rtdata/images/processing-play.png b/rtdata/images/processing-play.png deleted file mode 100644 index e653de0f1..000000000 Binary files a/rtdata/images/processing-play.png and /dev/null differ diff --git a/rtdata/images/processing.png b/rtdata/images/processing.png deleted file mode 100644 index 2a602d656..000000000 Binary files a/rtdata/images/processing.png and /dev/null differ diff --git a/rtdata/images/rated.png b/rtdata/images/rated.png deleted file mode 100644 index 99d6b73ba..000000000 Binary files a/rtdata/images/rated.png and /dev/null differ diff --git a/rtdata/images/ratednot.png b/rtdata/images/ratednot.png deleted file mode 100644 index ed7c561df..000000000 Binary files a/rtdata/images/ratednot.png and /dev/null differ diff --git a/rtdata/images/ratednotg.png b/rtdata/images/ratednotg.png deleted file mode 100644 index 2f619d755..000000000 Binary files a/rtdata/images/ratednotg.png and /dev/null differ diff --git a/rtdata/images/raw.png b/rtdata/images/raw.png deleted file mode 100644 index aa8d0bb6d..000000000 Binary files a/rtdata/images/raw.png and /dev/null differ diff --git a/rtdata/images/recent-save.png b/rtdata/images/recent-save.png deleted file mode 100644 index be5de85d9..000000000 Binary files a/rtdata/images/recent-save.png and /dev/null differ diff --git a/rtdata/images/refresh-red.png b/rtdata/images/refresh-red.png deleted file mode 100644 index 24dc27e64..000000000 Binary files a/rtdata/images/refresh-red.png and /dev/null differ diff --git a/rtdata/images/refresh-white.png b/rtdata/images/refresh-white.png deleted file mode 100644 index c4143da34..000000000 Binary files a/rtdata/images/refresh-white.png and /dev/null differ diff --git a/rtdata/images/resize.png b/rtdata/images/resize.png deleted file mode 100644 index 4d3f0e681..000000000 Binary files a/rtdata/images/resize.png and /dev/null differ diff --git a/rtdata/images/rt-logo-large.png b/rtdata/images/rt-logo-large.png deleted file mode 100644 index f2cde46b7..000000000 Binary files a/rtdata/images/rt-logo-large.png and /dev/null differ diff --git a/rtdata/images/rt-logo-medium.png b/rtdata/images/rt-logo-medium.png deleted file mode 100644 index a2c2366f1..000000000 Binary files a/rtdata/images/rt-logo-medium.png and /dev/null differ diff --git a/rtdata/images/rt-logo-small.png b/rtdata/images/rt-logo-small.png deleted file mode 100644 index cf306e433..000000000 Binary files a/rtdata/images/rt-logo-small.png and /dev/null differ diff --git a/rtdata/images/rt-logo-tiny.png b/rtdata/images/rt-logo-tiny.png deleted file mode 100644 index f1034f149..000000000 Binary files a/rtdata/images/rt-logo-tiny.png and /dev/null differ diff --git a/rtdata/images/rt_splash.svg b/rtdata/images/rt_splash.svg deleted file mode 100644 index c80cdd5c7..000000000 --- a/rtdata/images/rt_splash.svg +++ /dev/null @@ -1,924 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Apply glow effects using filters. You might need to ungroup the circle elements before applying. You can change the flood color of the "ring shadow" effect to make it white if you want to make the logo usable on a dark background. For logo specifics, refer to rt_logo.svg "Raw": font ITC Eras Std Ultra, appears in Inkscape as ITC Eras Standard - Ultra-Bold, 60pt, -3px spacing between characters."Therapee": font ITC Eras Std Medium, appears in Inkscape as ITC Eras Standard - Medium, 60pt, +1px spacing between characters.Version: font ITC Eras Std Bold, appears in Inkscape as ITC Eras Standard - Bold, 64pt, skewed -3°. RawTherapee splash screen design version 1.1 from 2017-01-28 | www.rawtherapee.com - Raw - Therapee - GNU GPLv3 - 5 - . 3 - - Development - - - diff --git a/rtdata/images/saved.png b/rtdata/images/saved.png deleted file mode 100644 index 2a465c0f2..000000000 Binary files a/rtdata/images/saved.png and /dev/null differ diff --git a/rtdata/images/savedg.png b/rtdata/images/savedg.png deleted file mode 100644 index 6855b7c2e..000000000 Binary files a/rtdata/images/savedg.png and /dev/null differ diff --git a/rtdata/images/savednot.png b/rtdata/images/savednot.png deleted file mode 100644 index 532e8b366..000000000 Binary files a/rtdata/images/savednot.png and /dev/null differ diff --git a/rtdata/images/savednotg.png b/rtdata/images/savednotg.png deleted file mode 100644 index c6079a1ed..000000000 Binary files a/rtdata/images/savednotg.png and /dev/null differ diff --git a/rtdata/images/splash.png b/rtdata/images/splash.png deleted file mode 100644 index 701ef02bf..000000000 Binary files a/rtdata/images/splash.png and /dev/null differ diff --git a/rtdata/images/stock-flip-horizontal.png b/rtdata/images/stock-flip-horizontal.png deleted file mode 100644 index 9c42f276e..000000000 Binary files a/rtdata/images/stock-flip-horizontal.png and /dev/null differ diff --git a/rtdata/images/stock-flip-vertical.png b/rtdata/images/stock-flip-vertical.png deleted file mode 100644 index 2b838c15b..000000000 Binary files a/rtdata/images/stock-flip-vertical.png and /dev/null differ diff --git a/rtdata/images/stock-rotate-270.png b/rtdata/images/stock-rotate-270.png deleted file mode 100644 index 2c6e23d37..000000000 Binary files a/rtdata/images/stock-rotate-270.png and /dev/null differ diff --git a/rtdata/images/stock-rotate-90.png b/rtdata/images/stock-rotate-90.png deleted file mode 100644 index 31cd17760..000000000 Binary files a/rtdata/images/stock-rotate-90.png and /dev/null differ diff --git a/rtdata/images/straighten-small.png b/rtdata/images/straighten-small.png deleted file mode 100644 index c750356ab..000000000 Binary files a/rtdata/images/straighten-small.png and /dev/null differ diff --git a/rtdata/images/straighten.png b/rtdata/images/straighten.png deleted file mode 100644 index 955af8f0a..000000000 Binary files a/rtdata/images/straighten.png and /dev/null differ diff --git a/rtdata/images/themed/png/dark/add-small.png b/rtdata/images/themed/png/dark/add-small.png new file mode 100644 index 000000000..44a3d8639 Binary files /dev/null and b/rtdata/images/themed/png/dark/add-small.png differ diff --git a/rtdata/images/themed/png/dark/add.png b/rtdata/images/themed/png/dark/add.png new file mode 100644 index 000000000..6b401bc87 Binary files /dev/null and b/rtdata/images/themed/png/dark/add.png differ diff --git a/rtdata/images/themed/png/dark/aperture.png b/rtdata/images/themed/png/dark/aperture.png new file mode 100644 index 000000000..a80fda199 Binary files /dev/null and b/rtdata/images/themed/png/dark/aperture.png differ diff --git a/rtdata/images/themed/png/dark/arrow-down-small.png b/rtdata/images/themed/png/dark/arrow-down-small.png new file mode 100644 index 000000000..3c1b4033a Binary files /dev/null and b/rtdata/images/themed/png/dark/arrow-down-small.png differ diff --git a/rtdata/images/themed/png/dark/arrow-left-small.png b/rtdata/images/themed/png/dark/arrow-left-small.png new file mode 100644 index 000000000..b8245b953 Binary files /dev/null and b/rtdata/images/themed/png/dark/arrow-left-small.png differ diff --git a/rtdata/images/themed/png/dark/arrow-right-small.png b/rtdata/images/themed/png/dark/arrow-right-small.png new file mode 100644 index 000000000..83177a23a Binary files /dev/null and b/rtdata/images/themed/png/dark/arrow-right-small.png differ diff --git a/rtdata/images/themed/png/dark/arrow-up-small.png b/rtdata/images/themed/png/dark/arrow-up-small.png new file mode 100644 index 000000000..0483b3e73 Binary files /dev/null and b/rtdata/images/themed/png/dark/arrow-up-small.png differ diff --git a/rtdata/images/themed/png/dark/arrow-updown.png b/rtdata/images/themed/png/dark/arrow-updown.png new file mode 100644 index 000000000..cd2c0b14e Binary files /dev/null and b/rtdata/images/themed/png/dark/arrow-updown.png differ diff --git a/rtdata/images/themed/png/dark/arrow2-left.png b/rtdata/images/themed/png/dark/arrow2-left.png new file mode 100644 index 000000000..dd0c0c3d7 Binary files /dev/null and b/rtdata/images/themed/png/dark/arrow2-left.png differ diff --git a/rtdata/images/themed/png/dark/arrow2-right.png b/rtdata/images/themed/png/dark/arrow2-right.png new file mode 100644 index 000000000..2ee87ec71 Binary files /dev/null and b/rtdata/images/themed/png/dark/arrow2-right.png differ diff --git a/rtdata/images/themed/png/dark/atom.png b/rtdata/images/themed/png/dark/atom.png new file mode 100644 index 000000000..9de042fbb Binary files /dev/null and b/rtdata/images/themed/png/dark/atom.png differ diff --git a/rtdata/images/themed/png/dark/bayer.png b/rtdata/images/themed/png/dark/bayer.png new file mode 100644 index 000000000..035318b9a Binary files /dev/null and b/rtdata/images/themed/png/dark/bayer.png differ diff --git a/rtdata/images/themed/png/dark/beforeafter.png b/rtdata/images/themed/png/dark/beforeafter.png new file mode 100644 index 000000000..25bd64b5a Binary files /dev/null and b/rtdata/images/themed/png/dark/beforeafter.png differ diff --git a/rtdata/images/themed/png/dark/cancel-small.png b/rtdata/images/themed/png/dark/cancel-small.png new file mode 100644 index 000000000..8a812e8f3 Binary files /dev/null and b/rtdata/images/themed/png/dark/cancel-small.png differ diff --git a/rtdata/images/themed/png/dark/cancel.png b/rtdata/images/themed/png/dark/cancel.png new file mode 100644 index 000000000..6eda05c50 Binary files /dev/null and b/rtdata/images/themed/png/dark/cancel.png differ diff --git a/rtdata/images/themed/png/dark/circle-black-small.png b/rtdata/images/themed/png/dark/circle-black-small.png new file mode 100644 index 000000000..f18a415b6 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-black-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-blue-green-small.png b/rtdata/images/themed/png/dark/circle-blue-green-small.png new file mode 100644 index 000000000..247931823 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-blue-green-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-blue-red-small.png b/rtdata/images/themed/png/dark/circle-blue-red-small.png new file mode 100644 index 000000000..d88a01330 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-blue-red-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-blue-small.png b/rtdata/images/themed/png/dark/circle-blue-small.png new file mode 100644 index 000000000..2c8ff48fd Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-blue-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-blue-yellow-small.png b/rtdata/images/themed/png/dark/circle-blue-yellow-small.png new file mode 100644 index 000000000..0585b2195 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-blue-yellow-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-cyan-red-small.png b/rtdata/images/themed/png/dark/circle-cyan-red-small.png new file mode 100644 index 000000000..ed7003161 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-cyan-red-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-cyan-small.png b/rtdata/images/themed/png/dark/circle-cyan-small.png new file mode 100644 index 000000000..84f873a2c Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-cyan-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-darkgray-small.png b/rtdata/images/themed/png/dark/circle-darkgray-small.png new file mode 100644 index 000000000..e706b1eba Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-darkgray-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-empty-blue-small.png b/rtdata/images/themed/png/dark/circle-empty-blue-small.png new file mode 100644 index 000000000..d53b3516e Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-empty-blue-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-empty-darkgray-small.png b/rtdata/images/themed/png/dark/circle-empty-darkgray-small.png new file mode 100644 index 000000000..4f0f0f4c7 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-empty-darkgray-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-empty-gray-small.png b/rtdata/images/themed/png/dark/circle-empty-gray-small.png new file mode 100644 index 000000000..b3a57c83b Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-empty-gray-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-empty-green-small.png b/rtdata/images/themed/png/dark/circle-empty-green-small.png new file mode 100644 index 000000000..3b1444d37 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-empty-green-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-empty-purple-small.png b/rtdata/images/themed/png/dark/circle-empty-purple-small.png new file mode 100644 index 000000000..e61da8e9f Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-empty-purple-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-empty-red-small.png b/rtdata/images/themed/png/dark/circle-empty-red-small.png new file mode 100644 index 000000000..bf8035931 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-empty-red-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-empty-yellow-small.png b/rtdata/images/themed/png/dark/circle-empty-yellow-small.png new file mode 100644 index 000000000..9a3ca9bd8 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-empty-yellow-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-gray-blue-small.png b/rtdata/images/themed/png/dark/circle-gray-blue-small.png new file mode 100644 index 000000000..01d5da881 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-gray-blue-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-gray-green-small.png b/rtdata/images/themed/png/dark/circle-gray-green-small.png new file mode 100644 index 000000000..2290b708f Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-gray-green-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-gray-red-small.png b/rtdata/images/themed/png/dark/circle-gray-red-small.png new file mode 100644 index 000000000..29afda33b Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-gray-red-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-gray-small.png b/rtdata/images/themed/png/dark/circle-gray-small.png new file mode 100644 index 000000000..18ad6330a Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-gray-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-green-blue-small.png b/rtdata/images/themed/png/dark/circle-green-blue-small.png new file mode 100644 index 000000000..1d6e60252 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-green-blue-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-green-red-small.png b/rtdata/images/themed/png/dark/circle-green-red-small.png new file mode 100644 index 000000000..96f86b1b9 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-green-red-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-green-small.png b/rtdata/images/themed/png/dark/circle-green-small.png new file mode 100644 index 000000000..88270e0cb Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-green-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-magenta-small.png b/rtdata/images/themed/png/dark/circle-magenta-small.png new file mode 100644 index 000000000..cce26e1f2 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-magenta-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-orange-small.png b/rtdata/images/themed/png/dark/circle-orange-small.png new file mode 100644 index 000000000..5894f0987 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-orange-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-purple-small.png b/rtdata/images/themed/png/dark/circle-purple-small.png new file mode 100644 index 000000000..9fe4eb0d6 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-purple-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-red-blue-small.png b/rtdata/images/themed/png/dark/circle-red-blue-small.png new file mode 100644 index 000000000..e70ef22f6 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-red-blue-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-red-cyan-small.png b/rtdata/images/themed/png/dark/circle-red-cyan-small.png new file mode 100644 index 000000000..92b03b953 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-red-cyan-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-red-green-small.png b/rtdata/images/themed/png/dark/circle-red-green-small.png new file mode 100644 index 000000000..4572e019f Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-red-green-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-red-small.png b/rtdata/images/themed/png/dark/circle-red-small.png new file mode 100644 index 000000000..a8c9cecec Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-red-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-white-small.png b/rtdata/images/themed/png/dark/circle-white-small.png new file mode 100644 index 000000000..acf4f8b76 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-white-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-yellow-blue-small.png b/rtdata/images/themed/png/dark/circle-yellow-blue-small.png new file mode 100644 index 000000000..1f7aec9f2 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-yellow-blue-small.png differ diff --git a/rtdata/images/themed/png/dark/circle-yellow-small.png b/rtdata/images/themed/png/dark/circle-yellow-small.png new file mode 100644 index 000000000..1c5678ac2 Binary files /dev/null and b/rtdata/images/themed/png/dark/circle-yellow-small.png differ diff --git a/rtdata/images/themed/png/dark/color-circles.png b/rtdata/images/themed/png/dark/color-circles.png new file mode 100644 index 000000000..f4b974b13 Binary files /dev/null and b/rtdata/images/themed/png/dark/color-circles.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png b/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png new file mode 100644 index 000000000..5dcdacf1f Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-add-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-add.png b/rtdata/images/themed/png/dark/color-picker-add.png new file mode 100644 index 000000000..fc4b040e2 Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-add.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-bars.png b/rtdata/images/themed/png/dark/color-picker-bars.png new file mode 100644 index 000000000..66e749864 Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-bars.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-hicontrast.png b/rtdata/images/themed/png/dark/color-picker-hicontrast.png new file mode 100644 index 000000000..c7bfb850b Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-hide.png b/rtdata/images/themed/png/dark/color-picker-hide.png new file mode 100644 index 000000000..0bd4fafba Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-hide.png differ diff --git a/rtdata/images/themed/png/dark/color-picker-small.png b/rtdata/images/themed/png/dark/color-picker-small.png new file mode 100644 index 000000000..5976b6e11 Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker-small.png differ diff --git a/rtdata/images/themed/png/dark/color-picker.png b/rtdata/images/themed/png/dark/color-picker.png new file mode 100644 index 000000000..f0174fd44 Binary files /dev/null and b/rtdata/images/themed/png/dark/color-picker.png differ diff --git a/rtdata/images/themed/png/dark/contrastmask-off.png b/rtdata/images/themed/png/dark/contrastmask-off.png new file mode 100644 index 000000000..f551f5413 Binary files /dev/null and b/rtdata/images/themed/png/dark/contrastmask-off.png differ diff --git a/rtdata/images/themed/png/dark/contrastmask-on.png b/rtdata/images/themed/png/dark/contrastmask-on.png new file mode 100644 index 000000000..28ea71f52 Binary files /dev/null and b/rtdata/images/themed/png/dark/contrastmask-on.png differ diff --git a/rtdata/images/themed/png/dark/copy.png b/rtdata/images/themed/png/dark/copy.png new file mode 100644 index 000000000..3b51949ed Binary files /dev/null and b/rtdata/images/themed/png/dark/copy.png differ diff --git a/rtdata/images/themed/png/dark/crop-auto-small.png b/rtdata/images/themed/png/dark/crop-auto-small.png new file mode 100644 index 000000000..d7942888d Binary files /dev/null and b/rtdata/images/themed/png/dark/crop-auto-small.png differ diff --git a/rtdata/images/themed/png/dark/crop-auto.png b/rtdata/images/themed/png/dark/crop-auto.png new file mode 100644 index 000000000..52cbd9e77 Binary files /dev/null and b/rtdata/images/themed/png/dark/crop-auto.png differ diff --git a/rtdata/images/themed/png/dark/crop-point-hicontrast.png b/rtdata/images/themed/png/dark/crop-point-hicontrast.png new file mode 100644 index 000000000..65aa29856 Binary files /dev/null and b/rtdata/images/themed/png/dark/crop-point-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/crop-small.png b/rtdata/images/themed/png/dark/crop-small.png new file mode 100644 index 000000000..aa278c16c Binary files /dev/null and b/rtdata/images/themed/png/dark/crop-small.png differ diff --git a/rtdata/images/themed/png/dark/crop.png b/rtdata/images/themed/png/dark/crop.png new file mode 100644 index 000000000..d8a290eec Binary files /dev/null and b/rtdata/images/themed/png/dark/crop.png differ diff --git a/rtdata/images/themed/png/dark/crossed-arrows-in.png b/rtdata/images/themed/png/dark/crossed-arrows-in.png new file mode 100644 index 000000000..531803679 Binary files /dev/null and b/rtdata/images/themed/png/dark/crossed-arrows-in.png differ diff --git a/rtdata/images/themed/png/dark/crossed-arrows-out.png b/rtdata/images/themed/png/dark/crossed-arrows-out.png new file mode 100644 index 000000000..c05eb3fe8 Binary files /dev/null and b/rtdata/images/themed/png/dark/crossed-arrows-out.png differ diff --git a/rtdata/images/themed/png/dark/crosshair-adjust.png b/rtdata/images/themed/png/dark/crosshair-adjust.png new file mode 100644 index 000000000..8536e8f09 Binary files /dev/null and b/rtdata/images/themed/png/dark/crosshair-adjust.png differ diff --git a/rtdata/images/themed/png/dark/crosshair-hicontrast.png b/rtdata/images/themed/png/dark/crosshair-hicontrast.png new file mode 100644 index 000000000..078512803 Binary files /dev/null and b/rtdata/images/themed/png/dark/crosshair-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/crosshair-node-curve.png b/rtdata/images/themed/png/dark/crosshair-node-curve.png new file mode 100644 index 000000000..08d6e00ff Binary files /dev/null and b/rtdata/images/themed/png/dark/crosshair-node-curve.png differ diff --git a/rtdata/images/themed/png/dark/crosshair-small.png b/rtdata/images/themed/png/dark/crosshair-small.png new file mode 100644 index 000000000..66db0bd42 Binary files /dev/null and b/rtdata/images/themed/png/dark/crosshair-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-catmullrom-small.png b/rtdata/images/themed/png/dark/curve-catmullrom-small.png new file mode 100644 index 000000000..d3fb3188d Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-catmullrom-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-catmullrom.png b/rtdata/images/themed/png/dark/curve-catmullrom.png new file mode 100644 index 000000000..ad8446f88 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-catmullrom.png differ diff --git a/rtdata/images/themed/png/dark/curve-controlpoints-small.png b/rtdata/images/themed/png/dark/curve-controlpoints-small.png new file mode 100644 index 000000000..e4107e5e4 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-controlpoints-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-controlpoints.png b/rtdata/images/themed/png/dark/curve-controlpoints.png new file mode 100644 index 000000000..e85d1a214 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-controlpoints.png differ diff --git a/rtdata/images/themed/png/dark/curve-flat-small.png b/rtdata/images/themed/png/dark/curve-flat-small.png new file mode 100644 index 000000000..61893e320 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-flat-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-flat.png b/rtdata/images/themed/png/dark/curve-flat.png new file mode 100644 index 000000000..7621dd8a0 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-flat.png differ diff --git a/rtdata/images/themed/png/dark/curve-linear-small.png b/rtdata/images/themed/png/dark/curve-linear-small.png new file mode 100644 index 000000000..723d29e93 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-linear-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-linear.png b/rtdata/images/themed/png/dark/curve-linear.png new file mode 100644 index 000000000..60a8b3d73 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-linear.png differ diff --git a/rtdata/images/themed/png/dark/curve-nurbs-small.png b/rtdata/images/themed/png/dark/curve-nurbs-small.png new file mode 100644 index 000000000..0ba221d92 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-nurbs-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-nurbs.png b/rtdata/images/themed/png/dark/curve-nurbs.png new file mode 100644 index 000000000..8d9425a0b Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-nurbs.png differ diff --git a/rtdata/images/themed/png/dark/curve-parametric-small.png b/rtdata/images/themed/png/dark/curve-parametric-small.png new file mode 100644 index 000000000..237b76125 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-parametric-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-parametric.png b/rtdata/images/themed/png/dark/curve-parametric.png new file mode 100644 index 000000000..97f3ac96b Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-parametric.png differ diff --git a/rtdata/images/themed/png/dark/curve-spline-small.png b/rtdata/images/themed/png/dark/curve-spline-small.png new file mode 100644 index 000000000..763beda56 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-spline-small.png differ diff --git a/rtdata/images/themed/png/dark/curve-spline.png b/rtdata/images/themed/png/dark/curve-spline.png new file mode 100644 index 000000000..c86105d46 Binary files /dev/null and b/rtdata/images/themed/png/dark/curve-spline.png differ diff --git a/rtdata/images/themed/png/dark/detail.png b/rtdata/images/themed/png/dark/detail.png new file mode 100644 index 000000000..73ee6a9f0 Binary files /dev/null and b/rtdata/images/themed/png/dark/detail.png differ diff --git a/rtdata/images/themed/png/dark/device-floppy.png b/rtdata/images/themed/png/dark/device-floppy.png new file mode 100644 index 000000000..939a6d63e Binary files /dev/null and b/rtdata/images/themed/png/dark/device-floppy.png differ diff --git a/rtdata/images/themed/png/dark/device-hdd.png b/rtdata/images/themed/png/dark/device-hdd.png new file mode 100644 index 000000000..92ddc0e01 Binary files /dev/null and b/rtdata/images/themed/png/dark/device-hdd.png differ diff --git a/rtdata/images/themed/png/dark/device-network.png b/rtdata/images/themed/png/dark/device-network.png new file mode 100644 index 000000000..4aa2516ef Binary files /dev/null and b/rtdata/images/themed/png/dark/device-network.png differ diff --git a/rtdata/images/themed/png/dark/device-optical.png b/rtdata/images/themed/png/dark/device-optical.png new file mode 100644 index 000000000..e5cd69a02 Binary files /dev/null and b/rtdata/images/themed/png/dark/device-optical.png differ diff --git a/rtdata/images/themed/png/dark/device-usb.png b/rtdata/images/themed/png/dark/device-usb.png new file mode 100644 index 000000000..a19b591e6 Binary files /dev/null and b/rtdata/images/themed/png/dark/device-usb.png differ diff --git a/rtdata/images/themed/png/dark/distortion-auto-small.png b/rtdata/images/themed/png/dark/distortion-auto-small.png new file mode 100644 index 000000000..e002a4ae7 Binary files /dev/null and b/rtdata/images/themed/png/dark/distortion-auto-small.png differ diff --git a/rtdata/images/themed/png/dark/distortion-auto.png b/rtdata/images/themed/png/dark/distortion-auto.png new file mode 100644 index 000000000..28c89da36 Binary files /dev/null and b/rtdata/images/themed/png/dark/distortion-auto.png differ diff --git a/rtdata/images/themed/png/dark/distortion-barrel-small.png b/rtdata/images/themed/png/dark/distortion-barrel-small.png new file mode 100644 index 000000000..531fd93d9 Binary files /dev/null and b/rtdata/images/themed/png/dark/distortion-barrel-small.png differ diff --git a/rtdata/images/themed/png/dark/distortion-barrel.png b/rtdata/images/themed/png/dark/distortion-barrel.png new file mode 100644 index 000000000..44f312dc9 Binary files /dev/null and b/rtdata/images/themed/png/dark/distortion-barrel.png differ diff --git a/rtdata/images/themed/png/dark/distortion-pincushion-small.png b/rtdata/images/themed/png/dark/distortion-pincushion-small.png new file mode 100644 index 000000000..c33205d78 Binary files /dev/null and b/rtdata/images/themed/png/dark/distortion-pincushion-small.png differ diff --git a/rtdata/images/themed/png/dark/distortion-pincushion.png b/rtdata/images/themed/png/dark/distortion-pincushion.png new file mode 100644 index 000000000..219dc6d37 Binary files /dev/null and b/rtdata/images/themed/png/dark/distortion-pincushion.png differ diff --git a/rtdata/images/themed/png/dark/edit-point.png b/rtdata/images/themed/png/dark/edit-point.png new file mode 100644 index 000000000..8ead1ea66 Binary files /dev/null and b/rtdata/images/themed/png/dark/edit-point.png differ diff --git a/rtdata/images/themed/png/dark/equilizer-narrow.png b/rtdata/images/themed/png/dark/equilizer-narrow.png new file mode 100644 index 000000000..6ee072ae5 Binary files /dev/null and b/rtdata/images/themed/png/dark/equilizer-narrow.png differ diff --git a/rtdata/images/themed/png/dark/equilizer-wide.png b/rtdata/images/themed/png/dark/equilizer-wide.png new file mode 100644 index 000000000..37c07c605 Binary files /dev/null and b/rtdata/images/themed/png/dark/equilizer-wide.png differ diff --git a/rtdata/images/themed/png/dark/expander-closed-small.png b/rtdata/images/themed/png/dark/expander-closed-small.png new file mode 100644 index 000000000..b59480cd5 Binary files /dev/null and b/rtdata/images/themed/png/dark/expander-closed-small.png differ diff --git a/rtdata/images/themed/png/dark/expander-open-small.png b/rtdata/images/themed/png/dark/expander-open-small.png new file mode 100644 index 000000000..15b74149a Binary files /dev/null and b/rtdata/images/themed/png/dark/expander-open-small.png differ diff --git a/rtdata/images/themed/png/dark/exposure.png b/rtdata/images/themed/png/dark/exposure.png new file mode 100644 index 000000000..f7cc6e155 Binary files /dev/null and b/rtdata/images/themed/png/dark/exposure.png differ diff --git a/rtdata/images/themed/png/dark/filetype-hdr.png b/rtdata/images/themed/png/dark/filetype-hdr.png new file mode 100644 index 000000000..a333858d5 Binary files /dev/null and b/rtdata/images/themed/png/dark/filetype-hdr.png differ diff --git a/rtdata/images/themed/png/dark/filetype-ps.png b/rtdata/images/themed/png/dark/filetype-ps.png new file mode 100644 index 000000000..414530cdd Binary files /dev/null and b/rtdata/images/themed/png/dark/filetype-ps.png differ diff --git a/rtdata/images/themed/png/dark/filter-clear.png b/rtdata/images/themed/png/dark/filter-clear.png new file mode 100644 index 000000000..acb729f11 Binary files /dev/null and b/rtdata/images/themed/png/dark/filter-clear.png differ diff --git a/rtdata/images/themed/png/dark/filter-original.png b/rtdata/images/themed/png/dark/filter-original.png new file mode 100644 index 000000000..9f538fab4 Binary files /dev/null and b/rtdata/images/themed/png/dark/filter-original.png differ diff --git a/rtdata/images/themed/png/dark/filter-original2.png b/rtdata/images/themed/png/dark/filter-original2.png new file mode 100644 index 000000000..7617380b2 Binary files /dev/null and b/rtdata/images/themed/png/dark/filter-original2.png differ diff --git a/rtdata/images/themed/png/dark/filter.png b/rtdata/images/themed/png/dark/filter.png new file mode 100644 index 000000000..af0060c9a Binary files /dev/null and b/rtdata/images/themed/png/dark/filter.png differ diff --git a/rtdata/images/themed/png/dark/flip-horizontal.png b/rtdata/images/themed/png/dark/flip-horizontal.png new file mode 100644 index 000000000..fe53cefe7 Binary files /dev/null and b/rtdata/images/themed/png/dark/flip-horizontal.png differ diff --git a/rtdata/images/themed/png/dark/flip-vertical.png b/rtdata/images/themed/png/dark/flip-vertical.png new file mode 100644 index 000000000..85e7ccd02 Binary files /dev/null and b/rtdata/images/themed/png/dark/flip-vertical.png differ diff --git a/rtdata/images/themed/png/dark/focusscreen-off.png b/rtdata/images/themed/png/dark/focusscreen-off.png new file mode 100644 index 000000000..5ee597b3b Binary files /dev/null and b/rtdata/images/themed/png/dark/focusscreen-off.png differ diff --git a/rtdata/images/themed/png/dark/focusscreen-on.png b/rtdata/images/themed/png/dark/focusscreen-on.png new file mode 100644 index 000000000..f9c418b92 Binary files /dev/null and b/rtdata/images/themed/png/dark/focusscreen-on.png differ diff --git a/rtdata/images/themed/png/dark/folder-closed-home-small.png b/rtdata/images/themed/png/dark/folder-closed-home-small.png new file mode 100644 index 000000000..06aeea67a Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-closed-home-small.png differ diff --git a/rtdata/images/themed/png/dark/folder-closed-home.png b/rtdata/images/themed/png/dark/folder-closed-home.png new file mode 100644 index 000000000..88f801d24 Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-closed-home.png differ diff --git a/rtdata/images/themed/png/dark/folder-closed-recent-small.png b/rtdata/images/themed/png/dark/folder-closed-recent-small.png new file mode 100644 index 000000000..fdf1696b3 Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-closed-recent-small.png differ diff --git a/rtdata/images/themed/png/dark/folder-closed-recent.png b/rtdata/images/themed/png/dark/folder-closed-recent.png new file mode 100644 index 000000000..fe23eea9f Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-closed-recent.png differ diff --git a/rtdata/images/themed/png/dark/folder-closed-small.png b/rtdata/images/themed/png/dark/folder-closed-small.png new file mode 100644 index 000000000..de543f67f Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-closed-small.png differ diff --git a/rtdata/images/themed/png/dark/folder-closed.png b/rtdata/images/themed/png/dark/folder-closed.png new file mode 100644 index 000000000..2ec2d9717 Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-closed.png differ diff --git a/rtdata/images/themed/png/dark/folder-open-recent-small.png b/rtdata/images/themed/png/dark/folder-open-recent-small.png new file mode 100644 index 000000000..3fac2f496 Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-open-recent-small.png differ diff --git a/rtdata/images/themed/png/dark/folder-open-recent.png b/rtdata/images/themed/png/dark/folder-open-recent.png new file mode 100644 index 000000000..acf421774 Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-open-recent.png differ diff --git a/rtdata/images/themed/png/dark/folder-open-small.png b/rtdata/images/themed/png/dark/folder-open-small.png new file mode 100644 index 000000000..56eca1923 Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-open-small.png differ diff --git a/rtdata/images/themed/png/dark/folder-open.png b/rtdata/images/themed/png/dark/folder-open.png new file mode 100644 index 000000000..df99ec1a2 Binary files /dev/null and b/rtdata/images/themed/png/dark/folder-open.png differ diff --git a/rtdata/images/themed/png/dark/fullscreen-enter.png b/rtdata/images/themed/png/dark/fullscreen-enter.png new file mode 100644 index 000000000..2986358eb Binary files /dev/null and b/rtdata/images/themed/png/dark/fullscreen-enter.png differ diff --git a/rtdata/images/themed/png/dark/fullscreen-leave.png b/rtdata/images/themed/png/dark/fullscreen-leave.png new file mode 100644 index 000000000..5844f0e85 Binary files /dev/null and b/rtdata/images/themed/png/dark/fullscreen-leave.png differ diff --git a/rtdata/images/themed/png/dark/gamut-hist.png b/rtdata/images/themed/png/dark/gamut-hist.png new file mode 100644 index 000000000..346ae6225 Binary files /dev/null and b/rtdata/images/themed/png/dark/gamut-hist.png differ diff --git a/rtdata/images/themed/png/dark/gamut-plus.png b/rtdata/images/themed/png/dark/gamut-plus.png new file mode 100644 index 000000000..a83f5e603 Binary files /dev/null and b/rtdata/images/themed/png/dark/gamut-plus.png differ diff --git a/rtdata/images/themed/png/dark/gamut-softproof.png b/rtdata/images/themed/png/dark/gamut-softproof.png new file mode 100644 index 000000000..b130cc275 Binary files /dev/null and b/rtdata/images/themed/png/dark/gamut-softproof.png differ diff --git a/rtdata/images/themed/png/dark/gamut-warning.png b/rtdata/images/themed/png/dark/gamut-warning.png new file mode 100644 index 000000000..cf09ff17d Binary files /dev/null and b/rtdata/images/themed/png/dark/gamut-warning.png differ diff --git a/rtdata/images/themed/png/dark/gamut_srgb_prophoto_xy.png b/rtdata/images/themed/png/dark/gamut_srgb_prophoto_xy.png new file mode 100644 index 000000000..8e131b1dd Binary files /dev/null and b/rtdata/images/themed/png/dark/gamut_srgb_prophoto_xy.png differ diff --git a/rtdata/images/themed/png/dark/gears-pause.png b/rtdata/images/themed/png/dark/gears-pause.png new file mode 100644 index 000000000..e9cb6a535 Binary files /dev/null and b/rtdata/images/themed/png/dark/gears-pause.png differ diff --git a/rtdata/images/themed/png/dark/gears-play.png b/rtdata/images/themed/png/dark/gears-play.png new file mode 100644 index 000000000..917130261 Binary files /dev/null and b/rtdata/images/themed/png/dark/gears-play.png differ diff --git a/rtdata/images/themed/png/dark/gears-small.png b/rtdata/images/themed/png/dark/gears-small.png new file mode 100644 index 000000000..70186dd18 Binary files /dev/null and b/rtdata/images/themed/png/dark/gears-small.png differ diff --git a/rtdata/images/themed/png/dark/gears.png b/rtdata/images/themed/png/dark/gears.png new file mode 100644 index 000000000..e21456d9f Binary files /dev/null and b/rtdata/images/themed/png/dark/gears.png differ diff --git a/rtdata/images/themed/png/dark/goto-end-small.png b/rtdata/images/themed/png/dark/goto-end-small.png new file mode 100644 index 000000000..13f626635 Binary files /dev/null and b/rtdata/images/themed/png/dark/goto-end-small.png differ diff --git a/rtdata/images/themed/png/dark/goto-start-small.png b/rtdata/images/themed/png/dark/goto-start-small.png new file mode 100644 index 000000000..70cc10bf4 Binary files /dev/null and b/rtdata/images/themed/png/dark/goto-start-small.png differ diff --git a/rtdata/images/themed/png/dark/hand-closed-hicontrast.png b/rtdata/images/themed/png/dark/hand-closed-hicontrast.png new file mode 100644 index 000000000..590d95096 Binary files /dev/null and b/rtdata/images/themed/png/dark/hand-closed-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/hand-open-hicontrast.png b/rtdata/images/themed/png/dark/hand-open-hicontrast.png new file mode 100644 index 000000000..2ee26e375 Binary files /dev/null and b/rtdata/images/themed/png/dark/hand-open-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/hand-open.png b/rtdata/images/themed/png/dark/hand-open.png new file mode 100644 index 000000000..85fcaaacc Binary files /dev/null and b/rtdata/images/themed/png/dark/hand-open.png differ diff --git a/rtdata/images/themed/png/dark/histogram-bar-off-small.png b/rtdata/images/themed/png/dark/histogram-bar-off-small.png new file mode 100644 index 000000000..5c9c21e72 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-bar-off-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-bar-on-small.png b/rtdata/images/themed/png/dark/histogram-bar-on-small.png new file mode 100644 index 000000000..f8a5bddf6 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-bar-on-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-bayer-off-small.png b/rtdata/images/themed/png/dark/histogram-bayer-off-small.png new file mode 100644 index 000000000..af1369145 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-bayer-off-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-bayer-on-small.png b/rtdata/images/themed/png/dark/histogram-bayer-on-small.png new file mode 100644 index 000000000..44e23b51b Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-bayer-on-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-blue-off-small.png b/rtdata/images/themed/png/dark/histogram-blue-off-small.png new file mode 100644 index 000000000..8b368ed63 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-blue-off-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-blue-on-small.png b/rtdata/images/themed/png/dark/histogram-blue-on-small.png new file mode 100644 index 000000000..537153043 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-blue-on-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-gold-off-small.png b/rtdata/images/themed/png/dark/histogram-gold-off-small.png new file mode 100644 index 000000000..4272c3ff7 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-gold-off-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-gold-on-small.png b/rtdata/images/themed/png/dark/histogram-gold-on-small.png new file mode 100644 index 000000000..8f32203fd Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-gold-on-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-green-off-small.png b/rtdata/images/themed/png/dark/histogram-green-off-small.png new file mode 100644 index 000000000..395fcac9e Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-green-off-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-green-on-small.png b/rtdata/images/themed/png/dark/histogram-green-on-small.png new file mode 100644 index 000000000..db3f89ef5 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-green-on-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-mode-linear-small.png b/rtdata/images/themed/png/dark/histogram-mode-linear-small.png new file mode 100644 index 000000000..507be4c3e Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-mode-linear-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-mode-logx-small.png b/rtdata/images/themed/png/dark/histogram-mode-logx-small.png new file mode 100644 index 000000000..2a0b7cc6a Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-mode-logx-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-mode-logxy-small.png b/rtdata/images/themed/png/dark/histogram-mode-logxy-small.png new file mode 100644 index 000000000..23bf705ac Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-mode-logxy-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-red-off-small.png b/rtdata/images/themed/png/dark/histogram-red-off-small.png new file mode 100644 index 000000000..7d5ea5352 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-red-off-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-red-on-small.png b/rtdata/images/themed/png/dark/histogram-red-on-small.png new file mode 100644 index 000000000..deee136a2 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-red-on-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-silver-off-small.png b/rtdata/images/themed/png/dark/histogram-silver-off-small.png new file mode 100644 index 000000000..d88e879bc Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-silver-off-small.png differ diff --git a/rtdata/images/themed/png/dark/histogram-silver-on-small.png b/rtdata/images/themed/png/dark/histogram-silver-on-small.png new file mode 100644 index 000000000..bdef06144 Binary files /dev/null and b/rtdata/images/themed/png/dark/histogram-silver-on-small.png differ diff --git a/rtdata/images/themed/png/dark/info.png b/rtdata/images/themed/png/dark/info.png new file mode 100644 index 000000000..4d7ad53bb Binary files /dev/null and b/rtdata/images/themed/png/dark/info.png differ diff --git a/rtdata/images/themed/png/dark/intent-absolute.png b/rtdata/images/themed/png/dark/intent-absolute.png new file mode 100644 index 000000000..14cc9f44b Binary files /dev/null and b/rtdata/images/themed/png/dark/intent-absolute.png differ diff --git a/rtdata/images/themed/png/dark/intent-perceptual.png b/rtdata/images/themed/png/dark/intent-perceptual.png new file mode 100644 index 000000000..44507d85f Binary files /dev/null and b/rtdata/images/themed/png/dark/intent-perceptual.png differ diff --git a/rtdata/images/themed/png/dark/intent-relative.png b/rtdata/images/themed/png/dark/intent-relative.png new file mode 100644 index 000000000..895c335c1 Binary files /dev/null and b/rtdata/images/themed/png/dark/intent-relative.png differ diff --git a/rtdata/images/themed/png/dark/intent-saturation.png b/rtdata/images/themed/png/dark/intent-saturation.png new file mode 100644 index 000000000..fb33221e4 Binary files /dev/null and b/rtdata/images/themed/png/dark/intent-saturation.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-1to1-small.png b/rtdata/images/themed/png/dark/magnifier-1to1-small.png new file mode 100644 index 000000000..b68d5d975 Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-1to1-small.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-1to1.png b/rtdata/images/themed/png/dark/magnifier-1to1.png new file mode 100644 index 000000000..b111f5cb6 Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-1to1.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-crop.png b/rtdata/images/themed/png/dark/magnifier-crop.png new file mode 100644 index 000000000..1302ac7f9 Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-crop.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-fit.png b/rtdata/images/themed/png/dark/magnifier-fit.png new file mode 100644 index 000000000..d3c238338 Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-fit.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-minus-small.png b/rtdata/images/themed/png/dark/magnifier-minus-small.png new file mode 100644 index 000000000..dd1b65589 Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-minus-small.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-minus.png b/rtdata/images/themed/png/dark/magnifier-minus.png new file mode 100644 index 000000000..1f60a292a Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-minus.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-plus-small.png b/rtdata/images/themed/png/dark/magnifier-plus-small.png new file mode 100644 index 000000000..532f9c426 Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-plus-small.png differ diff --git a/rtdata/images/themed/png/dark/magnifier-plus.png b/rtdata/images/themed/png/dark/magnifier-plus.png new file mode 100644 index 000000000..b8d6a2a7a Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier-plus.png differ diff --git a/rtdata/images/themed/png/dark/magnifier.png b/rtdata/images/themed/png/dark/magnifier.png new file mode 100644 index 000000000..6ae59fd55 Binary files /dev/null and b/rtdata/images/themed/png/dark/magnifier.png differ diff --git a/rtdata/images/themed/png/dark/metadata.png b/rtdata/images/themed/png/dark/metadata.png new file mode 100644 index 000000000..48fccde79 Binary files /dev/null and b/rtdata/images/themed/png/dark/metadata.png differ diff --git a/rtdata/images/themed/png/dark/node-move-nw-se-hicontrast.png b/rtdata/images/themed/png/dark/node-move-nw-se-hicontrast.png new file mode 100644 index 000000000..b802c5849 Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-nw-se-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/node-move-sw-ne-hicontrast.png b/rtdata/images/themed/png/dark/node-move-sw-ne-hicontrast.png new file mode 100644 index 000000000..2e51e88a3 Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-sw-ne-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/node-move-x-hicontrast.png b/rtdata/images/themed/png/dark/node-move-x-hicontrast.png new file mode 100644 index 000000000..1cc871dbb Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-x-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/node-move-xy-hicontrast.png b/rtdata/images/themed/png/dark/node-move-xy-hicontrast.png new file mode 100644 index 000000000..8b843958d Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-xy-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/node-move-y-hicontrast.png b/rtdata/images/themed/png/dark/node-move-y-hicontrast.png new file mode 100644 index 000000000..f80690851 Binary files /dev/null and b/rtdata/images/themed/png/dark/node-move-y-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/one-to-one-small.png b/rtdata/images/themed/png/dark/one-to-one-small.png new file mode 100644 index 000000000..50cda2db5 Binary files /dev/null and b/rtdata/images/themed/png/dark/one-to-one-small.png differ diff --git a/rtdata/images/themed/png/dark/ornament1.png b/rtdata/images/themed/png/dark/ornament1.png new file mode 100644 index 000000000..2acdd19e8 Binary files /dev/null and b/rtdata/images/themed/png/dark/ornament1.png differ diff --git a/rtdata/images/themed/png/dark/padlock-locked-small.png b/rtdata/images/themed/png/dark/padlock-locked-small.png new file mode 100644 index 000000000..8f7c12169 Binary files /dev/null and b/rtdata/images/themed/png/dark/padlock-locked-small.png differ diff --git a/rtdata/images/themed/png/dark/padlock-unlocked-small.png b/rtdata/images/themed/png/dark/padlock-unlocked-small.png new file mode 100644 index 000000000..ad27326c7 Binary files /dev/null and b/rtdata/images/themed/png/dark/padlock-unlocked-small.png differ diff --git a/rtdata/images/themed/png/dark/palette-brush.png b/rtdata/images/themed/png/dark/palette-brush.png new file mode 100644 index 000000000..592521db0 Binary files /dev/null and b/rtdata/images/themed/png/dark/palette-brush.png differ diff --git a/rtdata/images/themed/png/dark/panel-to-bottom.png b/rtdata/images/themed/png/dark/panel-to-bottom.png new file mode 100644 index 000000000..a8ed862f1 Binary files /dev/null and b/rtdata/images/themed/png/dark/panel-to-bottom.png differ diff --git a/rtdata/images/themed/png/dark/panel-to-left.png b/rtdata/images/themed/png/dark/panel-to-left.png new file mode 100644 index 000000000..51eb8b845 Binary files /dev/null and b/rtdata/images/themed/png/dark/panel-to-left.png differ diff --git a/rtdata/images/themed/png/dark/panel-to-right.png b/rtdata/images/themed/png/dark/panel-to-right.png new file mode 100644 index 000000000..372607970 Binary files /dev/null and b/rtdata/images/themed/png/dark/panel-to-right.png differ diff --git a/rtdata/images/themed/png/dark/panel-to-top.png b/rtdata/images/themed/png/dark/panel-to-top.png new file mode 100644 index 000000000..fc92ca1f6 Binary files /dev/null and b/rtdata/images/themed/png/dark/panel-to-top.png differ diff --git a/rtdata/images/themed/png/dark/paste.png b/rtdata/images/themed/png/dark/paste.png new file mode 100644 index 000000000..fba618a86 Binary files /dev/null and b/rtdata/images/themed/png/dark/paste.png differ diff --git a/rtdata/images/themed/png/dark/perspective-horizontal-left-small.png b/rtdata/images/themed/png/dark/perspective-horizontal-left-small.png new file mode 100644 index 000000000..039485fe3 Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-horizontal-left-small.png differ diff --git a/rtdata/images/themed/png/dark/perspective-horizontal-left.png b/rtdata/images/themed/png/dark/perspective-horizontal-left.png new file mode 100644 index 000000000..b2b169840 Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-horizontal-left.png differ diff --git a/rtdata/images/themed/png/dark/perspective-horizontal-right-small.png b/rtdata/images/themed/png/dark/perspective-horizontal-right-small.png new file mode 100644 index 000000000..a917cf458 Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-horizontal-right-small.png differ diff --git a/rtdata/images/themed/png/dark/perspective-horizontal-right.png b/rtdata/images/themed/png/dark/perspective-horizontal-right.png new file mode 100644 index 000000000..6ab911949 Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-horizontal-right.png differ diff --git a/rtdata/images/themed/png/dark/perspective-vertical-bottom-small.png b/rtdata/images/themed/png/dark/perspective-vertical-bottom-small.png new file mode 100644 index 000000000..f45a38c3e Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-vertical-bottom-small.png differ diff --git a/rtdata/images/themed/png/dark/perspective-vertical-bottom.png b/rtdata/images/themed/png/dark/perspective-vertical-bottom.png new file mode 100644 index 000000000..0e508882b Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-vertical-bottom.png differ diff --git a/rtdata/images/themed/png/dark/perspective-vertical-top-small.png b/rtdata/images/themed/png/dark/perspective-vertical-top-small.png new file mode 100644 index 000000000..ab96d5596 Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-vertical-top-small.png differ diff --git a/rtdata/images/themed/png/dark/perspective-vertical-top.png b/rtdata/images/themed/png/dark/perspective-vertical-top.png new file mode 100644 index 000000000..6084254a5 Binary files /dev/null and b/rtdata/images/themed/png/dark/perspective-vertical-top.png differ diff --git a/rtdata/images/themed/png/dark/power-inconsistent-small.png b/rtdata/images/themed/png/dark/power-inconsistent-small.png new file mode 100644 index 000000000..75f9c7a58 Binary files /dev/null and b/rtdata/images/themed/png/dark/power-inconsistent-small.png differ diff --git a/rtdata/images/themed/png/dark/power-off-small.png b/rtdata/images/themed/png/dark/power-off-small.png new file mode 100644 index 000000000..9b3118c50 Binary files /dev/null and b/rtdata/images/themed/png/dark/power-off-small.png differ diff --git a/rtdata/images/themed/png/dark/power-on-small.png b/rtdata/images/themed/png/dark/power-on-small.png new file mode 100644 index 000000000..c54e0d50e Binary files /dev/null and b/rtdata/images/themed/png/dark/power-on-small.png differ diff --git a/rtdata/images/themed/png/dark/preferences.png b/rtdata/images/themed/png/dark/preferences.png new file mode 100644 index 000000000..b88c501e5 Binary files /dev/null and b/rtdata/images/themed/png/dark/preferences.png differ diff --git a/rtdata/images/themed/png/dark/profile-filled.png b/rtdata/images/themed/png/dark/profile-filled.png new file mode 100644 index 000000000..e806c99f5 Binary files /dev/null and b/rtdata/images/themed/png/dark/profile-filled.png differ diff --git a/rtdata/images/themed/png/dark/profile-partial.png b/rtdata/images/themed/png/dark/profile-partial.png new file mode 100644 index 000000000..335a0238a Binary files /dev/null and b/rtdata/images/themed/png/dark/profile-partial.png differ diff --git a/rtdata/images/themed/png/dark/redo-all.png b/rtdata/images/themed/png/dark/redo-all.png new file mode 100644 index 000000000..e293010d0 Binary files /dev/null and b/rtdata/images/themed/png/dark/redo-all.png differ diff --git a/rtdata/images/themed/png/dark/redo-small.png b/rtdata/images/themed/png/dark/redo-small.png new file mode 100644 index 000000000..206200d6d Binary files /dev/null and b/rtdata/images/themed/png/dark/redo-small.png differ diff --git a/rtdata/images/themed/png/dark/redo.png b/rtdata/images/themed/png/dark/redo.png new file mode 100644 index 000000000..c75b63620 Binary files /dev/null and b/rtdata/images/themed/png/dark/redo.png differ diff --git a/rtdata/images/themed/png/dark/refresh-red-small.png b/rtdata/images/themed/png/dark/refresh-red-small.png new file mode 100644 index 000000000..296035883 Binary files /dev/null and b/rtdata/images/themed/png/dark/refresh-red-small.png differ diff --git a/rtdata/images/themed/png/dark/refresh-small.png b/rtdata/images/themed/png/dark/refresh-small.png new file mode 100644 index 000000000..b8f2e67d5 Binary files /dev/null and b/rtdata/images/themed/png/dark/refresh-small.png differ diff --git a/rtdata/images/themed/png/dark/refresh.png b/rtdata/images/themed/png/dark/refresh.png new file mode 100644 index 000000000..6981fbefb Binary files /dev/null and b/rtdata/images/themed/png/dark/refresh.png differ diff --git a/rtdata/images/themed/png/dark/remove-small.png b/rtdata/images/themed/png/dark/remove-small.png new file mode 100644 index 000000000..996823902 Binary files /dev/null and b/rtdata/images/themed/png/dark/remove-small.png differ diff --git a/rtdata/images/themed/png/dark/remove.png b/rtdata/images/themed/png/dark/remove.png new file mode 100644 index 000000000..8d9715ac5 Binary files /dev/null and b/rtdata/images/themed/png/dark/remove.png differ diff --git a/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png b/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png new file mode 100644 index 000000000..d8929ac42 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-aroundnode-hicontrast.png differ diff --git a/rtdata/images/themed/png/dark/rotate-aroundnode.png b/rtdata/images/themed/png/dark/rotate-aroundnode.png new file mode 100644 index 000000000..50db200a6 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-aroundnode.png differ diff --git a/rtdata/images/themed/png/dark/rotate-left-90.png b/rtdata/images/themed/png/dark/rotate-left-90.png new file mode 100644 index 000000000..fa238e339 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-left-90.png differ diff --git a/rtdata/images/themed/png/dark/rotate-left-small.png b/rtdata/images/themed/png/dark/rotate-left-small.png new file mode 100644 index 000000000..659dc6344 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-left-small.png differ diff --git a/rtdata/images/themed/png/dark/rotate-left.png b/rtdata/images/themed/png/dark/rotate-left.png new file mode 100644 index 000000000..739b39c0b Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-left.png differ diff --git a/rtdata/images/themed/png/dark/rotate-right-90.png b/rtdata/images/themed/png/dark/rotate-right-90.png new file mode 100644 index 000000000..126232d2f Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-right-90.png differ diff --git a/rtdata/images/themed/png/dark/rotate-right-small.png b/rtdata/images/themed/png/dark/rotate-right-small.png new file mode 100644 index 000000000..c59152c81 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-right-small.png differ diff --git a/rtdata/images/themed/png/dark/rotate-right.png b/rtdata/images/themed/png/dark/rotate-right.png new file mode 100644 index 000000000..8f99d9b05 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-right.png differ diff --git a/rtdata/images/themed/png/dark/rotate-straighten-small.png b/rtdata/images/themed/png/dark/rotate-straighten-small.png new file mode 100644 index 000000000..d57dcb7c7 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-straighten-small.png differ diff --git a/rtdata/images/themed/png/dark/rotate-straighten.png b/rtdata/images/themed/png/dark/rotate-straighten.png new file mode 100644 index 000000000..457282758 Binary files /dev/null and b/rtdata/images/themed/png/dark/rotate-straighten.png differ diff --git a/rtdata/images/themed/png/dark/save-small.png b/rtdata/images/themed/png/dark/save-small.png new file mode 100644 index 000000000..e4912f5d2 Binary files /dev/null and b/rtdata/images/themed/png/dark/save-small.png differ diff --git a/rtdata/images/themed/png/dark/save.png b/rtdata/images/themed/png/dark/save.png new file mode 100644 index 000000000..2d52cdaeb Binary files /dev/null and b/rtdata/images/themed/png/dark/save.png differ diff --git a/rtdata/images/themed/png/dark/saved-no-small.png b/rtdata/images/themed/png/dark/saved-no-small.png new file mode 100644 index 000000000..417f27624 Binary files /dev/null and b/rtdata/images/themed/png/dark/saved-no-small.png differ diff --git a/rtdata/images/themed/png/dark/saved-yes-small.png b/rtdata/images/themed/png/dark/saved-yes-small.png new file mode 100644 index 000000000..953c7f8cc Binary files /dev/null and b/rtdata/images/themed/png/dark/saved-yes-small.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-black-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-black-off-narrow.png new file mode 100644 index 000000000..ff6adb675 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-black-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-black-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-black-on-narrow.png new file mode 100644 index 000000000..5d6e35c3d Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-black-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-blue-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-blue-off-narrow.png new file mode 100644 index 000000000..2a9741c0f Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-blue-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-blue-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-blue-on-narrow.png new file mode 100644 index 000000000..e52337d33 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-blue-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-gray-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-gray-off-narrow.png new file mode 100644 index 000000000..7e009920f Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-gray-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-gray-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-gray-on-narrow.png new file mode 100644 index 000000000..64289008a Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-gray-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-green-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-green-off-narrow.png new file mode 100644 index 000000000..f55cbb8c3 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-green-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-green-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-green-on-narrow.png new file mode 100644 index 000000000..0c8b9522d Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-green-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-luminosity-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-luminosity-off-narrow.png new file mode 100644 index 000000000..c6dfe8410 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-luminosity-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-luminosity-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-luminosity-on-narrow.png new file mode 100644 index 000000000..b45b608d9 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-luminosity-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-red-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-red-off-narrow.png new file mode 100644 index 000000000..99730ee4b Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-red-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-red-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-red-on-narrow.png new file mode 100644 index 000000000..e0b91d8b3 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-red-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-theme-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-theme-off-narrow.png new file mode 100644 index 000000000..449946648 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-theme-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-theme-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-theme-on-narrow.png new file mode 100644 index 000000000..e59257824 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-theme-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-white-off-narrow.png b/rtdata/images/themed/png/dark/square-toggle-white-off-narrow.png new file mode 100644 index 000000000..b2e5e3611 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-white-off-narrow.png differ diff --git a/rtdata/images/themed/png/dark/square-toggle-white-on-narrow.png b/rtdata/images/themed/png/dark/square-toggle-white-on-narrow.png new file mode 100644 index 000000000..7ff59d927 Binary files /dev/null and b/rtdata/images/themed/png/dark/square-toggle-white-on-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png b/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png new file mode 100644 index 000000000..b0ce704d6 Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-gold-hollow-small.png b/rtdata/images/themed/png/dark/star-gold-hollow-small.png new file mode 100644 index 000000000..478055c2b Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold-hollow-small.png differ diff --git a/rtdata/images/themed/png/dark/star-gold-narrow.png b/rtdata/images/themed/png/dark/star-gold-narrow.png new file mode 100644 index 000000000..32710fb9d Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-gold-small.png b/rtdata/images/themed/png/dark/star-gold-small.png new file mode 100644 index 000000000..da02a823e Binary files /dev/null and b/rtdata/images/themed/png/dark/star-gold-small.png differ diff --git a/rtdata/images/themed/png/dark/star-hollow-narrow.png b/rtdata/images/themed/png/dark/star-hollow-narrow.png new file mode 100644 index 000000000..b9c978350 Binary files /dev/null and b/rtdata/images/themed/png/dark/star-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-hollow-small.png b/rtdata/images/themed/png/dark/star-hollow-small.png new file mode 100644 index 000000000..b5cf648ca Binary files /dev/null and b/rtdata/images/themed/png/dark/star-hollow-small.png differ diff --git a/rtdata/images/themed/png/dark/star-narrow.png b/rtdata/images/themed/png/dark/star-narrow.png new file mode 100644 index 000000000..bdcc73bfe Binary files /dev/null and b/rtdata/images/themed/png/dark/star-narrow.png differ diff --git a/rtdata/images/themed/png/dark/star-small.png b/rtdata/images/themed/png/dark/star-small.png new file mode 100644 index 000000000..db895d932 Binary files /dev/null and b/rtdata/images/themed/png/dark/star-small.png differ diff --git a/rtdata/images/themed/png/dark/star.png b/rtdata/images/themed/png/dark/star.png new file mode 100644 index 000000000..dcc05e7d1 Binary files /dev/null and b/rtdata/images/themed/png/dark/star.png differ diff --git a/rtdata/images/themed/png/dark/template-16.png b/rtdata/images/themed/png/dark/template-16.png new file mode 100644 index 000000000..1c50ead9e Binary files /dev/null and b/rtdata/images/themed/png/dark/template-16.png differ diff --git a/rtdata/images/themed/png/dark/template-24.png b/rtdata/images/themed/png/dark/template-24.png new file mode 100644 index 000000000..7ab9e8c0f Binary files /dev/null and b/rtdata/images/themed/png/dark/template-24.png differ diff --git a/rtdata/images/themed/png/dark/template-narrow.png b/rtdata/images/themed/png/dark/template-narrow.png new file mode 100644 index 000000000..78c374503 Binary files /dev/null and b/rtdata/images/themed/png/dark/template-narrow.png differ diff --git a/rtdata/images/themed/png/dark/tick-green-hollow-small.png b/rtdata/images/themed/png/dark/tick-green-hollow-small.png new file mode 100644 index 000000000..176bf5489 Binary files /dev/null and b/rtdata/images/themed/png/dark/tick-green-hollow-small.png differ diff --git a/rtdata/images/themed/png/dark/tick-green-hollow.png b/rtdata/images/themed/png/dark/tick-green-hollow.png new file mode 100644 index 000000000..7cac33dc0 Binary files /dev/null and b/rtdata/images/themed/png/dark/tick-green-hollow.png differ diff --git a/rtdata/images/themed/png/dark/tick-green-small.png b/rtdata/images/themed/png/dark/tick-green-small.png new file mode 100644 index 000000000..54cf5d024 Binary files /dev/null and b/rtdata/images/themed/png/dark/tick-green-small.png differ diff --git a/rtdata/images/themed/png/dark/tick-green.png b/rtdata/images/themed/png/dark/tick-green.png new file mode 100644 index 000000000..2458734b2 Binary files /dev/null and b/rtdata/images/themed/png/dark/tick-green.png differ diff --git a/rtdata/images/themed/png/dark/tick-hollow-small.png b/rtdata/images/themed/png/dark/tick-hollow-small.png new file mode 100644 index 000000000..e5e492deb Binary files /dev/null and b/rtdata/images/themed/png/dark/tick-hollow-small.png differ diff --git a/rtdata/images/themed/png/dark/tick-small.png b/rtdata/images/themed/png/dark/tick-small.png new file mode 100644 index 000000000..8ee5e5516 Binary files /dev/null and b/rtdata/images/themed/png/dark/tick-small.png differ diff --git a/rtdata/images/themed/png/dark/tick.png b/rtdata/images/themed/png/dark/tick.png new file mode 100644 index 000000000..5318ae4d5 Binary files /dev/null and b/rtdata/images/themed/png/dark/tick.png differ diff --git a/rtdata/images/themed/png/dark/transform.png b/rtdata/images/themed/png/dark/transform.png new file mode 100644 index 000000000..30cd76dd6 Binary files /dev/null and b/rtdata/images/themed/png/dark/transform.png differ diff --git a/rtdata/images/themed/png/dark/trash-delete.png b/rtdata/images/themed/png/dark/trash-delete.png new file mode 100644 index 000000000..1a7c084aa Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-delete.png differ diff --git a/rtdata/images/themed/png/dark/trash-empty-show.png b/rtdata/images/themed/png/dark/trash-empty-show.png new file mode 100644 index 000000000..983979634 Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-empty-show.png differ diff --git a/rtdata/images/themed/png/dark/trash-empty.png b/rtdata/images/themed/png/dark/trash-empty.png new file mode 100644 index 000000000..a1b92354e Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-empty.png differ diff --git a/rtdata/images/themed/png/dark/trash-full-show.png b/rtdata/images/themed/png/dark/trash-full-show.png new file mode 100644 index 000000000..1c1c7aa17 Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-full-show.png differ diff --git a/rtdata/images/themed/png/dark/trash-full.png b/rtdata/images/themed/png/dark/trash-full.png new file mode 100644 index 000000000..699d2b8ac Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-full.png differ diff --git a/rtdata/images/themed/png/dark/trash-hide-deleted.png b/rtdata/images/themed/png/dark/trash-hide-deleted.png new file mode 100644 index 000000000..ffbb9f391 Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-hide-deleted.png differ diff --git a/rtdata/images/themed/png/dark/trash-remove-small.png b/rtdata/images/themed/png/dark/trash-remove-small.png new file mode 100644 index 000000000..75fd6493c Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-remove-small.png differ diff --git a/rtdata/images/themed/png/dark/trash-remove.png b/rtdata/images/themed/png/dark/trash-remove.png new file mode 100644 index 000000000..f9dc4bde7 Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-remove.png differ diff --git a/rtdata/images/themed/png/dark/trash-small.png b/rtdata/images/themed/png/dark/trash-small.png new file mode 100644 index 000000000..2a19f041c Binary files /dev/null and b/rtdata/images/themed/png/dark/trash-small.png differ diff --git a/rtdata/images/themed/png/dark/undo-all.png b/rtdata/images/themed/png/dark/undo-all.png new file mode 100644 index 000000000..7f577140b Binary files /dev/null and b/rtdata/images/themed/png/dark/undo-all.png differ diff --git a/rtdata/images/themed/png/dark/undo-small.png b/rtdata/images/themed/png/dark/undo-small.png new file mode 100644 index 000000000..9505829d4 Binary files /dev/null and b/rtdata/images/themed/png/dark/undo-small.png differ diff --git a/rtdata/images/themed/png/dark/undo.png b/rtdata/images/themed/png/dark/undo.png new file mode 100644 index 000000000..3e0a28d1e Binary files /dev/null and b/rtdata/images/themed/png/dark/undo.png differ diff --git a/rtdata/images/themed/png/dark/warning-highlights.png b/rtdata/images/themed/png/dark/warning-highlights.png new file mode 100644 index 000000000..61ec734ca Binary files /dev/null and b/rtdata/images/themed/png/dark/warning-highlights.png differ diff --git a/rtdata/images/themed/png/dark/warning-shadows.png b/rtdata/images/themed/png/dark/warning-shadows.png new file mode 100644 index 000000000..c5e83dad6 Binary files /dev/null and b/rtdata/images/themed/png/dark/warning-shadows.png differ diff --git a/rtdata/images/themed/png/dark/warning.png b/rtdata/images/themed/png/dark/warning.png new file mode 100644 index 000000000..8bc60b95a Binary files /dev/null and b/rtdata/images/themed/png/dark/warning.png differ diff --git a/rtdata/images/themed/png/dark/wavelets.png b/rtdata/images/themed/png/dark/wavelets.png new file mode 100644 index 000000000..664fa8196 Binary files /dev/null and b/rtdata/images/themed/png/dark/wavelets.png differ diff --git a/rtdata/images/themed/png/dark/wb-auto-small.png b/rtdata/images/themed/png/dark/wb-auto-small.png new file mode 100644 index 000000000..e557048eb Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-auto-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-auto.png b/rtdata/images/themed/png/dark/wb-auto.png new file mode 100644 index 000000000..e2f033360 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-auto.png differ diff --git a/rtdata/images/themed/png/dark/wb-camera-small.png b/rtdata/images/themed/png/dark/wb-camera-small.png new file mode 100644 index 000000000..69c869445 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-camera-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-camera.png b/rtdata/images/themed/png/dark/wb-camera.png new file mode 100644 index 000000000..8749579d0 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-camera.png differ diff --git a/rtdata/images/themed/png/dark/wb-cloudy-small.png b/rtdata/images/themed/png/dark/wb-cloudy-small.png new file mode 100644 index 000000000..175d88f1a Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-cloudy-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-cloudy.png b/rtdata/images/themed/png/dark/wb-cloudy.png new file mode 100644 index 000000000..1c394b709 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-cloudy.png differ diff --git a/rtdata/images/themed/png/dark/wb-custom-small.png b/rtdata/images/themed/png/dark/wb-custom-small.png new file mode 100644 index 000000000..2f3fcb517 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-custom-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-custom.png b/rtdata/images/themed/png/dark/wb-custom.png new file mode 100644 index 000000000..db9abc03c Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-custom.png differ diff --git a/rtdata/images/themed/png/dark/wb-flash-small.png b/rtdata/images/themed/png/dark/wb-flash-small.png new file mode 100644 index 000000000..1bc051cd4 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-flash-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-flash.png b/rtdata/images/themed/png/dark/wb-flash.png new file mode 100644 index 000000000..d460a0569 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-flash.png differ diff --git a/rtdata/images/themed/png/dark/wb-fluorescent-small.png b/rtdata/images/themed/png/dark/wb-fluorescent-small.png new file mode 100644 index 000000000..3c7882252 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-fluorescent-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-fluorescent.png b/rtdata/images/themed/png/dark/wb-fluorescent.png new file mode 100644 index 000000000..c994ee9dd Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-fluorescent.png differ diff --git a/rtdata/images/themed/png/dark/wb-lamp-small.png b/rtdata/images/themed/png/dark/wb-lamp-small.png new file mode 100644 index 000000000..ea5f790c3 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-lamp-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-lamp.png b/rtdata/images/themed/png/dark/wb-lamp.png new file mode 100644 index 000000000..b0d3df3e5 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-lamp.png differ diff --git a/rtdata/images/themed/png/dark/wb-led-small.png b/rtdata/images/themed/png/dark/wb-led-small.png new file mode 100644 index 000000000..dc4385c94 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-led-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-led.png b/rtdata/images/themed/png/dark/wb-led.png new file mode 100644 index 000000000..dfdb25191 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-led.png differ diff --git a/rtdata/images/themed/png/dark/wb-shade-small.png b/rtdata/images/themed/png/dark/wb-shade-small.png new file mode 100644 index 000000000..255c021a6 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-shade-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-shade.png b/rtdata/images/themed/png/dark/wb-shade.png new file mode 100644 index 000000000..2be98acf6 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-shade.png differ diff --git a/rtdata/images/themed/png/dark/wb-sun-small.png b/rtdata/images/themed/png/dark/wb-sun-small.png new file mode 100644 index 000000000..a7de769df Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-sun-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-sun.png b/rtdata/images/themed/png/dark/wb-sun.png new file mode 100644 index 000000000..e65ee2a80 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-sun.png differ diff --git a/rtdata/images/themed/png/dark/wb-tungsten-small.png b/rtdata/images/themed/png/dark/wb-tungsten-small.png new file mode 100644 index 000000000..6f958cd59 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-tungsten-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-tungsten.png b/rtdata/images/themed/png/dark/wb-tungsten.png new file mode 100644 index 000000000..2c71f66ef Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-tungsten.png differ diff --git a/rtdata/images/themed/png/dark/wb-water-small.png b/rtdata/images/themed/png/dark/wb-water-small.png new file mode 100644 index 000000000..2ecb58552 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-water-small.png differ diff --git a/rtdata/images/themed/png/dark/wb-water.png b/rtdata/images/themed/png/dark/wb-water.png new file mode 100644 index 000000000..7bc55c153 Binary files /dev/null and b/rtdata/images/themed/png/dark/wb-water.png differ diff --git a/rtdata/images/themed/png/dark/window-add.png b/rtdata/images/themed/png/dark/window-add.png new file mode 100644 index 000000000..4364b1a13 Binary files /dev/null and b/rtdata/images/themed/png/dark/window-add.png differ diff --git a/rtdata/images/themed/png/light/add-small.png b/rtdata/images/themed/png/light/add-small.png new file mode 100644 index 000000000..59211ace6 Binary files /dev/null and b/rtdata/images/themed/png/light/add-small.png differ diff --git a/rtdata/images/themed/png/light/add.png b/rtdata/images/themed/png/light/add.png new file mode 100644 index 000000000..88b1c285d Binary files /dev/null and b/rtdata/images/themed/png/light/add.png differ diff --git a/rtdata/images/themed/png/light/aperture.png b/rtdata/images/themed/png/light/aperture.png new file mode 100644 index 000000000..70e8e0be5 Binary files /dev/null and b/rtdata/images/themed/png/light/aperture.png differ diff --git a/rtdata/images/themed/png/light/arrow-down-small.png b/rtdata/images/themed/png/light/arrow-down-small.png new file mode 100644 index 000000000..ab76bb3cc Binary files /dev/null and b/rtdata/images/themed/png/light/arrow-down-small.png differ diff --git a/rtdata/images/themed/png/light/arrow-left-small.png b/rtdata/images/themed/png/light/arrow-left-small.png new file mode 100644 index 000000000..2673b7445 Binary files /dev/null and b/rtdata/images/themed/png/light/arrow-left-small.png differ diff --git a/rtdata/images/themed/png/light/arrow-right-small.png b/rtdata/images/themed/png/light/arrow-right-small.png new file mode 100644 index 000000000..228cecd3d Binary files /dev/null and b/rtdata/images/themed/png/light/arrow-right-small.png differ diff --git a/rtdata/images/themed/png/light/arrow-up-small.png b/rtdata/images/themed/png/light/arrow-up-small.png new file mode 100644 index 000000000..6e8061207 Binary files /dev/null and b/rtdata/images/themed/png/light/arrow-up-small.png differ diff --git a/rtdata/images/themed/png/light/arrow-updown.png b/rtdata/images/themed/png/light/arrow-updown.png new file mode 100644 index 000000000..bb0ccc5dc Binary files /dev/null and b/rtdata/images/themed/png/light/arrow-updown.png differ diff --git a/rtdata/images/themed/png/light/arrow2-left.png b/rtdata/images/themed/png/light/arrow2-left.png new file mode 100644 index 000000000..4ac761b76 Binary files /dev/null and b/rtdata/images/themed/png/light/arrow2-left.png differ diff --git a/rtdata/images/themed/png/light/arrow2-right.png b/rtdata/images/themed/png/light/arrow2-right.png new file mode 100644 index 000000000..75d150843 Binary files /dev/null and b/rtdata/images/themed/png/light/arrow2-right.png differ diff --git a/rtdata/images/themed/png/light/atom.png b/rtdata/images/themed/png/light/atom.png new file mode 100644 index 000000000..df3dc8bdf Binary files /dev/null and b/rtdata/images/themed/png/light/atom.png differ diff --git a/rtdata/images/themed/png/light/bayer.png b/rtdata/images/themed/png/light/bayer.png new file mode 100644 index 000000000..c85ce844e Binary files /dev/null and b/rtdata/images/themed/png/light/bayer.png differ diff --git a/rtdata/images/themed/png/light/beforeafter.png b/rtdata/images/themed/png/light/beforeafter.png new file mode 100644 index 000000000..fb7e7ce55 Binary files /dev/null and b/rtdata/images/themed/png/light/beforeafter.png differ diff --git a/rtdata/images/themed/png/light/cancel-small.png b/rtdata/images/themed/png/light/cancel-small.png new file mode 100644 index 000000000..8c5d91145 Binary files /dev/null and b/rtdata/images/themed/png/light/cancel-small.png differ diff --git a/rtdata/images/themed/png/light/cancel.png b/rtdata/images/themed/png/light/cancel.png new file mode 100644 index 000000000..1a48a2e44 Binary files /dev/null and b/rtdata/images/themed/png/light/cancel.png differ diff --git a/rtdata/images/themed/png/light/circle-black-small.png b/rtdata/images/themed/png/light/circle-black-small.png new file mode 100644 index 000000000..f18a415b6 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-black-small.png differ diff --git a/rtdata/images/themed/png/light/circle-blue-green-small.png b/rtdata/images/themed/png/light/circle-blue-green-small.png new file mode 100644 index 000000000..247931823 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-blue-green-small.png differ diff --git a/rtdata/images/themed/png/light/circle-blue-red-small.png b/rtdata/images/themed/png/light/circle-blue-red-small.png new file mode 100644 index 000000000..d88a01330 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-blue-red-small.png differ diff --git a/rtdata/images/themed/png/light/circle-blue-small.png b/rtdata/images/themed/png/light/circle-blue-small.png new file mode 100644 index 000000000..2c8ff48fd Binary files /dev/null and b/rtdata/images/themed/png/light/circle-blue-small.png differ diff --git a/rtdata/images/themed/png/light/circle-blue-yellow-small.png b/rtdata/images/themed/png/light/circle-blue-yellow-small.png new file mode 100644 index 000000000..0585b2195 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-blue-yellow-small.png differ diff --git a/rtdata/images/themed/png/light/circle-cyan-red-small.png b/rtdata/images/themed/png/light/circle-cyan-red-small.png new file mode 100644 index 000000000..ed7003161 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-cyan-red-small.png differ diff --git a/rtdata/images/themed/png/light/circle-cyan-small.png b/rtdata/images/themed/png/light/circle-cyan-small.png new file mode 100644 index 000000000..84f873a2c Binary files /dev/null and b/rtdata/images/themed/png/light/circle-cyan-small.png differ diff --git a/rtdata/images/themed/png/light/circle-darkgray-small.png b/rtdata/images/themed/png/light/circle-darkgray-small.png new file mode 100644 index 000000000..e706b1eba Binary files /dev/null and b/rtdata/images/themed/png/light/circle-darkgray-small.png differ diff --git a/rtdata/images/themed/png/light/circle-empty-blue-small.png b/rtdata/images/themed/png/light/circle-empty-blue-small.png new file mode 100644 index 000000000..d53b3516e Binary files /dev/null and b/rtdata/images/themed/png/light/circle-empty-blue-small.png differ diff --git a/rtdata/images/themed/png/light/circle-empty-darkgray-small.png b/rtdata/images/themed/png/light/circle-empty-darkgray-small.png new file mode 100644 index 000000000..4f0f0f4c7 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-empty-darkgray-small.png differ diff --git a/rtdata/images/themed/png/light/circle-empty-gray-small.png b/rtdata/images/themed/png/light/circle-empty-gray-small.png new file mode 100644 index 000000000..b3a57c83b Binary files /dev/null and b/rtdata/images/themed/png/light/circle-empty-gray-small.png differ diff --git a/rtdata/images/themed/png/light/circle-empty-green-small.png b/rtdata/images/themed/png/light/circle-empty-green-small.png new file mode 100644 index 000000000..3b1444d37 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-empty-green-small.png differ diff --git a/rtdata/images/themed/png/light/circle-empty-purple-small.png b/rtdata/images/themed/png/light/circle-empty-purple-small.png new file mode 100644 index 000000000..e61da8e9f Binary files /dev/null and b/rtdata/images/themed/png/light/circle-empty-purple-small.png differ diff --git a/rtdata/images/themed/png/light/circle-empty-red-small.png b/rtdata/images/themed/png/light/circle-empty-red-small.png new file mode 100644 index 000000000..bf8035931 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-empty-red-small.png differ diff --git a/rtdata/images/themed/png/light/circle-empty-yellow-small.png b/rtdata/images/themed/png/light/circle-empty-yellow-small.png new file mode 100644 index 000000000..9a3ca9bd8 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-empty-yellow-small.png differ diff --git a/rtdata/images/themed/png/light/circle-gray-blue-small.png b/rtdata/images/themed/png/light/circle-gray-blue-small.png new file mode 100644 index 000000000..01d5da881 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-gray-blue-small.png differ diff --git a/rtdata/images/themed/png/light/circle-gray-green-small.png b/rtdata/images/themed/png/light/circle-gray-green-small.png new file mode 100644 index 000000000..2290b708f Binary files /dev/null and b/rtdata/images/themed/png/light/circle-gray-green-small.png differ diff --git a/rtdata/images/themed/png/light/circle-gray-red-small.png b/rtdata/images/themed/png/light/circle-gray-red-small.png new file mode 100644 index 000000000..29afda33b Binary files /dev/null and b/rtdata/images/themed/png/light/circle-gray-red-small.png differ diff --git a/rtdata/images/themed/png/light/circle-gray-small.png b/rtdata/images/themed/png/light/circle-gray-small.png new file mode 100644 index 000000000..18ad6330a Binary files /dev/null and b/rtdata/images/themed/png/light/circle-gray-small.png differ diff --git a/rtdata/images/themed/png/light/circle-green-blue-small.png b/rtdata/images/themed/png/light/circle-green-blue-small.png new file mode 100644 index 000000000..1d6e60252 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-green-blue-small.png differ diff --git a/rtdata/images/themed/png/light/circle-green-red-small.png b/rtdata/images/themed/png/light/circle-green-red-small.png new file mode 100644 index 000000000..96f86b1b9 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-green-red-small.png differ diff --git a/rtdata/images/themed/png/light/circle-green-small.png b/rtdata/images/themed/png/light/circle-green-small.png new file mode 100644 index 000000000..88270e0cb Binary files /dev/null and b/rtdata/images/themed/png/light/circle-green-small.png differ diff --git a/rtdata/images/themed/png/light/circle-magenta-small.png b/rtdata/images/themed/png/light/circle-magenta-small.png new file mode 100644 index 000000000..cce26e1f2 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-magenta-small.png differ diff --git a/rtdata/images/themed/png/light/circle-orange-small.png b/rtdata/images/themed/png/light/circle-orange-small.png new file mode 100644 index 000000000..5894f0987 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-orange-small.png differ diff --git a/rtdata/images/themed/png/light/circle-purple-small.png b/rtdata/images/themed/png/light/circle-purple-small.png new file mode 100644 index 000000000..9fe4eb0d6 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-purple-small.png differ diff --git a/rtdata/images/themed/png/light/circle-red-blue-small.png b/rtdata/images/themed/png/light/circle-red-blue-small.png new file mode 100644 index 000000000..e70ef22f6 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-red-blue-small.png differ diff --git a/rtdata/images/themed/png/light/circle-red-cyan-small.png b/rtdata/images/themed/png/light/circle-red-cyan-small.png new file mode 100644 index 000000000..92b03b953 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-red-cyan-small.png differ diff --git a/rtdata/images/themed/png/light/circle-red-green-small.png b/rtdata/images/themed/png/light/circle-red-green-small.png new file mode 100644 index 000000000..4572e019f Binary files /dev/null and b/rtdata/images/themed/png/light/circle-red-green-small.png differ diff --git a/rtdata/images/themed/png/light/circle-red-small.png b/rtdata/images/themed/png/light/circle-red-small.png new file mode 100644 index 000000000..a8c9cecec Binary files /dev/null and b/rtdata/images/themed/png/light/circle-red-small.png differ diff --git a/rtdata/images/themed/png/light/circle-white-small.png b/rtdata/images/themed/png/light/circle-white-small.png new file mode 100644 index 000000000..acf4f8b76 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-white-small.png differ diff --git a/rtdata/images/themed/png/light/circle-yellow-blue-small.png b/rtdata/images/themed/png/light/circle-yellow-blue-small.png new file mode 100644 index 000000000..1f7aec9f2 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-yellow-blue-small.png differ diff --git a/rtdata/images/themed/png/light/circle-yellow-small.png b/rtdata/images/themed/png/light/circle-yellow-small.png new file mode 100644 index 000000000..1c5678ac2 Binary files /dev/null and b/rtdata/images/themed/png/light/circle-yellow-small.png differ diff --git a/rtdata/images/themed/png/light/color-circles.png b/rtdata/images/themed/png/light/color-circles.png new file mode 100644 index 000000000..0be8fdacc Binary files /dev/null and b/rtdata/images/themed/png/light/color-circles.png differ diff --git a/rtdata/images/themed/png/light/color-picker-add-hicontrast.png b/rtdata/images/themed/png/light/color-picker-add-hicontrast.png new file mode 100644 index 000000000..5dcdacf1f Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-add-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/color-picker-add.png b/rtdata/images/themed/png/light/color-picker-add.png new file mode 100644 index 000000000..593e69b3d Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-add.png differ diff --git a/rtdata/images/themed/png/light/color-picker-bars.png b/rtdata/images/themed/png/light/color-picker-bars.png new file mode 100644 index 000000000..a7a9b0f07 Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-bars.png differ diff --git a/rtdata/images/themed/png/light/color-picker-hicontrast.png b/rtdata/images/themed/png/light/color-picker-hicontrast.png new file mode 100644 index 000000000..c7bfb850b Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/color-picker-hide.png b/rtdata/images/themed/png/light/color-picker-hide.png new file mode 100644 index 000000000..418b5b929 Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-hide.png differ diff --git a/rtdata/images/themed/png/light/color-picker-small.png b/rtdata/images/themed/png/light/color-picker-small.png new file mode 100644 index 000000000..109f8fda4 Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker-small.png differ diff --git a/rtdata/images/themed/png/light/color-picker.png b/rtdata/images/themed/png/light/color-picker.png new file mode 100644 index 000000000..0d01785a0 Binary files /dev/null and b/rtdata/images/themed/png/light/color-picker.png differ diff --git a/rtdata/images/themed/png/light/contrastmask-off.png b/rtdata/images/themed/png/light/contrastmask-off.png new file mode 100644 index 000000000..b3df60148 Binary files /dev/null and b/rtdata/images/themed/png/light/contrastmask-off.png differ diff --git a/rtdata/images/themed/png/light/contrastmask-on.png b/rtdata/images/themed/png/light/contrastmask-on.png new file mode 100644 index 000000000..064ed7e9b Binary files /dev/null and b/rtdata/images/themed/png/light/contrastmask-on.png differ diff --git a/rtdata/images/themed/png/light/copy.png b/rtdata/images/themed/png/light/copy.png new file mode 100644 index 000000000..bd4523ea2 Binary files /dev/null and b/rtdata/images/themed/png/light/copy.png differ diff --git a/rtdata/images/themed/png/light/crop-auto-small.png b/rtdata/images/themed/png/light/crop-auto-small.png new file mode 100644 index 000000000..bc3de2dc2 Binary files /dev/null and b/rtdata/images/themed/png/light/crop-auto-small.png differ diff --git a/rtdata/images/themed/png/light/crop-auto.png b/rtdata/images/themed/png/light/crop-auto.png new file mode 100644 index 000000000..5499df93f Binary files /dev/null and b/rtdata/images/themed/png/light/crop-auto.png differ diff --git a/rtdata/images/themed/png/light/crop-point-hicontrast.png b/rtdata/images/themed/png/light/crop-point-hicontrast.png new file mode 100644 index 000000000..65aa29856 Binary files /dev/null and b/rtdata/images/themed/png/light/crop-point-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/crop-small.png b/rtdata/images/themed/png/light/crop-small.png new file mode 100644 index 000000000..9f345a6ef Binary files /dev/null and b/rtdata/images/themed/png/light/crop-small.png differ diff --git a/rtdata/images/themed/png/light/crop.png b/rtdata/images/themed/png/light/crop.png new file mode 100644 index 000000000..83ef5a955 Binary files /dev/null and b/rtdata/images/themed/png/light/crop.png differ diff --git a/rtdata/images/themed/png/light/crossed-arrows-in.png b/rtdata/images/themed/png/light/crossed-arrows-in.png new file mode 100644 index 000000000..f10a4a058 Binary files /dev/null and b/rtdata/images/themed/png/light/crossed-arrows-in.png differ diff --git a/rtdata/images/themed/png/light/crossed-arrows-out.png b/rtdata/images/themed/png/light/crossed-arrows-out.png new file mode 100644 index 000000000..410e65f3d Binary files /dev/null and b/rtdata/images/themed/png/light/crossed-arrows-out.png differ diff --git a/rtdata/images/themed/png/light/crosshair-adjust.png b/rtdata/images/themed/png/light/crosshair-adjust.png new file mode 100644 index 000000000..b8b17dfa1 Binary files /dev/null and b/rtdata/images/themed/png/light/crosshair-adjust.png differ diff --git a/rtdata/images/themed/png/light/crosshair-hicontrast.png b/rtdata/images/themed/png/light/crosshair-hicontrast.png new file mode 100644 index 000000000..078512803 Binary files /dev/null and b/rtdata/images/themed/png/light/crosshair-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/crosshair-node-curve.png b/rtdata/images/themed/png/light/crosshair-node-curve.png new file mode 100644 index 000000000..0af7379c2 Binary files /dev/null and b/rtdata/images/themed/png/light/crosshair-node-curve.png differ diff --git a/rtdata/images/themed/png/light/crosshair-small.png b/rtdata/images/themed/png/light/crosshair-small.png new file mode 100644 index 000000000..a898a2fdb Binary files /dev/null and b/rtdata/images/themed/png/light/crosshair-small.png differ diff --git a/rtdata/images/themed/png/light/curve-catmullrom-small.png b/rtdata/images/themed/png/light/curve-catmullrom-small.png new file mode 100644 index 000000000..1654d10ea Binary files /dev/null and b/rtdata/images/themed/png/light/curve-catmullrom-small.png differ diff --git a/rtdata/images/themed/png/light/curve-catmullrom.png b/rtdata/images/themed/png/light/curve-catmullrom.png new file mode 100644 index 000000000..16a2234ec Binary files /dev/null and b/rtdata/images/themed/png/light/curve-catmullrom.png differ diff --git a/rtdata/images/themed/png/light/curve-controlpoints-small.png b/rtdata/images/themed/png/light/curve-controlpoints-small.png new file mode 100644 index 000000000..2be1333ff Binary files /dev/null and b/rtdata/images/themed/png/light/curve-controlpoints-small.png differ diff --git a/rtdata/images/themed/png/light/curve-controlpoints.png b/rtdata/images/themed/png/light/curve-controlpoints.png new file mode 100644 index 000000000..cdd7cdd3a Binary files /dev/null and b/rtdata/images/themed/png/light/curve-controlpoints.png differ diff --git a/rtdata/images/themed/png/light/curve-flat-small.png b/rtdata/images/themed/png/light/curve-flat-small.png new file mode 100644 index 000000000..17959e6ac Binary files /dev/null and b/rtdata/images/themed/png/light/curve-flat-small.png differ diff --git a/rtdata/images/themed/png/light/curve-flat.png b/rtdata/images/themed/png/light/curve-flat.png new file mode 100644 index 000000000..976281d49 Binary files /dev/null and b/rtdata/images/themed/png/light/curve-flat.png differ diff --git a/rtdata/images/themed/png/light/curve-linear-small.png b/rtdata/images/themed/png/light/curve-linear-small.png new file mode 100644 index 000000000..53b07f616 Binary files /dev/null and b/rtdata/images/themed/png/light/curve-linear-small.png differ diff --git a/rtdata/images/themed/png/light/curve-linear.png b/rtdata/images/themed/png/light/curve-linear.png new file mode 100644 index 000000000..a3d9105dd Binary files /dev/null and b/rtdata/images/themed/png/light/curve-linear.png differ diff --git a/rtdata/images/themed/png/light/curve-nurbs-small.png b/rtdata/images/themed/png/light/curve-nurbs-small.png new file mode 100644 index 000000000..f970852b5 Binary files /dev/null and b/rtdata/images/themed/png/light/curve-nurbs-small.png differ diff --git a/rtdata/images/themed/png/light/curve-nurbs.png b/rtdata/images/themed/png/light/curve-nurbs.png new file mode 100644 index 000000000..ad9b3eb87 Binary files /dev/null and b/rtdata/images/themed/png/light/curve-nurbs.png differ diff --git a/rtdata/images/themed/png/light/curve-parametric-small.png b/rtdata/images/themed/png/light/curve-parametric-small.png new file mode 100644 index 000000000..2acba010c Binary files /dev/null and b/rtdata/images/themed/png/light/curve-parametric-small.png differ diff --git a/rtdata/images/themed/png/light/curve-parametric.png b/rtdata/images/themed/png/light/curve-parametric.png new file mode 100644 index 000000000..a29a7529b Binary files /dev/null and b/rtdata/images/themed/png/light/curve-parametric.png differ diff --git a/rtdata/images/themed/png/light/curve-spline-small.png b/rtdata/images/themed/png/light/curve-spline-small.png new file mode 100644 index 000000000..6ea7b93c9 Binary files /dev/null and b/rtdata/images/themed/png/light/curve-spline-small.png differ diff --git a/rtdata/images/themed/png/light/curve-spline.png b/rtdata/images/themed/png/light/curve-spline.png new file mode 100644 index 000000000..c7318df5a Binary files /dev/null and b/rtdata/images/themed/png/light/curve-spline.png differ diff --git a/rtdata/images/themed/png/light/detail.png b/rtdata/images/themed/png/light/detail.png new file mode 100644 index 000000000..45ef517d0 Binary files /dev/null and b/rtdata/images/themed/png/light/detail.png differ diff --git a/rtdata/images/themed/png/light/device-floppy.png b/rtdata/images/themed/png/light/device-floppy.png new file mode 100644 index 000000000..bc0ec8c30 Binary files /dev/null and b/rtdata/images/themed/png/light/device-floppy.png differ diff --git a/rtdata/images/themed/png/light/device-hdd.png b/rtdata/images/themed/png/light/device-hdd.png new file mode 100644 index 000000000..4477bfb21 Binary files /dev/null and b/rtdata/images/themed/png/light/device-hdd.png differ diff --git a/rtdata/images/themed/png/light/device-network.png b/rtdata/images/themed/png/light/device-network.png new file mode 100644 index 000000000..3d2f69efe Binary files /dev/null and b/rtdata/images/themed/png/light/device-network.png differ diff --git a/rtdata/images/themed/png/light/device-optical.png b/rtdata/images/themed/png/light/device-optical.png new file mode 100644 index 000000000..ca6c5bd32 Binary files /dev/null and b/rtdata/images/themed/png/light/device-optical.png differ diff --git a/rtdata/images/themed/png/light/device-usb.png b/rtdata/images/themed/png/light/device-usb.png new file mode 100644 index 000000000..30a43f7fe Binary files /dev/null and b/rtdata/images/themed/png/light/device-usb.png differ diff --git a/rtdata/images/themed/png/light/distortion-auto-small.png b/rtdata/images/themed/png/light/distortion-auto-small.png new file mode 100644 index 000000000..385c37307 Binary files /dev/null and b/rtdata/images/themed/png/light/distortion-auto-small.png differ diff --git a/rtdata/images/themed/png/light/distortion-auto.png b/rtdata/images/themed/png/light/distortion-auto.png new file mode 100644 index 000000000..242791d1b Binary files /dev/null and b/rtdata/images/themed/png/light/distortion-auto.png differ diff --git a/rtdata/images/themed/png/light/distortion-barrel-small.png b/rtdata/images/themed/png/light/distortion-barrel-small.png new file mode 100644 index 000000000..5ec7c232b Binary files /dev/null and b/rtdata/images/themed/png/light/distortion-barrel-small.png differ diff --git a/rtdata/images/themed/png/light/distortion-barrel.png b/rtdata/images/themed/png/light/distortion-barrel.png new file mode 100644 index 000000000..ab04051ea Binary files /dev/null and b/rtdata/images/themed/png/light/distortion-barrel.png differ diff --git a/rtdata/images/themed/png/light/distortion-pincushion-small.png b/rtdata/images/themed/png/light/distortion-pincushion-small.png new file mode 100644 index 000000000..12bbe630d Binary files /dev/null and b/rtdata/images/themed/png/light/distortion-pincushion-small.png differ diff --git a/rtdata/images/themed/png/light/distortion-pincushion.png b/rtdata/images/themed/png/light/distortion-pincushion.png new file mode 100644 index 000000000..a927e90c2 Binary files /dev/null and b/rtdata/images/themed/png/light/distortion-pincushion.png differ diff --git a/rtdata/images/themed/png/light/edit-point.png b/rtdata/images/themed/png/light/edit-point.png new file mode 100644 index 000000000..b75f3670a Binary files /dev/null and b/rtdata/images/themed/png/light/edit-point.png differ diff --git a/rtdata/images/themed/png/light/equilizer-narrow.png b/rtdata/images/themed/png/light/equilizer-narrow.png new file mode 100644 index 000000000..3e40c173c Binary files /dev/null and b/rtdata/images/themed/png/light/equilizer-narrow.png differ diff --git a/rtdata/images/themed/png/light/equilizer-wide.png b/rtdata/images/themed/png/light/equilizer-wide.png new file mode 100644 index 000000000..41b0f72f0 Binary files /dev/null and b/rtdata/images/themed/png/light/equilizer-wide.png differ diff --git a/rtdata/images/themed/png/light/expander-closed-small.png b/rtdata/images/themed/png/light/expander-closed-small.png new file mode 100644 index 000000000..23fcef4a1 Binary files /dev/null and b/rtdata/images/themed/png/light/expander-closed-small.png differ diff --git a/rtdata/images/themed/png/light/expander-open-small.png b/rtdata/images/themed/png/light/expander-open-small.png new file mode 100644 index 000000000..d4ab66ab6 Binary files /dev/null and b/rtdata/images/themed/png/light/expander-open-small.png differ diff --git a/rtdata/images/themed/png/light/exposure.png b/rtdata/images/themed/png/light/exposure.png new file mode 100644 index 000000000..1259b9a5c Binary files /dev/null and b/rtdata/images/themed/png/light/exposure.png differ diff --git a/rtdata/images/themed/png/light/filetype-hdr.png b/rtdata/images/themed/png/light/filetype-hdr.png new file mode 100644 index 000000000..7365fb560 Binary files /dev/null and b/rtdata/images/themed/png/light/filetype-hdr.png differ diff --git a/rtdata/images/themed/png/light/filetype-ps.png b/rtdata/images/themed/png/light/filetype-ps.png new file mode 100644 index 000000000..982ed9736 Binary files /dev/null and b/rtdata/images/themed/png/light/filetype-ps.png differ diff --git a/rtdata/images/themed/png/light/filter-clear.png b/rtdata/images/themed/png/light/filter-clear.png new file mode 100644 index 000000000..f07e3a901 Binary files /dev/null and b/rtdata/images/themed/png/light/filter-clear.png differ diff --git a/rtdata/images/themed/png/light/filter-original.png b/rtdata/images/themed/png/light/filter-original.png new file mode 100644 index 000000000..5de915274 Binary files /dev/null and b/rtdata/images/themed/png/light/filter-original.png differ diff --git a/rtdata/images/themed/png/light/filter-original2.png b/rtdata/images/themed/png/light/filter-original2.png new file mode 100644 index 000000000..c20c214aa Binary files /dev/null and b/rtdata/images/themed/png/light/filter-original2.png differ diff --git a/rtdata/images/themed/png/light/filter.png b/rtdata/images/themed/png/light/filter.png new file mode 100644 index 000000000..4a0c95916 Binary files /dev/null and b/rtdata/images/themed/png/light/filter.png differ diff --git a/rtdata/images/themed/png/light/flip-horizontal.png b/rtdata/images/themed/png/light/flip-horizontal.png new file mode 100644 index 000000000..9d5993527 Binary files /dev/null and b/rtdata/images/themed/png/light/flip-horizontal.png differ diff --git a/rtdata/images/themed/png/light/flip-vertical.png b/rtdata/images/themed/png/light/flip-vertical.png new file mode 100644 index 000000000..6249c98b4 Binary files /dev/null and b/rtdata/images/themed/png/light/flip-vertical.png differ diff --git a/rtdata/images/themed/png/light/focusscreen-off.png b/rtdata/images/themed/png/light/focusscreen-off.png new file mode 100644 index 000000000..106ec4035 Binary files /dev/null and b/rtdata/images/themed/png/light/focusscreen-off.png differ diff --git a/rtdata/images/themed/png/light/focusscreen-on.png b/rtdata/images/themed/png/light/focusscreen-on.png new file mode 100644 index 000000000..f9c418b92 Binary files /dev/null and b/rtdata/images/themed/png/light/focusscreen-on.png differ diff --git a/rtdata/images/themed/png/light/folder-closed-home-small.png b/rtdata/images/themed/png/light/folder-closed-home-small.png new file mode 100644 index 000000000..fff07d768 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-closed-home-small.png differ diff --git a/rtdata/images/themed/png/light/folder-closed-home.png b/rtdata/images/themed/png/light/folder-closed-home.png new file mode 100644 index 000000000..27eb6d355 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-closed-home.png differ diff --git a/rtdata/images/themed/png/light/folder-closed-recent-small.png b/rtdata/images/themed/png/light/folder-closed-recent-small.png new file mode 100644 index 000000000..400f79a67 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-closed-recent-small.png differ diff --git a/rtdata/images/themed/png/light/folder-closed-recent.png b/rtdata/images/themed/png/light/folder-closed-recent.png new file mode 100644 index 000000000..4f3755700 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-closed-recent.png differ diff --git a/rtdata/images/themed/png/light/folder-closed-small.png b/rtdata/images/themed/png/light/folder-closed-small.png new file mode 100644 index 000000000..89939d9d0 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-closed-small.png differ diff --git a/rtdata/images/themed/png/light/folder-closed.png b/rtdata/images/themed/png/light/folder-closed.png new file mode 100644 index 000000000..3f14b84fc Binary files /dev/null and b/rtdata/images/themed/png/light/folder-closed.png differ diff --git a/rtdata/images/themed/png/light/folder-open-recent-small.png b/rtdata/images/themed/png/light/folder-open-recent-small.png new file mode 100644 index 000000000..48aed8e40 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-open-recent-small.png differ diff --git a/rtdata/images/themed/png/light/folder-open-recent.png b/rtdata/images/themed/png/light/folder-open-recent.png new file mode 100644 index 000000000..25eabe0d8 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-open-recent.png differ diff --git a/rtdata/images/themed/png/light/folder-open-small.png b/rtdata/images/themed/png/light/folder-open-small.png new file mode 100644 index 000000000..6cb4fb877 Binary files /dev/null and b/rtdata/images/themed/png/light/folder-open-small.png differ diff --git a/rtdata/images/themed/png/light/folder-open.png b/rtdata/images/themed/png/light/folder-open.png new file mode 100644 index 000000000..0a857b1fd Binary files /dev/null and b/rtdata/images/themed/png/light/folder-open.png differ diff --git a/rtdata/images/themed/png/light/fullscreen-enter.png b/rtdata/images/themed/png/light/fullscreen-enter.png new file mode 100644 index 000000000..b8f52bda8 Binary files /dev/null and b/rtdata/images/themed/png/light/fullscreen-enter.png differ diff --git a/rtdata/images/themed/png/light/fullscreen-leave.png b/rtdata/images/themed/png/light/fullscreen-leave.png new file mode 100644 index 000000000..3a96de2dd Binary files /dev/null and b/rtdata/images/themed/png/light/fullscreen-leave.png differ diff --git a/rtdata/images/themed/png/light/gamut-hist.png b/rtdata/images/themed/png/light/gamut-hist.png new file mode 100644 index 000000000..c1faf7b2e Binary files /dev/null and b/rtdata/images/themed/png/light/gamut-hist.png differ diff --git a/rtdata/images/themed/png/light/gamut-plus.png b/rtdata/images/themed/png/light/gamut-plus.png new file mode 100644 index 000000000..c41e5a39b Binary files /dev/null and b/rtdata/images/themed/png/light/gamut-plus.png differ diff --git a/rtdata/images/themed/png/light/gamut-softproof.png b/rtdata/images/themed/png/light/gamut-softproof.png new file mode 100644 index 000000000..832b231fe Binary files /dev/null and b/rtdata/images/themed/png/light/gamut-softproof.png differ diff --git a/rtdata/images/themed/png/light/gamut-warning.png b/rtdata/images/themed/png/light/gamut-warning.png new file mode 100644 index 000000000..882a59530 Binary files /dev/null and b/rtdata/images/themed/png/light/gamut-warning.png differ diff --git a/rtdata/images/themed/png/light/gamut_srgb_prophoto_xy.png b/rtdata/images/themed/png/light/gamut_srgb_prophoto_xy.png new file mode 100644 index 000000000..46e8becb9 Binary files /dev/null and b/rtdata/images/themed/png/light/gamut_srgb_prophoto_xy.png differ diff --git a/rtdata/images/themed/png/light/gears-pause.png b/rtdata/images/themed/png/light/gears-pause.png new file mode 100644 index 000000000..ef10159f4 Binary files /dev/null and b/rtdata/images/themed/png/light/gears-pause.png differ diff --git a/rtdata/images/themed/png/light/gears-play.png b/rtdata/images/themed/png/light/gears-play.png new file mode 100644 index 000000000..c7d534f55 Binary files /dev/null and b/rtdata/images/themed/png/light/gears-play.png differ diff --git a/rtdata/images/themed/png/light/gears-small.png b/rtdata/images/themed/png/light/gears-small.png new file mode 100644 index 000000000..84b70358b Binary files /dev/null and b/rtdata/images/themed/png/light/gears-small.png differ diff --git a/rtdata/images/themed/png/light/gears.png b/rtdata/images/themed/png/light/gears.png new file mode 100644 index 000000000..ff76d0cb0 Binary files /dev/null and b/rtdata/images/themed/png/light/gears.png differ diff --git a/rtdata/images/themed/png/light/goto-end-small.png b/rtdata/images/themed/png/light/goto-end-small.png new file mode 100644 index 000000000..29d81c231 Binary files /dev/null and b/rtdata/images/themed/png/light/goto-end-small.png differ diff --git a/rtdata/images/themed/png/light/goto-start-small.png b/rtdata/images/themed/png/light/goto-start-small.png new file mode 100644 index 000000000..671666740 Binary files /dev/null and b/rtdata/images/themed/png/light/goto-start-small.png differ diff --git a/rtdata/images/themed/png/light/hand-closed-hicontrast.png b/rtdata/images/themed/png/light/hand-closed-hicontrast.png new file mode 100644 index 000000000..590d95096 Binary files /dev/null and b/rtdata/images/themed/png/light/hand-closed-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/hand-open-hicontrast.png b/rtdata/images/themed/png/light/hand-open-hicontrast.png new file mode 100644 index 000000000..2ee26e375 Binary files /dev/null and b/rtdata/images/themed/png/light/hand-open-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/hand-open.png b/rtdata/images/themed/png/light/hand-open.png new file mode 100644 index 000000000..bb01eac88 Binary files /dev/null and b/rtdata/images/themed/png/light/hand-open.png differ diff --git a/rtdata/images/themed/png/light/histogram-bar-off-small.png b/rtdata/images/themed/png/light/histogram-bar-off-small.png new file mode 100644 index 000000000..b7f022a0a Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-bar-off-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-bar-on-small.png b/rtdata/images/themed/png/light/histogram-bar-on-small.png new file mode 100644 index 000000000..e38fe436f Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-bar-on-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-bayer-off-small.png b/rtdata/images/themed/png/light/histogram-bayer-off-small.png new file mode 100644 index 000000000..af1369145 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-bayer-off-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-bayer-on-small.png b/rtdata/images/themed/png/light/histogram-bayer-on-small.png new file mode 100644 index 000000000..44e23b51b Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-bayer-on-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-blue-off-small.png b/rtdata/images/themed/png/light/histogram-blue-off-small.png new file mode 100644 index 000000000..8b368ed63 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-blue-off-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-blue-on-small.png b/rtdata/images/themed/png/light/histogram-blue-on-small.png new file mode 100644 index 000000000..537153043 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-blue-on-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-gold-off-small.png b/rtdata/images/themed/png/light/histogram-gold-off-small.png new file mode 100644 index 000000000..4272c3ff7 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-gold-off-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-gold-on-small.png b/rtdata/images/themed/png/light/histogram-gold-on-small.png new file mode 100644 index 000000000..8f32203fd Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-gold-on-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-green-off-small.png b/rtdata/images/themed/png/light/histogram-green-off-small.png new file mode 100644 index 000000000..395fcac9e Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-green-off-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-green-on-small.png b/rtdata/images/themed/png/light/histogram-green-on-small.png new file mode 100644 index 000000000..db3f89ef5 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-green-on-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-mode-linear-small.png b/rtdata/images/themed/png/light/histogram-mode-linear-small.png new file mode 100644 index 000000000..4eafc3c15 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-mode-linear-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-mode-logx-small.png b/rtdata/images/themed/png/light/histogram-mode-logx-small.png new file mode 100644 index 000000000..2e33b16d7 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-mode-logx-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-mode-logxy-small.png b/rtdata/images/themed/png/light/histogram-mode-logxy-small.png new file mode 100644 index 000000000..29431e3b4 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-mode-logxy-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-red-off-small.png b/rtdata/images/themed/png/light/histogram-red-off-small.png new file mode 100644 index 000000000..7d5ea5352 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-red-off-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-red-on-small.png b/rtdata/images/themed/png/light/histogram-red-on-small.png new file mode 100644 index 000000000..deee136a2 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-red-on-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-silver-off-small.png b/rtdata/images/themed/png/light/histogram-silver-off-small.png new file mode 100644 index 000000000..d88e879bc Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-silver-off-small.png differ diff --git a/rtdata/images/themed/png/light/histogram-silver-on-small.png b/rtdata/images/themed/png/light/histogram-silver-on-small.png new file mode 100644 index 000000000..bdef06144 Binary files /dev/null and b/rtdata/images/themed/png/light/histogram-silver-on-small.png differ diff --git a/rtdata/images/themed/png/light/info.png b/rtdata/images/themed/png/light/info.png new file mode 100644 index 000000000..10235714f Binary files /dev/null and b/rtdata/images/themed/png/light/info.png differ diff --git a/rtdata/images/themed/png/light/intent-absolute.png b/rtdata/images/themed/png/light/intent-absolute.png new file mode 100644 index 000000000..ee04d0a11 Binary files /dev/null and b/rtdata/images/themed/png/light/intent-absolute.png differ diff --git a/rtdata/images/themed/png/light/intent-perceptual.png b/rtdata/images/themed/png/light/intent-perceptual.png new file mode 100644 index 000000000..1c1e0c283 Binary files /dev/null and b/rtdata/images/themed/png/light/intent-perceptual.png differ diff --git a/rtdata/images/themed/png/light/intent-relative.png b/rtdata/images/themed/png/light/intent-relative.png new file mode 100644 index 000000000..4d212b6ab Binary files /dev/null and b/rtdata/images/themed/png/light/intent-relative.png differ diff --git a/rtdata/images/themed/png/light/intent-saturation.png b/rtdata/images/themed/png/light/intent-saturation.png new file mode 100644 index 000000000..26ab655dc Binary files /dev/null and b/rtdata/images/themed/png/light/intent-saturation.png differ diff --git a/rtdata/images/themed/png/light/magnifier-1to1-small.png b/rtdata/images/themed/png/light/magnifier-1to1-small.png new file mode 100644 index 000000000..cfd75532a Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-1to1-small.png differ diff --git a/rtdata/images/themed/png/light/magnifier-1to1.png b/rtdata/images/themed/png/light/magnifier-1to1.png new file mode 100644 index 000000000..b547f0944 Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-1to1.png differ diff --git a/rtdata/images/themed/png/light/magnifier-crop.png b/rtdata/images/themed/png/light/magnifier-crop.png new file mode 100644 index 000000000..7f4f906f0 Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-crop.png differ diff --git a/rtdata/images/themed/png/light/magnifier-fit.png b/rtdata/images/themed/png/light/magnifier-fit.png new file mode 100644 index 000000000..fdc0bef5f Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-fit.png differ diff --git a/rtdata/images/themed/png/light/magnifier-minus-small.png b/rtdata/images/themed/png/light/magnifier-minus-small.png new file mode 100644 index 000000000..76b55f975 Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-minus-small.png differ diff --git a/rtdata/images/themed/png/light/magnifier-minus.png b/rtdata/images/themed/png/light/magnifier-minus.png new file mode 100644 index 000000000..22db961c3 Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-minus.png differ diff --git a/rtdata/images/themed/png/light/magnifier-plus-small.png b/rtdata/images/themed/png/light/magnifier-plus-small.png new file mode 100644 index 000000000..54d989e63 Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-plus-small.png differ diff --git a/rtdata/images/themed/png/light/magnifier-plus.png b/rtdata/images/themed/png/light/magnifier-plus.png new file mode 100644 index 000000000..e45ce8d81 Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier-plus.png differ diff --git a/rtdata/images/themed/png/light/magnifier.png b/rtdata/images/themed/png/light/magnifier.png new file mode 100644 index 000000000..a7fbdbeda Binary files /dev/null and b/rtdata/images/themed/png/light/magnifier.png differ diff --git a/rtdata/images/themed/png/light/metadata.png b/rtdata/images/themed/png/light/metadata.png new file mode 100644 index 000000000..ba114f5c1 Binary files /dev/null and b/rtdata/images/themed/png/light/metadata.png differ diff --git a/rtdata/images/themed/png/light/node-move-nw-se-hicontrast.png b/rtdata/images/themed/png/light/node-move-nw-se-hicontrast.png new file mode 100644 index 000000000..b802c5849 Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-nw-se-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/node-move-sw-ne-hicontrast.png b/rtdata/images/themed/png/light/node-move-sw-ne-hicontrast.png new file mode 100644 index 000000000..2e51e88a3 Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-sw-ne-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/node-move-x-hicontrast.png b/rtdata/images/themed/png/light/node-move-x-hicontrast.png new file mode 100644 index 000000000..1cc871dbb Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-x-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/node-move-xy-hicontrast.png b/rtdata/images/themed/png/light/node-move-xy-hicontrast.png new file mode 100644 index 000000000..8b843958d Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-xy-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/node-move-y-hicontrast.png b/rtdata/images/themed/png/light/node-move-y-hicontrast.png new file mode 100644 index 000000000..f80690851 Binary files /dev/null and b/rtdata/images/themed/png/light/node-move-y-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/one-to-one-small.png b/rtdata/images/themed/png/light/one-to-one-small.png new file mode 100644 index 000000000..8c506609c Binary files /dev/null and b/rtdata/images/themed/png/light/one-to-one-small.png differ diff --git a/rtdata/images/themed/png/light/ornament1.png b/rtdata/images/themed/png/light/ornament1.png new file mode 100644 index 000000000..71b3f1c78 Binary files /dev/null and b/rtdata/images/themed/png/light/ornament1.png differ diff --git a/rtdata/images/themed/png/light/padlock-locked-small.png b/rtdata/images/themed/png/light/padlock-locked-small.png new file mode 100644 index 000000000..1b1198f01 Binary files /dev/null and b/rtdata/images/themed/png/light/padlock-locked-small.png differ diff --git a/rtdata/images/themed/png/light/padlock-unlocked-small.png b/rtdata/images/themed/png/light/padlock-unlocked-small.png new file mode 100644 index 000000000..96b75f093 Binary files /dev/null and b/rtdata/images/themed/png/light/padlock-unlocked-small.png differ diff --git a/rtdata/images/themed/png/light/palette-brush.png b/rtdata/images/themed/png/light/palette-brush.png new file mode 100644 index 000000000..bd208f059 Binary files /dev/null and b/rtdata/images/themed/png/light/palette-brush.png differ diff --git a/rtdata/images/themed/png/light/panel-to-bottom.png b/rtdata/images/themed/png/light/panel-to-bottom.png new file mode 100644 index 000000000..e2d532a16 Binary files /dev/null and b/rtdata/images/themed/png/light/panel-to-bottom.png differ diff --git a/rtdata/images/themed/png/light/panel-to-left.png b/rtdata/images/themed/png/light/panel-to-left.png new file mode 100644 index 000000000..196fed3c9 Binary files /dev/null and b/rtdata/images/themed/png/light/panel-to-left.png differ diff --git a/rtdata/images/themed/png/light/panel-to-right.png b/rtdata/images/themed/png/light/panel-to-right.png new file mode 100644 index 000000000..a9e3b7667 Binary files /dev/null and b/rtdata/images/themed/png/light/panel-to-right.png differ diff --git a/rtdata/images/themed/png/light/panel-to-top.png b/rtdata/images/themed/png/light/panel-to-top.png new file mode 100644 index 000000000..dafa6b852 Binary files /dev/null and b/rtdata/images/themed/png/light/panel-to-top.png differ diff --git a/rtdata/images/themed/png/light/paste.png b/rtdata/images/themed/png/light/paste.png new file mode 100644 index 000000000..ffefcc323 Binary files /dev/null and b/rtdata/images/themed/png/light/paste.png differ diff --git a/rtdata/images/themed/png/light/perspective-horizontal-left-small.png b/rtdata/images/themed/png/light/perspective-horizontal-left-small.png new file mode 100644 index 000000000..f2832c607 Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-horizontal-left-small.png differ diff --git a/rtdata/images/themed/png/light/perspective-horizontal-left.png b/rtdata/images/themed/png/light/perspective-horizontal-left.png new file mode 100644 index 000000000..23b24f6aa Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-horizontal-left.png differ diff --git a/rtdata/images/themed/png/light/perspective-horizontal-right-small.png b/rtdata/images/themed/png/light/perspective-horizontal-right-small.png new file mode 100644 index 000000000..e555f0c1e Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-horizontal-right-small.png differ diff --git a/rtdata/images/themed/png/light/perspective-horizontal-right.png b/rtdata/images/themed/png/light/perspective-horizontal-right.png new file mode 100644 index 000000000..7a334ad81 Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-horizontal-right.png differ diff --git a/rtdata/images/themed/png/light/perspective-vertical-bottom-small.png b/rtdata/images/themed/png/light/perspective-vertical-bottom-small.png new file mode 100644 index 000000000..12f776add Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-vertical-bottom-small.png differ diff --git a/rtdata/images/themed/png/light/perspective-vertical-bottom.png b/rtdata/images/themed/png/light/perspective-vertical-bottom.png new file mode 100644 index 000000000..c6dbfcd51 Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-vertical-bottom.png differ diff --git a/rtdata/images/themed/png/light/perspective-vertical-top-small.png b/rtdata/images/themed/png/light/perspective-vertical-top-small.png new file mode 100644 index 000000000..8202b0e75 Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-vertical-top-small.png differ diff --git a/rtdata/images/themed/png/light/perspective-vertical-top.png b/rtdata/images/themed/png/light/perspective-vertical-top.png new file mode 100644 index 000000000..05c0a7fe1 Binary files /dev/null and b/rtdata/images/themed/png/light/perspective-vertical-top.png differ diff --git a/rtdata/images/themed/png/light/power-inconsistent-small.png b/rtdata/images/themed/png/light/power-inconsistent-small.png new file mode 100644 index 000000000..2805f8245 Binary files /dev/null and b/rtdata/images/themed/png/light/power-inconsistent-small.png differ diff --git a/rtdata/images/themed/png/light/power-off-small.png b/rtdata/images/themed/png/light/power-off-small.png new file mode 100644 index 000000000..6036813a9 Binary files /dev/null and b/rtdata/images/themed/png/light/power-off-small.png differ diff --git a/rtdata/images/themed/png/light/power-on-small.png b/rtdata/images/themed/png/light/power-on-small.png new file mode 100644 index 000000000..796aa16e2 Binary files /dev/null and b/rtdata/images/themed/png/light/power-on-small.png differ diff --git a/rtdata/images/themed/png/light/preferences.png b/rtdata/images/themed/png/light/preferences.png new file mode 100644 index 000000000..c18a5e2a6 Binary files /dev/null and b/rtdata/images/themed/png/light/preferences.png differ diff --git a/rtdata/images/themed/png/light/profile-filled.png b/rtdata/images/themed/png/light/profile-filled.png new file mode 100644 index 000000000..ba549ec63 Binary files /dev/null and b/rtdata/images/themed/png/light/profile-filled.png differ diff --git a/rtdata/images/themed/png/light/profile-partial.png b/rtdata/images/themed/png/light/profile-partial.png new file mode 100644 index 000000000..5baed296d Binary files /dev/null and b/rtdata/images/themed/png/light/profile-partial.png differ diff --git a/rtdata/images/themed/png/light/redo-all.png b/rtdata/images/themed/png/light/redo-all.png new file mode 100644 index 000000000..38551bf34 Binary files /dev/null and b/rtdata/images/themed/png/light/redo-all.png differ diff --git a/rtdata/images/themed/png/light/redo-small.png b/rtdata/images/themed/png/light/redo-small.png new file mode 100644 index 000000000..59a5e3a31 Binary files /dev/null and b/rtdata/images/themed/png/light/redo-small.png differ diff --git a/rtdata/images/themed/png/light/redo.png b/rtdata/images/themed/png/light/redo.png new file mode 100644 index 000000000..165f4ea29 Binary files /dev/null and b/rtdata/images/themed/png/light/redo.png differ diff --git a/rtdata/images/themed/png/light/refresh-red-small.png b/rtdata/images/themed/png/light/refresh-red-small.png new file mode 100644 index 000000000..296035883 Binary files /dev/null and b/rtdata/images/themed/png/light/refresh-red-small.png differ diff --git a/rtdata/images/themed/png/light/refresh-small.png b/rtdata/images/themed/png/light/refresh-small.png new file mode 100644 index 000000000..c6c827182 Binary files /dev/null and b/rtdata/images/themed/png/light/refresh-small.png differ diff --git a/rtdata/images/themed/png/light/refresh.png b/rtdata/images/themed/png/light/refresh.png new file mode 100644 index 000000000..cc062f1f5 Binary files /dev/null and b/rtdata/images/themed/png/light/refresh.png differ diff --git a/rtdata/images/themed/png/light/remove-small.png b/rtdata/images/themed/png/light/remove-small.png new file mode 100644 index 000000000..c9bdc8b83 Binary files /dev/null and b/rtdata/images/themed/png/light/remove-small.png differ diff --git a/rtdata/images/themed/png/light/remove.png b/rtdata/images/themed/png/light/remove.png new file mode 100644 index 000000000..5d030627a Binary files /dev/null and b/rtdata/images/themed/png/light/remove.png differ diff --git a/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png b/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png new file mode 100644 index 000000000..d8929ac42 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-aroundnode-hicontrast.png differ diff --git a/rtdata/images/themed/png/light/rotate-aroundnode.png b/rtdata/images/themed/png/light/rotate-aroundnode.png new file mode 100644 index 000000000..5da406b64 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-aroundnode.png differ diff --git a/rtdata/images/themed/png/light/rotate-left-90.png b/rtdata/images/themed/png/light/rotate-left-90.png new file mode 100644 index 000000000..7904c82f5 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-left-90.png differ diff --git a/rtdata/images/themed/png/light/rotate-left-small.png b/rtdata/images/themed/png/light/rotate-left-small.png new file mode 100644 index 000000000..f3c94f65a Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-left-small.png differ diff --git a/rtdata/images/themed/png/light/rotate-left.png b/rtdata/images/themed/png/light/rotate-left.png new file mode 100644 index 000000000..5e2b0a201 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-left.png differ diff --git a/rtdata/images/themed/png/light/rotate-right-90.png b/rtdata/images/themed/png/light/rotate-right-90.png new file mode 100644 index 000000000..52fd331dd Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-right-90.png differ diff --git a/rtdata/images/themed/png/light/rotate-right-small.png b/rtdata/images/themed/png/light/rotate-right-small.png new file mode 100644 index 000000000..4fa8f8d19 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-right-small.png differ diff --git a/rtdata/images/themed/png/light/rotate-right.png b/rtdata/images/themed/png/light/rotate-right.png new file mode 100644 index 000000000..c819cbe73 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-right.png differ diff --git a/rtdata/images/themed/png/light/rotate-straighten-small.png b/rtdata/images/themed/png/light/rotate-straighten-small.png new file mode 100644 index 000000000..67190d31a Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-straighten-small.png differ diff --git a/rtdata/images/themed/png/light/rotate-straighten.png b/rtdata/images/themed/png/light/rotate-straighten.png new file mode 100644 index 000000000..a9c2e0805 Binary files /dev/null and b/rtdata/images/themed/png/light/rotate-straighten.png differ diff --git a/rtdata/images/themed/png/light/save-small.png b/rtdata/images/themed/png/light/save-small.png new file mode 100644 index 000000000..c296fdb72 Binary files /dev/null and b/rtdata/images/themed/png/light/save-small.png differ diff --git a/rtdata/images/themed/png/light/save.png b/rtdata/images/themed/png/light/save.png new file mode 100644 index 000000000..f71542230 Binary files /dev/null and b/rtdata/images/themed/png/light/save.png differ diff --git a/rtdata/images/themed/png/light/saved-no-small.png b/rtdata/images/themed/png/light/saved-no-small.png new file mode 100644 index 000000000..68021eda4 Binary files /dev/null and b/rtdata/images/themed/png/light/saved-no-small.png differ diff --git a/rtdata/images/themed/png/light/saved-yes-small.png b/rtdata/images/themed/png/light/saved-yes-small.png new file mode 100644 index 000000000..4557ef905 Binary files /dev/null and b/rtdata/images/themed/png/light/saved-yes-small.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-black-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-black-off-narrow.png new file mode 100644 index 000000000..ff6adb675 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-black-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-black-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-black-on-narrow.png new file mode 100644 index 000000000..5d6e35c3d Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-black-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-blue-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-blue-off-narrow.png new file mode 100644 index 000000000..2a9741c0f Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-blue-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-blue-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-blue-on-narrow.png new file mode 100644 index 000000000..e52337d33 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-blue-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-gray-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-gray-off-narrow.png new file mode 100644 index 000000000..7e009920f Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-gray-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-gray-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-gray-on-narrow.png new file mode 100644 index 000000000..64289008a Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-gray-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-green-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-green-off-narrow.png new file mode 100644 index 000000000..f55cbb8c3 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-green-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-green-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-green-on-narrow.png new file mode 100644 index 000000000..0c8b9522d Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-green-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-luminosity-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-luminosity-off-narrow.png new file mode 100644 index 000000000..c6dfe8410 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-luminosity-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-luminosity-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-luminosity-on-narrow.png new file mode 100644 index 000000000..b45b608d9 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-luminosity-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-red-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-red-off-narrow.png new file mode 100644 index 000000000..99730ee4b Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-red-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-red-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-red-on-narrow.png new file mode 100644 index 000000000..e0b91d8b3 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-red-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-theme-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-theme-off-narrow.png new file mode 100644 index 000000000..449946648 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-theme-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-theme-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-theme-on-narrow.png new file mode 100644 index 000000000..e59257824 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-theme-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-white-off-narrow.png b/rtdata/images/themed/png/light/square-toggle-white-off-narrow.png new file mode 100644 index 000000000..b2e5e3611 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-white-off-narrow.png differ diff --git a/rtdata/images/themed/png/light/square-toggle-white-on-narrow.png b/rtdata/images/themed/png/light/square-toggle-white-on-narrow.png new file mode 100644 index 000000000..7ff59d927 Binary files /dev/null and b/rtdata/images/themed/png/light/square-toggle-white-on-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-gold-hollow-narrow.png b/rtdata/images/themed/png/light/star-gold-hollow-narrow.png new file mode 100644 index 000000000..b0ce704d6 Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-gold-hollow-small.png b/rtdata/images/themed/png/light/star-gold-hollow-small.png new file mode 100644 index 000000000..478055c2b Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold-hollow-small.png differ diff --git a/rtdata/images/themed/png/light/star-gold-narrow.png b/rtdata/images/themed/png/light/star-gold-narrow.png new file mode 100644 index 000000000..32710fb9d Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-gold-small.png b/rtdata/images/themed/png/light/star-gold-small.png new file mode 100644 index 000000000..da02a823e Binary files /dev/null and b/rtdata/images/themed/png/light/star-gold-small.png differ diff --git a/rtdata/images/themed/png/light/star-hollow-narrow.png b/rtdata/images/themed/png/light/star-hollow-narrow.png new file mode 100644 index 000000000..4a15f0ba1 Binary files /dev/null and b/rtdata/images/themed/png/light/star-hollow-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-hollow-small.png b/rtdata/images/themed/png/light/star-hollow-small.png new file mode 100644 index 000000000..8e5335410 Binary files /dev/null and b/rtdata/images/themed/png/light/star-hollow-small.png differ diff --git a/rtdata/images/themed/png/light/star-narrow.png b/rtdata/images/themed/png/light/star-narrow.png new file mode 100644 index 000000000..78c8eea8a Binary files /dev/null and b/rtdata/images/themed/png/light/star-narrow.png differ diff --git a/rtdata/images/themed/png/light/star-small.png b/rtdata/images/themed/png/light/star-small.png new file mode 100644 index 000000000..2bb54647a Binary files /dev/null and b/rtdata/images/themed/png/light/star-small.png differ diff --git a/rtdata/images/themed/png/light/star.png b/rtdata/images/themed/png/light/star.png new file mode 100644 index 000000000..de03f30ca Binary files /dev/null and b/rtdata/images/themed/png/light/star.png differ diff --git a/rtdata/images/themed/png/light/template-16.png b/rtdata/images/themed/png/light/template-16.png new file mode 100644 index 000000000..1c50ead9e Binary files /dev/null and b/rtdata/images/themed/png/light/template-16.png differ diff --git a/rtdata/images/themed/png/light/template-24.png b/rtdata/images/themed/png/light/template-24.png new file mode 100644 index 000000000..7ab9e8c0f Binary files /dev/null and b/rtdata/images/themed/png/light/template-24.png differ diff --git a/rtdata/images/themed/png/light/template-narrow.png b/rtdata/images/themed/png/light/template-narrow.png new file mode 100644 index 000000000..78c374503 Binary files /dev/null and b/rtdata/images/themed/png/light/template-narrow.png differ diff --git a/rtdata/images/themed/png/light/tick-green-hollow-small.png b/rtdata/images/themed/png/light/tick-green-hollow-small.png new file mode 100644 index 000000000..176bf5489 Binary files /dev/null and b/rtdata/images/themed/png/light/tick-green-hollow-small.png differ diff --git a/rtdata/images/themed/png/light/tick-green-hollow.png b/rtdata/images/themed/png/light/tick-green-hollow.png new file mode 100644 index 000000000..7cac33dc0 Binary files /dev/null and b/rtdata/images/themed/png/light/tick-green-hollow.png differ diff --git a/rtdata/images/themed/png/light/tick-green-small.png b/rtdata/images/themed/png/light/tick-green-small.png new file mode 100644 index 000000000..54cf5d024 Binary files /dev/null and b/rtdata/images/themed/png/light/tick-green-small.png differ diff --git a/rtdata/images/themed/png/light/tick-green.png b/rtdata/images/themed/png/light/tick-green.png new file mode 100644 index 000000000..2458734b2 Binary files /dev/null and b/rtdata/images/themed/png/light/tick-green.png differ diff --git a/rtdata/images/themed/png/light/tick-hollow-small.png b/rtdata/images/themed/png/light/tick-hollow-small.png new file mode 100644 index 000000000..9a0973962 Binary files /dev/null and b/rtdata/images/themed/png/light/tick-hollow-small.png differ diff --git a/rtdata/images/themed/png/light/tick-small.png b/rtdata/images/themed/png/light/tick-small.png new file mode 100644 index 000000000..73438bed0 Binary files /dev/null and b/rtdata/images/themed/png/light/tick-small.png differ diff --git a/rtdata/images/themed/png/light/tick.png b/rtdata/images/themed/png/light/tick.png new file mode 100644 index 000000000..7bb629789 Binary files /dev/null and b/rtdata/images/themed/png/light/tick.png differ diff --git a/rtdata/images/themed/png/light/transform.png b/rtdata/images/themed/png/light/transform.png new file mode 100644 index 000000000..ec1c6642a Binary files /dev/null and b/rtdata/images/themed/png/light/transform.png differ diff --git a/rtdata/images/themed/png/light/trash-delete.png b/rtdata/images/themed/png/light/trash-delete.png new file mode 100644 index 000000000..7d0c422f7 Binary files /dev/null and b/rtdata/images/themed/png/light/trash-delete.png differ diff --git a/rtdata/images/themed/png/light/trash-empty-show.png b/rtdata/images/themed/png/light/trash-empty-show.png new file mode 100644 index 000000000..9e4ade318 Binary files /dev/null and b/rtdata/images/themed/png/light/trash-empty-show.png differ diff --git a/rtdata/images/themed/png/light/trash-empty.png b/rtdata/images/themed/png/light/trash-empty.png new file mode 100644 index 000000000..7a8345109 Binary files /dev/null and b/rtdata/images/themed/png/light/trash-empty.png differ diff --git a/rtdata/images/themed/png/light/trash-full-show.png b/rtdata/images/themed/png/light/trash-full-show.png new file mode 100644 index 000000000..8061c5070 Binary files /dev/null and b/rtdata/images/themed/png/light/trash-full-show.png differ diff --git a/rtdata/images/themed/png/light/trash-full.png b/rtdata/images/themed/png/light/trash-full.png new file mode 100644 index 000000000..a43d6f3e5 Binary files /dev/null and b/rtdata/images/themed/png/light/trash-full.png differ diff --git a/rtdata/images/themed/png/light/trash-hide-deleted.png b/rtdata/images/themed/png/light/trash-hide-deleted.png new file mode 100644 index 000000000..319a0dd4a Binary files /dev/null and b/rtdata/images/themed/png/light/trash-hide-deleted.png differ diff --git a/rtdata/images/themed/png/light/trash-remove-small.png b/rtdata/images/themed/png/light/trash-remove-small.png new file mode 100644 index 000000000..df70891fb Binary files /dev/null and b/rtdata/images/themed/png/light/trash-remove-small.png differ diff --git a/rtdata/images/themed/png/light/trash-remove.png b/rtdata/images/themed/png/light/trash-remove.png new file mode 100644 index 000000000..8c0c45aad Binary files /dev/null and b/rtdata/images/themed/png/light/trash-remove.png differ diff --git a/rtdata/images/themed/png/light/trash-small.png b/rtdata/images/themed/png/light/trash-small.png new file mode 100644 index 000000000..7e3183942 Binary files /dev/null and b/rtdata/images/themed/png/light/trash-small.png differ diff --git a/rtdata/images/themed/png/light/undo-all.png b/rtdata/images/themed/png/light/undo-all.png new file mode 100644 index 000000000..04170e26f Binary files /dev/null and b/rtdata/images/themed/png/light/undo-all.png differ diff --git a/rtdata/images/themed/png/light/undo-small.png b/rtdata/images/themed/png/light/undo-small.png new file mode 100644 index 000000000..d6f1d0115 Binary files /dev/null and b/rtdata/images/themed/png/light/undo-small.png differ diff --git a/rtdata/images/themed/png/light/undo.png b/rtdata/images/themed/png/light/undo.png new file mode 100644 index 000000000..6451ce0dd Binary files /dev/null and b/rtdata/images/themed/png/light/undo.png differ diff --git a/rtdata/images/themed/png/light/warning-highlights.png b/rtdata/images/themed/png/light/warning-highlights.png new file mode 100644 index 000000000..5426a14a3 Binary files /dev/null and b/rtdata/images/themed/png/light/warning-highlights.png differ diff --git a/rtdata/images/themed/png/light/warning-shadows.png b/rtdata/images/themed/png/light/warning-shadows.png new file mode 100644 index 000000000..86b6c06a6 Binary files /dev/null and b/rtdata/images/themed/png/light/warning-shadows.png differ diff --git a/rtdata/images/themed/png/light/warning.png b/rtdata/images/themed/png/light/warning.png new file mode 100644 index 000000000..5bc43cfe2 Binary files /dev/null and b/rtdata/images/themed/png/light/warning.png differ diff --git a/rtdata/images/themed/png/light/wavelets.png b/rtdata/images/themed/png/light/wavelets.png new file mode 100644 index 000000000..3907c255e Binary files /dev/null and b/rtdata/images/themed/png/light/wavelets.png differ diff --git a/rtdata/images/themed/png/light/wb-auto-small.png b/rtdata/images/themed/png/light/wb-auto-small.png new file mode 100644 index 000000000..e7995b4ce Binary files /dev/null and b/rtdata/images/themed/png/light/wb-auto-small.png differ diff --git a/rtdata/images/themed/png/light/wb-auto.png b/rtdata/images/themed/png/light/wb-auto.png new file mode 100644 index 000000000..d1b60e8ad Binary files /dev/null and b/rtdata/images/themed/png/light/wb-auto.png differ diff --git a/rtdata/images/themed/png/light/wb-camera-small.png b/rtdata/images/themed/png/light/wb-camera-small.png new file mode 100644 index 000000000..72d03db7b Binary files /dev/null and b/rtdata/images/themed/png/light/wb-camera-small.png differ diff --git a/rtdata/images/themed/png/light/wb-camera.png b/rtdata/images/themed/png/light/wb-camera.png new file mode 100644 index 000000000..8034b85d2 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-camera.png differ diff --git a/rtdata/images/themed/png/light/wb-cloudy-small.png b/rtdata/images/themed/png/light/wb-cloudy-small.png new file mode 100644 index 000000000..131b28287 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-cloudy-small.png differ diff --git a/rtdata/images/themed/png/light/wb-cloudy.png b/rtdata/images/themed/png/light/wb-cloudy.png new file mode 100644 index 000000000..04e6e3418 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-cloudy.png differ diff --git a/rtdata/images/themed/png/light/wb-custom-small.png b/rtdata/images/themed/png/light/wb-custom-small.png new file mode 100644 index 000000000..c0d2ebf09 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-custom-small.png differ diff --git a/rtdata/images/themed/png/light/wb-custom.png b/rtdata/images/themed/png/light/wb-custom.png new file mode 100644 index 000000000..fdc7258cd Binary files /dev/null and b/rtdata/images/themed/png/light/wb-custom.png differ diff --git a/rtdata/images/themed/png/light/wb-flash-small.png b/rtdata/images/themed/png/light/wb-flash-small.png new file mode 100644 index 000000000..cf44f0357 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-flash-small.png differ diff --git a/rtdata/images/themed/png/light/wb-flash.png b/rtdata/images/themed/png/light/wb-flash.png new file mode 100644 index 000000000..8c602dc88 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-flash.png differ diff --git a/rtdata/images/themed/png/light/wb-fluorescent-small.png b/rtdata/images/themed/png/light/wb-fluorescent-small.png new file mode 100644 index 000000000..0362ebf02 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-fluorescent-small.png differ diff --git a/rtdata/images/themed/png/light/wb-fluorescent.png b/rtdata/images/themed/png/light/wb-fluorescent.png new file mode 100644 index 000000000..4acc5e767 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-fluorescent.png differ diff --git a/rtdata/images/themed/png/light/wb-lamp-small.png b/rtdata/images/themed/png/light/wb-lamp-small.png new file mode 100644 index 000000000..4c8516d30 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-lamp-small.png differ diff --git a/rtdata/images/themed/png/light/wb-lamp.png b/rtdata/images/themed/png/light/wb-lamp.png new file mode 100644 index 000000000..57da8265c Binary files /dev/null and b/rtdata/images/themed/png/light/wb-lamp.png differ diff --git a/rtdata/images/themed/png/light/wb-led-small.png b/rtdata/images/themed/png/light/wb-led-small.png new file mode 100644 index 000000000..7b3d8504f Binary files /dev/null and b/rtdata/images/themed/png/light/wb-led-small.png differ diff --git a/rtdata/images/themed/png/light/wb-led.png b/rtdata/images/themed/png/light/wb-led.png new file mode 100644 index 000000000..5c2d363c6 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-led.png differ diff --git a/rtdata/images/themed/png/light/wb-shade-small.png b/rtdata/images/themed/png/light/wb-shade-small.png new file mode 100644 index 000000000..397fcfdd4 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-shade-small.png differ diff --git a/rtdata/images/themed/png/light/wb-shade.png b/rtdata/images/themed/png/light/wb-shade.png new file mode 100644 index 000000000..7603de77e Binary files /dev/null and b/rtdata/images/themed/png/light/wb-shade.png differ diff --git a/rtdata/images/themed/png/light/wb-sun-small.png b/rtdata/images/themed/png/light/wb-sun-small.png new file mode 100644 index 000000000..70c139ab2 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-sun-small.png differ diff --git a/rtdata/images/themed/png/light/wb-sun.png b/rtdata/images/themed/png/light/wb-sun.png new file mode 100644 index 000000000..da7271078 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-sun.png differ diff --git a/rtdata/images/themed/png/light/wb-tungsten-small.png b/rtdata/images/themed/png/light/wb-tungsten-small.png new file mode 100644 index 000000000..3dcbf947d Binary files /dev/null and b/rtdata/images/themed/png/light/wb-tungsten-small.png differ diff --git a/rtdata/images/themed/png/light/wb-tungsten.png b/rtdata/images/themed/png/light/wb-tungsten.png new file mode 100644 index 000000000..9c3793852 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-tungsten.png differ diff --git a/rtdata/images/themed/png/light/wb-water-small.png b/rtdata/images/themed/png/light/wb-water-small.png new file mode 100644 index 000000000..59e7bb836 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-water-small.png differ diff --git a/rtdata/images/themed/png/light/wb-water.png b/rtdata/images/themed/png/light/wb-water.png new file mode 100644 index 000000000..593516563 Binary files /dev/null and b/rtdata/images/themed/png/light/wb-water.png differ diff --git a/rtdata/images/themed/png/light/window-add.png b/rtdata/images/themed/png/light/window-add.png new file mode 100644 index 000000000..6ccacd678 Binary files /dev/null and b/rtdata/images/themed/png/light/window-add.png differ diff --git a/rtdata/images/themed/svg/add-small.svg b/rtdata/images/themed/svg/add-small.svg new file mode 100644 index 000000000..13abbdc25 --- /dev/null +++ b/rtdata/images/themed/svg/add-small.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/add.svg b/rtdata/images/themed/svg/add.svg new file mode 100644 index 000000000..c45f9f584 --- /dev/null +++ b/rtdata/images/themed/svg/add.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/aperture.svg b/rtdata/images/themed/svg/aperture.svg new file mode 100644 index 000000000..5820ee283 --- /dev/null +++ b/rtdata/images/themed/svg/aperture.svg @@ -0,0 +1,395 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/arrow-down-small.svg b/rtdata/images/themed/svg/arrow-down-small.svg new file mode 100644 index 000000000..d17ba4329 --- /dev/null +++ b/rtdata/images/themed/svg/arrow-down-small.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/arrow-left-small.svg b/rtdata/images/themed/svg/arrow-left-small.svg new file mode 100644 index 000000000..54eafbc29 --- /dev/null +++ b/rtdata/images/themed/svg/arrow-left-small.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/arrow-right-small.svg b/rtdata/images/themed/svg/arrow-right-small.svg new file mode 100644 index 000000000..43bfdd4e8 --- /dev/null +++ b/rtdata/images/themed/svg/arrow-right-small.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/arrow-up-small.svg b/rtdata/images/themed/svg/arrow-up-small.svg new file mode 100644 index 000000000..b5609c5d7 --- /dev/null +++ b/rtdata/images/themed/svg/arrow-up-small.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/arrow-updown.svg b/rtdata/images/themed/svg/arrow-updown.svg new file mode 100644 index 000000000..d5b6c22a5 --- /dev/null +++ b/rtdata/images/themed/svg/arrow-updown.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/arrow2-left.svg b/rtdata/images/themed/svg/arrow2-left.svg new file mode 100644 index 000000000..f71ee83e3 --- /dev/null +++ b/rtdata/images/themed/svg/arrow2-left.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/arrow2-right.svg b/rtdata/images/themed/svg/arrow2-right.svg new file mode 100644 index 000000000..8c3f60554 --- /dev/null +++ b/rtdata/images/themed/svg/arrow2-right.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/atom.svg b/rtdata/images/themed/svg/atom.svg new file mode 100644 index 000000000..72fb97532 --- /dev/null +++ b/rtdata/images/themed/svg/atom.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/bayer.svg b/rtdata/images/themed/svg/bayer.svg new file mode 100644 index 000000000..1718ce5c4 --- /dev/null +++ b/rtdata/images/themed/svg/bayer.svg @@ -0,0 +1,196 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/beforeafter.svg b/rtdata/images/themed/svg/beforeafter.svg new file mode 100644 index 000000000..8c4eaab48 --- /dev/null +++ b/rtdata/images/themed/svg/beforeafter.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/cancel-small.svg b/rtdata/images/themed/svg/cancel-small.svg new file mode 100644 index 000000000..3bbe99bc1 --- /dev/null +++ b/rtdata/images/themed/svg/cancel-small.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/cancel.svg b/rtdata/images/themed/svg/cancel.svg new file mode 100644 index 000000000..c42837e61 --- /dev/null +++ b/rtdata/images/themed/svg/cancel.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-black-small.svg b/rtdata/images/themed/svg/circle-black-small.svg new file mode 100644 index 000000000..2b314c556 --- /dev/null +++ b/rtdata/images/themed/svg/circle-black-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-blue-green-small.svg b/rtdata/images/themed/svg/circle-blue-green-small.svg new file mode 100644 index 000000000..5068447b3 --- /dev/null +++ b/rtdata/images/themed/svg/circle-blue-green-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-blue-red-small.svg b/rtdata/images/themed/svg/circle-blue-red-small.svg new file mode 100644 index 000000000..6445577c1 --- /dev/null +++ b/rtdata/images/themed/svg/circle-blue-red-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-blue-small.svg b/rtdata/images/themed/svg/circle-blue-small.svg new file mode 100644 index 000000000..b92577051 --- /dev/null +++ b/rtdata/images/themed/svg/circle-blue-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-blue-yellow-small.svg b/rtdata/images/themed/svg/circle-blue-yellow-small.svg new file mode 100644 index 000000000..5f2e7f04d --- /dev/null +++ b/rtdata/images/themed/svg/circle-blue-yellow-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-cyan-red-small.svg b/rtdata/images/themed/svg/circle-cyan-red-small.svg new file mode 100644 index 000000000..6b34c50ec --- /dev/null +++ b/rtdata/images/themed/svg/circle-cyan-red-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-cyan-small.svg b/rtdata/images/themed/svg/circle-cyan-small.svg new file mode 100644 index 000000000..b376821cb --- /dev/null +++ b/rtdata/images/themed/svg/circle-cyan-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-darkgray-small.svg b/rtdata/images/themed/svg/circle-darkgray-small.svg new file mode 100644 index 000000000..8183c820f --- /dev/null +++ b/rtdata/images/themed/svg/circle-darkgray-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-empty-blue-small.svg b/rtdata/images/themed/svg/circle-empty-blue-small.svg new file mode 100644 index 000000000..e9004ae63 --- /dev/null +++ b/rtdata/images/themed/svg/circle-empty-blue-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-empty-darkgray-small.svg b/rtdata/images/themed/svg/circle-empty-darkgray-small.svg new file mode 100644 index 000000000..21b4db7ab --- /dev/null +++ b/rtdata/images/themed/svg/circle-empty-darkgray-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-empty-gray-small.svg b/rtdata/images/themed/svg/circle-empty-gray-small.svg new file mode 100644 index 000000000..9bca30ae1 --- /dev/null +++ b/rtdata/images/themed/svg/circle-empty-gray-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-empty-green-small.svg b/rtdata/images/themed/svg/circle-empty-green-small.svg new file mode 100644 index 000000000..b99c6d43e --- /dev/null +++ b/rtdata/images/themed/svg/circle-empty-green-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-empty-purple-small.svg b/rtdata/images/themed/svg/circle-empty-purple-small.svg new file mode 100644 index 000000000..751525ff2 --- /dev/null +++ b/rtdata/images/themed/svg/circle-empty-purple-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-empty-red-small.svg b/rtdata/images/themed/svg/circle-empty-red-small.svg new file mode 100644 index 000000000..fcb7123cf --- /dev/null +++ b/rtdata/images/themed/svg/circle-empty-red-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-empty-yellow-small.svg b/rtdata/images/themed/svg/circle-empty-yellow-small.svg new file mode 100644 index 000000000..65d9fd4cf --- /dev/null +++ b/rtdata/images/themed/svg/circle-empty-yellow-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-gray-blue-small.svg b/rtdata/images/themed/svg/circle-gray-blue-small.svg new file mode 100644 index 000000000..0804edcd7 --- /dev/null +++ b/rtdata/images/themed/svg/circle-gray-blue-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-gray-green-small.svg b/rtdata/images/themed/svg/circle-gray-green-small.svg new file mode 100644 index 000000000..609f6d0e7 --- /dev/null +++ b/rtdata/images/themed/svg/circle-gray-green-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-gray-red-small.svg b/rtdata/images/themed/svg/circle-gray-red-small.svg new file mode 100644 index 000000000..6e203cdbb --- /dev/null +++ b/rtdata/images/themed/svg/circle-gray-red-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-gray-small.svg b/rtdata/images/themed/svg/circle-gray-small.svg new file mode 100644 index 000000000..6ed1fd51d --- /dev/null +++ b/rtdata/images/themed/svg/circle-gray-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-green-blue-small.svg b/rtdata/images/themed/svg/circle-green-blue-small.svg new file mode 100644 index 000000000..650f9fc44 --- /dev/null +++ b/rtdata/images/themed/svg/circle-green-blue-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-green-red-small.svg b/rtdata/images/themed/svg/circle-green-red-small.svg new file mode 100644 index 000000000..21e153062 --- /dev/null +++ b/rtdata/images/themed/svg/circle-green-red-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-green-small.svg b/rtdata/images/themed/svg/circle-green-small.svg new file mode 100644 index 000000000..dc1b0217a --- /dev/null +++ b/rtdata/images/themed/svg/circle-green-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-magenta-small.svg b/rtdata/images/themed/svg/circle-magenta-small.svg new file mode 100644 index 000000000..9f2e485f9 --- /dev/null +++ b/rtdata/images/themed/svg/circle-magenta-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-orange-small.svg b/rtdata/images/themed/svg/circle-orange-small.svg new file mode 100644 index 000000000..addf840d1 --- /dev/null +++ b/rtdata/images/themed/svg/circle-orange-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-purple-small.svg b/rtdata/images/themed/svg/circle-purple-small.svg new file mode 100644 index 000000000..2c4a3f225 --- /dev/null +++ b/rtdata/images/themed/svg/circle-purple-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-red-blue-small.svg b/rtdata/images/themed/svg/circle-red-blue-small.svg new file mode 100644 index 000000000..274cb68fa --- /dev/null +++ b/rtdata/images/themed/svg/circle-red-blue-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-red-cyan-small.svg b/rtdata/images/themed/svg/circle-red-cyan-small.svg new file mode 100644 index 000000000..e2feb97e1 --- /dev/null +++ b/rtdata/images/themed/svg/circle-red-cyan-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-red-green-small.svg b/rtdata/images/themed/svg/circle-red-green-small.svg new file mode 100644 index 000000000..96cc892dd --- /dev/null +++ b/rtdata/images/themed/svg/circle-red-green-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-red-small.svg b/rtdata/images/themed/svg/circle-red-small.svg new file mode 100644 index 000000000..a56b0d328 --- /dev/null +++ b/rtdata/images/themed/svg/circle-red-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-white-small.svg b/rtdata/images/themed/svg/circle-white-small.svg new file mode 100644 index 000000000..5a485d954 --- /dev/null +++ b/rtdata/images/themed/svg/circle-white-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-yellow-blue-small.svg b/rtdata/images/themed/svg/circle-yellow-blue-small.svg new file mode 100644 index 000000000..f6e134941 --- /dev/null +++ b/rtdata/images/themed/svg/circle-yellow-blue-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/circle-yellow-small.svg b/rtdata/images/themed/svg/circle-yellow-small.svg new file mode 100644 index 000000000..7d86fdb19 --- /dev/null +++ b/rtdata/images/themed/svg/circle-yellow-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-circles.svg b/rtdata/images/themed/svg/color-circles.svg new file mode 100644 index 000000000..f7f6ad657 --- /dev/null +++ b/rtdata/images/themed/svg/color-circles.svg @@ -0,0 +1,215 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-add-hicontrast.svg b/rtdata/images/themed/svg/color-picker-add-hicontrast.svg new file mode 100644 index 000000000..09870ff48 --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-add-hicontrast.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-add.svg b/rtdata/images/themed/svg/color-picker-add.svg new file mode 100644 index 000000000..b42b8371d --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-add.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-bars.svg b/rtdata/images/themed/svg/color-picker-bars.svg new file mode 100644 index 000000000..f6c57ea40 --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-bars.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-hicontrast.svg b/rtdata/images/themed/svg/color-picker-hicontrast.svg new file mode 100644 index 000000000..20ece03b7 --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-hicontrast.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-hide.svg b/rtdata/images/themed/svg/color-picker-hide.svg new file mode 100644 index 000000000..be180885e --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-hide.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker-small.svg b/rtdata/images/themed/svg/color-picker-small.svg new file mode 100644 index 000000000..d83400653 --- /dev/null +++ b/rtdata/images/themed/svg/color-picker-small.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/color-picker.svg b/rtdata/images/themed/svg/color-picker.svg new file mode 100644 index 000000000..d52d96633 --- /dev/null +++ b/rtdata/images/themed/svg/color-picker.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/contrastmask-off.svg b/rtdata/images/themed/svg/contrastmask-off.svg new file mode 100644 index 000000000..ed76efbbb --- /dev/null +++ b/rtdata/images/themed/svg/contrastmask-off.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/contrastmask-on.svg b/rtdata/images/themed/svg/contrastmask-on.svg new file mode 100644 index 000000000..9e3504128 --- /dev/null +++ b/rtdata/images/themed/svg/contrastmask-on.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/copy.svg b/rtdata/images/themed/svg/copy.svg new file mode 100644 index 000000000..9471e1ea7 --- /dev/null +++ b/rtdata/images/themed/svg/copy.svg @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crop-auto-small.svg b/rtdata/images/themed/svg/crop-auto-small.svg new file mode 100644 index 000000000..6d8ac3ea7 --- /dev/null +++ b/rtdata/images/themed/svg/crop-auto-small.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crop-auto.svg b/rtdata/images/themed/svg/crop-auto.svg new file mode 100644 index 000000000..bc662e9ea --- /dev/null +++ b/rtdata/images/themed/svg/crop-auto.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crop-point-hicontrast.svg b/rtdata/images/themed/svg/crop-point-hicontrast.svg new file mode 100644 index 000000000..4a06bfcba --- /dev/null +++ b/rtdata/images/themed/svg/crop-point-hicontrast.svg @@ -0,0 +1,176 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crop-small.svg b/rtdata/images/themed/svg/crop-small.svg new file mode 100644 index 000000000..94c0b43df --- /dev/null +++ b/rtdata/images/themed/svg/crop-small.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crop.svg b/rtdata/images/themed/svg/crop.svg new file mode 100644 index 000000000..8fd598f60 --- /dev/null +++ b/rtdata/images/themed/svg/crop.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crossed-arrows-in.svg b/rtdata/images/themed/svg/crossed-arrows-in.svg new file mode 100644 index 000000000..8a4c71dc8 --- /dev/null +++ b/rtdata/images/themed/svg/crossed-arrows-in.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crossed-arrows-out.svg b/rtdata/images/themed/svg/crossed-arrows-out.svg new file mode 100644 index 000000000..5eb5ba4b1 --- /dev/null +++ b/rtdata/images/themed/svg/crossed-arrows-out.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crosshair-adjust.svg b/rtdata/images/themed/svg/crosshair-adjust.svg new file mode 100644 index 000000000..4cde3415a --- /dev/null +++ b/rtdata/images/themed/svg/crosshair-adjust.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crosshair-hicontrast.svg b/rtdata/images/themed/svg/crosshair-hicontrast.svg new file mode 100644 index 000000000..a4dcc2592 --- /dev/null +++ b/rtdata/images/themed/svg/crosshair-hicontrast.svg @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crosshair-node-curve.svg b/rtdata/images/themed/svg/crosshair-node-curve.svg new file mode 100644 index 000000000..d72c2a929 --- /dev/null +++ b/rtdata/images/themed/svg/crosshair-node-curve.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/crosshair-small.svg b/rtdata/images/themed/svg/crosshair-small.svg new file mode 100644 index 000000000..2e5e6596a --- /dev/null +++ b/rtdata/images/themed/svg/crosshair-small.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-catmullrom-small.svg b/rtdata/images/themed/svg/curve-catmullrom-small.svg new file mode 100644 index 000000000..bc6378bb4 --- /dev/null +++ b/rtdata/images/themed/svg/curve-catmullrom-small.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-catmullrom.svg b/rtdata/images/themed/svg/curve-catmullrom.svg new file mode 100644 index 000000000..b59954885 --- /dev/null +++ b/rtdata/images/themed/svg/curve-catmullrom.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-controlpoints-small.svg b/rtdata/images/themed/svg/curve-controlpoints-small.svg new file mode 100644 index 000000000..fc85b8774 --- /dev/null +++ b/rtdata/images/themed/svg/curve-controlpoints-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-controlpoints.svg b/rtdata/images/themed/svg/curve-controlpoints.svg new file mode 100644 index 000000000..2d432264c --- /dev/null +++ b/rtdata/images/themed/svg/curve-controlpoints.svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-flat-small.svg b/rtdata/images/themed/svg/curve-flat-small.svg new file mode 100644 index 000000000..59585c64a --- /dev/null +++ b/rtdata/images/themed/svg/curve-flat-small.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-flat.svg b/rtdata/images/themed/svg/curve-flat.svg new file mode 100644 index 000000000..89888b4d1 --- /dev/null +++ b/rtdata/images/themed/svg/curve-flat.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-linear-small.svg b/rtdata/images/themed/svg/curve-linear-small.svg new file mode 100644 index 000000000..c2a3f7915 --- /dev/null +++ b/rtdata/images/themed/svg/curve-linear-small.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-linear.svg b/rtdata/images/themed/svg/curve-linear.svg new file mode 100644 index 000000000..b016121aa --- /dev/null +++ b/rtdata/images/themed/svg/curve-linear.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-nurbs-small.svg b/rtdata/images/themed/svg/curve-nurbs-small.svg new file mode 100644 index 000000000..1ff3a1a76 --- /dev/null +++ b/rtdata/images/themed/svg/curve-nurbs-small.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-nurbs.svg b/rtdata/images/themed/svg/curve-nurbs.svg new file mode 100644 index 000000000..1d7ef10ce --- /dev/null +++ b/rtdata/images/themed/svg/curve-nurbs.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-parametric-small.svg b/rtdata/images/themed/svg/curve-parametric-small.svg new file mode 100644 index 000000000..2334def2d --- /dev/null +++ b/rtdata/images/themed/svg/curve-parametric-small.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-parametric.svg b/rtdata/images/themed/svg/curve-parametric.svg new file mode 100644 index 000000000..88a1f0389 --- /dev/null +++ b/rtdata/images/themed/svg/curve-parametric.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-spline-small.svg b/rtdata/images/themed/svg/curve-spline-small.svg new file mode 100644 index 000000000..990df0c0d --- /dev/null +++ b/rtdata/images/themed/svg/curve-spline-small.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/curve-spline.svg b/rtdata/images/themed/svg/curve-spline.svg new file mode 100644 index 000000000..f0a28a1a9 --- /dev/null +++ b/rtdata/images/themed/svg/curve-spline.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/detail.svg b/rtdata/images/themed/svg/detail.svg new file mode 100644 index 000000000..4bdc2fb9b --- /dev/null +++ b/rtdata/images/themed/svg/detail.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/device-floppy.svg b/rtdata/images/themed/svg/device-floppy.svg new file mode 100644 index 000000000..29b855e4b --- /dev/null +++ b/rtdata/images/themed/svg/device-floppy.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/device-hdd.svg b/rtdata/images/themed/svg/device-hdd.svg new file mode 100644 index 000000000..b93a1d698 --- /dev/null +++ b/rtdata/images/themed/svg/device-hdd.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/device-network.svg b/rtdata/images/themed/svg/device-network.svg new file mode 100644 index 000000000..d17821545 --- /dev/null +++ b/rtdata/images/themed/svg/device-network.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/device-optical.svg b/rtdata/images/themed/svg/device-optical.svg new file mode 100644 index 000000000..de73e9422 --- /dev/null +++ b/rtdata/images/themed/svg/device-optical.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/device-usb.svg b/rtdata/images/themed/svg/device-usb.svg new file mode 100644 index 000000000..116a6e1f5 --- /dev/null +++ b/rtdata/images/themed/svg/device-usb.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/distortion-auto-small.svg b/rtdata/images/themed/svg/distortion-auto-small.svg new file mode 100644 index 000000000..6a8ac0a03 --- /dev/null +++ b/rtdata/images/themed/svg/distortion-auto-small.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/distortion-auto.svg b/rtdata/images/themed/svg/distortion-auto.svg new file mode 100644 index 000000000..8cfadb130 --- /dev/null +++ b/rtdata/images/themed/svg/distortion-auto.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/distortion-barrel-small.svg b/rtdata/images/themed/svg/distortion-barrel-small.svg new file mode 100644 index 000000000..b769bd0aa --- /dev/null +++ b/rtdata/images/themed/svg/distortion-barrel-small.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/distortion-barrel.svg b/rtdata/images/themed/svg/distortion-barrel.svg new file mode 100644 index 000000000..012651e87 --- /dev/null +++ b/rtdata/images/themed/svg/distortion-barrel.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/distortion-pincushion-small.svg b/rtdata/images/themed/svg/distortion-pincushion-small.svg new file mode 100644 index 000000000..8c26277d2 --- /dev/null +++ b/rtdata/images/themed/svg/distortion-pincushion-small.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/distortion-pincushion.svg b/rtdata/images/themed/svg/distortion-pincushion.svg new file mode 100644 index 000000000..c893eb99a --- /dev/null +++ b/rtdata/images/themed/svg/distortion-pincushion.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/edit-point.svg b/rtdata/images/themed/svg/edit-point.svg new file mode 100644 index 000000000..9f686d6e9 --- /dev/null +++ b/rtdata/images/themed/svg/edit-point.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/equilizer-narrow.svg b/rtdata/images/themed/svg/equilizer-narrow.svg new file mode 100644 index 000000000..52dcaed4b --- /dev/null +++ b/rtdata/images/themed/svg/equilizer-narrow.svg @@ -0,0 +1,358 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/equilizer-wide.svg b/rtdata/images/themed/svg/equilizer-wide.svg new file mode 100644 index 000000000..594cca2ab --- /dev/null +++ b/rtdata/images/themed/svg/equilizer-wide.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/expander-closed-small.svg b/rtdata/images/themed/svg/expander-closed-small.svg new file mode 100644 index 000000000..e9cea3b4d --- /dev/null +++ b/rtdata/images/themed/svg/expander-closed-small.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/expander-open-small.svg b/rtdata/images/themed/svg/expander-open-small.svg new file mode 100644 index 000000000..8355bc2f3 --- /dev/null +++ b/rtdata/images/themed/svg/expander-open-small.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/exposure.svg b/rtdata/images/themed/svg/exposure.svg new file mode 100644 index 000000000..c0edc9e9b --- /dev/null +++ b/rtdata/images/themed/svg/exposure.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/filetype-hdr.svg b/rtdata/images/themed/svg/filetype-hdr.svg new file mode 100644 index 000000000..86729442d --- /dev/null +++ b/rtdata/images/themed/svg/filetype-hdr.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + Arial Black, normal, 6pt. Resize manually to fit. + + + + + + + diff --git a/rtdata/images/themed/svg/filetype-ps.svg b/rtdata/images/themed/svg/filetype-ps.svg new file mode 100644 index 000000000..c0dc6069c --- /dev/null +++ b/rtdata/images/themed/svg/filetype-ps.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + Arial Black, normal, 6pt. Resize manually to fit. + + + + + + diff --git a/rtdata/images/themed/svg/filter-clear.svg b/rtdata/images/themed/svg/filter-clear.svg new file mode 100644 index 000000000..27af953db --- /dev/null +++ b/rtdata/images/themed/svg/filter-clear.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/filter-original.svg b/rtdata/images/themed/svg/filter-original.svg new file mode 100644 index 000000000..c14a57a99 --- /dev/null +++ b/rtdata/images/themed/svg/filter-original.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/filter-original2.svg b/rtdata/images/themed/svg/filter-original2.svg new file mode 100644 index 000000000..ce761302a --- /dev/null +++ b/rtdata/images/themed/svg/filter-original2.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/filter.svg b/rtdata/images/themed/svg/filter.svg new file mode 100644 index 000000000..684ffc35e --- /dev/null +++ b/rtdata/images/themed/svg/filter.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/flip-horizontal.svg b/rtdata/images/themed/svg/flip-horizontal.svg new file mode 100644 index 000000000..67465657f --- /dev/null +++ b/rtdata/images/themed/svg/flip-horizontal.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/flip-vertical.svg b/rtdata/images/themed/svg/flip-vertical.svg new file mode 100644 index 000000000..39771286a --- /dev/null +++ b/rtdata/images/themed/svg/flip-vertical.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/focusscreen-off.svg b/rtdata/images/themed/svg/focusscreen-off.svg new file mode 100644 index 000000000..0197b8b5d --- /dev/null +++ b/rtdata/images/themed/svg/focusscreen-off.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/focusscreen-on.svg b/rtdata/images/themed/svg/focusscreen-on.svg new file mode 100644 index 000000000..b6a6149f7 --- /dev/null +++ b/rtdata/images/themed/svg/focusscreen-on.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-closed-home-small.svg b/rtdata/images/themed/svg/folder-closed-home-small.svg new file mode 100644 index 000000000..e2988a681 --- /dev/null +++ b/rtdata/images/themed/svg/folder-closed-home-small.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-closed-home.svg b/rtdata/images/themed/svg/folder-closed-home.svg new file mode 100644 index 000000000..d4bf64e15 --- /dev/null +++ b/rtdata/images/themed/svg/folder-closed-home.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-closed-recent-small.svg b/rtdata/images/themed/svg/folder-closed-recent-small.svg new file mode 100644 index 000000000..e412e386c --- /dev/null +++ b/rtdata/images/themed/svg/folder-closed-recent-small.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-closed-recent.svg b/rtdata/images/themed/svg/folder-closed-recent.svg new file mode 100644 index 000000000..84da8e236 --- /dev/null +++ b/rtdata/images/themed/svg/folder-closed-recent.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-closed-small.svg b/rtdata/images/themed/svg/folder-closed-small.svg new file mode 100644 index 000000000..f86f2157f --- /dev/null +++ b/rtdata/images/themed/svg/folder-closed-small.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-closed.svg b/rtdata/images/themed/svg/folder-closed.svg new file mode 100644 index 000000000..74166166c --- /dev/null +++ b/rtdata/images/themed/svg/folder-closed.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-open-recent-small.svg b/rtdata/images/themed/svg/folder-open-recent-small.svg new file mode 100644 index 000000000..dc2f2ec3f --- /dev/null +++ b/rtdata/images/themed/svg/folder-open-recent-small.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-open-recent.svg b/rtdata/images/themed/svg/folder-open-recent.svg new file mode 100644 index 000000000..c0baf0ccf --- /dev/null +++ b/rtdata/images/themed/svg/folder-open-recent.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-open-small.svg b/rtdata/images/themed/svg/folder-open-small.svg new file mode 100644 index 000000000..f25394737 --- /dev/null +++ b/rtdata/images/themed/svg/folder-open-small.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/folder-open.svg b/rtdata/images/themed/svg/folder-open.svg new file mode 100644 index 000000000..324a4bb9e --- /dev/null +++ b/rtdata/images/themed/svg/folder-open.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/fullscreen-enter.svg b/rtdata/images/themed/svg/fullscreen-enter.svg new file mode 100644 index 000000000..33e8bf568 --- /dev/null +++ b/rtdata/images/themed/svg/fullscreen-enter.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/fullscreen-leave.svg b/rtdata/images/themed/svg/fullscreen-leave.svg new file mode 100644 index 000000000..3eee818a9 --- /dev/null +++ b/rtdata/images/themed/svg/fullscreen-leave.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gamut-hist.svg b/rtdata/images/themed/svg/gamut-hist.svg new file mode 100644 index 000000000..289dbf396 --- /dev/null +++ b/rtdata/images/themed/svg/gamut-hist.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gamut-plus.svg b/rtdata/images/themed/svg/gamut-plus.svg new file mode 100644 index 000000000..c27796b70 --- /dev/null +++ b/rtdata/images/themed/svg/gamut-plus.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gamut-softproof.svg b/rtdata/images/themed/svg/gamut-softproof.svg new file mode 100644 index 000000000..ca37ca2a0 --- /dev/null +++ b/rtdata/images/themed/svg/gamut-softproof.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gamut-warning.svg b/rtdata/images/themed/svg/gamut-warning.svg new file mode 100644 index 000000000..83cdb85cb --- /dev/null +++ b/rtdata/images/themed/svg/gamut-warning.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + ! + + diff --git a/rtdata/images/themed/svg/gamut_srgb_prophoto_xy.svg b/rtdata/images/themed/svg/gamut_srgb_prophoto_xy.svg new file mode 100644 index 000000000..951b6611d --- /dev/null +++ b/rtdata/images/themed/svg/gamut_srgb_prophoto_xy.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gears-pause.svg b/rtdata/images/themed/svg/gears-pause.svg new file mode 100644 index 000000000..b472a82f4 --- /dev/null +++ b/rtdata/images/themed/svg/gears-pause.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gears-play.svg b/rtdata/images/themed/svg/gears-play.svg new file mode 100644 index 000000000..83c23557d --- /dev/null +++ b/rtdata/images/themed/svg/gears-play.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gears-small.svg b/rtdata/images/themed/svg/gears-small.svg new file mode 100644 index 000000000..60cfdc609 --- /dev/null +++ b/rtdata/images/themed/svg/gears-small.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/gears.svg b/rtdata/images/themed/svg/gears.svg new file mode 100644 index 000000000..3a7785a6f --- /dev/null +++ b/rtdata/images/themed/svg/gears.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/goto-end-small.svg b/rtdata/images/themed/svg/goto-end-small.svg new file mode 100644 index 000000000..26d805c5d --- /dev/null +++ b/rtdata/images/themed/svg/goto-end-small.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/goto-start-small.svg b/rtdata/images/themed/svg/goto-start-small.svg new file mode 100644 index 000000000..35b4e9f8c --- /dev/null +++ b/rtdata/images/themed/svg/goto-start-small.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/hand-closed-hicontrast.svg b/rtdata/images/themed/svg/hand-closed-hicontrast.svg new file mode 100644 index 000000000..0d6b00f95 --- /dev/null +++ b/rtdata/images/themed/svg/hand-closed-hicontrast.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/hand-open-hicontrast.svg b/rtdata/images/themed/svg/hand-open-hicontrast.svg new file mode 100644 index 000000000..310eda2d1 --- /dev/null +++ b/rtdata/images/themed/svg/hand-open-hicontrast.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/hand-open.svg b/rtdata/images/themed/svg/hand-open.svg new file mode 100644 index 000000000..a7597b482 --- /dev/null +++ b/rtdata/images/themed/svg/hand-open.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-bar-off-small.svg b/rtdata/images/themed/svg/histogram-bar-off-small.svg new file mode 100644 index 000000000..76016bf46 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-bar-off-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-bar-on-small.svg b/rtdata/images/themed/svg/histogram-bar-on-small.svg new file mode 100644 index 000000000..858569703 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-bar-on-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-bayer-off-small.svg b/rtdata/images/themed/svg/histogram-bayer-off-small.svg new file mode 100644 index 000000000..5d6c439fb --- /dev/null +++ b/rtdata/images/themed/svg/histogram-bayer-off-small.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-bayer-on-small.svg b/rtdata/images/themed/svg/histogram-bayer-on-small.svg new file mode 100644 index 000000000..d9ef178a5 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-bayer-on-small.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-blue-off-small.svg b/rtdata/images/themed/svg/histogram-blue-off-small.svg new file mode 100644 index 000000000..e78f3c19c --- /dev/null +++ b/rtdata/images/themed/svg/histogram-blue-off-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-blue-on-small.svg b/rtdata/images/themed/svg/histogram-blue-on-small.svg new file mode 100644 index 000000000..d0bbe35db --- /dev/null +++ b/rtdata/images/themed/svg/histogram-blue-on-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-gold-off-small.svg b/rtdata/images/themed/svg/histogram-gold-off-small.svg new file mode 100644 index 000000000..ed7d82521 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-gold-off-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-gold-on-small.svg b/rtdata/images/themed/svg/histogram-gold-on-small.svg new file mode 100644 index 000000000..601a15165 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-gold-on-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-green-off-small.svg b/rtdata/images/themed/svg/histogram-green-off-small.svg new file mode 100644 index 000000000..462b1b45f --- /dev/null +++ b/rtdata/images/themed/svg/histogram-green-off-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-green-on-small.svg b/rtdata/images/themed/svg/histogram-green-on-small.svg new file mode 100644 index 000000000..6c06531c6 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-green-on-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-mode-linear-small.svg b/rtdata/images/themed/svg/histogram-mode-linear-small.svg new file mode 100644 index 000000000..52b914762 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-mode-linear-small.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-mode-logx-small.svg b/rtdata/images/themed/svg/histogram-mode-logx-small.svg new file mode 100644 index 000000000..0eb016d00 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-mode-logx-small.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-mode-logxy-small.svg b/rtdata/images/themed/svg/histogram-mode-logxy-small.svg new file mode 100644 index 000000000..e0b69c4e5 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-mode-logxy-small.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-red-off-small.svg b/rtdata/images/themed/svg/histogram-red-off-small.svg new file mode 100644 index 000000000..ec4200483 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-red-off-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-red-on-small.svg b/rtdata/images/themed/svg/histogram-red-on-small.svg new file mode 100644 index 000000000..082813853 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-red-on-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-silver-off-small.svg b/rtdata/images/themed/svg/histogram-silver-off-small.svg new file mode 100644 index 000000000..200bbd0b7 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-silver-off-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/histogram-silver-on-small.svg b/rtdata/images/themed/svg/histogram-silver-on-small.svg new file mode 100644 index 000000000..414d5f4f0 --- /dev/null +++ b/rtdata/images/themed/svg/histogram-silver-on-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/info.svg b/rtdata/images/themed/svg/info.svg new file mode 100644 index 000000000..8805fcad4 --- /dev/null +++ b/rtdata/images/themed/svg/info.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + i + + diff --git a/rtdata/images/themed/svg/intent-absolute.svg b/rtdata/images/themed/svg/intent-absolute.svg new file mode 100644 index 000000000..055759ad1 --- /dev/null +++ b/rtdata/images/themed/svg/intent-absolute.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/intent-perceptual.svg b/rtdata/images/themed/svg/intent-perceptual.svg new file mode 100644 index 000000000..2e845cd39 --- /dev/null +++ b/rtdata/images/themed/svg/intent-perceptual.svg @@ -0,0 +1,303 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/intent-relative.svg b/rtdata/images/themed/svg/intent-relative.svg new file mode 100644 index 000000000..04e553796 --- /dev/null +++ b/rtdata/images/themed/svg/intent-relative.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/intent-saturation.svg b/rtdata/images/themed/svg/intent-saturation.svg new file mode 100644 index 000000000..569c54962 --- /dev/null +++ b/rtdata/images/themed/svg/intent-saturation.svg @@ -0,0 +1,305 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-1to1-small.svg b/rtdata/images/themed/svg/magnifier-1to1-small.svg new file mode 100644 index 000000000..68aa7d6c2 --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-1to1-small.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-1to1.svg b/rtdata/images/themed/svg/magnifier-1to1.svg new file mode 100644 index 000000000..5272cf2ed --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-1to1.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-crop.svg b/rtdata/images/themed/svg/magnifier-crop.svg new file mode 100644 index 000000000..54d6e3e9e --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-crop.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-fit.svg b/rtdata/images/themed/svg/magnifier-fit.svg new file mode 100644 index 000000000..1d531e2d7 --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-fit.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-minus-small.svg b/rtdata/images/themed/svg/magnifier-minus-small.svg new file mode 100644 index 000000000..08871ed77 --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-minus-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-minus.svg b/rtdata/images/themed/svg/magnifier-minus.svg new file mode 100644 index 000000000..567845d57 --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-minus.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-plus-small.svg b/rtdata/images/themed/svg/magnifier-plus-small.svg new file mode 100644 index 000000000..a93e8cd8e --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-plus-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier-plus.svg b/rtdata/images/themed/svg/magnifier-plus.svg new file mode 100644 index 000000000..a98c19bad --- /dev/null +++ b/rtdata/images/themed/svg/magnifier-plus.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/magnifier.svg b/rtdata/images/themed/svg/magnifier.svg new file mode 100644 index 000000000..3b7ae2fd2 --- /dev/null +++ b/rtdata/images/themed/svg/magnifier.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/metadata.svg b/rtdata/images/themed/svg/metadata.svg new file mode 100644 index 000000000..695d2af1a --- /dev/null +++ b/rtdata/images/themed/svg/metadata.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-nw-se-hicontrast.svg b/rtdata/images/themed/svg/node-move-nw-se-hicontrast.svg new file mode 100644 index 000000000..375c8ea27 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-nw-se-hicontrast.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-sw-ne-hicontrast.svg b/rtdata/images/themed/svg/node-move-sw-ne-hicontrast.svg new file mode 100644 index 000000000..fdda47505 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-sw-ne-hicontrast.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-x-hicontrast.svg b/rtdata/images/themed/svg/node-move-x-hicontrast.svg new file mode 100644 index 000000000..a24af10ef --- /dev/null +++ b/rtdata/images/themed/svg/node-move-x-hicontrast.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-xy-hicontrast.svg b/rtdata/images/themed/svg/node-move-xy-hicontrast.svg new file mode 100644 index 000000000..05d291870 --- /dev/null +++ b/rtdata/images/themed/svg/node-move-xy-hicontrast.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/node-move-y-hicontrast.svg b/rtdata/images/themed/svg/node-move-y-hicontrast.svg new file mode 100644 index 000000000..615f3f94a --- /dev/null +++ b/rtdata/images/themed/svg/node-move-y-hicontrast.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/one-to-one-small.svg b/rtdata/images/themed/svg/one-to-one-small.svg new file mode 100644 index 000000000..8b08f99d0 --- /dev/null +++ b/rtdata/images/themed/svg/one-to-one-small.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/ornament1.svg b/rtdata/images/themed/svg/ornament1.svg new file mode 100644 index 000000000..af3d729e5 --- /dev/null +++ b/rtdata/images/themed/svg/ornament1.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/padlock-locked-small.svg b/rtdata/images/themed/svg/padlock-locked-small.svg new file mode 100644 index 000000000..27f1bc510 --- /dev/null +++ b/rtdata/images/themed/svg/padlock-locked-small.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/padlock-unlocked-small.svg b/rtdata/images/themed/svg/padlock-unlocked-small.svg new file mode 100644 index 000000000..0c282c8cf --- /dev/null +++ b/rtdata/images/themed/svg/padlock-unlocked-small.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/palette-brush.svg b/rtdata/images/themed/svg/palette-brush.svg new file mode 100644 index 000000000..30eaac0d6 --- /dev/null +++ b/rtdata/images/themed/svg/palette-brush.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/panel-to-bottom.svg b/rtdata/images/themed/svg/panel-to-bottom.svg new file mode 100644 index 000000000..8e63c0309 --- /dev/null +++ b/rtdata/images/themed/svg/panel-to-bottom.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/panel-to-left.svg b/rtdata/images/themed/svg/panel-to-left.svg new file mode 100644 index 000000000..d987f54f7 --- /dev/null +++ b/rtdata/images/themed/svg/panel-to-left.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/panel-to-right.svg b/rtdata/images/themed/svg/panel-to-right.svg new file mode 100644 index 000000000..52fc38529 --- /dev/null +++ b/rtdata/images/themed/svg/panel-to-right.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/panel-to-top.svg b/rtdata/images/themed/svg/panel-to-top.svg new file mode 100644 index 000000000..5b1cccfe5 --- /dev/null +++ b/rtdata/images/themed/svg/panel-to-top.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/paste.svg b/rtdata/images/themed/svg/paste.svg new file mode 100644 index 000000000..83d82617a --- /dev/null +++ b/rtdata/images/themed/svg/paste.svg @@ -0,0 +1,260 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-horizontal-left-small.svg b/rtdata/images/themed/svg/perspective-horizontal-left-small.svg new file mode 100644 index 000000000..c4797a6a2 --- /dev/null +++ b/rtdata/images/themed/svg/perspective-horizontal-left-small.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-horizontal-left.svg b/rtdata/images/themed/svg/perspective-horizontal-left.svg new file mode 100644 index 000000000..18ce37ea3 --- /dev/null +++ b/rtdata/images/themed/svg/perspective-horizontal-left.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-horizontal-right-small.svg b/rtdata/images/themed/svg/perspective-horizontal-right-small.svg new file mode 100644 index 000000000..4721117c8 --- /dev/null +++ b/rtdata/images/themed/svg/perspective-horizontal-right-small.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-horizontal-right.svg b/rtdata/images/themed/svg/perspective-horizontal-right.svg new file mode 100644 index 000000000..809e94123 --- /dev/null +++ b/rtdata/images/themed/svg/perspective-horizontal-right.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-vertical-bottom-small.svg b/rtdata/images/themed/svg/perspective-vertical-bottom-small.svg new file mode 100644 index 000000000..80f023b74 --- /dev/null +++ b/rtdata/images/themed/svg/perspective-vertical-bottom-small.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-vertical-bottom.svg b/rtdata/images/themed/svg/perspective-vertical-bottom.svg new file mode 100644 index 000000000..4cc5bf0f3 --- /dev/null +++ b/rtdata/images/themed/svg/perspective-vertical-bottom.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-vertical-top-small.svg b/rtdata/images/themed/svg/perspective-vertical-top-small.svg new file mode 100644 index 000000000..1ec0fafa7 --- /dev/null +++ b/rtdata/images/themed/svg/perspective-vertical-top-small.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/perspective-vertical-top.svg b/rtdata/images/themed/svg/perspective-vertical-top.svg new file mode 100644 index 000000000..34f75fe7f --- /dev/null +++ b/rtdata/images/themed/svg/perspective-vertical-top.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/power-inconsistent-small.svg b/rtdata/images/themed/svg/power-inconsistent-small.svg new file mode 100644 index 000000000..305f504cd --- /dev/null +++ b/rtdata/images/themed/svg/power-inconsistent-small.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/power-off-small.svg b/rtdata/images/themed/svg/power-off-small.svg new file mode 100644 index 000000000..d04115bb9 --- /dev/null +++ b/rtdata/images/themed/svg/power-off-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/power-on-small.svg b/rtdata/images/themed/svg/power-on-small.svg new file mode 100644 index 000000000..caaf7992d --- /dev/null +++ b/rtdata/images/themed/svg/power-on-small.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/preferences.svg b/rtdata/images/themed/svg/preferences.svg new file mode 100644 index 000000000..db6794736 --- /dev/null +++ b/rtdata/images/themed/svg/preferences.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/profile-filled.svg b/rtdata/images/themed/svg/profile-filled.svg new file mode 100644 index 000000000..d31352f11 --- /dev/null +++ b/rtdata/images/themed/svg/profile-filled.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/profile-partial.svg b/rtdata/images/themed/svg/profile-partial.svg new file mode 100644 index 000000000..90d22c74a --- /dev/null +++ b/rtdata/images/themed/svg/profile-partial.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/redo-all.svg b/rtdata/images/themed/svg/redo-all.svg new file mode 100644 index 000000000..f9dbaad23 --- /dev/null +++ b/rtdata/images/themed/svg/redo-all.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/redo-small.svg b/rtdata/images/themed/svg/redo-small.svg new file mode 100644 index 000000000..639aebb42 --- /dev/null +++ b/rtdata/images/themed/svg/redo-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/redo.svg b/rtdata/images/themed/svg/redo.svg new file mode 100644 index 000000000..14f9f7c00 --- /dev/null +++ b/rtdata/images/themed/svg/redo.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/refresh-red-small.svg b/rtdata/images/themed/svg/refresh-red-small.svg new file mode 100644 index 000000000..498faafe8 --- /dev/null +++ b/rtdata/images/themed/svg/refresh-red-small.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/refresh-small.svg b/rtdata/images/themed/svg/refresh-small.svg new file mode 100644 index 000000000..d9ca603ef --- /dev/null +++ b/rtdata/images/themed/svg/refresh-small.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/refresh.svg b/rtdata/images/themed/svg/refresh.svg new file mode 100644 index 000000000..3b0b0cb72 --- /dev/null +++ b/rtdata/images/themed/svg/refresh.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/remove-small.svg b/rtdata/images/themed/svg/remove-small.svg new file mode 100644 index 000000000..1bffa469c --- /dev/null +++ b/rtdata/images/themed/svg/remove-small.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/remove.svg b/rtdata/images/themed/svg/remove.svg new file mode 100644 index 000000000..bccfdb160 --- /dev/null +++ b/rtdata/images/themed/svg/remove.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg b/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg new file mode 100644 index 000000000..fda645c55 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-aroundnode-hicontrast.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-aroundnode.svg b/rtdata/images/themed/svg/rotate-aroundnode.svg new file mode 100644 index 000000000..67ac406fa --- /dev/null +++ b/rtdata/images/themed/svg/rotate-aroundnode.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-left-90.svg b/rtdata/images/themed/svg/rotate-left-90.svg new file mode 100644 index 000000000..394c88c29 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-left-90.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + 90° + + + + + + diff --git a/rtdata/images/themed/svg/rotate-left-small.svg b/rtdata/images/themed/svg/rotate-left-small.svg new file mode 100644 index 000000000..d85b5e8ea --- /dev/null +++ b/rtdata/images/themed/svg/rotate-left-small.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-left.svg b/rtdata/images/themed/svg/rotate-left.svg new file mode 100644 index 000000000..c66020379 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-left.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-right-90.svg b/rtdata/images/themed/svg/rotate-right-90.svg new file mode 100644 index 000000000..eca331bc8 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-right-90.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + 90° + + + + + + diff --git a/rtdata/images/themed/svg/rotate-right-small.svg b/rtdata/images/themed/svg/rotate-right-small.svg new file mode 100644 index 000000000..89e6d4ac2 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-right-small.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-right.svg b/rtdata/images/themed/svg/rotate-right.svg new file mode 100644 index 000000000..26a46a3f6 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-right.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-straighten-small.svg b/rtdata/images/themed/svg/rotate-straighten-small.svg new file mode 100644 index 000000000..00da936f8 --- /dev/null +++ b/rtdata/images/themed/svg/rotate-straighten-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/rotate-straighten.svg b/rtdata/images/themed/svg/rotate-straighten.svg new file mode 100644 index 000000000..34765aa2b --- /dev/null +++ b/rtdata/images/themed/svg/rotate-straighten.svg @@ -0,0 +1,237 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + 90° + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/save-small.svg b/rtdata/images/themed/svg/save-small.svg new file mode 100644 index 000000000..3398e27c8 --- /dev/null +++ b/rtdata/images/themed/svg/save-small.svg @@ -0,0 +1,177 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/save.svg b/rtdata/images/themed/svg/save.svg new file mode 100644 index 000000000..eae40ed09 --- /dev/null +++ b/rtdata/images/themed/svg/save.svg @@ -0,0 +1,456 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/saved-no-small.svg b/rtdata/images/themed/svg/saved-no-small.svg new file mode 100644 index 000000000..02b245aa1 --- /dev/null +++ b/rtdata/images/themed/svg/saved-no-small.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/saved-yes-small.svg b/rtdata/images/themed/svg/saved-yes-small.svg new file mode 100644 index 000000000..f545e9b18 --- /dev/null +++ b/rtdata/images/themed/svg/saved-yes-small.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-black-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-black-off-narrow.svg new file mode 100644 index 000000000..23d835032 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-black-off-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-black-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-black-on-narrow.svg new file mode 100644 index 000000000..431f8bd58 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-black-on-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-blue-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-blue-off-narrow.svg new file mode 100644 index 000000000..4da563f36 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-blue-off-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-blue-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-blue-on-narrow.svg new file mode 100644 index 000000000..6aa7e2cb1 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-blue-on-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-gray-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-gray-off-narrow.svg new file mode 100644 index 000000000..3bc716d8e --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-gray-off-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-gray-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-gray-on-narrow.svg new file mode 100644 index 000000000..6e3ddb2ed --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-gray-on-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-green-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-green-off-narrow.svg new file mode 100644 index 000000000..814feedf6 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-green-off-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-green-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-green-on-narrow.svg new file mode 100644 index 000000000..ed178b3b0 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-green-on-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-luminosity-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-luminosity-off-narrow.svg new file mode 100644 index 000000000..c5758afa0 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-luminosity-off-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + L + + diff --git a/rtdata/images/themed/svg/square-toggle-luminosity-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-luminosity-on-narrow.svg new file mode 100644 index 000000000..9db291ba3 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-luminosity-on-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + L + + diff --git a/rtdata/images/themed/svg/square-toggle-red-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-red-off-narrow.svg new file mode 100644 index 000000000..b05b91ae5 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-red-off-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-red-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-red-on-narrow.svg new file mode 100644 index 000000000..52382d0df --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-red-on-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-theme-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-theme-off-narrow.svg new file mode 100644 index 000000000..9b3bc4a2a --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-theme-off-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + T + + diff --git a/rtdata/images/themed/svg/square-toggle-theme-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-theme-on-narrow.svg new file mode 100644 index 000000000..e7b1f00bd --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-theme-on-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + T + + diff --git a/rtdata/images/themed/svg/square-toggle-white-off-narrow.svg b/rtdata/images/themed/svg/square-toggle-white-off-narrow.svg new file mode 100644 index 000000000..99e675f83 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-white-off-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/square-toggle-white-on-narrow.svg b/rtdata/images/themed/svg/square-toggle-white-on-narrow.svg new file mode 100644 index 000000000..97b5e5e41 --- /dev/null +++ b/rtdata/images/themed/svg/square-toggle-white-on-narrow.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-gold-hollow-narrow.svg b/rtdata/images/themed/svg/star-gold-hollow-narrow.svg new file mode 100644 index 000000000..82ab83a4a --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-hollow-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-gold-hollow-small.svg b/rtdata/images/themed/svg/star-gold-hollow-small.svg new file mode 100644 index 000000000..ecdcf65f7 --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-hollow-small.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-gold-narrow.svg b/rtdata/images/themed/svg/star-gold-narrow.svg new file mode 100644 index 000000000..ee54c8214 --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-gold-small.svg b/rtdata/images/themed/svg/star-gold-small.svg new file mode 100644 index 000000000..48694c3f1 --- /dev/null +++ b/rtdata/images/themed/svg/star-gold-small.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-hollow-narrow.svg b/rtdata/images/themed/svg/star-hollow-narrow.svg new file mode 100644 index 000000000..66b1c233c --- /dev/null +++ b/rtdata/images/themed/svg/star-hollow-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-hollow-small.svg b/rtdata/images/themed/svg/star-hollow-small.svg new file mode 100644 index 000000000..6d63a6e8b --- /dev/null +++ b/rtdata/images/themed/svg/star-hollow-small.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-narrow.svg b/rtdata/images/themed/svg/star-narrow.svg new file mode 100644 index 000000000..90add16d5 --- /dev/null +++ b/rtdata/images/themed/svg/star-narrow.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star-small.svg b/rtdata/images/themed/svg/star-small.svg new file mode 100644 index 000000000..cd7a9b8ef --- /dev/null +++ b/rtdata/images/themed/svg/star-small.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/star.svg b/rtdata/images/themed/svg/star.svg new file mode 100644 index 000000000..af9ca870e --- /dev/null +++ b/rtdata/images/themed/svg/star.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/template-16.svg b/rtdata/images/themed/svg/template-16.svg new file mode 100644 index 000000000..d38151609 --- /dev/null +++ b/rtdata/images/themed/svg/template-16.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/template-24.svg b/rtdata/images/themed/svg/template-24.svg new file mode 100644 index 000000000..88d934fc5 --- /dev/null +++ b/rtdata/images/themed/svg/template-24.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/template-narrow.svg b/rtdata/images/themed/svg/template-narrow.svg new file mode 100644 index 000000000..9a6321317 --- /dev/null +++ b/rtdata/images/themed/svg/template-narrow.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/tick-green-hollow-small.svg b/rtdata/images/themed/svg/tick-green-hollow-small.svg new file mode 100644 index 000000000..fcac2954d --- /dev/null +++ b/rtdata/images/themed/svg/tick-green-hollow-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/tick-green-hollow.svg b/rtdata/images/themed/svg/tick-green-hollow.svg new file mode 100644 index 000000000..9b1eca47d --- /dev/null +++ b/rtdata/images/themed/svg/tick-green-hollow.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/tick-green-small.svg b/rtdata/images/themed/svg/tick-green-small.svg new file mode 100644 index 000000000..edf2dd4b4 --- /dev/null +++ b/rtdata/images/themed/svg/tick-green-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/tick-green.svg b/rtdata/images/themed/svg/tick-green.svg new file mode 100644 index 000000000..fa250d9fe --- /dev/null +++ b/rtdata/images/themed/svg/tick-green.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/tick-hollow-small.svg b/rtdata/images/themed/svg/tick-hollow-small.svg new file mode 100644 index 000000000..010fba31e --- /dev/null +++ b/rtdata/images/themed/svg/tick-hollow-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/tick-small.svg b/rtdata/images/themed/svg/tick-small.svg new file mode 100644 index 000000000..943c61d76 --- /dev/null +++ b/rtdata/images/themed/svg/tick-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/tick.svg b/rtdata/images/themed/svg/tick.svg new file mode 100644 index 000000000..8ab7a2e27 --- /dev/null +++ b/rtdata/images/themed/svg/tick.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/transform.svg b/rtdata/images/themed/svg/transform.svg new file mode 100644 index 000000000..09b55309d --- /dev/null +++ b/rtdata/images/themed/svg/transform.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-delete.svg b/rtdata/images/themed/svg/trash-delete.svg new file mode 100644 index 000000000..7593e6001 --- /dev/null +++ b/rtdata/images/themed/svg/trash-delete.svg @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-empty-show.svg b/rtdata/images/themed/svg/trash-empty-show.svg new file mode 100644 index 000000000..366b15bd6 --- /dev/null +++ b/rtdata/images/themed/svg/trash-empty-show.svg @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-empty.svg b/rtdata/images/themed/svg/trash-empty.svg new file mode 100644 index 000000000..47ceae609 --- /dev/null +++ b/rtdata/images/themed/svg/trash-empty.svg @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-full-show.svg b/rtdata/images/themed/svg/trash-full-show.svg new file mode 100644 index 000000000..8ec3f9092 --- /dev/null +++ b/rtdata/images/themed/svg/trash-full-show.svg @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-full.svg b/rtdata/images/themed/svg/trash-full.svg new file mode 100644 index 000000000..eae5920e3 --- /dev/null +++ b/rtdata/images/themed/svg/trash-full.svg @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-hide-deleted.svg b/rtdata/images/themed/svg/trash-hide-deleted.svg new file mode 100644 index 000000000..e70aa21e1 --- /dev/null +++ b/rtdata/images/themed/svg/trash-hide-deleted.svg @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-remove-small.svg b/rtdata/images/themed/svg/trash-remove-small.svg new file mode 100644 index 000000000..a58bafd39 --- /dev/null +++ b/rtdata/images/themed/svg/trash-remove-small.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-remove.svg b/rtdata/images/themed/svg/trash-remove.svg new file mode 100644 index 000000000..31ca65a56 --- /dev/null +++ b/rtdata/images/themed/svg/trash-remove.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/trash-small.svg b/rtdata/images/themed/svg/trash-small.svg new file mode 100644 index 000000000..3d2e674c6 --- /dev/null +++ b/rtdata/images/themed/svg/trash-small.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/undo-all.svg b/rtdata/images/themed/svg/undo-all.svg new file mode 100644 index 000000000..e648588ef --- /dev/null +++ b/rtdata/images/themed/svg/undo-all.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/undo-small.svg b/rtdata/images/themed/svg/undo-small.svg new file mode 100644 index 000000000..f06c73392 --- /dev/null +++ b/rtdata/images/themed/svg/undo-small.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/undo.svg b/rtdata/images/themed/svg/undo.svg new file mode 100644 index 000000000..bc4282693 --- /dev/null +++ b/rtdata/images/themed/svg/undo.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/warning-highlights.svg b/rtdata/images/themed/svg/warning-highlights.svg new file mode 100644 index 000000000..c7aaf80ce --- /dev/null +++ b/rtdata/images/themed/svg/warning-highlights.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/warning-shadows.svg b/rtdata/images/themed/svg/warning-shadows.svg new file mode 100644 index 000000000..f9baa36c1 --- /dev/null +++ b/rtdata/images/themed/svg/warning-shadows.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/warning.svg b/rtdata/images/themed/svg/warning.svg new file mode 100644 index 000000000..c24ba0653 --- /dev/null +++ b/rtdata/images/themed/svg/warning.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wavelets.svg b/rtdata/images/themed/svg/wavelets.svg new file mode 100644 index 000000000..1d6de039c --- /dev/null +++ b/rtdata/images/themed/svg/wavelets.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-auto-small.svg b/rtdata/images/themed/svg/wb-auto-small.svg new file mode 100644 index 000000000..23e55f560 --- /dev/null +++ b/rtdata/images/themed/svg/wb-auto-small.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-auto.svg b/rtdata/images/themed/svg/wb-auto.svg new file mode 100644 index 000000000..5914ee63e --- /dev/null +++ b/rtdata/images/themed/svg/wb-auto.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-camera-small.svg b/rtdata/images/themed/svg/wb-camera-small.svg new file mode 100644 index 000000000..2521d513e --- /dev/null +++ b/rtdata/images/themed/svg/wb-camera-small.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-camera.svg b/rtdata/images/themed/svg/wb-camera.svg new file mode 100644 index 000000000..f83342b6b --- /dev/null +++ b/rtdata/images/themed/svg/wb-camera.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-cloudy-small.svg b/rtdata/images/themed/svg/wb-cloudy-small.svg new file mode 100644 index 000000000..0197eab4e --- /dev/null +++ b/rtdata/images/themed/svg/wb-cloudy-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-cloudy.svg b/rtdata/images/themed/svg/wb-cloudy.svg new file mode 100644 index 000000000..5762fa37b --- /dev/null +++ b/rtdata/images/themed/svg/wb-cloudy.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-custom-small.svg b/rtdata/images/themed/svg/wb-custom-small.svg new file mode 100644 index 000000000..f176458a8 --- /dev/null +++ b/rtdata/images/themed/svg/wb-custom-small.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-custom.svg b/rtdata/images/themed/svg/wb-custom.svg new file mode 100644 index 000000000..f1d2ec8f7 --- /dev/null +++ b/rtdata/images/themed/svg/wb-custom.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-flash-small.svg b/rtdata/images/themed/svg/wb-flash-small.svg new file mode 100644 index 000000000..634912538 --- /dev/null +++ b/rtdata/images/themed/svg/wb-flash-small.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-flash.svg b/rtdata/images/themed/svg/wb-flash.svg new file mode 100644 index 000000000..fb4b0ca66 --- /dev/null +++ b/rtdata/images/themed/svg/wb-flash.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-fluorescent-small.svg b/rtdata/images/themed/svg/wb-fluorescent-small.svg new file mode 100644 index 000000000..67c86ec71 --- /dev/null +++ b/rtdata/images/themed/svg/wb-fluorescent-small.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-fluorescent.svg b/rtdata/images/themed/svg/wb-fluorescent.svg new file mode 100644 index 000000000..8746978e1 --- /dev/null +++ b/rtdata/images/themed/svg/wb-fluorescent.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-lamp-small.svg b/rtdata/images/themed/svg/wb-lamp-small.svg new file mode 100644 index 000000000..32c172d7f --- /dev/null +++ b/rtdata/images/themed/svg/wb-lamp-small.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-lamp.svg b/rtdata/images/themed/svg/wb-lamp.svg new file mode 100644 index 000000000..39f2ccb94 --- /dev/null +++ b/rtdata/images/themed/svg/wb-lamp.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-led-small.svg b/rtdata/images/themed/svg/wb-led-small.svg new file mode 100644 index 000000000..7e20c4576 --- /dev/null +++ b/rtdata/images/themed/svg/wb-led-small.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-led.svg b/rtdata/images/themed/svg/wb-led.svg new file mode 100644 index 000000000..952f5f77f --- /dev/null +++ b/rtdata/images/themed/svg/wb-led.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-shade-small.svg b/rtdata/images/themed/svg/wb-shade-small.svg new file mode 100644 index 000000000..78ed1e6c6 --- /dev/null +++ b/rtdata/images/themed/svg/wb-shade-small.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-shade.svg b/rtdata/images/themed/svg/wb-shade.svg new file mode 100644 index 000000000..3ac24bd80 --- /dev/null +++ b/rtdata/images/themed/svg/wb-shade.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-sun-small.svg b/rtdata/images/themed/svg/wb-sun-small.svg new file mode 100644 index 000000000..94abad681 --- /dev/null +++ b/rtdata/images/themed/svg/wb-sun-small.svg @@ -0,0 +1,178 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-sun.svg b/rtdata/images/themed/svg/wb-sun.svg new file mode 100644 index 000000000..b9c71a3dc --- /dev/null +++ b/rtdata/images/themed/svg/wb-sun.svg @@ -0,0 +1,173 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-tungsten-small.svg b/rtdata/images/themed/svg/wb-tungsten-small.svg new file mode 100644 index 000000000..dc4b62beb --- /dev/null +++ b/rtdata/images/themed/svg/wb-tungsten-small.svg @@ -0,0 +1,163 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-tungsten.svg b/rtdata/images/themed/svg/wb-tungsten.svg new file mode 100644 index 000000000..0dabc0935 --- /dev/null +++ b/rtdata/images/themed/svg/wb-tungsten.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-water-small.svg b/rtdata/images/themed/svg/wb-water-small.svg new file mode 100644 index 000000000..2cb62298a --- /dev/null +++ b/rtdata/images/themed/svg/wb-water-small.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/wb-water.svg b/rtdata/images/themed/svg/wb-water.svg new file mode 100644 index 000000000..55a98f099 --- /dev/null +++ b/rtdata/images/themed/svg/wb-water.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/themed/svg/window-add.svg b/rtdata/images/themed/svg/window-add.svg new file mode 100644 index 000000000..da0651444 --- /dev/null +++ b/rtdata/images/themed/svg/window-add.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + image/svg+xml + + + + + Maciej Dworak + + + + + + + + RawTherapee icon. + + + + + + + + + + + + + + + + + diff --git a/rtdata/images/toleftend.png b/rtdata/images/toleftend.png deleted file mode 100644 index 4dfd61fec..000000000 Binary files a/rtdata/images/toleftend.png and /dev/null differ diff --git a/rtdata/images/torightend.png b/rtdata/images/torightend.png deleted file mode 100644 index 2c5204f74..000000000 Binary files a/rtdata/images/torightend.png and /dev/null differ diff --git a/rtdata/images/transform.png b/rtdata/images/transform.png deleted file mode 100644 index fc2f66cef..000000000 Binary files a/rtdata/images/transform.png and /dev/null differ diff --git a/rtdata/images/trash-show-empty.png b/rtdata/images/trash-show-empty.png deleted file mode 100644 index 08fcdfc93..000000000 Binary files a/rtdata/images/trash-show-empty.png and /dev/null differ diff --git a/rtdata/images/trash-show-full.png b/rtdata/images/trash-show-full.png deleted file mode 100644 index c9bd50e51..000000000 Binary files a/rtdata/images/trash-show-full.png and /dev/null differ diff --git a/rtdata/images/trash.png b/rtdata/images/trash.png deleted file mode 100644 index 08fcdfc93..000000000 Binary files a/rtdata/images/trash.png and /dev/null differ diff --git a/rtdata/images/uncolorlabel.png b/rtdata/images/uncolorlabel.png deleted file mode 100644 index b060306bf..000000000 Binary files a/rtdata/images/uncolorlabel.png and /dev/null differ diff --git a/rtdata/images/undelete.png b/rtdata/images/undelete.png deleted file mode 100644 index 10b5d94fd..000000000 Binary files a/rtdata/images/undelete.png and /dev/null differ diff --git a/rtdata/images/unrated.png b/rtdata/images/unrated.png deleted file mode 100644 index 2f619d755..000000000 Binary files a/rtdata/images/unrated.png and /dev/null differ diff --git a/rtdata/images/warnhl.png b/rtdata/images/warnhl.png deleted file mode 100644 index 98dddeb92..000000000 Binary files a/rtdata/images/warnhl.png and /dev/null differ diff --git a/rtdata/images/warnsh.png b/rtdata/images/warnsh.png deleted file mode 100644 index ee2c31e08..000000000 Binary files a/rtdata/images/warnsh.png and /dev/null differ diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 7fa32fc56..c38ec1cb5 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -5,7 +5,6 @@ ABOUT_TAB_CREDITS;Crèdits ABOUT_TAB_LICENSE;Llicència ABOUT_TAB_RELEASENOTES;Notes de la versió 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 @@ -85,8 +84,6 @@ FILEBROWSER_AUTOFLATFIELD;Auto camp pla FILEBROWSER_BROWSEPATHBUTTONHINT;Clic per navegar al path escollit FILEBROWSER_BROWSEPATHHINT;Escriviu path on buscar.\nCtrl-O dirigir-se al path de la finestra de text.\nEnter / Ctrl-Enter (en el gestor de fitxers) per a navegar allí;\n\nPath dreceres:\n ~ - directori home de l'usuari\n ! - directori de fotografies de l'usuari FILEBROWSER_CACHE;Cau -FILEBROWSER_CACHECLEARFROMFULL;Esborra el cau - tot -FILEBROWSER_CACHECLEARFROMPARTIAL;Esborra el cau - part FILEBROWSER_CLEARPROFILE;Neteja FILEBROWSER_COPYPROFILE;Copia FILEBROWSER_CURRENT_NAME;Nom actual: @@ -305,7 +302,6 @@ HISTORY_MSG_121;Raw auto CA HISTORY_MSG_122;Auto marc fosc HISTORY_MSG_123;Fitxer de camp fosc HISTORY_MSG_124;Correc. expo. linear -HISTORY_MSG_125;Correc. exposició preservant HL HISTORY_MSG_126;Fitxer de camp pla HISTORY_MSG_127;Auto-sel. camp pla HISTORY_MSG_128;Camp pla borrós - radi @@ -435,8 +431,6 @@ MAIN_TOOLTIP_THRESHOLD;Llindar 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 @@ -475,7 +469,6 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtre línia de soroll PARTIALPASTE_RAWCACORR_AUTO;Auto-correcció AC PARTIALPASTE_RAWEXPOS_BLACK;Nivell negre PARTIALPASTE_RAWEXPOS_LINEAR;Factor de corr. linear de punt blanc -PARTIALPASTE_RAWEXPOS_PRESER;Corr. punt blanc preservant HL (EV) PARTIALPASTE_RAWGROUP;Ajustos raw PARTIALPASTE_RAW_DCBENHANCE;Aplica pas de millora DCB PARTIALPASTE_RAW_DCBITERATIONS;Nombre d'iteracions DCB @@ -496,9 +489,6 @@ PREFERENCES_APPLNEXTSTARTUP;Efectiu en reiniciar PREFERENCES_AUTOMONPROFILE;Usa els perfils dels monitors dels sist. operatius automàticament PREFERENCES_BATCH_PROCESSING;Process. per lots PREFERENCES_BEHAVIOR;Comportament -PREFERENCES_CACHECLEARALL;Esborrar tot -PREFERENCES_CACHECLEARPROFILES;Esborrar perfils -PREFERENCES_CACHECLEARTHUMBS;Esborra minifotos PREFERENCES_CACHEMAXENTRIES;Màxim nombre d'entrades a la mem. cau PREFERENCES_CACHEOPTS;Opcions memòria cau PREFERENCES_CACHETHUMBHEIGHT;Màxima alçada de minifoto @@ -506,7 +496,6 @@ PREFERENCES_CLIPPINGIND;Indicador de pèrdues PREFERENCES_CUSTPROFBUILD;Constructor de perfils de procés particulars 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_DARKFRAMEFOUND;Trobat PREFERENCES_DARKFRAMESHOTS;trets PREFERENCES_DARKFRAMETEMPLATES;plantilles @@ -521,7 +510,6 @@ PREFERENCES_DIRSOFTWARE;Instal·lació al directori 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_FLATFIELDFOUND;Trobat PREFERENCES_FLATFIELDSDIR;Carpeta de camps plans @@ -569,9 +557,7 @@ PREFERENCES_PROFILESAVECACHE;Desa els paràmetres de procés a la memòria cau PREFERENCES_PROFILESAVEINPUT;Desa els paràm. de procés juntament amb la imatge PREFERENCES_PROPERTY;Propietat PREFERENCES_PSPATH;Directori d'instal. d'Adobe Photoshop -PREFERENCES_SELECTFONT;Selec. font PREFERENCES_SELECTLANG;Seleccionar idioma -PREFERENCES_SELECTTHEME;Seleccionar tema PREFERENCES_SET;Fixa PREFERENCES_SHOWBASICEXIF;Mostra principals dades Exif PREFERENCES_SHOWDATETIME;Indica data i hora @@ -582,7 +568,7 @@ PREFERENCES_SINGLETABVERTAB;Mode simple treball, vistes verticals PREFERENCES_SND_BATCHQUEUEDONE;Procs. de la cua fets PREFERENCES_SND_HELP;Poseu el path o bé no res (res=silenci). A Windows useu "SystemDefault", "SystemAsterisk" etc. pels sons del sistema. PREFERENCES_SND_LNGEDITPROCDONE;Process. d'editor fet -PREFERENCES_SND_TRESHOLDSECS;després d'uns segons +PREFERENCES_SND_THRESHOLDSECS;després d'uns segons PREFERENCES_STARTUPIMDIR;Directori inicial de les imatges PREFERENCES_TAB_BROWSER;Gestor de fitxers PREFERENCES_TAB_COLORMGR;Gestió del color @@ -590,7 +576,6 @@ PREFERENCES_TAB_GENERAL;General PREFERENCES_TAB_IMPROC;Processament de la imatge PREFERENCES_TAB_SOUND;Sons PREFERENCES_TP_LABEL;Panell d'eines: -PREFERENCES_TP_USEICONORTEXT;Usa les icones tab en comptes de text PREFERENCES_TP_VSCROLLBAR;Amaga la barra d'eines vertical PREFERENCES_WORKFLOW;Flux de treball PROFILEPANEL_COPYPPASTE;Paràmetres a copiar @@ -671,7 +656,6 @@ TP_CROP_GUIDETYPE;Tipus de guia: TP_CROP_H;Alt TP_CROP_LABEL;Cropa TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Selecc. cropar TP_CROP_W;Ample TP_CROP_X;x TP_CROP_Y;y @@ -799,9 +783,6 @@ TP_LENSGEOM_AUTOCROP;Auto cropa TP_LENSGEOM_FILL;Auto omple TP_LENSGEOM_LABEL;Lent / Geometria TP_LENSPROFILE_LABEL;Perfil de correcció de lent -TP_LENSPROFILE_USECA;Usa correcció AC -TP_LENSPROFILE_USEDIST;Correcció de distorsió -TP_LENSPROFILE_USEVIGN;Correcció de vores fosques TP_NEUTRAL_TIP;Torna els controls d'exposició a valors neutrals TP_PERSPECTIVE_HORIZONTAL;Horitzontal TP_PERSPECTIVE_LABEL;Perspectiva @@ -815,7 +796,6 @@ TP_RAWCACORR_CABLUE;Blau TP_RAWCACORR_CARED;Vermell TP_RAWEXPOS_BLACKS;Nivells negres TP_RAWEXPOS_LINEAR;Punt blanc: factor de correcció linear -TP_RAWEXPOS_PRESER;Punt blanc: correc. clars preservant (EV) TP_RAWEXPOS_TWOGREEN;Dos verds junts TP_RAW_DCBENHANCE;Aplica pas de millora DCB TP_RAW_DCBITERATIONS;Nombre d'iteracions DCB @@ -942,7 +922,7 @@ TP_WBALANCE_TUNGSTEN;Tungstèn 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: - @@ -950,18 +930,24 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -969,6 +955,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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. +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels @@ -977,6 +964,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red @@ -1000,7 +989,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -1010,10 +999,14 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_174;CIECAM02 @@ -1076,9 +1069,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -1114,7 +1107,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -1129,8 +1122,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -1233,7 +1226,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1313,19 +1306,103 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1351,10 +1428,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). @@ -1364,10 +1438,13 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !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_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -1379,47 +1456,57 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !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 +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BEHADDALL;All to 'Add' !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_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1437,11 +1524,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLUOF2;Fluorescent F2 !PREFERENCES_FLUOF7;Fluorescent F7 !PREFERENCES_FLUOF11;Fluorescent F11 @@ -1466,23 +1551,17 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1495,30 +1574,20 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PROFILEPANEL_GLOBALPROFILES;Bundled profiles !PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. !PROFILEPANEL_MYPROFILES;My profiles @@ -1530,22 +1599,24 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!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 +!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 the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1572,9 +1643,8 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1604,11 +1674,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1619,8 +1685,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1638,8 +1705,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1651,14 +1716,13 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1678,11 +1742,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1694,6 +1756,27 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1722,6 +1805,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1785,7 +1874,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1825,6 +1916,12 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. !TP_LABCURVE_CURVEEDITOR_CL;CL !TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) @@ -1833,6 +1930,15 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1856,8 +1962,17 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength !TP_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1867,14 +1982,22 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1882,69 +2005,54 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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. !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !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_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1956,7 +2064,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1982,7 +2090,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2025,9 +2133,15 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !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_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2096,7 +2210,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2107,7 +2221,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2193,9 +2307,10 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: - !TP_WAVELET_TON;Toning !TP_WBALANCE_EQBLUERED;Blue/Red equalizer !TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. +!TP_WBALANCE_PICKER;Pick !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". !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 --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index b829a3d34..3badf67eb 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -10,7 +10,6 @@ ABOUT_TAB_CREDITS;感谢 ABOUT_TAB_LICENSE;授权协议 ABOUT_TAB_RELEASENOTES;发布说明 ABOUT_TAB_SPLASH;启动页 -ADJUSTER_RESET_TO_DEFAULT;重置缺省参数 BATCHQUEUE_AUTOSTART;自动开始 BATCHQUEUE_DESTFILENAME;路径和文件名 BATCH_PROCESSING;批量处理 @@ -96,8 +95,6 @@ FILEBROWSER_AUTODARKFRAME;自动暗场 FILEBROWSER_AUTOFLATFIELD;自动平场 FILEBROWSER_BROWSEPATHBUTTONHINT;点击浏览选择的路径 FILEBROWSER_CACHE;缓存 -FILEBROWSER_CACHECLEARFROMFULL;清空缓存 -FILEBROWSER_CACHECLEARFROMPARTIAL;清理缓存 FILEBROWSER_CLEARPROFILE;清空配置 FILEBROWSER_COPYPROFILE;复制配置 FILEBROWSER_CURRENT_NAME;当前名称: @@ -466,7 +463,6 @@ PARTIALPASTE_RAWCACORR_AUTO;CA自动更正 PARTIALPASTE_RAWCACORR_CAREDBLUE;红蓝色散 PARTIALPASTE_RAWEXPOS_BLACK;黑色等级 PARTIALPASTE_RAWEXPOS_LINEAR;白点纠正 -PARTIALPASTE_RAWEXPOS_PRESER;高光补偿 PARTIALPASTE_RAWGROUP;Raw设置 PARTIALPASTE_RAW_DCBENHANCE;DCB 增强 PARTIALPASTE_RAW_DCBITERATIONS;DCB 反复 @@ -488,29 +484,17 @@ PARTIALPASTE_VIGNETTING;暗角修正 PARTIALPASTE_WAVELETGROUP;小波变换等级 PARTIALPASTE_WHITEBALANCE;白平衡 PREFERENCES_ADD;添加 +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;导航器引导颜色 PREFERENCES_APPLNEXTSTARTUP;下次启动生效 -PREFERENCES_AUTLISLOW;低 -PREFERENCES_AUTLISMAX;最大 - 所有块平均值 -PREFERENCES_AUTLISSTD;高 -PREFERENCES_AUTLISVLOW;无 -PREFERENCES_AUTLOW;低 PREFERENCES_AUTOMONPROFILE;使用操作系统主显示器的色彩档案 -PREFERENCES_AUTSTD;标准 PREFERENCES_BATCH_PROCESSING;批处理 PREFERENCES_BEHADDALL;全 '添加' PREFERENCES_BEHAVIOR;行为 PREFERENCES_BEHSETALL;全 '设定' PREFERENCES_BLACKBODY;钨丝灯 -PREFERENCES_CACHECLEARALL;全部清除 -PREFERENCES_CACHECLEARPROFILES;清除配置 -PREFERENCES_CACHECLEARTHUMBS;清除缩略图 PREFERENCES_CACHEMAXENTRIES;最大缓存数量 PREFERENCES_CACHEOPTS;缓存选项 PREFERENCES_CACHETHUMBHEIGHT;最大缩略图高度 -PREFERENCES_CIEART;CIECAM02 优化 -PREFERENCES_CIEART_FRAME;CIECAM02-特定选项 -PREFERENCES_CIEART_LABEL;使用单浮点精度而不是双精度 -PREFERENCES_CIEART_TOOLTIP;如果启用, CIECAM02 将使用单精度浮点计算, 结果是品质轻微下降, 速度则可以提高一些 PREFERENCES_CLIPPINGIND;高光溢出提示 PREFERENCES_CLUTSCACHE;HaldCLUT 缓存 PREFERENCES_CLUTSCACHE_LABEL;CLUTs 最大缓存数 @@ -526,7 +510,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;可执行文件路径 -PREFERENCES_CUTOVERLAYBRUSH;裁切遮罩色彩和透明度 PREFERENCES_D50;5000K PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K @@ -537,8 +520,6 @@ PREFERENCES_DARKFRAMESHOTS;张 PREFERENCES_DARKFRAMETEMPLATES;模板 PREFERENCES_DATEFORMAT;日期格式 PREFERENCES_DATEFORMATHINT;可以使用下列控制符:\n%y : 年\n%m : 月h\n%d : 日\n\n例如, 中文日期格式:\n%y/%m/%d -PREFERENCES_DAUB_LABEL;使用 Daubechies D6 小波变换而不是 D4 -PREFERENCES_DAUB_TOOLTIP;The Noise Reduction and 小波变换等级 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;暗场图像路径 PREFERENCES_DIRHOME;用户文件路径 PREFERENCES_DIRLAST;上次访问路径 @@ -546,10 +527,8 @@ PREFERENCES_DIROTHER;其他 PREFERENCES_DIRSELECTDLG;启动时选择图片路径... PREFERENCES_DIRSOFTWARE;软件安装路径 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_FLATFIELDFOUND;找到 PREFERENCES_FLATFIELDSDIR;平场图像路径 @@ -592,12 +571,7 @@ PREFERENCES_INTENT_SATURATION;饱和度 PREFERENCES_INTERNALTHUMBIFUNTOUCHED;如果RAW文件没有修改, 显示内嵌JPEG缩略图 PREFERENCES_LANG;语言 PREFERENCES_LANGAUTODETECT;使用系统语言 -PREFERENCES_LEVAUTDN;降噪等级 -PREFERENCES_LEVDN;单元尺寸 -PREFERENCES_LISS;自动多区域平滑 -PREFERENCES_MAX;最大 (Tile) PREFERENCES_MAXRECENTFOLDERS;最近访问路径历史记录数 -PREFERENCES_MED;中等 (Tile/2) PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -605,16 +579,13 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" PREFERENCES_MENUGROUPRANK;组 "评价" PREFERENCES_MENUOPTIONS;子菜单选项 PREFERENCES_METADATA;元数据 -PREFERENCES_MIN;Mini (100x115) PREFERENCES_MONINTENT;默认渲染意图 PREFERENCES_MONITOR;显示器 PREFERENCES_MONPROFILE;默认色彩配置文件 PREFERENCES_MONPROFILE_WARNOSX;受MacOS限制, 仅支持sRGB PREFERENCES_MULTITAB;多编辑器标签模式 PREFERENCES_MULTITABDUALMON;多编辑器标签独立模式 -PREFERENCES_NAVGUIDEBRUSH;导航器引导颜色 PREFERENCES_NAVIGATIONFRAME;导航器 -PREFERENCES_NOISE;降噪 PREFERENCES_OUTDIR;输出路径 PREFERENCES_OUTDIRFOLDER;保存至文件夹 PREFERENCES_OUTDIRFOLDERHINT;将已寸图片放至所选文件夹 @@ -650,52 +621,34 @@ PREFERENCES_PRTPROFILE;色彩配置文件 PREFERENCES_PSPATH;Adobe Photoshop安装路径 PREFERENCES_REMEMBERZOOMPAN;记忆缩放和位置 PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -PREFERENCES_RGBDTL_LABEL;降噪和小波变换等级可用的最大线程数 -PREFERENCES_RGBDTL_TOOLTIP;"0"表示自动选择最大可用线程数 线程越多处理越快, 同时消耗更多内存 -PREFERENCES_SELECTFONT;设置主要字体 -PREFERENCES_SELECTFONT_COLPICKER;设置色彩选择器字体 PREFERENCES_SELECTLANG;选择语言 -PREFERENCES_SELECTTHEME;选择主题 -PREFERENCES_SERIALIZE_TIFF_READ;Tiff 读取设定 -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;连续载入tiff文件 -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;开启后可以提高在无压缩tiff图片文件夹中的缩略图生成速度 +PREFERENCES_SERIALIZE_TIFF_READ;TIFF 读取设定 +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;连续载入TIFF文件 +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;开启后可以提高在无压缩TIFF图片文件夹中的缩略图生成速度 PREFERENCES_SET;设置 PREFERENCES_SHOWBASICEXIF;显示基本Exif信息 PREFERENCES_SHOWDATETIME;显示时间日期 PREFERENCES_SHOWEXPOSURECOMPENSATION;附加曝光补偿 PREFERENCES_SHOWFILMSTRIPTOOLBAR;显示图像胶片栏 PREFERENCES_SHTHRESHOLD;阴影过暗阈值 -PREFERENCES_SIMPLAUT;工具模式 PREFERENCES_SINGLETAB;单编辑器栏模式 PREFERENCES_SINGLETABVERTAB;单编辑器栏模式, 标签栏垂直 -PREFERENCES_SMA;小 (250x287) PREFERENCES_SND_BATCHQUEUEDONE;队列处理完成 PREFERENCES_SND_HELP;输入完整路径来指定声音文件, 或者留空表示无声 \nWindows系统声音可以使用 "SystemDefault", "SystemAsterisk" 等 Linux则可以使用 "complete", "window-attention" 等 PREFERENCES_SND_LNGEDITPROCDONE;编辑器处理完成 -PREFERENCES_SND_TRESHOLDSECS;几秒之后 +PREFERENCES_SND_THRESHOLDSECS;几秒之后 PREFERENCES_STARTUPIMDIR;启动时路径 -PREFERENCES_STDAUT;标准 PREFERENCES_TAB_BROWSER;文件浏览器 PREFERENCES_TAB_COLORMGR;色彩管理 PREFERENCES_TAB_DYNAMICPROFILE;动态预设规则 PREFERENCES_TAB_GENERAL;一般 PREFERENCES_TAB_IMPROC;图片处理 -PREFERENCES_TAB_PERFORMANCE;性能和品质 PREFERENCES_TAB_SOUND;音效 -PREFERENCES_THEME;主题 -PREFERENCES_TIMAX;高 -PREFERENCES_TINB;块数量 -PREFERENCES_TISTD;标准 PREFERENCES_TP_LABEL;工具栏 -PREFERENCES_TP_USEICONORTEXT;标签使用图标而不是文本 PREFERENCES_TP_VSCROLLBAR;隐藏垂直滚动栏 PREFERENCES_TUNNELMETADATA;无损复制 Exif/IPTC/XMP 到输出文件 PREFERENCES_USEBUNDLEDPROFILES;启用内置预设 PREFERENCES_VIEW;输出设备白平衡 (显示器、电视、投影仪等) -PREFERENCES_WAVLEV;在质量为"高"时增加小波变换等级 -PREFERENCES_WLONE;一级 -PREFERENCES_WLTWO;二级 -PREFERENCES_WLZER;无 PREFERENCES_WORKFLOW;排版 PROFILEPANEL_LABEL;处理参数配置 PROFILEPANEL_LOADDLGLABEL;加载处理参数为... @@ -760,9 +713,6 @@ TP_BWMIX_LABEL;黑白 TP_BWMIX_MET;方式 TP_BWMIX_MET_DESAT;淡化饱和度 TP_BWMIX_MET_LUMEQUAL;明亮度平衡工具 -TP_BWMIX_MIXC;混合工具 -TP_BWMIX_NEUTRAL;重置混合工具 -TP_BWMIX_NEUTRAL_TIP;重置所有混合工具(色彩过滤、通道混合) TP_BWMIX_SETTING;预设 TP_BWMIX_SETTING_TOOLTIP;不同预设 (影片、水平排布等)或手动通道混合工具设置 TP_BWMIX_SET_HIGHCONTAST;高对比度 @@ -810,7 +760,6 @@ TP_CROP_GUIDETYPE;辅助方式: TP_CROP_H;高 TP_CROP_LABEL;剪裁 TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;选择预设 TP_CROP_W;宽 TP_CROP_X;x TP_CROP_Y;y @@ -917,9 +866,6 @@ TP_LENSGEOM_AUTOCROP;自动剪切 TP_LENSGEOM_FILL;自动填充 TP_LENSGEOM_LABEL;镜头 / 几何 TP_LENSPROFILE_LABEL;镜头矫正档案 -TP_LENSPROFILE_USECA;色散矫正 -TP_LENSPROFILE_USEDIST;畸变矫正 -TP_LENSPROFILE_USEVIGN;暗角矫正 TP_PCVIGNETTE_FEATHER;羽化 TP_PCVIGNETTE_LABEL;暗角滤镜 TP_PCVIGNETTE_ROUNDNESS;圆度 @@ -1017,8 +963,8 @@ TP_WBALANCE_WATER_HEADER;水下 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快捷键: - @@ -1026,15 +972,22 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !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. +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps @@ -1047,6 +1000,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. !FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 @@ -1061,11 +1016,14 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Show unsaved images.\nShortcut: Alt-6 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 +!GENERAL_CURRENT;Current +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_86;RGB Curves - Luminosity mode @@ -1096,7 +1054,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_118;Raw CA correction - Blue !HISTORY_MSG_120;Green equilibration !HISTORY_MSG_121;Raw CA Correction - Auto -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -1187,9 +1144,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_240;GF - Center !HISTORY_MSG_241;VF - Feather @@ -1222,7 +1179,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -1237,8 +1194,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -1341,7 +1298,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1421,18 +1378,102 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1458,10 +1499,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). @@ -1470,25 +1508,48 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !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_DEHAZE;Haze removal !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift +!PARTIALPASTE_RAW_BORDER;Raw border +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !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_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +!PREFERENCES_CROP;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1496,7 +1557,15 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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 +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles !PROFILEPANEL_LOADPPASTE;Parameters to load @@ -1512,15 +1581,18 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1528,10 +1600,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1542,6 +1613,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. !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. !TP_BWMIX_MET_CHANMIX;Channel Mixer +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1559,11 +1632,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1574,8 +1643,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1593,8 +1663,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1603,14 +1671,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 !TP_COLORAPP_LABEL_SCENE;Scene Conditions !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) !TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. @@ -1624,11 +1691,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1640,6 +1705,27 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1665,7 +1751,13 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1728,9 +1820,11 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_EPD_EDGESTOPPING;Edge stopping !TP_EPD_GAMMA;Gamma !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates -!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_CLAMPOOG;Clip out-of-gamut colors !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 @@ -1768,6 +1862,12 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. !TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated !TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel @@ -1798,6 +1898,15 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1818,8 +1927,17 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_PREPROCESS_GREENEQUIL;Green equilibration !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength !TP_RAWEXPOS_BLACKS;Black Levels !TP_RAWEXPOS_BLACK_0;Green 1 (lead) @@ -1830,20 +1948,27 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1852,7 +1977,8 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1860,63 +1986,47 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1928,7 +2038,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1954,7 +2064,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1993,12 +2103,18 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2084,7 +2200,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2095,7 +2211,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2201,6 +2317,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: - !TP_WBALANCE_LAMP_HEADER;Lamp !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SOLUX47;Solux 4700K (vendor) !TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) !TP_WBALANCE_TEMPBIAS;AWB temperature bias diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index fde7f4fde..6fd045ce8 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -1,7 +1,6 @@ #00 Chinese (Traditional) #01 2008-07-29 Mingjui Liao -ADJUSTER_RESET_TO_DEFAULT;重置預設參數 BATCHQUEUE_AUTOSTART;Auto start BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives CURVEEDITOR_LINEAR;線性 @@ -240,9 +239,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;下次啟動生效 -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height @@ -284,7 +280,6 @@ PREFERENCES_PROFILESAVECACHE;Save Processing Parameters to the Cache PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File PREFERENCES_PSPATH;Adobe Photoshop installation directory PREFERENCES_SELECTLANG;選擇語言 -PREFERENCES_SELECTTHEME;Select theme PREFERENCES_SHOWBASICEXIF;顯示基本Exif資訊 PREFERENCES_SHOWDATETIME;顯示時間日期 PREFERENCES_SHTHRESHOLD;暗部不足闕值 @@ -344,7 +339,6 @@ TP_CROP_GTRULETHIRDS;1/3法則 TP_CROP_GUIDETYPE;輔助方式: TP_CROP_H;高 TP_CROP_LABEL;剪裁 -TP_CROP_SELECTCROP; 選擇預設 TP_CROP_W;寬 TP_CROP_X;x TP_CROP_Y;y @@ -430,6 +424,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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 @@ -437,9 +432,10 @@ TP_WBALANCE_TEMPERATURE;色溫 !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -456,6 +452,10 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -466,6 +466,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -506,8 +507,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -564,7 +565,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -574,15 +575,18 @@ TP_WBALANCE_TEMPERATURE;色溫 !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -627,12 +631,11 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -736,9 +739,9 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -774,7 +777,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -789,8 +792,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -893,7 +896,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -973,19 +976,103 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1011,16 +1098,13 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1035,27 +1119,30 @@ TP_WBALANCE_TEMPERATURE;色溫 !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1073,8 +1160,10 @@ TP_WBALANCE_TEMPERATURE;色溫 !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 @@ -1083,6 +1172,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1101,19 +1191,22 @@ TP_WBALANCE_TEMPERATURE;色溫 !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1125,18 +1218,18 @@ TP_WBALANCE_TEMPERATURE;色溫 !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1144,16 +1237,17 @@ TP_WBALANCE_TEMPERATURE;色溫 !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1169,7 +1263,6 @@ TP_WBALANCE_TEMPERATURE;色溫 !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1178,14 +1271,11 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1217,12 +1307,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1230,22 +1315,21 @@ TP_WBALANCE_TEMPERATURE;色溫 !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1259,43 +1343,31 @@ TP_WBALANCE_TEMPERATURE;色溫 !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1315,12 +1387,15 @@ TP_WBALANCE_TEMPERATURE;色溫 !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1330,8 +1405,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1339,13 +1414,12 @@ TP_WBALANCE_TEMPERATURE;色溫 !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1372,9 +1446,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1405,11 +1478,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1420,8 +1489,9 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1439,8 +1509,6 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1452,14 +1520,13 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1479,11 +1546,9 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1495,6 +1560,27 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1527,11 +1613,17 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1611,13 +1703,15 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1643,10 +1737,6 @@ TP_WBALANCE_TEMPERATURE;色溫 !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1693,6 +1783,12 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1735,10 +1831,16 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1769,10 +1871,19 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1785,20 +1896,27 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1807,7 +1925,8 @@ TP_WBALANCE_TEMPERATURE;色溫 !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1815,67 +1934,51 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box !TP_RESIZE_FULLIMAGE;Full Image !TP_RESIZE_LANCZOS;Lanczos -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1887,7 +1990,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1913,7 +2016,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1965,13 +2068,19 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2061,7 +2170,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2072,7 +2181,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2184,6 +2293,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2198,7 +2308,7 @@ TP_WBALANCE_TEMPERATURE;色溫 !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 --git a/rtdata/languages/Czech b/rtdata/languages/Czech index e81f2c046..8d3296a1c 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -39,24 +39,29 @@ #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 +#42 2018-04-28 updated by mkyral +#43 2018-12-13 updated by mkyral ABOUT_TAB_BUILD;Verze ABOUT_TAB_CREDITS;Zásluhy ABOUT_TAB_LICENSE;Licence ABOUT_TAB_RELEASENOTES;Poznámky k vydání ABOUT_TAB_SPLASH;Úvodní obrazovka -ADJUSTER_RESET_TO_DEFAULT;Vrátit se k původnímu +ADJUSTER_RESET_TO_DEFAULT;Kliknutí - návrat k výchozí hodnotě.\nCtrl+kliknutí - návrat k počáteční hodnotě. 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: CURVEEDITOR_AXIS_OUT;Výstup: -CURVEEDITOR_AXIS_RIGHT_TAN;PS: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Elastická CURVEEDITOR_CURVE;Křivka CURVEEDITOR_CURVES;Křivky -CURVEEDITOR_CUSTOM;Vlastní +CURVEEDITOR_CUSTOM;Běžná CURVEEDITOR_DARKS;Tmavé CURVEEDITOR_EDITPOINT_HINT;Povolit úpravu hodnoty vstupně výstupního uzlu.\n\nKliknutím pravým tlačítkem na uzel jej vyberete. \nKliknutím pravým tlačítkem do prázdného místa zrušíte výběr. CURVEEDITOR_HIGHLIGHTS;Světla @@ -80,6 +85,10 @@ DYNPROFILEEDITOR_DELETE;Smazat DYNPROFILEEDITOR_EDIT;Upravit DYNPROFILEEDITOR_EDIT_RULE;Upravit pravidlo dynamického profilu DYNPROFILEEDITOR_ENTRY_TOOLTIP;Porovnávání rozlišuje velikost písmen.\nPro vložení regulárního výrazu přidejte\nprefix "re:". +DYNPROFILEEDITOR_IMGTYPE_ANY;Jakýkoli +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Běžná DYNPROFILEEDITOR_MOVE_DOWN;Posunout dolů DYNPROFILEEDITOR_MOVE_UP;Posunout nahoru DYNPROFILEEDITOR_NEW;Nový @@ -93,6 +102,7 @@ EXIFFILTER_CAMERA;Fotoaparát EXIFFILTER_EXPOSURECOMPENSATION;Kompenzace expozice (EV) EXIFFILTER_FILETYPE;Typ souboru EXIFFILTER_FOCALLEN;Ohnisková vzdálenost +EXIFFILTER_IMAGETYPE;Typ obrázku EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Objektiv EXIFFILTER_METADATAFILTER;Povolit filtr metadat @@ -151,8 +161,8 @@ FILEBROWSER_AUTOFLATFIELD;Auto Flat Field FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro výběr cesty. FILEBROWSER_BROWSEPATHHINT;Vložte cestu pro procházení.\n\nKlávesové zkratky:\nCtrl-o pro přepnutí do adresního řádku.\nEnter/ Ctrl-Enter pro procházení ;\nEsc pro zrušení změn.\nShift-Esc pro zrušení přepnutí.\n\nZkratky pro cesty:\n~\t- domácí složka uživatele.\n!\t- složka s obrázky uživatele. FILEBROWSER_CACHE;Mezipaměť -FILEBROWSER_CACHECLEARFROMFULL;Vymazat z mezipaměti - úplně -FILEBROWSER_CACHECLEARFROMPARTIAL;Vymazat z mezipaměti - částečně +FILEBROWSER_CACHECLEARFROMFULL;Smazat vše včetně profilů zpracování v mezipaměti +FILEBROWSER_CACHECLEARFROMPARTIAL;Smazat všechny profily mimo těch v mezipaměti FILEBROWSER_CLEARPROFILE;Smazat FILEBROWSER_COLORLABEL_TOOLTIP;Barevný štítek.\n\nPoužijte výběr ze seznamu nebo klávesové zkratky:\nShift-Ctrl-0 Bez barvy\nShift-Ctrl-1 Červený\nShift-Ctrl-2 Žlutý\nShift-Ctrl-3 Zelený\nShift-Ctrl-4 Modrý\nShift-Ctrl-5 Nachový FILEBROWSER_COPYPROFILE;Kopírovat @@ -241,7 +251,7 @@ 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. FILECHOOSER_FILTER_ANY;Všechny soubory -FILECHOOSER_FILTER_COLPROF;Barevné profily +FILECHOOSER_FILTER_COLPROF;Barevné profily (*.icc) FILECHOOSER_FILTER_CURVE;Soubory křivek FILECHOOSER_FILTER_LCP;Korekční profily objektivu FILECHOOSER_FILTER_PP;Profily zpracování @@ -255,6 +265,7 @@ GENERAL_AUTO;Automaticky GENERAL_BEFORE;Před GENERAL_CANCEL;Zrušit GENERAL_CLOSE;Zavřít +GENERAL_CURRENT;Současný GENERAL_DISABLE;Vypnout GENERAL_DISABLED;Vypnuto GENERAL_ENABLE;Zapnout @@ -267,16 +278,19 @@ GENERAL_NONE;Nic GENERAL_OK;OK GENERAL_OPEN;Otevřít GENERAL_PORTRAIT;Na výšku +GENERAL_RESET;Obnovit GENERAL_SAVE;Uložit +GENERAL_SAVE_AS;Uložit jako... +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_BAR;Zobrazit/Skrýt řádek RGB indikátoru. HISTOGRAM_TOOLTIP_CHRO;Skrýt/Zobrazit histogram barevnosti. -HISTOGRAM_TOOLTIP_FULL;Plný (zapnuto) nebo přiblížený (vypnuto) histogram. HISTOGRAM_TOOLTIP_G;Skrýt/Zobrazit histogram zelené. HISTOGRAM_TOOLTIP_L;Skrýt/Zobrazit CIELab histogram jasu. +HISTOGRAM_TOOLTIP_MODE;Přepíná mezi lineárním, log-lineárním a log-log škálováním histogramu. HISTOGRAM_TOOLTIP_R;Skrýt/Zobrazit histogram červené. HISTOGRAM_TOOLTIP_RAW;Skrýt/Zobrazit raw histogram. HISTORY_CHANGED;Změněno @@ -407,7 +421,6 @@ HISTORY_MSG_121;Raw korekce CA - automatická HISTORY_MSG_122;Tmavé snímky - Automatický výběr HISTORY_MSG_123;Tmavé snímky - Soubor HISTORY_MSG_124;Korekce bílého bodu -HISTORY_MSG_125;Zachování světel HISTORY_MSG_126;Flat Field - Soubor HISTORY_MSG_127;Flat Field - Automatický výběr HISTORY_MSG_128;Flat Field - Poloměr rozostření @@ -455,6 +468,7 @@ HISTORY_MSG_169;L*a*b* - CH Křivka 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 - Obnovení detailů HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - CAT02 přizpůsobení HISTORY_MSG_176;CAM02 - Okolí pro prohlížení @@ -466,7 +480,7 @@ HISTORY_MSG_181;CAM02 - Chroma (C) HISTORY_MSG_182;CAM02 - Automatická CAT02 HISTORY_MSG_183;CAM02 - Kontrast (J) HISTORY_MSG_184;CAM02 - Okolí scény -HISTORY_MSG_185;CAM02 - Kontrola palety +HISTORY_MSG_185;CAM02 - Kontrola gamutu HISTORY_MSG_186;CAM02 - Algoritmus HISTORY_MSG_187;CAM02 - Ochrana červ. a pleť. tónů HISTORY_MSG_188;CAM02 - Světlost (Q) @@ -484,6 +498,7 @@ HISTORY_MSG_199;CAM02 - Výstupní histogramy 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 - 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 @@ -514,9 +529,9 @@ HISTORY_MSG_231;ČB - Křivka 'Před' HISTORY_MSG_232;ČB - Typ křivky 'Před' HISTORY_MSG_233;ČB - Křivka 'Po' HISTORY_MSG_234;ČB - Typ křivky 'Po' -HISTORY_MSG_235;ČB - Automatické míchání kanálů +HISTORY_MSG_235;ČB - MK - Auto HISTORY_MSG_236;--nepoužito-- -HISTORY_MSG_237;ČB - Míchání +HISTORY_MSG_237;ČB - MK HISTORY_MSG_238;PF - Rozptyl HISTORY_MSG_239;PF - Síla HISTORY_MSG_240;PF - Střed @@ -535,8 +550,9 @@ HISTORY_MSG_252;KdDÚ - Ochrana tónů pleti 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 - 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 @@ -551,7 +567,7 @@ HISTORY_MSG_269;Barevné tónování - Světla - červená HISTORY_MSG_270;Barevné tónování - Světla - zelená HISTORY_MSG_271;Barevné tónování - Světla - modrá HISTORY_MSG_272;Barevné tónování - Vyvážení -HISTORY_MSG_273;Barevné tónování - Obnovení +HISTORY_MSG_273;Barevné tónování - Vyvážení barev SMH HISTORY_MSG_274;Barevné tónování - Nasycení stínů HISTORY_MSG_275;Barevné tónování - Nasycení světel HISTORY_MSG_276;Barevné tónování - Neprůhlednost @@ -566,8 +582,8 @@ HISTORY_MSG_284;Barevné tónování - Aut. ochrana nasycení HISTORY_MSG_285;Redukce šumu - Medián - Metoda HISTORY_MSG_286;Redukce šumu - Medián - Typ HISTORY_MSG_287;Redukce šumu - Medián - Průchody -HISTORY_MSG_288;Flat Field - kontrola oříznutí -HISTORY_MSG_289;Flat Field - kontrola oříznutí - Auto +HISTORY_MSG_288;Flat Field - Kontrola oříznutí +HISTORY_MSG_289; Flat Field - Kontrola oříznutí - Aut HISTORY_MSG_290;Úroveň černé - Červená HISTORY_MSG_291;Úroveň černé - Zelená 1 HISTORY_MSG_292;Úroveň černé - Modrá @@ -575,6 +591,7 @@ HISTORY_MSG_293;Simulace filmu 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 - Mód HISTORY_MSG_298;Filtr mrtvých pixelů HISTORY_MSG_299;Redukce šumu - Křivka barevnosti HISTORY_MSG_300;- @@ -591,15 +608,15 @@ HISTORY_MSG_310;Vlnka - Zůstatek - Zaměření a ochrana tónů oblohy HISTORY_MSG_311;Vlnka - Úrovně vlnky HISTORY_MSG_312;Vlnka - Zůstatek - Práh stínů HISTORY_MSG_313;Vlnka - Barevnost - Pastel./Sat. -HISTORY_MSG_314;Vlnka - Paleta - Omezení artefaktů +HISTORY_MSG_314;Vlnka - Gamut - Omezení artefaktů HISTORY_MSG_315;Vlnka - Zůstatek - Kontrast -HISTORY_MSG_316;Vlnka - Paleta - Ochrana a zaměření pleťových tónů -HISTORY_MSG_317;Vlnka - Paleta - Odstín pleti +HISTORY_MSG_316;Vlnka - Gamut - Ochrana a zaměření pleťových tónů +HISTORY_MSG_317;Vlnka - Gamut - Odstín pleti HISTORY_MSG_318;Vlnka - Kontrast - Úrovně světel HISTORY_MSG_319;Vlnka - Kontrast - - rozsah světel HISTORY_MSG_320;Vlnka - Kontrast - Rozsah stínů HISTORY_MSG_321;Vlnka - Kontrast - Úrovně stínů -HISTORY_MSG_322;Vlnka - Paleta - Zabránit posunu barev +HISTORY_MSG_322;Vlnka - Gamut - Zabránit posunu barev HISTORY_MSG_323;Vlnka - DH - Místní kontrast HISTORY_MSG_324;Vlnka - Barevnost - Pastelové HISTORY_MSG_325;Vlnka - Barevnost - Nasycení @@ -635,7 +652,7 @@ HISTORY_MSG_354;Vlnka - DH - Vylepšení HISTORY_MSG_355;Vlnka - DH - Minimální práh HISTORY_MSG_356;Vlnka - DH - Maximální práh HISTORY_MSG_357;Vlnka - Odšumění - Propojení s DH -HISTORY_MSG_358;Vlnka - Paleta - Kontrast úrovní barevnost +HISTORY_MSG_358;Vlnka - Gamut - Kontrast úrovní barevnost HISTORY_MSG_359;Vypálené/Mrtvé - Práh HISTORY_MSG_360;TM - Gama HISTORY_MSG_361;Vlnka - Dokončení - Vyvážení barev @@ -669,7 +686,7 @@ HISTORY_MSG_388;Vlnka - Zůstatek - VB střední: zelená HISTORY_MSG_389;Vlnka - Zůstatek - VB střední: modrá HISTORY_MSG_390;Vlnka - Zůstatek - VB stíny: zelená HISTORY_MSG_391;Vlnka - Zůstatek - VB stíny: modrá -HISTORY_MSG_392;Vlnka - Zůstatek - VB vrátit +HISTORY_MSG_392;Vlnka - Zůstatek - Vyvážení barev HISTORY_MSG_393;DCP - tabulka vzhledu HISTORY_MSG_394;DCP - základní expozice HISTORY_MSG_395;DCP - základní tabulka @@ -749,15 +766,105 @@ 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_488;Komprese dynamického rozsahu +HISTORY_MSG_489;DRC - Detail +HISTORY_MSG_490;DRC - Míra HISTORY_MSG_491;Vyvážení bílé HISTORY_MSG_492;RGB křivky +HISTORY_MSG_493;L*a*b* úpravy +HISTORY_MSG_CLAMPOOG;Oříznout barvy mimo gamut +HISTORY_MSG_COLORTONING_LABGRID_VALUE;Barevné tónování - Korekce barev +HISTORY_MSG_COLORTONING_LABREGION_AB;Barevné tónování - Korekce barev +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;BT - Kanál +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;BT -oblast C masky +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Barevné tónování - H maska +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;BT - Světlost +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;BT - L maska +HISTORY_MSG_COLORTONING_LABREGION_LIST;BT - +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;BT - oblast masky rozostření +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;BT - oblast posunu +HISTORY_MSG_COLORTONING_LABREGION_POWER;BT - oblast síly +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;BT- Nasycení +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;BT - oblast zobrazené masky +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;BT - oblast sklonu +HISTORY_MSG_DEHAZE_DEPTH;Závoj - Hloubka +HISTORY_MSG_DEHAZE_ENABLED;Odstranění závoje +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Závoj - Ukázat hloubkovou mapu +HISTORY_MSG_DEHAZE_STRENGTH;Závoj - Síla +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dvojité demozajkování - automatický práh +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dvojité demozajkování - Práh kontrastu +HISTORY_MSG_HISTMATCHING;Automaticky nalezená tónová křivka +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Výstup - Základní barvy +HISTORY_MSG_ICM_OUTPUT_TEMP;Výstup - ICC-v4 světelný zdroj D +HISTORY_MSG_ICM_OUTPUT_TYPE;Výstup - Typ +HISTORY_MSG_ICM_WORKING_GAMMA;Pracovní - Gama +HISTORY_MSG_ICM_WORKING_SLOPE;Pracovní - sklon +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Pracovní - Metoda TRC +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_MICROCONTRAST_CONTRAST;Mikrokontrast - Práh kontrastu +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Metoda demozajkování pohybu +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Směr filtru linkového rušení +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek +HISTORY_MSG_PRSHARPEN_CONTRAST;Doostření - Práh kontrastu +HISTORY_MSG_RAWCACORR_AUTOIT;Raw korekce CA - Iterace +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw korekce CA - Zabránit posunu barev +HISTORY_MSG_RAW_BORDER;Okraj Raw +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Změna rozměrů - Povolit zvětšení +HISTORY_MSG_SHARPENING_CONTRAST;Doostření - Práh kontrastu +HISTORY_MSG_SH_COLORSPACE;S/S - Barevný prostor +HISTORY_MSG_SOFTLIGHT_ENABLED;Měkké světlo +HISTORY_MSG_SOFTLIGHT_STRENGTH;Měkká světla - Síla +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Kotva HISTORY_NEWSNAPSHOT;Přidat HISTORY_NEWSNAPSHOT_TOOLTIP;Zkratka: Alt-s HISTORY_SNAPSHOT;Snímek HISTORY_SNAPSHOTS;Snímky +ICCPROFCREATOR_COPYRIGHT;Autorská práva: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Vrátit se k původní deklaraci práv a majitele, nastaví "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Vlastní +ICCPROFCREATOR_DESCRIPTION;Popis: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Přidá hodnoty gamy a sklonu do popisu +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Ponechte prázdné pro nastavení výchozího popisu. +ICCPROFCREATOR_GAMMA;Gama +ICCPROFCREATOR_ICCVERSION;Verze ICC: +ICCPROFCREATOR_ILL;Osvětlení: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Výchozí +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Světelný zdroj může být nastaven pouze u ICC v4 profilů. +ICCPROFCREATOR_PRIMARIES;Základní barvy: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Modrá X +ICCPROFCREATOR_PRIM_BLUY;Modrá Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Zelená X +ICCPROFCREATOR_PRIM_GREY;Zelená Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Červená X +ICCPROFCREATOR_PRIM_REDY;Červená Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;Vlastní základní barvy lze nastavit pouze u ICC v4 profilu. +ICCPROFCREATOR_PRIM_WIDEG;Široký gamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Uložit ICC profil jako... +ICCPROFCREATOR_SLOPE;Sklon +ICCPROFCREATOR_TRC_PRESET;Tónová křivka odezvy: IPTCPANEL_CATEGORY;Kategorie IPTCPANEL_CATEGORYHINT;Identifikuje předmět obrázku dle názoru dodavatele. IPTCPANEL_CITY;Město @@ -800,17 +907,14 @@ IPTCPANEL_TITLE;Titulek 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_ICCPROFCREATOR;Nástroj pro vytváření ICC profilu 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 MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronizovat prohlížeč souborů s editorem pro zobrazení náhledu aktuálně otevřeného obrázku a smazání filtrů v prohlížeči souborů.\nZkratka: x\n\nStejně jako výše, ale bez smazání filtrů v prohlížeči souborů:\nZkratka: y\n(Náhled otevřeného obrázku nebude zobrazen pokud je filtrován). MAIN_BUTTON_PREFERENCES;Volby MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Vložit současný obrázek do fronty zpracování.\nZkratka: Ctrl+b -MAIN_BUTTON_SAVE_TOOLTIP;Uložit současný obrázek.\nZkratka: Ctrl+s +MAIN_BUTTON_SAVE_TOOLTIP;Uloží aktuální obrázek.\nZkratka: Ctrl+s\nUloží současný profil (.pp3).\nZkratka: Ctrl+Shift+s MAIN_BUTTON_SENDTOEDITOR;Upravit obrázek v externím editoru MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Editovat současný obrázek v externím editoru.\nZkratka: Ctrl+e MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Zobrazit/skrýt všechny postranní panely.\nZkratka: m @@ -839,6 +943,8 @@ MAIN_MSG_QOVERWRITE;Chcete jej přepsat? 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 @@ -857,21 +963,20 @@ MAIN_TAB_RAW;Raw 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_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: < MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznit oříznuté stíny.\nZkratka: > MAIN_TOOLTIP_PREVIEWB;Náhled modrého kanálu.\nZkratka: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Náhled Masky zaostření.\nZkratka: Shift-f\n\nVíce přesné u snímků s nízkou hloubkou ostrosti, nízkým šumem a na vyšších úrovních zvětšení.\n\nPro zlepšení přesnosti detekce u zašuměných snímků použijte menší zvětšení, mezi 10 až 30%. +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Náhled masky zaostření.\nZkratka: Shift-f\n\nVíce přesné u snímků s nízkou hloubkou ostrosti, nízkým šumem a na vyšších úrovních zvětšení.\n\nPoužijte přiblížení v rozsahu 10 až 30% pro zlepšení přesnosti detekce u zašuměných snímků. MAIN_TOOLTIP_PREVIEWG;Náhled zeleného kanálu.\nZkratka: g -MAIN_TOOLTIP_PREVIEWL;Náhled Svítivost.\nZkratka: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWL;Náhled svítivost.\nZkratka: v\n\n0.299*R + 0.587*G + 0.114*B MAIN_TOOLTIP_PREVIEWR;Náhled červeného kanálu.\nZkratka: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Náhled masky kontrastu doostření.\nZkratka: p\n\nFunguje pouze pokud doostření zapnuto a přiblížení je >=100%. MAIN_TOOLTIP_QINFO;Stručné informace o obrázku.\nZkratka: i MAIN_TOOLTIP_SHOWHIDELP1;Zobrazit/skrýt levý panel.\nZkratka: l MAIN_TOOLTIP_SHOWHIDERP1;Zobrazit/skrýt pravý panel.\nZkratka: Alt-l @@ -891,8 +996,10 @@ NAVIGATOR_S;S: 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ů @@ -907,6 +1014,7 @@ PARTIALPASTE_CROP;Ořez PARTIALPASTE_DARKFRAMEAUTOSELECT;Automatický výběr tmavých snímků PARTIALPASTE_DARKFRAMEFILE;Soubor tmavého snímku PARTIALPASTE_DEFRINGE;Odstranění lemu +PARTIALPASTE_DEHAZE;Odstranění závoje PARTIALPASTE_DETAILGROUP;Nastavení detailů PARTIALPASTE_DIALOGLABEL;Částečné vložení profilu zpracování PARTIALPASTE_DIRPYRDENOISE;Redukce šumu @@ -931,20 +1039,24 @@ PARTIALPASTE_IPTCINFO;IPTC PARTIALPASTE_LABCURVE;L*a*b* úpravy PARTIALPASTE_LENSGROUP;Nastavení související s objektivy PARTIALPASTE_LENSPROFILE;Korekční profily objektivů -PARTIALPASTE_METAGROUP;Metadata +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ů PARTIALPASTE_PREPROCESS_GREENEQUIL;Vyrovnání zelené PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtr vypálených pixelů PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtrovat linkové rušení +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek PARTIALPASTE_PRSHARPENING;Doostření po změně velikosti PARTIALPASTE_RAWCACORR_AUTO;Automatická korekce CA +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA zabránit posunu barev PARTIALPASTE_RAWCACORR_CAREDBLUE;CA červená a modrá PARTIALPASTE_RAWEXPOS_BLACK;Úrovně černé PARTIALPASTE_RAWEXPOS_LINEAR;Korekce bílého bodu -PARTIALPASTE_RAWEXPOS_PRESER;Zachování světel PARTIALPASTE_RAWGROUP;Nastavení Raw +PARTIALPASTE_RAW_BORDER;Okraj Raw PARTIALPASTE_RAW_DCBENHANCE;Vylepšení DCB PARTIALPASTE_RAW_DCBITERATIONS;Průchody DCB PARTIALPASTE_RAW_DMETHOD;Metoda demozajkování @@ -960,21 +1072,21 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Stíny/Světla PARTIALPASTE_SHARPENEDGE;Hrany PARTIALPASTE_SHARPENING;Doostření (USM/RL) PARTIALPASTE_SHARPENMICRO;Mikrokontrast -PARTIALPASTE_TM_FATTAL;HDR mapování tónů +PARTIALPASTE_SOFTLIGHT;Měkké světlo +PARTIALPASTE_TM_FATTAL;Komprese dynamického rozsahu PARTIALPASTE_VIBRANCE;Živost PARTIALPASTE_VIGNETTING;Korekce vinětace -PARTIALPASTE_WAVELETGROUP;Úrovně vlnky PARTIALPASTE_WHITEBALANCE;Nastavení bílé PREFERENCES_ADD;Přidat +PREFERENCES_APPEARANCE;Vzhled +PREFERENCES_APPEARANCE_COLORPICKERFONT;Písmo Průzkumníka barev +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Barva masky ořezu +PREFERENCES_APPEARANCE_MAINFONT;Hlavní písmo +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Barva vodítek navigátoru +PREFERENCES_APPEARANCE_THEME;Motiv PREFERENCES_APPLNEXTSTARTUP;vyžaduje restart aplikace -PREFERENCES_AUTLISLOW;Nízké -PREFERENCES_AUTLISMAX;Maximální - průměr všech dlaždic -PREFERENCES_AUTLISSTD;Vysoké -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_AUTOSAVE_TP_OPEN;Uložit stav sbalení/rozbalení nástrojů při ukončení PREFERENCES_BATCH_PROCESSING;Dávkové zpracování PREFERENCES_BEHADDALL;Vše do 'Přidat' PREFERENCES_BEHADDALLHINT;Nastaví všechny parametry do módu Přidat.\nZměna parametrů v panelu dávkového zpracování se aplikuje jako rozdíl k uloženým hodnotám. @@ -982,21 +1094,25 @@ PREFERENCES_BEHAVIOR;Režim PREFERENCES_BEHSETALL;Vše do 'Nastavit' PREFERENCES_BEHSETALLHINT;Nastaví všechny parametry do módu Nastavit.\nZměna parametrů v panelu dávkového zpracování se aplikuje jako absolutní, budou zobrazeny aktuální hodnoty. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Vymazat vše -PREFERENCES_CACHECLEARPROFILES;Smazat profily zpracování -PREFERENCES_CACHECLEARTHUMBS;Vymazat náhledy +PREFERENCES_CACHECLEAR;Smazat +PREFERENCES_CACHECLEAR_ALL;Smazat z mezipaměti všechny soubory : +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Smazat z mezipaměti všechny soubory mimo profilů zpracování: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Smazat z mezipaměti pouze profily zpracování: +PREFERENCES_CACHECLEAR_SAFETY;Jsou smazány pouze soubory ve vyrovnávací paměti. Profily zpracování uložené u zdrojových obrázků zůstávají nedotčeny. PREFERENCES_CACHEMAXENTRIES;Maximální počet záznamů v mezipaměti 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_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í PREFERENCES_CLUTSCACHE;Mezipaměť HaldCLUT 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í 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 @@ -1008,7 +1124,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Formát klíče PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Jméno PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Cesta k programu -PREFERENCES_CUTOVERLAYBRUSH;Barva masky ořezu/průhlednosti PREFERENCES_D50;Nastavení v hlavní nabídce PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K @@ -1019,8 +1134,6 @@ PREFERENCES_DARKFRAMESHOTS;snímků 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 @@ -1028,11 +1141,11 @@ 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;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_FILEBROWSERTOOLBARSINGLEROW;Kompaktní nástroje v Prohlížeči souborů PREFERENCES_FILEFORMAT;Formát souboru PREFERENCES_FLATFIELDFOUND;Nalezeno PREFERENCES_FLATFIELDSDIR;Složka Flat Field souborů @@ -1075,12 +1188,7 @@ 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 -PREFERENCES_LISS;Automatické více zónové vyhlazení -PREFERENCES_MAX;Velká (dlaždice) PREFERENCES_MAXRECENTFOLDERS;Maximální počet nedávných složek -PREFERENCES_MED;Střední (Poloviční dlaždice) PREFERENCES_MENUGROUPEXTPROGS;Skupina "Otevřít pomocí" PREFERENCES_MENUGROUPFILEOPERATIONS;Skupina "Souborové operace" PREFERENCES_MENUGROUPLABEL;Skupina "Barevné štítky" @@ -1088,16 +1196,13 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Skupina "Operace s profily zpracování" PREFERENCES_MENUGROUPRANK;Skupina "Hodnocení" PREFERENCES_MENUOPTIONS;Volby místní nabídky PREFERENCES_METADATA;Metadata -PREFERENCES_MIN;Velmi malá (100x115) PREFERENCES_MONINTENT;Výchozí reprodukční záměr PREFERENCES_MONITOR;Monitor PREFERENCES_MONPROFILE;Výchozí barevný profil PREFERENCES_MONPROFILE_WARNOSX;Na MacOS je podporováno pouze sRGB. PREFERENCES_MULTITAB;Mód více karet editoru PREFERENCES_MULTITABDUALMON;Mód více karet editoru ve vlastním okně -PREFERENCES_NAVGUIDEBRUSH;Barva vodítek navigátoru PREFERENCES_NAVIGATIONFRAME;Navigátor -PREFERENCES_NOISE;Redukce šumu PREFERENCES_OUTDIR;Výstupní složka PREFERENCES_OUTDIRFOLDER;Ulož do souboru PREFERENCES_OUTDIRFOLDERHINT;Uložit obrázky do vybrané složky. @@ -1113,11 +1218,13 @@ PREFERENCES_PARSEDEXTADDHINT;Vymazat označenou příponu ze seznamu. PREFERENCES_PARSEDEXTDELHINT;Vymazat označenou příponu ze seznamu. PREFERENCES_PARSEDEXTDOWNHINT;Vybranou příponu posunout na seznamu níže. PREFERENCES_PARSEDEXTUPHINT;Vybranou příponu posunout na seznamu výše. +PREFERENCES_PERFORMANCE_THREADS;Vlákna +PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximální počet vláken pro Redukci šumu a Úrovně vlnky (0 = Automaticky) PREFERENCES_PREVDEMO;Metoda demozajkování náhledu 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 @@ -1133,53 +1240,40 @@ PREFERENCES_PRTPROFILE;Barevný profil PREFERENCES_PSPATH;Instalační složka Adobe Photoshop PREFERENCES_REMEMBERZOOMPAN;Zapamatovat si procento přiblížení a posun obrázku 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_SAVE_TP_OPEN_NOW;Uložit současný stav sbalení/rozbalení nástrojů PREFERENCES_SELECTLANG;Volba jazyka -PREFERENCES_SELECTTHEME;Zvolit vzhled -PREFERENCES_SERIALIZE_TIFF_READ;Nastavení čtení Tiff -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serializovat čtení tiff souborů -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Povolení této volby může zvýšit výkon generování náhledů ve složkách obsahujících mnoho nezkomprimovaných tiff souborů. +PREFERENCES_SERIALIZE_TIFF_READ;Nastavení čtení TIFF +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serializovat čtení TIFF souborů +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Povolení této volby může zvýšit výkon generování náhledů ve složkách obsahujících mnoho nezkomprimovaných TIFF souborů. PREFERENCES_SET;Nastavit PREFERENCES_SHOWBASICEXIF;Zobrazovat základní Exif informace PREFERENCES_SHOWDATETIME;Zobrazovat datum a čas PREFERENCES_SHOWEXPOSURECOMPENSATION;Přidat kompenzaci expozice -PREFERENCES_SHOWFILMSTRIPTOOLBAR;Zobrazit lištu s filmovým pásem +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Lišta s filmovým pásem PREFERENCES_SHTHRESHOLD;Práh oříznutých stínů -PREFERENCES_SIMPLAUT;Režim nástrojů PREFERENCES_SINGLETAB;Mód jedné karty editoru PREFERENCES_SINGLETABVERTAB;Mód jedné karty editoru, svislé karty -PREFERENCES_SMA;Malá (250x287) PREFERENCES_SND_BATCHQUEUEDONE;Zpracování fronty dokončeno PREFERENCES_SND_HELP;Vložte cestu k souboru pro nastavení zvuku nebo ponechte prázdné (bez zvuku).\nVe Windows zadejte "SystemDefault", "SystemAsterisk" a podobně.\nNa Linuxu použijte "complete", "window-attention" a další. PREFERENCES_SND_LNGEDITPROCDONE;Zpracování v editoru dokončeno -PREFERENCES_SND_TRESHOLDSECS;Po sekundách +PREFERENCES_SND_THRESHOLDSECS;Po sekundách PREFERENCES_STARTUPIMDIR;Složka obrázků při spuštění -PREFERENCES_STDAUT;Běžný PREFERENCES_TAB_BROWSER;Prohlížeč souborů PREFERENCES_TAB_COLORMGR;Správa barev PREFERENCES_TAB_DYNAMICPROFILE;Pravidla dynamických profilů PREFERENCES_TAB_GENERAL;Obecné PREFERENCES_TAB_IMPROC;Zpracování obrázku -PREFERENCES_TAB_PERFORMANCE;Výkon a kvalita +PREFERENCES_TAB_PERFORMANCE;Výkon PREFERENCES_TAB_SOUND;Zvuky -PREFERENCES_THEME;Vzhled -PREFERENCES_TIMAX;Vysoký -PREFERENCES_TINB;Počet dlaždic -PREFERENCES_TISTD;Běžný +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Náhled vloženého JPEG +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Obrázek pro zobrazení +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrální vykreslení RAW +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Vložený JPEG náhled pokud je v plné velikosti, jinak neutrální raw PREFERENCES_TP_LABEL;Panel nástrojů: -PREFERENCES_TP_USEICONORTEXT;V záhlaví karty zobrazit ikonu namísto textu PREFERENCES_TP_VSCROLLBAR;Skrýt svislou posuvnou lištu PREFERENCES_TUNNELMETADATA;Zkopírovat nezměněná Exif/IPTC/XMP metadata do výstupního souboru PREFERENCES_USEBUNDLEDPROFILES;Použít přiložené profily PREFERENCES_VIEW;Nastavení vyvážení bílé výstupních zařízení (monitor, TV, projektor, rámeček a jiné) -PREFERENCES_WAVLEV;Zvýšit úroveň vlnkové transformace v nejvyšší kvalitě -PREFERENCES_WLONE;Jedna úroveň -PREFERENCES_WLTWO;Dvě úrovně -PREFERENCES_WLZER;Ne PREFERENCES_WORKFLOW;Rozvržení PROFILEPANEL_COPYPPASTE;Parametry pro kopírování PROFILEPANEL_GLOBALPROFILES;Přiložené profily @@ -1220,13 +1314,16 @@ 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ů +SAMPLEFORMAT_1;8-bitový neznaménkový +SAMPLEFORMAT_2;16-bitový neznaménkový +SAMPLEFORMAT_4;24-bitový LogLuv +SAMPLEFORMAT_8;32-bitový LogLuv +SAMPLEFORMAT_16;S pohyblivou čárkou, 16 bitů +SAMPLEFORMAT_32;S pohyblivou čárkou, 24 bitů +SAMPLEFORMAT_64;S pohyblivou čárkou, 32 bitů SAVEDLG_AUTOSUFFIX;Automaticky přidat příponu pokud soubor již existuje SAVEDLG_FILEFORMAT;Formát souboru +SAVEDLG_FILEFORMAT_FLOAT;S pohyblivou čárkou SAVEDLG_FORCEFORMATOPTS;Vynutit volby uložení SAVEDLG_JPEGQUAL;Kvalita JPEG SAVEDLG_PUTTOQUEUE;Vložit soubor do fronty @@ -1242,8 +1339,8 @@ SAVEDLG_SUBSAMP_TOOLTIP;Nejlepší komprese:\nJ:a:b 4:2:0\nh/v 2/2\nO polovinu s 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 profilu tiskárnyoznačeny šedou barvou. -SOFTPROOF_TOOLTIP;Jemně korekční\nPokud je aktivní, umožní vám simulovat výstup tiskárny pomocí profilu tiskárny nastaveného v Volby > Správa barev. +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 @@ -1251,8 +1348,8 @@ THRESHOLDSELECTOR_HINT;Držte klávesu Shift pro přesun individuálních THRESHOLDSELECTOR_T;Nahoře THRESHOLDSELECTOR_TL;Nahoře vlevo THRESHOLDSELECTOR_TR;Nahoře vpravo -TOOLBAR_TOOLTIP_COLORPICKER;Uzamykatelný Průzkumník barev\n\nPokud je povolen:\nPřidáte průzkumníka barev kliknutím levým tlačítkem myši do náhledu\nPodržením levého tlačítka myši a tažením průzkumníka přesunete\nPokud na průzkumníka kliknete pravým tlačítkem, dojde k jeho smazání\nSmazání všech průzkumníků po stisknutí klávesy Shift a pravého tlačítka myši\nKliknutím pravým tlačítkem kdekoli mimo průzkumníka přepne zpět na nástroj posunu -TOOLBAR_TOOLTIP_CROP;Oříznutí výběru.\nZkratka: c\nOblast výřezu posunete pomocí Shift + tažení myši +TOOLBAR_TOOLTIP_COLORPICKER;Uzamykatelný Průzkumník barev\n\nPokud je nástroj aktivní:\n- Přidání sondy: levý-klik.\n- Posunutí sondy: levý-klik a posunutí.\n- Smazání sondy: pravý-klik.\n- Smazání všech sond: shift+pravý-klik.\n- Návrat k nástroji posunu: pravý-klik. +TOOLBAR_TOOLTIP_CROP;Oříznutí výběru.\nZkratka: c\nVýřez posunete pomocí Shift + tažení myši TOOLBAR_TOOLTIP_HAND;Posun.\nZkratka: h TOOLBAR_TOOLTIP_STRAIGHTEN;Vyznačení roviny / rotace.\nZkratka: s\n\nZobrazení míry rotace pomocí vodící linky na náhledu snímky. Úhel rotace je zobrazen vedle vodící linky. Střed rotace je geometrický střed snímku. TOOLBAR_TOOLTIP_WB;Bodové vyvážení bílé.\nZkratka: w @@ -1261,7 +1358,6 @@ TP_BWMIX_ALGO_LI;Lineární TP_BWMIX_ALGO_SP;Speciální efekty TP_BWMIX_ALGO_TOOLTIP;Lineární: výstupem bude běžná lineární odpověď.\nSpeciální efekty: výstupem budou speciální efekty pomocí míchání kanálů (nelineární odpověď). TP_BWMIX_AUTOCH;Automaticky -TP_BWMIX_AUTOCH_TIP;Spočítá optimální hodnoty pro míchání kanálů. TP_BWMIX_CC_ENABLED;Úpravy doplňkových barev TP_BWMIX_CC_TOOLTIP;Povolením zapnete automatické korekce doplňkových barev v režimu ROYGCBPM. TP_BWMIX_CHANNEL;Korekce jasu @@ -1288,9 +1384,8 @@ TP_BWMIX_MET;Metoda TP_BWMIX_MET_CHANMIX;Míchání kanálů TP_BWMIX_MET_DESAT;Odbarvení TP_BWMIX_MET_LUMEQUAL;Korekce jasu -TP_BWMIX_MIXC;Míchání -TP_BWMIX_NEUTRAL;Vrátit míchání -TP_BWMIX_NEUTRAL_TIP;Vrátí všechny hodnoty (filtry, mixéry kanálů) na výchozí pozice. +TP_BWMIX_MIXC;Míchání kanálů +TP_BWMIX_NEUTRAL;Obnovit TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Celkem: %4%% TP_BWMIX_RGBLABEL_HINT;Výsledné RGB faktory po započtení všech mixérů\n"Celkem" zobrazí součet aktuálně aplikovaných RGB hodnot:\n- vždy 100% v relativním režimu\n- více (světlejší) nebo méně (tmavší) než 100% v absolutním režimu. TP_BWMIX_RGB_TOOLTIP;Mísení RGB kanálů. Jako vodítko můžete použít uložená přednastavení.\nPovšimněte si prosím, že záporné hodnoty mohou vést ke vzniku artefaktů nebo chybnému chování. @@ -1332,11 +1427,7 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Překlopit horizontálně. 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;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), 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_ABSOLUTELUMINANCE;Absolutní jas TP_COLORAPP_ALGO;Algoritmus TP_COLORAPP_ALGO_ALL;Vše TP_COLORAPP_ALGO_JC;Světlost + Barevnost (JC) @@ -1347,8 +1438,9 @@ 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_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_CAT02ADAPTATION_TOOLTIP;U ručního nastavení jsou doporučeny hodnoty nad 65. TP_COLORAPP_CHROMA;Barevnost (C) -TP_COLORAPP_CHROMA_M;Barevnost (M) +TP_COLORAPP_CHROMA_M;Pestrobarevnost (M) TP_COLORAPP_CHROMA_M_TOOLTIP;Pestrobarevnost se v CIECAM02 liší od pestrobarevnosti L*a*b* a RGB. TP_COLORAPP_CHROMA_S;Nasycení (S) TP_COLORAPP_CHROMA_S_TOOLTIP;Nasycení se v CIECAM02 liší od nasycení L*a*b* a RGB. @@ -1366,11 +1458,9 @@ TP_COLORAPP_CURVEEDITOR3;Barevná křivka TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Upravte barevnost, nasycení nebo pestrobarevnost.\n\nZobrazí histogram barevnosti (L*a*b*) před CIECAM02.\nPokud je volba "Zobrazit CIECAM02 histogramy výstupu v křivkách" povolena, zobrazí histogram C, S nebo M po CIECAM02 .\n\nC, S a M histogramy nejsou na hlavním panelu zobrazeny.\nHistogram konečného výsledku je zobrazen na hlavním panelu. TP_COLORAPP_DATACIE;CIECAM02 histogramy výstupu v křivkách 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_GAMUT;Kontrola gamutu (L*a*b*) +TP_COLORAPP_GAMUT_TOOLTIP;Povolí kontrolu gamutu v L*a*b* režimu. TP_COLORAPP_HUE;Odstín (h) TP_COLORAPP_HUE_TOOLTIP;Odstín (h) - úhel mezi 0° a 360°. TP_COLORAPP_LABEL;CIE model přizpůsobení barev 2002 @@ -1379,14 +1469,13 @@ TP_COLORAPP_LABEL_SCENE;Podmínky scény TP_COLORAPP_LABEL_VIEWING;Podmínky zobrazení 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_MEANLUMINANCE;Střední jas (Yb%) 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é 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-- -TP_COLORAPP_SHARPCIE_TOOLTIP;--nepoužito-- TP_COLORAPP_SURROUND;Okolí TP_COLORAPP_SURROUND_AVER;Průměrné TP_COLORAPP_SURROUND_DARK;Tmavé @@ -1406,11 +1495,9 @@ 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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolutní jas prostředí prohlížení\n(obvykle 16 cd/m²). 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é @@ -1422,6 +1509,27 @@ TP_COLORTONING_HIGHLIGHT;Světla 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_LABREGIONS;Oblasti oprav barvy +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Kanál +TP_COLORTONING_LABREGION_CHANNEL_ALL;Vše +TP_COLORTONING_LABREGION_CHANNEL_B;Modrá +TP_COLORTONING_LABREGION_CHANNEL_G;Zelená +TP_COLORTONING_LABREGION_CHANNEL_R;Červená +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Světlost +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Oprava +TP_COLORTONING_LABREGION_MASK;Maska +TP_COLORTONING_LABREGION_MASKBLUR;Maska neostrosti +TP_COLORTONING_LABREGION_OFFSET;Posun +TP_COLORTONING_LABREGION_POWER;Síla +TP_COLORTONING_LABREGION_SATURATION;Nasycení +TP_COLORTONING_LABREGION_SHOWMASK;Ukázat masku +TP_COLORTONING_LABREGION_SLOPE;Sklon 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. @@ -1461,20 +1569,26 @@ TP_CROP_GUIDETYPE;Druh vodítek: TP_CROP_H;Výška TP_CROP_LABEL;Ořez TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Vyznačit výřez +TP_CROP_RESETCROP;Obnovit +TP_CROP_SELECTCROP;Vybrat TP_CROP_W;Šířka -TP_CROP_X;X -TP_CROP_Y;Y +TP_CROP_X;Vlevo +TP_CROP_Y;Nahoře TP_DARKFRAME_AUTOSELECT;Automatický výběr TP_DARKFRAME_LABEL;Tmavý snímek TP_DEFRINGE_LABEL;Odstranění lemu TP_DEFRINGE_RADIUS;Poloměr TP_DEFRINGE_THRESHOLD;Práh +TP_DEHAZE_DEPTH;Hloubka +TP_DEHAZE_LABEL;Odstranění závoje +TP_DEHAZE_SHOW_DEPTH_MAP;Ukázat hloubkovou mapu +TP_DEHAZE_STRENGTH;Síla 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í @@ -1483,7 +1597,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Ručně\nOvlivňuje celý ob 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\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_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= - @@ -1491,22 +1605,22 @@ TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Velikost dlaždice=%1, Střed: Tx= 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_LABEL;Redukce šumu TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Ovládání jasu TP_DIRPYRDENOISE_LUMINANCE_CURVE;Křivka jasů -TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Jas - Detail +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Obnovení detailů TP_DIRPYRDENOISE_LUMINANCE_FRAME;Jas TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Jas -TP_DIRPYRDENOISE_MAIN_COLORSPACE;Metoda +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Barevný prostor TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* -TP_DIRPYRDENOISE_MAIN_COLORSPACE_LABEL;Redukce šumu 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;Kvalita -TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Vysoká -TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Běžná -TP_DIRPYRDENOISE_MAIN_MODE_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_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* @@ -1550,11 +1664,11 @@ TP_EPD_LABEL;Mapování tónů TP_EPD_REWEIGHTINGITERATES;Počet průchodů převážení TP_EPD_SCALE;Měřítko TP_EPD_STRENGTH;Síla -TP_EPD_TOOLTIP;Mapování tónů je dostupné v L*a*b* (standard) a CIECAM02 módu.\n\nV L*a*b* módu může být mapování tónů použito i pro zůstatkový obraz nástroje Vlnka\n\nPro zapnutí mapování tónů v CIECAM02 módu zapněte prosím následující volby:\n1. CIECAM02\n2. Algoritmus="Jas a pestrobarevnost (QM)"\n3. "Mapování tónů pomocí jasu CIECAM02 (Q)" TP_EXPOSURE_AUTOLEVELS;Automatické úrovně TP_EXPOSURE_AUTOLEVELS_TIP;Přepne provedení Automatické úrovně na automatickou sadu hodnot parametrů založených na analýze obrázku\nPokud to je nezbytné, povolí rekonstrukci světel. TP_EXPOSURE_BLACKLEVEL;Černá TP_EXPOSURE_BRIGHTNESS;Světlost +TP_EXPOSURE_CLAMPOOG;Oříznout barvy mimo gamut TP_EXPOSURE_CLIP;Oříznutí % TP_EXPOSURE_CLIP_TIP;Podíl klipujících bodů v automatických operacích úrovní. TP_EXPOSURE_COMPRHIGHLIGHTS;Komprese světel @@ -1565,6 +1679,8 @@ TP_EXPOSURE_CURVEEDITOR1;Tónová křivka 1 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 @@ -1591,10 +1707,6 @@ TP_FLATFIELD_BT_VERTICAL;Svisle TP_FLATFIELD_CLIPCONTROL;Kontrola oříznutí TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Kontrola oříznutí zabrání oříznutí světel po aplikaci Flat Field. Pokud byly světla oříznuta ještě před aplikací Flat field, může se objevit barevný nádech. TP_FLATFIELD_LABEL;Flat Field -TP_GAMMA_CURV;Gama -TP_GAMMA_FREE;Volná gama -TP_GAMMA_OUTPUT;Výstupní gama -TP_GAMMA_SLOP;Sklon (lineární) TP_GENERAL_11SCALE_TOOLTIP;Efekt tohoto nástroje je viditelný pouze při přiblížení 1:1. TP_GRADIENT_CENTER;Střed TP_GRADIENT_CENTER_X;Střed X @@ -1655,10 +1767,16 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;Uloží lineární TIFF obrázek před aplikování 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 vybrané DCP obsahuje tónovou křivku. TP_ICM_WORKINGPROFILE;Pracovní barevný prostor +TP_ICM_WORKING_TRC;Tónová křivka odezvy: +TP_ICM_WORKING_TRC_CUSTOM;Vlastní +TP_ICM_WORKING_TRC_GAMMA;Gama +TP_ICM_WORKING_TRC_NONE;Nic +TP_ICM_WORKING_TRC_SLOPE;Sklon +TP_ICM_WORKING_TRC_TOOLTIP;Pouze pro vložené profily. TP_IMPULSEDENOISE_LABEL;Redukce impulzního šumu TP_IMPULSEDENOISE_THRESH;Práh TP_LABCURVE_AVOIDCOLORSHIFT;Zabránit posunu barev -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Přizpůsobit barvy palety barevného pracovního prostoru a aplikovat Munsellovu korekci. +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Napasovat barvy do gamutu barevného pracovního prostoru a aplikovat Munsellovu korekci. TP_LABCURVE_BRIGHTNESS;Světlost TP_LABCURVE_CHROMATICITY;Barevnost TP_LABCURVE_CHROMA_TOOLTIP;Pro černobílé tónování nastavte barevnost na -100. @@ -1697,10 +1815,25 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Pracuje s posuvníkem barevnosti a CC křivkou. TP_LENSGEOM_AUTOCROP;Automatický ořez TP_LENSGEOM_FILL;Automatické vyplnění TP_LENSGEOM_LABEL;Objektiv / Geometrie +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automaticky +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP soubor +TP_LENSPROFILE_CORRECTION_MANUAL;Ručně 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_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ý. +TP_LENSPROFILE_MODE_HEADER;Výběr profilu objektivu: +TP_LENSPROFILE_USE_CA;Chromatická aberace +TP_LENSPROFILE_USE_GEOMETRIC;Geometrická +TP_LENSPROFILE_USE_HEADER;Vyberte zkreslení na opravu: +TP_LENSPROFILE_USE_VIGNETTING;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 @@ -1722,10 +1855,19 @@ TP_PREPROCESS_HOTPIXFILT;Filtr vypálených pixelů TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Zkusí potlačit vypálené pixely. TP_PREPROCESS_LABEL;Předzpracování TP_PREPROCESS_LINEDENOISE;Filtrovat linkové rušení +TP_PREPROCESS_LINEDENOISE_DIRECTION;Směr +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Oba +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Vodorovně +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Vodorovně pouze u PDAF řádků +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Svisle TP_PREPROCESS_NO_FOUND;Nic nenalezeno +TP_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek TP_PRSHARPENING_LABEL;Doostření po změně velikosti TP_PRSHARPENING_TOOLTIP;Obrázek po zmenšení doostří. Funguje pouze pokud je použita "Lanczos" metoda zmenšení. Náhled výsledku není v tomto nástroji možný. Podívejte se do RawPedie pro návod k použití. TP_RAWCACORR_AUTO;Automatická korekce +TP_RAWCACORR_AUTOIT;Počet průchodů +TP_RAWCACORR_AUTOIT_TOOLTIP;Toto nastavení je dostupné po zatržení volby "Automatická korekce".\nAutomatická korekce je konzervativní, což znamená, že často neodstraní úplně veškerou chromatickou aberaci..\nPro korekci zbývající chromatické aberace můžete použít až pěti opakování automatické korekce..\nKaždé opakování sníží zbývající chromatickou aberaci z předchozího běhu za cenu prodloužení celkového času zpracování. +TP_RAWCACORR_AVOIDCOLORSHIFT;Zabránit posunu barev TP_RAWCACORR_CABLUE;Modrá TP_RAWCACORR_CARED;Červená TP_RAWCACORR_CASTR;Síla @@ -1738,20 +1880,27 @@ TP_RAWEXPOS_BLACK_BLUE;Modrá TP_RAWEXPOS_BLACK_GREEN;Zelená TP_RAWEXPOS_BLACK_RED;Červená TP_RAWEXPOS_LINEAR;Korekce bílého bodu -TP_RAWEXPOS_PRESER;Zachování světel TP_RAWEXPOS_RGB;Červená, telená, modrá TP_RAWEXPOS_TWOGREEN;Spojit zelené -TP_RAW_1PASSMEDIUM;Jeden průchod (střední) -TP_RAW_3PASSBEST;Tři průchody (nejlepší) +TP_RAW_1PASSMEDIUM;Jeden průchod (Markesteijn) +TP_RAW_2PASS;Jeden průchod + rychlý +TP_RAW_3PASSBEST;Tři průchody (Markesteijn) +TP_RAW_4PASS;Tři průchody + rychlý TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Okraj TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;Vylepšení DCB TP_RAW_DCBITERATIONS;Počet průchodů DCB +TP_RAW_DCBVNG4;DCB+VNG4 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_DUALDEMOSAICAUTOCONTRAST;Automatický práh +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Pokud je zatrženo (doporučeno), RawTherapee vypočítá optimální hodnotu, jenž následně používá na ploché oblasti snímku.\nPokud není na snímku plochý region nebo je snímek příliš zašuměný bude hodnota nastavena na 0.\nPro ruční nastavení této hodnoty nejprve zrušte zatržení této volby (vhodné hodnoty závisí na hloubce ostrosti snímku). +TP_RAW_DUALDEMOSAICCONTRAST;Práh kontrastu TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Počet kroků potlačování chybných barev TP_RAW_FAST;Rychlá @@ -1760,7 +1909,7 @@ TP_RAW_HD_TOOLTIP;Nižší hodnoty učiní detekci vypálených/mrtvých bodů a 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 @@ -1768,56 +1917,42 @@ TP_RAW_LMMSE_TOOLTIP;Přidá gamu (krok 1) - přidá mediány (kroky 2, až 4) a TP_RAW_MONO;Mono TP_RAW_NONE;Žádná (zobrazí strukturu senzoru) TP_RAW_PIXELSHIFT;Pixel Shift -TP_RAW_PIXELSHIFTADAPTIVE;Přizpůsobivá detekce TP_RAW_PIXELSHIFTBLUR;Maska pohybové neostrosti -TP_RAW_PIXELSHIFTEPERISO;Přizpůsobení ISO -TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Výchozí hodnota 0 by měla dostačovat pro základní hodnoty ISO.\nDetekci pohybu na vyšších hodnotách ISO vylepšíte navýšením této hodnoty.\nZvyšujte po malých krocích a sledujte přitom masku pohybu. +TP_RAW_PIXELSHIFTDMETHOD;Metoda demozajkování pro pohyb +TP_RAW_PIXELSHIFTEPERISO;Citlivost +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Výchozí hodnota 0 by měla dobře fungovat u základní hodnoty ISO.\nVyšší hodnoty zvýší citlivost detekce pohybu.\nZvyšujte po malých krocích a sledujte přitom masku pohybu.\nZvyšte citlivost u podexponovaných snímků nebo snímků s vysokým ISO. TP_RAW_PIXELSHIFTEQUALBRIGHT;Vyrovnat jas snímků TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Korekce po kanálech TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Zapnuto: Nezávislá korekce jednotlivých RGB kanálů.\nVypnuto: Použije se stejná hodnota pro všechny kanály. TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Vyrovná jas ostatních snímků podle jasu vybraného snímku.\nPokud jsou ve snímku přeexponované oblasti, vyberte jasnější snímek abyste zamezili výskytu purpurové barvy v přeexponovaných oblastech nebo povolte korekci pohybu. -TP_RAW_PIXELSHIFTEXP0;Testovací TP_RAW_PIXELSHIFTGREEN;Kontrolovat zelený kanál na pohyb TP_RAW_PIXELSHIFTHOLEFILL;Vyplnit díry v masce pohybu TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Vyplnit díry v masce pohybu TP_RAW_PIXELSHIFTLMMSE;Použít LMMSE pro části s pohybem TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Pro oblasti s pohybem použít LMMSE namísto AMaZE.\nUžitečné pro fotografie s vysokým ISO. -TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 nový práh TP_RAW_PIXELSHIFTMEDIAN;Použít medián pro části s pohybem -TP_RAW_PIXELSHIFTMEDIAN3;Vyjmout vybraný snímek z mediánu -TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Vyjme vybraný snímek z mediánu.\nUžitečné, pokud se pohybující se objekty překrývají jen ve druhém a třetím. TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Pro oblasti s pohybem použijte medián všech snímků namísto vybraného.\nOdstraní objekty, které jsou na všech snímcích na různých místech.\nVytvoří efekt pohybu pro pomalu se pohybující (překrývající se) objekty. TP_RAW_PIXELSHIFTMM_AUTO;Automatická TP_RAW_PIXELSHIFTMM_CUSTOM;Vlastní TP_RAW_PIXELSHIFTMM_OFF;Vypnuto -TP_RAW_PIXELSHIFTMOTION;Úroveň kontroly pohybu (zastaralé) -TP_RAW_PIXELSHIFTMOTIONCORRECTION;Míra korekce pohybu v zelené TP_RAW_PIXELSHIFTMOTIONMETHOD;Korekce pohybu TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 znamená bez detekce pohybu.\n1 - 99 znamená, že pohybu bude detekován dle této hodnoty. Pro zvýšení míry detekce použijte vyšší hodnotu.\n100 znamená, že bude použito AMaZE demozajkování snímku. -TP_RAW_PIXELSHIFTNONGREENAMAZE;Kontrolovat červené/modré AMaZE TP_RAW_PIXELSHIFTNONGREENCROSS;Kontrolovat pohyb v červeném a modrém kanálu -TP_RAW_PIXELSHIFTNONGREENCROSS2;Kontrolovat zelené AMaZE -TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Kontrolovat červenou/modrou vodorovně -TP_RAW_PIXELSHIFTNONGREENVERTICAL;Kontrolovat červenou/modrou svisle -TP_RAW_PIXELSHIFTNREADISO;nRead -TP_RAW_PIXELSHIFTPRNU;PRNU (%) -TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Váha červené a modré TP_RAW_PIXELSHIFTSHOWMOTION;Ukázat masku pohybu TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Ukázat pouze masku pohybu TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Ukázat masku pohybu bez obrázku. -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Překryje obrázek maskou, která ukazuje oblasti s pohybem. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Překryje obrázek zelenou maskou, která ukazuje oblasti s pohybem. TP_RAW_PIXELSHIFTSIGMA;Poloměr rozostření TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Výchozí poloměr 1,0 většinou velmi dobře funguje pro základní ISO.\nU snímků s vysokým ISO poloměr zvětšete. Hodnota 5,0 je dobrým výchozím bodem.\nBěhem změny hodnoty sledujte masku pohybu. TP_RAW_PIXELSHIFTSMOOTH;Hladké přechody TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Vyhlazení přechodů mezi oblastmi s pohybem a bez pohybu.\nNastavte na 0 pro vypnutí vyhlazování přechodů.\nNastavte na 1 pro získání AMaZE/LMMSE výsledku pro vybraný snímek (závisí na tom, zda je vybrána volba "Použít LMMSE") nebo mediánu všech čtyř snímků (pokud je vybrána volba "Použít medián"). -TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev faktor modrý -TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev faktor zelený -TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev faktor červený TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 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_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ší.\n+rychlá vytváří méně artefaktů v plochých oblastech TP_RAW_SENSOR_XTRANS_LABEL;Senzory s X-Trans maticí TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Povolit zvětšení TP_RESIZE_APPLIESTO;Aplikovat na: TP_RESIZE_CROPPEDAREA;Oblast ořezu TP_RESIZE_FITBOX;Výřez @@ -1832,10 +1967,10 @@ TP_RESIZE_SCALE;Měřítko TP_RESIZE_SPECIFY;Zvolte: TP_RESIZE_W;Šířka: TP_RESIZE_WIDTH;Šířka -TP_RETINEX_CONTEDIT_HSL;HSV korekce histogramu -TP_RETINEX_CONTEDIT_LAB;Histogram korekce L*a*b* -TP_RETINEX_CONTEDIT_LH;Korekce odstínu -TP_RETINEX_CONTEDIT_MAP;Korekce masky +TP_RETINEX_CONTEDIT_HSL;HSL histogram +TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +TP_RETINEX_CONTEDIT_LH;Odstín +TP_RETINEX_CONTEDIT_MAP;Korekce TP_RETINEX_CURVEEDITOR_CD;L=f(L) TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Jas dle jasu L=f(L).\nUpraví raw data pro snížení výskytu halo efektu a vzniku artefaktů. TP_RETINEX_CURVEEDITOR_LH;Síla=f(O) @@ -1847,7 +1982,7 @@ TP_RETINEX_FREEGAMMA;Volná gama TP_RETINEX_GAIN;Zisk TP_RETINEX_GAINOFFS;Zisk a posun (jasu) TP_RETINEX_GAINTRANSMISSION;Přenos zisku -TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Zesílí nebo zeslabí mapu přenosu pro dosažení jasu.\nÚsečka: přenos -min od 0. průměr. a hodnot (max).\nPořadnice: zisk. +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Zesílí nebo zeslabí mapu přenosu pro dosažení požadovaného jasu.\nOsa X je přenos.\nOsa Y je zisk. TP_RETINEX_GAIN_TOOLTIP;Působí na obnovený obrázek.\n\nToto je velmi odlišné od ostatních nastavení. Použito pro černé nebo bílé pixely a pro vyvážení histogramu. TP_RETINEX_GAMMA;Gama TP_RETINEX_GAMMA_FREE;Volná @@ -1873,7 +2008,7 @@ TP_RETINEX_LABEL;Retinex TP_RETINEX_LABEL_MASK;Maska TP_RETINEX_LABSPACE;L*a*b* TP_RETINEX_LOW;Slabé -TP_RETINEX_MAP;Metoda masky +TP_RETINEX_MAP;Metoda TP_RETINEX_MAP_GAUS;Gaussova maska TP_RETINEX_MAP_MAPP;Ostrá maska (částečná vlnka) TP_RETINEX_MAP_MAPT;Ostrá maska (kompletní vlnka) @@ -1936,6 +2071,7 @@ TP_SHARPENEDGE_LABEL;Hrany TP_SHARPENEDGE_PASSES;Počet průchodů TP_SHARPENEDGE_THREE;Pouze jas TP_SHARPENING_AMOUNT;Míra +TP_SHARPENING_CONTRAST;Práh kontrastu TP_SHARPENING_EDRADIUS;Poloměr TP_SHARPENING_EDTOLERANCE;Tolerance k hranám TP_SHARPENING_HALOCONTROL;Omezení halo efektu @@ -1951,12 +2087,16 @@ TP_SHARPENING_RLD_ITERATIONS;Počet průchodů TP_SHARPENING_THRESHOLD;Práh TP_SHARPENING_USM;Maskování rozostření TP_SHARPENMICRO_AMOUNT;Kvantita +TP_SHARPENMICRO_CONTRAST;Práh kontrastu TP_SHARPENMICRO_LABEL;Mikrokontrast TP_SHARPENMICRO_MATRIX;Matice 3×3 namísto 5×5 TP_SHARPENMICRO_UNIFORMITY;Jednolitost +TP_SOFTLIGHT_LABEL;Měkké světlo +TP_SOFTLIGHT_STRENGTH;Síla TP_TM_FATTAL_AMOUNT;Míra -TP_TM_FATTAL_LABEL;HDR Mapování tónů -TP_TM_FATTAL_THRESHOLD;Práh +TP_TM_FATTAL_ANCHOR;Kotva +TP_TM_FATTAL_LABEL;Komprese dynamického rozsahu +TP_TM_FATTAL_THRESHOLD;Detaily TP_VIBRANCE_AVOIDCOLORSHIFT;Zabránit posunu barev TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tóny pleti @@ -2023,7 +2163,7 @@ TP_WAVELET_COMPGAMMA;Komprese gamy TP_WAVELET_COMPGAMMA_TOOLTIP;Úprava gamy zůstatku obrázku vám umožní vyvážit data a histogram. TP_WAVELET_COMPTM;Mapování tónů TP_WAVELET_CONTEDIT;Křivka kontrastu 'Po' -TP_WAVELET_CONTR;Paleta +TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Kontrast TP_WAVELET_CONTRAST_MINUS;Kontrast - TP_WAVELET_CONTRAST_PLUS;Kontrast + @@ -2031,7 +2171,7 @@ TP_WAVELET_CONTRA_TOOLTIP;Změní kontrast zůstatku obrazu. TP_WAVELET_CTYPE;Ovládání barevnosti TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Mění lokální kontrast jako funkci originálního lokálního kontrastu(úsečka).\nNízké hodnoty na úsečce představují malý lokální kontrast (skutečné hodnoty okolo 10..20).\n50% z úsečky představuje průměrný lokální kontrast (skutečné hodnoty okolo 100..300).\n66% z úsečky představuje představuje standardní odchylku lokálního kontrastu (skutečné hodnoty okolo 300..800).\n100% z úsečky představuje maximální lokální kontrast (skutečné hodnoty okolo 3000..8000). TP_WAVELET_CURVEEDITOR_CH;Kontrast úrovní=f(Barevnost) -TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Mění kontrast každé úrovně jako funkci odstínu.\nDejte pozor, abyste nepřepsali změny udělané v podnástroji Paleta nástroje Odstín.\nZměny křivky se projeví pouze v případě, že posuvníky kontrastu úrovní vlnky nejsou nastaveny na nulu. +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Mění kontrast každé úrovně jako funkci odstínu.\nDejte pozor, abyste nepřepsali změny udělané v podnástroji Gamut nástroje Odstín.\nZměny křivky se projeví pouze v případě, že posuvníky kontrastu úrovní vlnky nejsou nastaveny na nulu. TP_WAVELET_CURVEEDITOR_CL;L TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Aplikuje finální křivku kontrastu jasů na konci zpracování vlnky. TP_WAVELET_CURVEEDITOR_HH;HH @@ -2049,7 +2189,7 @@ TP_WAVELET_DTHR;Napříč TP_WAVELET_DTWO;Vodorovně TP_WAVELET_EDCU;Křivka TP_WAVELET_EDGCONT;Místní kontrast -TP_WAVELET_EDGCONT_TOOLTIP;Posunutí bodů doleva snižuje kontrast a posunutí bodů doprava jej zvyšuje.\nRohy levý spodní, levý horní, pravý horní, pravý spodní postupně představují místní kontrast pro nízké hodnoty, průměr, průměr + stdev maximum +TP_WAVELET_EDGCONT_TOOLTIP;Posunutí bodů doleva snižuje kontrast a posunutí bodů doprava jej zvyšuje.\nRohy levý spodní, levý horní, pravý horní, pravý spodní postupně představují místní kontrast pro nízké hodnoty, průměr, průměr + stdev a maximum. TP_WAVELET_EDGE;Doostření hran TP_WAVELET_EDGEAMPLI;Základní zesílení TP_WAVELET_EDGEDETECT;Sklon citlivosti @@ -2060,7 +2200,7 @@ TP_WAVELET_EDGEDETECT_TOOLTIP;Posunutím posuvníku vpravo zvýšíte citlivost TP_WAVELET_EDGESENSI;Citlivost detekce hran TP_WAVELET_EDGREINF_TOOLTIP;Zesílení nebo zeslabení vlivu první úrovně, v porovnání se druhou úrovní. Ostatní úrovně zůstanou nezměněny. TP_WAVELET_EDGTHRESH;Detaily -TP_WAVELET_EDGTHRESH_TOOLTIP;Změní rozložení mezi prvními a ostatními úrovněmi. Čím větší práh, tím větší je význam prvních úrovní. Dejte si pozor na záporné hodnoty. Ty zvětšují efekt vyšších úrovní a mohou způsobit vznik artefaktů. +TP_WAVELET_EDGTHRESH_TOOLTIP;Změní rozložení mezi prvními a ostatními úrovněmi. Čím větší práh, tím větší je význam prvních úrovní. Dejt e si pozor na záporné hodnoty. Ty zvětšují efekt vyšších úrovní a mohou způsobit vznik artefaktů TP_WAVELET_EDRAD;Poloměr TP_WAVELET_EDRAD_TOOLTIP;Toto nastavení poloměru se velmi liší od ostatních nástrojů doostření. Jeho hodnota je pomocí komplexní funkce porovnána s každou úrovní. To znamená, že i nastavení hodnoty na nulu má na úrovně vliv. TP_WAVELET_EDSL;Práh posuvníků @@ -2178,13 +2318,14 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Metoda +TP_WBALANCE_PICKER;Nabrat TP_WBALANCE_SHADE;Stín TP_WBALANCE_SIZE;Rozměr: TP_WBALANCE_SOLUX35;Solux 3500K TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -TP_WBALANCE_SPOTWB;Bodové vyvážení +TP_WBALANCE_SPOTWB;Použijte pipetu pro nabrání vyvážení bílé z neutrální oblasti v náhledu. TP_WBALANCE_TEMPBIAS;AVB - Zdůraznění teploty TP_WBALANCE_TEMPBIAS_TOOLTIP;Dovolí ovlivnit výpočet "automatického vyvážení bílé"\nzdůrazněním teplejší nebo chladnější teploty. Toto zdůraznění\nje vyjádřeno v procentech vypočtené teploty a výsledek\nlze vyjádřit vzorcem "vypočtenáTeplota + vypočtenáTeplota * zdůraznění". TP_WBALANCE_TEMPERATURE;Teplota @@ -2195,8 +2336,8 @@ TP_WBALANCE_WATER_HEADER;Pod vodou 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: - @@ -2204,37 +2345,8 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: - ! 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 -!GENERAL_SLIDER;Slider -!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_493;L*a*b* Adjustments -!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 -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!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_EDITORCMDLINE;Custom command line -!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_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_PIXELSHIFTONEGREEN;Use one green instead of average -!TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use one green instead of averaging two greens for regions without motion. +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!TP_RAW_IMAGENUM_SN;SN mode +!TP_SHARPENING_BLUR;Blur radius diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index e5f193f6c..ff3c2a8e4 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -1,6 +1,5 @@ #01 2009-06-27 krengbo -ADJUSTER_RESET_TO_DEFAULT;Nulstil til standard CURVEEDITOR_LINEAR;Lineær CURVEEDITOR_LOADDLGLABEL;Indlæs kurve... CURVEEDITOR_SAVEDLGLABEL;Gem kurve... @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Skarphed PARTIALPASTE_VIGNETTING;Vignettering PARTIALPASTE_WHITEBALANCE;Hvidbalance PREFERENCES_APPLNEXTSTARTUP;Anvendes ved næste opstart -PREFERENCES_CACHECLEARALL;Ryd alt -PREFERENCES_CACHECLEARPROFILES;Ryd profiler -PREFERENCES_CACHECLEARTHUMBS;Ryd miniaturer PREFERENCES_CACHEMAXENTRIES;Maksimalt antal indskrivninger i cache PREFERENCES_CACHEOPTS;Cache-indstillinger PREFERENCES_CACHETHUMBHEIGHT;Maksimal miniaturehøjde @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Gem bearbejdningsparametre i cache PREFERENCES_PROFILESAVEINPUT;Gem bearbejdningsparametre sammen med input-filen PREFERENCES_PSPATH;Installationsmappe til Adobe Photoshop PREFERENCES_SELECTLANG;Vælg sprog -PREFERENCES_SELECTTHEME;Vælg tema PREFERENCES_SHOWBASICEXIF;Vis grundlæggende exif-data PREFERENCES_SHOWDATETIME;Vis dato og tid PREFERENCES_SHTHRESHOLD;Tærskel for udbrændte skygger @@ -335,7 +330,6 @@ TP_CROP_GTRULETHIRDS;Reglen om tredjedele TP_CROP_GUIDETYPE;Hjælpelinjer: TP_CROP_H;H TP_CROP_LABEL;Beskær -TP_CROP_SELECTCROP; Vælg beskæring TP_CROP_W;B TP_CROP_X;x TP_CROP_Y;y @@ -410,7 +404,6 @@ TP_WBALANCE_METHOD;Metode TP_WBALANCE_SIZE;Størrelse: TP_WBALANCE_SPOTWB;Mål WB TP_WBALANCE_TEMPERATURE;Temperatur -ADJUSTER_RESET_TO_DEFAULT;Nulstil til standard !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. @@ -421,6 +414,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -430,9 +424,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -449,6 +444,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -459,6 +458,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -499,8 +499,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -557,7 +557,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -569,16 +569,19 @@ TP_WBALANCE_TEMPERATURE;Temperatur !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -623,12 +626,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -732,9 +734,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -770,7 +772,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -785,8 +787,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -889,7 +891,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -969,19 +971,103 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1007,16 +1093,13 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1032,27 +1115,30 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1071,8 +1157,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 @@ -1081,6 +1169,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1099,19 +1188,22 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1123,18 +1215,18 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1142,16 +1234,17 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1167,7 +1260,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1176,14 +1268,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1215,12 +1304,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1228,22 +1312,21 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1257,43 +1340,31 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1313,12 +1384,15 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1328,8 +1402,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1337,13 +1411,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1370,9 +1443,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1403,11 +1475,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1418,8 +1486,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1437,8 +1506,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1450,14 +1517,13 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1477,11 +1543,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1493,6 +1557,27 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1525,11 +1610,17 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1609,13 +1700,15 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1641,10 +1734,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1691,6 +1780,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1733,10 +1828,16 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1767,10 +1868,19 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1783,19 +1893,26 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1803,7 +1920,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1811,58 +1929,42 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1871,10 +1973,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1886,7 +1988,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1912,7 +2014,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1964,13 +2066,19 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2060,7 +2168,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2071,7 +2179,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2183,6 +2291,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2197,7 +2306,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index f502e61cc..847aaa1f6 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -36,7 +36,7 @@ #35 2017-02-18 AWB bias (TooWaBoo) RT 5.0 r1 #36 2017-02-23 Korrekturen (TooWaBoo) RT 5.0 r1 #37 2017-03-06 Dynamisches Profil (TooWaBoo) RT 5.0 r1 -#38 2017-03-26 Pixel Shift (TooWaBoo) RT 5.0 r1 +#38 2017-03-26 Pixel-Shift (TooWaBoo) RT 5.0 r1 #39 06.04.2017 Fast Export (TooWaBoo) RT 5.0 r1 #40 30.04.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1 #41 03.05.2017 Erweiterung/Korrekturen (TooWaBoo) RT 5.0 r1 @@ -49,24 +49,55 @@ #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 +#54 30.03.2018 Erweiterung (TooWaBoo) RT 5.4 +#55 06.04.2018 Erweiterung (TooWaBoo) RT 5.4 +#56 27.04.2018 Erweiterung (TooWaBoo) RT 5.4 +#57 17.05.2018 Erweiterung (TooWaBoo) RT 5.4 +#58 19.05.2018 Erweiterung (TooWaBoo) RT 5.4 +#59 29.05.2018 Erweiterung (TooWaBoo) RT 5.4 +#60 14.06.2018 Erweiterung (TooWaBoo) RT 5.4 +#61 14.06.2018 Korrektur (TooWaBoo) RT 5.4 +#62 22.06.2018 Korrektur (TooWaBoo) RT 5.4 +#63 24.06.2018 DCB/RCD+VNG4 (TooWaBoo) RT 5.4 +#64 24.06.2018 Erweiterung/Korrektur (TooWaBoo) RT 5.4 +#65 25.06.2018 Korrekturen (TooWaBoo) RT 5.4 +#66 04.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#67 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#68 05.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#69 25.07.2018 Erweiterung (TooWaBoo) RT 5.4 +#70 25.07.2018 Korrekturen (TooWaBoo) RT 5.4 +#71 28.09.2018 Korrekturen (TooWaBoo) RT 5.5 +#72 05.10.2018 Korrekturen (TooWaBoo) RT 5.5 +#73 21.11.2018 Erweiterung (TooWaBoo) RT 5.5 +#74 24.11.2018 Erweiterung (TooWaBoo) RT 5.5 +#75 02.12.2018 Erweiterung (TooWaBoo) RT 5.5 +#76 11.12.2018 Erweiterung (TooWaBoo) RT 5.5 +#77 16.12.2018 Korrektur Farbwähler-Tooltip (TooWaBoo) RT 5.5 +#78 19.01.2019 Erweiterung (TooWaBoo) RT 5.5 +#79 24.02.2019 Erweiterung (TooWaBoo) RT 5.5 ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Danksagungen ABOUT_TAB_LICENSE;Lizenz ABOUT_TAB_RELEASENOTES;Versionshinweise ABOUT_TAB_SPLASH;Startbild -ADJUSTER_RESET_TO_DEFAULT;Standard wiederherstellen +ADJUSTER_RESET_TO_DEFAULT;Klick - Auf Standardwert zurücksetzen.\nStrg + Klick - Auf Initialwert zurücksetzen. 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: CURVEEDITOR_AXIS_OUT;y: CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Flexibel CURVEEDITOR_CURVE;Kurve CURVEEDITOR_CURVES;Kurven -CURVEEDITOR_CUSTOM;Angepasst +CURVEEDITOR_CUSTOM;Standard CURVEEDITOR_DARKS;Tiefen CURVEEDITOR_EDITPOINT_HINT;Bearbeitung der Kurvenpunkte über Zahlenwerte.\n\nRechtsklick auf einen Kurvenpunkt um ihn auszuwählen.\nRechtsklick in einen leeren Bereich um ihn abzuwählen. CURVEEDITOR_HIGHLIGHTS;Spitzlichter @@ -78,11 +109,11 @@ CURVEEDITOR_NURBS;NURBS-Kurve CURVEEDITOR_PARAMETRIC;Parametrisch CURVEEDITOR_SAVEDLGLABEL;Kurve speichern... CURVEEDITOR_SHADOWS;Schatten -CURVEEDITOR_TOOLTIPCOPY;Kurve in Zwischenablage kopieren -CURVEEDITOR_TOOLTIPLINEAR;Kurve zurücksetzen -CURVEEDITOR_TOOLTIPLOAD;Kurve laden -CURVEEDITOR_TOOLTIPPASTE;Kurve aus Zwischenablage einfügen -CURVEEDITOR_TOOLTIPSAVE;Kurve speichern +CURVEEDITOR_TOOLTIPCOPY;Kurve in Zwischenablage kopieren. +CURVEEDITOR_TOOLTIPLINEAR;Kurve zurücksetzen. +CURVEEDITOR_TOOLTIPLOAD;Kurve laden. +CURVEEDITOR_TOOLTIPPASTE;Kurve aus Zwischenablage einfügen. +CURVEEDITOR_TOOLTIPSAVE;Kurve speichern. CURVEEDITOR_TYPE;Typ: DIRBROWSER_FOLDERS;Ordner DONT_SHOW_AGAIN;Meldung nicht mehr anzeigen. @@ -90,19 +121,24 @@ DYNPROFILEEDITOR_DELETE;Löschen DYNPROFILEEDITOR_EDIT;Ändern DYNPROFILEEDITOR_EDIT_RULE;Profilregel ändern DYNPROFILEEDITOR_ENTRY_TOOLTIP;Groß-/Kleinschreibung wird NICHT berücksichtigt.\nFür einen regulären Ausdruck benutzen Sie bitte\n"re:" als Prefix. +DYNPROFILEEDITOR_IMGTYPE_ANY;Alle +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel-Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard DYNPROFILEEDITOR_MOVE_DOWN;Runter DYNPROFILEEDITOR_MOVE_UP;Hoch DYNPROFILEEDITOR_NEW;Neu DYNPROFILEEDITOR_NEW_RULE;Profilregel erstellen DYNPROFILEEDITOR_PROFILE;Profil EDITWINDOW_TITLE;Bildbearbeitung -EDIT_OBJECT_TOOLTIP;Schaltet das Einstellungswerkzeug\nim Vorschaubild ein/aus +EDIT_OBJECT_TOOLTIP;Schaltet das Einstellungswerkzeug\nim Vorschaubild ein/aus. EDIT_PIPETTE_TOOLTIP;Um einen Punkt der Kurve hinzuzufügen, halten Sie die Strg-Taste gedrückt und klicken mit der linke Maustaste auf die gewünschte Stelle in der Vorschau.\nUm den Punkt anzupassen, halten Sie die Strg-Taste gedrückt und klicken Sie mit der linken Maustaste auf den entsprechenden Bereich in der Vorschau. Dann lassen Sie die Strg-Taste los (es sei denn, Sie möchten eine Feineinstellung vornehmen) und bewegen die Maus bei gedrückter linker Maustaste nach oben oder unten, um den Punkt auf der Kurve zu bewegen. EXIFFILTER_APERTURE;Blende EXIFFILTER_CAMERA;Kamera EXIFFILTER_EXPOSURECOMPENSATION;Belichtungskorrektur (EV) EXIFFILTER_FILETYPE;Dateityp EXIFFILTER_FOCALLEN;Brennweite +EXIFFILTER_IMAGETYPE;Bildtyp EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Objektiv EXIFFILTER_METADATAFILTER;Metadatenfilter einschalten @@ -128,15 +164,15 @@ EXPORT_BYPASS_DEFRINGE;Farbsaum entfernen überspringen EXPORT_BYPASS_DIRPYRDENOISE;Rauschreduzierung überspringen EXPORT_BYPASS_DIRPYREQUALIZER;Detailebenenkontrast überspringen EXPORT_BYPASS_EQUALIZER;Waveletebenen überspringen -EXPORT_BYPASS_RAW_CA;CA-Korrektur überspringen [RAW] -EXPORT_BYPASS_RAW_CCSTEPS;Falschfarbenreduzierung überspringen\n[RAW] -EXPORT_BYPASS_RAW_DCB_ENHANCE;DCB-Verbesserungsstufen überspringen\n[RAW] -EXPORT_BYPASS_RAW_DCB_ITERATIONS;DCB-Interationen überspringen [RAW] -EXPORT_BYPASS_RAW_DF;Dunkelbild überspringen [RAW] -EXPORT_BYPASS_RAW_FF;Weißbild überspringen [RAW] -EXPORT_BYPASS_RAW_GREENTHRESH;Grün-Ausgleich überspringen [RAW] -EXPORT_BYPASS_RAW_LINENOISE;Zeilenrauschfilter überspringen [RAW] -EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;LMMSE-Verbesserungsstufen überspringen [RAW] +EXPORT_BYPASS_RAW_CA;CA-Korrektur überspringen +EXPORT_BYPASS_RAW_CCSTEPS;Falschfarbenreduzierung überspringen +EXPORT_BYPASS_RAW_DCB_ENHANCE;DCB-Verbesserungsstufen überspringen +EXPORT_BYPASS_RAW_DCB_ITERATIONS;DCB-Interationen überspringen +EXPORT_BYPASS_RAW_DF;Dunkelbild überspringen +EXPORT_BYPASS_RAW_FF;Weißbild überspringen +EXPORT_BYPASS_RAW_GREENTHRESH;Grün-Ausgleich überspringen +EXPORT_BYPASS_RAW_LINENOISE;Zeilenrauschfilter überspringen +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;LMMSE-Verbesserungsstufen überspringen EXPORT_BYPASS_SHARPENEDGE;Kantenschärfung überspringen EXPORT_BYPASS_SHARPENING;Schärfung überspringen EXPORT_BYPASS_SHARPENMICRO;Mikrokontrast überspringen @@ -149,7 +185,7 @@ EXPORT_PIPELINE;Verarbeitungspipeline EXPORT_PUTTOQUEUEFAST; Zur Warteschlange “Schneller Export“ hinzufügen EXPORT_RAW_DMETHOD;Demosaikmethode EXPORT_USE_FAST_PIPELINE;Priorität Geschwindigkeit -EXPORT_USE_FAST_PIPELINE_TIP;Wendet alle Bearbeitungsschritte, im Gegensatz\nzu „Standard“ , auf das bereits skalierte Bild an.\nDadurch steigt die Verarbeitungsgeschwindigkeit\nauf Kosten der Qualität. +EXPORT_USE_FAST_PIPELINE_TIP;Wendet alle Bearbeitungsschritte, im Gegensatz\nzu „Standard“, auf das bereits skalierte Bild an.\nDadurch steigt die Verarbeitungsgeschwindigkeit\nauf Kosten der Qualität. EXPORT_USE_NORMAL_PIPELINE;Standard EXTPROGTARGET_1;RAW EXTPROGTARGET_2;Stapelverarbeitung beendet @@ -158,11 +194,11 @@ FILEBROWSER_APPLYPROFILE;Profil anwenden FILEBROWSER_APPLYPROFILE_PARTIAL;Profil selektiv anwenden FILEBROWSER_AUTODARKFRAME;Automatisches Dunkelbild FILEBROWSER_AUTOFLATFIELD;Automatisches Weißbild -FILEBROWSER_BROWSEPATHBUTTONHINT;Ausgewählter Pfad öffnen +FILEBROWSER_BROWSEPATHBUTTONHINT;Ausgewählten Pfad öffnen. FILEBROWSER_BROWSEPATHHINT;Einen Pfad eingeben:\nTaste:\nStrg + o Setzt den Cursor in das Eingabefeld\nEnter Öffnet den Pfad\nEsc Änderungen verwerfen\nUmschalt + Esc Eingabefeld verlassen\n\nSchnellnavigation:\nTaste:\n~ “Home“-Verzeichnis des Benutzers\n! Bilder-Verzeichnis des Benutzers FILEBROWSER_CACHE;Festplatten-Cache -FILEBROWSER_CACHECLEARFROMFULL;Aus dem Festplatten-Cache entfernen (vollständig) -FILEBROWSER_CACHECLEARFROMPARTIAL;Aus dem Festplatten-Cache entfernen (teilweise) +FILEBROWSER_CACHECLEARFROMFULL;Alle zwischengespeicherte Profile löschen +FILEBROWSER_CACHECLEARFROMPARTIAL;Alle NICHT zwischengespeicherte Profile löschen FILEBROWSER_CLEARPROFILE;Profil löschen FILEBROWSER_COLORLABEL_TOOLTIP;Farbmarkierung\n\nTaste: Strg + Umschalt + 0 Ohne\nTaste: Strg + Umschalt + 1 Rot\nTaste: Strg + Umschalt + 2 Gelb\nTaste: Strg + Umschalt + 3 Grün\nTaste: Strg + Umschalt + 4 Blau\nTaste: Strg + Umschalt + 5 Violett FILEBROWSER_COPYPROFILE;Profil kopieren @@ -213,7 +249,7 @@ FILEBROWSER_POPUPSELECTALL;Alle auswählen FILEBROWSER_POPUPTRASH;In den Papierkorb verschieben FILEBROWSER_POPUPUNRANK;Bewertung entfernen FILEBROWSER_POPUPUNTRASH;Aus dem Papierkorb wiederherstellen -FILEBROWSER_QUERYBUTTONHINT;Suchfilter zurücksetzen +FILEBROWSER_QUERYBUTTONHINT;Suchfilter zurücksetzen. FILEBROWSER_QUERYHINT;Nur Dateien anzeigen, deren Namen die angegebene Zeichenkette beinhalten.\n\nTaste:\nStrg + f Setzt den Cursor in das Suchfeld\nEnter Suche starten\nEsc Suchfeld löschen\nUmschalt + Esc Suchfeldfeld verlassen FILEBROWSER_QUERYLABEL; Suche: FILEBROWSER_RANK1_TOOLTIP;Bewertung 1 *\nTaste: Umschalt + 1 @@ -225,31 +261,31 @@ FILEBROWSER_RENAMEDLGLABEL;Datei umbenennen FILEBROWSER_RESETDEFAULTPROFILE;Profil auf Vorgabe zurücksetzen FILEBROWSER_SELECTDARKFRAME;Dunkelbild wählen... FILEBROWSER_SELECTFLATFIELD;Weißbild wählen... -FILEBROWSER_SHOWCOLORLABEL1HINT;Nur rot markierte Bilder anzeigen\nTaste: Alt + 1 -FILEBROWSER_SHOWCOLORLABEL2HINT;Nur gelb markierte Bilder anzeigen\nTaste: Alt + 2 -FILEBROWSER_SHOWCOLORLABEL3HINT;Nur grün markierte Bilder anzeigen\nTaste: Alt + 3 -FILEBROWSER_SHOWCOLORLABEL4HINT;Nur blau markierte Bilder anzeigen\nTaste: Alt + 4 -FILEBROWSER_SHOWCOLORLABEL5HINT;Nur violett markierte Bilder anzeigen\nTaste: Alt + 5 -FILEBROWSER_SHOWDIRHINT;Alle Filter zurücksetzen\nTaste: d -FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen\nTaste: 7 -FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen\nTaste: 6 -FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i -FILEBROWSER_SHOWNOTTRASHHINT;Nur nicht gelöschte Bilder anzeigen +FILEBROWSER_SHOWCOLORLABEL1HINT;Nur rot markierte Bilder anzeigen.\nTaste: Alt + 1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Nur gelb markierte Bilder anzeigen.\nTaste: Alt + 2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Nur grün markierte Bilder anzeigen.\nTaste: Alt + 3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Nur blau markierte Bilder anzeigen.\nTaste: Alt + 4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Nur violett markierte Bilder anzeigen.\nTaste: Alt + 5 +FILEBROWSER_SHOWDIRHINT;Alle Filter zurücksetzen.\nTaste: d +FILEBROWSER_SHOWEDITEDHINT;Nur bearbeitete Bilder anzeigen.\nTaste: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Nur unbearbeitete Bilder anzeigen.\nTaste: 6 +FILEBROWSER_SHOWEXIFINFO;Bildinformationen ein-/ausblenden.\n\nIm Multi-Reitermodus:\nTaste: i\nIm Ein-Reitermodus:\nTaste: Alt + i +FILEBROWSER_SHOWNOTTRASHHINT;Nur nicht gelöschte Bilder anzeigen. FILEBROWSER_SHOWORIGINALHINT;Zeige nur das Originalbild.\n\nWenn mehrere Bilder mit dem gleichen Dateinamen und unterschiedlichen Dateitypen existieren, ist das Originalbild das Bild, welches in der Liste "Dateitypen anzeigen" unter Einstellungen > Dateiverwaltung als erstes gefunden wird. -FILEBROWSER_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen\nTaste: 1 -FILEBROWSER_SHOWRANK2HINT;Nur mit 2 Sternen bewertete Bilder anzeigen\nTaste: 2 -FILEBROWSER_SHOWRANK3HINT;Nur mit 3 Sternen bewertete Bilder anzeigen\nTaste: 3 -FILEBROWSER_SHOWRANK4HINT;Nur mit 4 Sternen bewertete Bilder anzeigen\nTaste: 4 -FILEBROWSER_SHOWRANK5HINT;Nur mit 5 Sternen bewertete Bilder anzeigen\nTaste: 5 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;Nur gespeicherte Bilder anzeigen\nTaste: Alt + 7 -FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Nur nicht gespeicherte Bilder anzeigen\nTaste: Alt + 6 -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_SHOWRANK1HINT;Nur mit 1 Stern bewertete Bilder anzeigen.\nTaste: 1 +FILEBROWSER_SHOWRANK2HINT;Nur mit 2 Sternen bewertete Bilder anzeigen.\nTaste: 2 +FILEBROWSER_SHOWRANK3HINT;Nur mit 3 Sternen bewertete Bilder anzeigen.\nTaste: 3 +FILEBROWSER_SHOWRANK4HINT;Nur mit 4 Sternen bewertete Bilder anzeigen.\nTaste: 4 +FILEBROWSER_SHOWRANK5HINT;Nur mit 5 Sternen bewertete Bilder anzeigen.\nTaste: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Nur gespeicherte Bilder anzeigen.\nTaste: Alt + 7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Nur nicht gespeicherte Bilder anzeigen.\nTaste: Alt + 6 +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_THUMBSIZE;Miniaturbildgröße -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 - +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 - FILECHOOSER_FILTER_ANY;Alle Dateien FILECHOOSER_FILTER_COLPROF;Farbprofile FILECHOOSER_FILTER_CURVE;Kurvendateien @@ -265,29 +301,34 @@ GENERAL_AUTO;Automatisch GENERAL_BEFORE;Vorher GENERAL_CANCEL;Abbrechen GENERAL_CLOSE;Schließen +GENERAL_CURRENT;Aktuell GENERAL_DISABLE;Deaktivieren GENERAL_DISABLED;Deaktiviert GENERAL_ENABLE;Aktivieren GENERAL_ENABLED;Aktiviert GENERAL_FILE;Datei: -GENERAL_LANDSCAPE;Quer +GENERAL_LANDSCAPE;Landschaft GENERAL_NA;n/a GENERAL_NO;Nein GENERAL_NONE;Keine GENERAL_OK;OK GENERAL_OPEN;Öffnen GENERAL_PORTRAIT;Portrait +GENERAL_RESET;Zurücksetzen GENERAL_SAVE;Speichern +GENERAL_SAVE_AS;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. -HISTOGRAM_TOOLTIP_B;Blau-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_BAR;RGB-Anzeigeleiste ein-/ausblenden\n\nZum Fixieren/Lösen der Anzeige muss mit der\nrechten Maustaste ins Bildfenster geklickt werden. -HISTOGRAM_TOOLTIP_CHRO;Chromatizität-Histogramm ein/ausblenden -HISTOGRAM_TOOLTIP_FULL;Skaliertes Histogramm ein/ausschalten -HISTOGRAM_TOOLTIP_G;Grün-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_L;CIELab-Luminanz-Histogramm ein-/ausblenden -HISTOGRAM_TOOLTIP_R;Rot-Histogramm ein-/ausblenden +HISTOGRAM_TOOLTIP_B;Blau-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_BAR;RGB-Anzeigeleiste ein-/ausblenden. +HISTOGRAM_TOOLTIP_CHRO;Chromatizität-Histogramm ein/ausblenden. +HISTOGRAM_TOOLTIP_FULL;Skaliertes Histogramm ein/ausschalten. +HISTOGRAM_TOOLTIP_G;Grün-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_L;CIELab-Luminanz-Histogramm ein-/ausblenden. +HISTOGRAM_TOOLTIP_MODE;Schaltet zwischen linearer, logarithmischer-linearer und\nlogarithmischer-logarithmischer Skalierung um. +HISTOGRAM_TOOLTIP_R;Rot-Histogramm ein-/ausblenden. HISTOGRAM_TOOLTIP_RAW;Zwischen normalen Histogrammen und\nRAW-Histogrammen umschalten. HISTORY_CHANGED;Geändert HISTORY_CUSTOMCURVE;Benutzerdefiniert @@ -328,7 +369,7 @@ HISTORY_MSG_32;(Schärfung) - RLD\nDämpfung HISTORY_MSG_33;(Schärfung) - RLD\nIterationen HISTORY_MSG_34;(Objektivkorrektur)\nProfil - Verzeichnung HISTORY_MSG_35;(Objektivkorrektur)\nProfil - Vignettierung -HISTORY_MSG_36;(Objektivkorrektur)\nProfil - CA-Korrektur +HISTORY_MSG_36;(Objektivkorrektur)\nProfil - CA HISTORY_MSG_37;(Belichtung) - Auto HISTORY_MSG_38;(Weißabgleich) - Methode HISTORY_MSG_39;(Weißabgleich)\nFarbtemperatur @@ -417,7 +458,6 @@ HISTORY_MSG_121;(Sensor-Matrix)\nChromatische Aberration\nAutomatische Korrektur HISTORY_MSG_122;(Dunkelbild)\nAutomatische Auswahl HISTORY_MSG_123;(Dunkelbild) - Datei HISTORY_MSG_124;(Weißpunkt)\nKorrekturfaktor -HISTORY_MSG_125;(Belichtungskorrektur)\nLichter schützen HISTORY_MSG_126;(Weißbild) - Datei HISTORY_MSG_127;(Weißbild)\nAutomatische Auswahl HISTORY_MSG_128;(Weißbild)\nUnschärferadius @@ -450,11 +490,11 @@ HISTORY_MSG_154;(Dynamik)\nHautfarbtöne schützen HISTORY_MSG_155;(Dynamik)\nFarbverschiebungen\nvermeiden HISTORY_MSG_156;(Dynamik)\nPastell und gesättigte\nTöne koppeln HISTORY_MSG_157;(Dynamik)\nPastell/gesättigte Töne\nSchwelle -HISTORY_MSG_158;(Dynamikkompression)\nIntensität -HISTORY_MSG_159;(Dynamikkompression)\nKantenschutz -HISTORY_MSG_160;(Dynamikkompression)\nFaktor -HISTORY_MSG_161;(Dynamikkompression)\nIterationen -HISTORY_MSG_162;(Dynamikkompression) +HISTORY_MSG_158;(Tonwertkorrektur)\nIntensität +HISTORY_MSG_159;(Tonwertkorrektur)\nKantenschutz +HISTORY_MSG_160;(Tonwertkorrektur)\nFaktor +HISTORY_MSG_161;(Tonwertkorrektur)\nIterationen +HISTORY_MSG_162;(Tonwertkorrektur) HISTORY_MSG_163;(RGB-Kurven) - Rot HISTORY_MSG_164;(RGB-Kurven) - Grün HISTORY_MSG_165;(RGB-Kurven) - Blau @@ -465,6 +505,7 @@ HISTORY_MSG_169;(L*a*b*) - CH-Kurve HISTORY_MSG_170;(Dynamik) - HH-Kurve HISTORY_MSG_171;(L*a*b*) - LC-Kurve HISTORY_MSG_172;(L*a*b*) - LC-Kurve\nbeschränken +HISTORY_MSG_173;(Rauschreduzierung)\nLuminanzdetails HISTORY_MSG_174;(CIECAM02) HISTORY_MSG_175;(CIECAM02) - Szene\nCAT02-Adaptation HISTORY_MSG_176;(CIECAM02)\nBetrachtungsbed.\nUmgebung @@ -494,6 +535,7 @@ HISTORY_MSG_199;(CIECAM02) - Ausgabe-\nHistogramm anzeigen 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)\nFarbraum HISTORY_MSG_204;(Sensor-Matrix)\nFarbinterpolation\nLMMSE-Verbesserung HISTORY_MSG_205;(CIECAM02)\nBetrachtungsbed.\nHot / Bad-Pixelfilter HISTORY_MSG_206;(CIECAM02) - Szene\nAuto-Luminanz @@ -545,6 +587,7 @@ HISTORY_MSG_252;(Detailebenenkontrast)\nHautfarbtöne schützen HISTORY_MSG_253;(Detailebenenkontrast)\nArtefakte reduzieren HISTORY_MSG_254;(Detailebenenkontrast)\nHautfarbton HISTORY_MSG_255;(Rauschreduzierung)\nMedianfilter +HISTORY_MSG_256;(Rauschreduzierung)\nMedianfilter - Mediantyp HISTORY_MSG_257;(Farbanpassungen) HISTORY_MSG_258;(Farbanpassungen)\nFarbkurve HISTORY_MSG_259;(Farbanpassungen)\nDeckkraftkurve @@ -561,7 +604,7 @@ HISTORY_MSG_269;(Farbanpassungen)\nLichter - Blau / Rot HISTORY_MSG_270;(Farbanpassungen)\nLichter - Cyan / Grün HISTORY_MSG_271;(Farbanpassungen)\nLichter - Gelb / Blau HISTORY_MSG_272;(Farbanpassungen)\nFarbausgleich -HISTORY_MSG_273;(Farbanpassungen)\nZurücksetzen +HISTORY_MSG_273;(Farbanpassungen)\nFarbausgleich\nRegler zurücksetzen HISTORY_MSG_274;(Farbanpassungen)\nSättigung Schatten HISTORY_MSG_275;(Farbanpassungen)\nSättigung Lichter HISTORY_MSG_276;(Farbanpassungen)\nDeckkraft @@ -585,6 +628,7 @@ HISTORY_MSG_293;(Filmsimulation) HISTORY_MSG_294;(Filmsimulation)\nIntensität HISTORY_MSG_295;(Filmsimulation) - Film HISTORY_MSG_296;(Rauschreduzierung)\nLuminanzkurve +HISTORY_MSG_297;(Rauschreduzierung)\nModus HISTORY_MSG_298;(Vorverarbeitung)\nDead-Pixel-Filter HISTORY_MSG_299;(Rauschreduzierung)\nChrominanzkurve HISTORY_MSG_300;- @@ -647,7 +691,7 @@ HISTORY_MSG_356;(Wavelet)\nKantenschärfung\nSchwelle hoch HISTORY_MSG_357;(Wavelet)\nRauschreduzierung\nSchärfung verknüpfen HISTORY_MSG_358;(Wavelet) - Gamut\nKontrastkurve HISTORY_MSG_359;(Vorverarbeitung)\nHot / Dead-Pixel-Filter\nSchwelle -HISTORY_MSG_360;(Dynamikkompression)\nGamma +HISTORY_MSG_360;(Tonwertkorrektur)\nGamma HISTORY_MSG_361;(Wavelet) - Endretusche\nFarbausgleich HISTORY_MSG_362;(Wavelet) - Restbild\nKompression HISTORY_MSG_363;(Wavelet) - Restbild\nKompression - Intensität @@ -714,7 +758,7 @@ HISTORY_MSG_423;(Retinex) - Einstellungen\nGammasteigung HISTORY_MSG_424;(Retinex) - Einstellungen\nHL-Schwelle HISTORY_MSG_425;(Retinex) - Einstellungen\nBasis-Logarithmus HISTORY_MSG_426;(Retinex) - Einstellungen\nKorrekturen - Farbton (H) -HISTORY_MSG_427;Ausgabe-Rendering-Intent +HISTORY_MSG_427;(Farbmanagement)\nAusgabeprofil\nRendering-Intent HISTORY_MSG_428;Monitor-Rendering-Intent HISTORY_MSG_429;(Retinex) - Einstellungen\nDynamikkompression\nIterationen HISTORY_MSG_430;(Retinex) - Einstellungen\nDynamikkompression\nTransmission Gradient @@ -733,20 +777,20 @@ HISTORY_MSG_442;(Retinex) - Einstellungen\nTransmission - Skalierung HISTORY_MSG_443;(Farbmanagement)\nAusgabeprofil\nSchwarzpunkt-Kompensation HISTORY_MSG_444;(Weißabgleich)\nAWB-Temperatur-Korrektur HISTORY_MSG_445;(Sensor-Matrix)\nFarbinterpolation\nUnterbild -HISTORY_MSG_449;(Sensor-Matrix)\nFarbinterpolation\nISO-Anpassung -HISTORY_MSG_452;(Sensor-Matrix)\nFarbinterpolation\nBewegungsmaske\nanzeigen -HISTORY_MSG_453;(Sensor-Matrix)\nFarbinterpolation\nNur Maske anzeigen -HISTORY_MSG_457;(Sensor-Matrix)\nFarbinterpolation\nBewegung im Rot/Blau-\nKanal erkennen -HISTORY_MSG_462;(Sensor-Matrix)\nFarbinterpolation\nBewegung im Grün-\nKanal erkennen -HISTORY_MSG_464;(Sensor-Matrix)\nFarbinterpolation\nUnschärfebewegungsmaske -HISTORY_MSG_465;(Sensor-Matrix)\nFarbinterpolation\nUnschärferadius -HISTORY_MSG_468;(Sensor-Matrix)\nFarbinterpolation\nLücken in der Bewegungs-\nmaske erkennen -HISTORY_MSG_469;(Sensor-Matrix)\nFarbinterpolation\nMedian -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 -HISTORY_MSG_474;(Sensor-Matrix)\nFarbinterpolation\nFrame-Helligkeit angleichen -HISTORY_MSG_475;(Sensor-Matrix)\nFarbinterpolation)\nAusgleich pro Kanal +HISTORY_MSG_449;(Sensor-Matrix)\nFarbinterpolation - PS\nISO-Anpassung +HISTORY_MSG_452;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegungsmaske\nanzeigen +HISTORY_MSG_453;(Sensor-Matrix)\nFarbinterpolation - PS\nNur Maske anzeigen +HISTORY_MSG_457;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegung im Rot/Blau-\nKanal erkennen +HISTORY_MSG_462;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegung im Grün-\nKanal erkennen +HISTORY_MSG_464;(Sensor-Matrix)\nFarbinterpolation - PS\nUnschärfebewegungsmaske +HISTORY_MSG_465;(Sensor-Matrix)\nFarbinterpolation - PS\nUnschärferadius +HISTORY_MSG_468;(Sensor-Matrix)\nFarbinterpolation - PS\nLücken in der Bewegungs-\nmaske erkennen +HISTORY_MSG_469;(Sensor-Matrix)\nFarbinterpolation - PS\nMedian +HISTORY_MSG_471;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegungskorrektur +HISTORY_MSG_472;(Sensor-Matrix)\nFarbinterpolation - PS\nWeicher Übergang +HISTORY_MSG_473;(Sensor-Matrix)\nFarbinterpolation - PS\nLMMSE für Bewegungs-\nteile verwenden +HISTORY_MSG_474;(Sensor-Matrix)\nFarbinterpolation - PS\nFrame-Helligkeit angleichen +HISTORY_MSG_475;(Sensor-Matrix)\nFarbinterpolation - PS\nAusgleich pro Kanal HISTORY_MSG_476;(CIECAM02)\nBetrachtungsbed.\nFarbtemperatur HISTORY_MSG_477;(CIECAM02)\nBetrachtungsbed.\nTönung HISTORY_MSG_478;(CIECAM02)\nBetrachtungsbed.\nYb% (Ø Luminanz) @@ -759,21 +803,106 @@ HISTORY_MSG_484;(CIECAM02) - Szene\nAuto Yb% 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_488;(Dynamikkompression) +HISTORY_MSG_489;(Dynamikkompression)\nDetails +HISTORY_MSG_490;(Dynamikkompression)\nIntensität HISTORY_MSG_491;(Weißabgleich) HISTORY_MSG_492;(RGB-Kurven) HISTORY_MSG_493;(L*a*b*) +HISTORY_MSG_CLAMPOOG;(Belichtung) - Farben\nauf Farbraum beschränken +HISTORY_MSG_COLORTONING_LABGRID_VALUE;(Farbanpassungen)\nL*a*b*-Farbkorrektur +HISTORY_MSG_COLORTONING_LABREGION_AB;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Kanal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - C-Maske +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - H-Maske +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Helligkeit +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - L-Maske +HISTORY_MSG_COLORTONING_LABREGION_LIST;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Liste +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Maskenunschärfe +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Versatz +HISTORY_MSG_COLORTONING_LABREGION_POWER;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Verstärkung +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Sättigung +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Maske anzeigen +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;(Farbanpassungen)\nL*a*b*-Farbkorrektur\nBereich - Steigung +HISTORY_MSG_DEHAZE_DEPTH;(Bildschleier entfernen)\nTiefe +HISTORY_MSG_DEHAZE_ENABLED;(Bildschleier entfernen) +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;(Bildschleier entfernen)\nMaske anzeigen +HISTORY_MSG_DEHAZE_STRENGTH;(Bildschleier entfernen)\nIntensität +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;(Sensor—Matrix)\nFarbinterpolation\nAuto-Kontrastschwelle +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;(Sensor-Matrix)\nFarbinterpolation\nKontrastschwelle +HISTORY_MSG_HISTMATCHING;(Belichtung)\nAuto-Tonwertkurve +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;(Farbmanagement)\nAusgabeprofil\nVorlagen +HISTORY_MSG_ICM_OUTPUT_TEMP;(Farbmanagement)\nAusgabeprofil\nIccV4-Illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;(Farbmanagement)\nAusgabeprofil\nTyp +HISTORY_MSG_ICM_WORKING_GAMMA;(Farbmanagement)\nArbeitsfarbraum\nGamma +HISTORY_MSG_ICM_WORKING_SLOPE;(Farbmanagement)\nArbeitsfarbraum\nSteigung +HISTORY_MSG_ICM_WORKING_TRC_METHOD;(Farbmanagement)\nArbeitsfarbraum\nFarbtonkennlinie 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_MICROCONTRAST_CONTRAST;(Mikrokontrast)\nKontrastschwelle +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;(Sensor-Matrix)\nFarbinterpolation - PS\nBewegungsmethode +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;(Sensor-Matrix)\nVorverarbeitung\nRichtung +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;(Sensor-Matrix)\nVorverarbeitung\nPDAF-Zeilenfilter +HISTORY_MSG_PRSHARPEN_CONTRAST;(Skalieren) - Schärfen\nKontrastschwelle +HISTORY_MSG_RAWCACORR_AUTOIT;(Sensor-Matrix)\nChromatische Aberration\nIterationen +HISTORY_MSG_RAWCACORR_COLORSHIFT;(Sensor-Matrix)\nChromatische Aberration\nFarbverschiebungen\nvermeiden +HISTORY_MSG_RAW_BORDER;(Sensor-Matrix)\nFarbinterpolation\nBildrand +HISTORY_MSG_RESIZE_ALLOWUPSCALING;(Skalieren)\nHochskalieren zulassen +HISTORY_MSG_SHARPENING_BLUR;(Schärfung)\nWeichzeichnerradius +HISTORY_MSG_SHARPENING_CONTRAST;(Schärfung)\nKontrastschwelle +HISTORY_MSG_SH_COLORSPACE;Farbraum +HISTORY_MSG_SOFTLIGHT_ENABLED;(Weiches Licht) +HISTORY_MSG_SOFTLIGHT_STRENGTH;(Weiches Licht)\nIntensität +HISTORY_MSG_TM_FATTAL_ANCHOR;(Dynamikkompression)\nHelligkeitsverschiebung HISTORY_NEWSNAPSHOT;Hinzufügen HISTORY_NEWSNAPSHOT_TOOLTIP;Taste: Alt + s HISTORY_SNAPSHOT;Schnappschuss HISTORY_SNAPSHOTS;Schnappschüsse +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Auf den vorgegebenen Copyright-Text zurücksetzen. +ICCPROFCREATOR_CUSTOM;Benutzerdefiniert +ICCPROFCREATOR_DESCRIPTION;Beschreibung: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Füge Gamma- und Steigungswerte der Beschreibung hinzu +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Wenn leer, wird die Standardbeschreibung verwendet. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC-Version: +ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Vorgabe +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Illuminant kann nur bei ICC-v4-Profilen\nverwendet werden. +ICCPROFCREATOR_PRIMARIES;Vorlage: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Blau X +ICCPROFCREATOR_PRIM_BLUY;Blau Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Grün X +ICCPROFCREATOR_PRIM_GREY;Grün Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Rot X +ICCPROFCREATOR_PRIM_REDY;Rot Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;Benutzerdefinierte Vorlagen können nur\nbei ICC-v4-Profilen verwendet werden. +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;ICC-Profile speichern unter ... +ICCPROFCREATOR_SLOPE;Steigung +ICCPROFCREATOR_TRC_PRESET;Farbtonkennlinie: IPTCPANEL_CATEGORY;Kategorie IPTCPANEL_CATEGORYHINT;Beschreibt das Thema des Bildes nach\nMeinung des Anbieters. IPTCPANEL_CITY;Stadt @@ -816,21 +945,19 @@ IPTCPANEL_TITLE;Titel IPTCPANEL_TITLEHINT;Geben Sie einen kurzen lesbaren Namen\nfür das Bild ein, z.B. den Dateinamen. IPTCPANEL_TRANSREFERENCE;Verarbeitungs-ID IPTCPANEL_TRANSREFERENCEHINT;Geben Sie eine Kennung zur Kontrolle oder\nVerfolgung des Arbeitsablaufes ein. -LENSPROFILE_CORRECTION_AUTOMATCH;Automatisch (Lensfun) -LENSPROFILE_CORRECTION_LCPFILE;LCP-Datei -LENSPROFILE_CORRECTION_MANUAL;Benutzerdefiniert (Lensfun) LENSPROFILE_LENS_WARNING;Warnung: Der Cropfaktor des Profils entspricht nicht dem des Objektivs.\nDies kann zu einem fehlerhaften Ergebnis führen. MAIN_BUTTON_FULLSCREEN;Vollbild\nTaste: F11 +MAIN_BUTTON_ICCPROFCREATOR;ICC-Profil erstellen. MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigiert zum nächsten Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: F4\n\nNavigiert zum nächsten Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: Umschalt + F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Navigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf das ausgewählte Miniaturbild.\nTaste: F3\n\nNavigiert zum vorherigen Miniaturbild in der\nDateiverwaltung oder Filmstreifen bezogen\nauf auf das im Editor geöffnete Bild.\nTaste: Umschalt + F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Selektiert das Miniaturbild des aktuell geöffneten\nBildes in der Dateiverwaltung und des Filmstreifens.\nEs werden alle aktiven Filter gelöscht.\nTaste: x\n\nWie oben, jedoch ohne Löschung aktiver Filter. Das\nMiniaturbild des geöffneten Bildes wird nicht angezeigt,\nwenn es herausgefiltert wurde.\nTaste: y MAIN_BUTTON_PREFERENCES;Einstellungen -MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen\nTaste: Strg + b -MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern\nTaste: Strg + s -MAIN_BUTTON_SENDTOEDITOR;Bild im externen Editor öffnen -MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen\nTaste: Strg + e -MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden\nTaste: m -MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden\nTaste: F11 +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Bild zur Warteschlange hinzufügen.\nTaste: Strg + b +MAIN_BUTTON_SAVE_TOOLTIP;Bild speichern.\nTaste: Strg + s\nProfil (.pp3) speichern.\nTaste: Strg + Umschalt + s +MAIN_BUTTON_SENDTOEDITOR;Bild im externen Editor öffnen. +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Bild im externen Editor öffnen.\nTaste: Strg + e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Alle seitlichen Bedienfelder ein-/ausblenden.\nTaste: m +MAIN_BUTTON_UNFULLSCREEN;Vollbild beenden.\nTaste: F11 MAIN_FRAME_BATCHQUEUE;Warteschlange MAIN_FRAME_BATCHQUEUE_TOOLTIP;Warteschlange\nTaste: Strg + F3 MAIN_FRAME_EDITOR;Editor @@ -842,8 +969,8 @@ MAIN_FRAME_PLACES_ADD;Hinzufügen MAIN_FRAME_PLACES_DEL;Entfernen MAIN_FRAME_RECENT;Verzeichnishistorie MAIN_MSG_ALREADYEXISTS;Diese Datei existiert bereits. -MAIN_MSG_CANNOTLOAD;Bild kann nicht geladen werden -MAIN_MSG_CANNOTSAVE;Fehler beim Speichern +MAIN_MSG_CANNOTLOAD;Bild kann nicht geladen werden. +MAIN_MSG_CANNOTSAVE;Fehler beim Speichern. MAIN_MSG_CANNOTSTARTEDITOR;Der externe Editor kann nicht gestartet werden. MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Setzen Sie bitte den richtigen Pfad in den Einstellungen. MAIN_MSG_EMPTYFILENAME;Dateiname fehlt! @@ -855,6 +982,8 @@ MAIN_MSG_QOVERWRITE;Möchten Sie die Datei überschreiben? 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 @@ -864,6 +993,8 @@ MAIN_TAB_EXIF;Exif MAIN_TAB_EXPORT; Exportieren MAIN_TAB_EXPOSURE;Belichtung MAIN_TAB_EXPOSURE_TOOLTIP;Taste: Alt + e +MAIN_TAB_FAVORITES;Favoriten +MAIN_TAB_FAVORITES_TOOLTIP;Taste: Alt + u MAIN_TAB_FILTER; Filter MAIN_TAB_INSPECT; Prüfen MAIN_TAB_IPTC;IPTC @@ -875,25 +1006,26 @@ MAIN_TAB_TRANSFORM;Transformieren MAIN_TAB_TRANSFORM_TOOLTIP;Taste: Alt + t MAIN_TAB_WAVELET;Wavelet MAIN_TAB_WAVELET_TOOLTIP;Taste: Alt + w -MAIN_TOOLTIP_BACKCOLOR0;Hintergrundfarbe der Vorschau basierend auf dem: Oberflächendesign\nTaste: 9 +MAIN_TOOLTIP_BACKCOLOR0;Hintergrundfarbe der Vorschau basierend auf dem Oberflächendesign.\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR1;Hintergrundfarbe der Vorschau: Schwarz\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR2;Hintergrundfarbe der Vorschau: Weiß\nTaste: 9 MAIN_TOOLTIP_BACKCOLOR3;Hintergrundfarbe der Vorschau: Mittleres Grau\nTaste: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Vorher-Ansicht: Sperren / Entsperren\n\nGesperrt: Friert die Vorher-Ansicht ein, so\ndass sich die Gesamtwirkung mehrerer\nBearbeitungsschritte beurteilen lässt.\n\nEntsperrt: Die Vorher-Ansicht hinkt dem\naktuellen Bild immer einen Bearbeitungs-\nschritt hinterher. -MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden\nTaste: l -MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten\nTaste: < -MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten\nTaste: > +MAIN_TOOLTIP_HIDEHP;Linkes Bedienfeld ein-/ausblenden.\nTaste: l +MAIN_TOOLTIP_INDCLIPPEDH;Anzeige zu heller Bereiche ein-/ausschalten.\nTaste: < +MAIN_TOOLTIP_INDCLIPPEDS;Anzeige zu dunkler Bereiche ein-/ausschalten.\nTaste: > MAIN_TOOLTIP_PREVIEWB;Vorschau Blau-Kanal\nTaste: b MAIN_TOOLTIP_PREVIEWFOCUSMASK;Vorschau Fokusmaske\nTaste: Umschalt + f\n\nPräziser bei Bildern mit geringer Tiefenschärfe,\nniedrigem Rauschen und bei hoher Vergrößerung. MAIN_TOOLTIP_PREVIEWG;Vorschau Grün-Kanal\nTaste: g MAIN_TOOLTIP_PREVIEWL;Vorschau Helligkeit\nTaste: v\n\n0.299·R + 0.587·G + 0.114·B MAIN_TOOLTIP_PREVIEWR;Vorschau Rot-Kanal\nTaste: r -MAIN_TOOLTIP_QINFO;Bildinformationen ein-/ausblenden\nTaste: i -MAIN_TOOLTIP_SHOWHIDELP1;Linkes Bedienfeld ein-/ausblenden\nTaste: l -MAIN_TOOLTIP_SHOWHIDERP1;Rechtes Bedienfeld ein-/ausblenden\nTaste: Alt + l -MAIN_TOOLTIP_SHOWHIDETP1;Oberes Bedienfeld ein-/ausblenden\nTaste: Umschalt + l +MAIN_TOOLTIP_PREVIEWSHARPMASK;Schärfungs-Kontroll-Maske ein-/ausschalten.\n\nFunktioniert nur bei aktivierter Schärfung\nund Zoom >= 100%.\nTaste: p +MAIN_TOOLTIP_QINFO;Bildinformationen ein-/ausblenden.\nTaste: i +MAIN_TOOLTIP_SHOWHIDELP1;Linkes Bedienfeld ein-/ausblenden.\nTaste: l +MAIN_TOOLTIP_SHOWHIDERP1;Rechtes Bedienfeld ein-/ausblenden.\nTaste: Alt + l +MAIN_TOOLTIP_SHOWHIDETP1;Oberes Bedienfeld ein-/ausblenden.\nTaste: Umschalt + l MAIN_TOOLTIP_THRESHOLD;Schwelle -MAIN_TOOLTIP_TOGGLE;Vorher/Nachher-Ansicht ein-/ausschalten\nTaste: Umschalt + b +MAIN_TOOLTIP_TOGGLE;Vorher/Nachher-Ansicht ein-/ausschalten.\nTaste: Umschalt + b MONITOR_PROFILE_SYSTEM;Systemvorgabe NAVIGATOR_B;B: NAVIGATOR_G;G: @@ -907,8 +1039,10 @@ NAVIGATOR_S;S: 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 @@ -923,13 +1057,14 @@ PARTIALPASTE_CROP;Ausschnitt PARTIALPASTE_DARKFRAMEAUTOSELECT;Dunkelbild: Automatische Auswahl PARTIALPASTE_DARKFRAMEFILE;Dunkelbild: Datei PARTIALPASTE_DEFRINGE;Farbsaum entfernen (Defringe) +PARTIALPASTE_DEHAZE;Bildschleier entfernen PARTIALPASTE_DETAILGROUP;Detailparameter PARTIALPASTE_DIALOGLABEL;Selektives Einfügen des Bearbeitungsprofils PARTIALPASTE_DIRPYRDENOISE;Rauschreduzierung PARTIALPASTE_DIRPYREQUALIZER;Detailebenenkontrast PARTIALPASTE_DISTORTION;Verzeichnungskorrektur -PARTIALPASTE_EPD;Dynamikkompression -PARTIALPASTE_EQUALIZER;Anzahl der Ebenen +PARTIALPASTE_EPD;Tonwertkorrektur +PARTIALPASTE_EQUALIZER;Wavelet PARTIALPASTE_EVERYTHING;Alle Parameter aktivieren / deaktivieren PARTIALPASTE_EXIFCHANGES;Änderungen an Exif-Daten PARTIALPASTE_EXPOSURE;Belichtung @@ -948,6 +1083,7 @@ 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 @@ -955,20 +1091,22 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Vorverarbeitung: Dead-Pixel-Filter PARTIALPASTE_PREPROCESS_GREENEQUIL;Vorverarbeitung: Grün-Ausgleich PARTIALPASTE_PREPROCESS_HOTPIXFILT;Vorverarbeitung: Hot-Pixel-Filter PARTIALPASTE_PREPROCESS_LINEDENOISE;Vorverarbeitung: Zeilenrauschfilter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Vorverarbeitung: PDAF-Zeilenfilter PARTIALPASTE_PRSHARPENING;Schärfung nach Größenänderung PARTIALPASTE_RAWCACORR_AUTO;Chromatische Aberration: Automatische Korrektur +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;Chromatische Aberration: Farbverschiebungen vermeiden PARTIALPASTE_RAWCACORR_CAREDBLUE;Chromatische Aberration: Rot & Blau PARTIALPASTE_RAWEXPOS_BLACK;Weißpunkt: Schwarzpegel PARTIALPASTE_RAWEXPOS_LINEAR;Weißpunkt: Korrekturfaktor -PARTIALPASTE_RAWEXPOS_PRESER;Weißpunkt: Lichter schützen (EV) PARTIALPASTE_RAWGROUP;RAW +PARTIALPASTE_RAW_BORDER;Farbinterpolation: Bildrand PARTIALPASTE_RAW_DCBENHANCE;Farbinterpolation: DCB-Verbesserung PARTIALPASTE_RAW_DCBITERATIONS;Farbinterpolation: Anzahl der DCB-Iterationen PARTIALPASTE_RAW_DMETHOD;Farbinterpolation: Methode PARTIALPASTE_RAW_FALSECOLOR;Farbinterpolation: Falschfarbenreduzierung PARTIALPASTE_RAW_IMAGENUM;Farbinterpolation: Unterbild PARTIALPASTE_RAW_LMMSEITERATIONS;Farbinterpolation: LMMSE-Verbesserungsstufen -PARTIALPASTE_RAW_PIXELSHIFT;Farbinterpolation: Pixel Shift +PARTIALPASTE_RAW_PIXELSHIFT;Farbinterpolation: Pixel-Shift PARTIALPASTE_RESIZE;Skalieren PARTIALPASTE_RETINEX;Retinex (Bildschleier entfernen) PARTIALPASTE_RGBCURVES;RGB-Kurven @@ -977,21 +1115,22 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Schatten/Lichter PARTIALPASTE_SHARPENEDGE;Kantenschärfung PARTIALPASTE_SHARPENING;Schärfung PARTIALPASTE_SHARPENMICRO;Mikrokontrast -PARTIALPASTE_TM_FATTAL;HDR-Dynamikkompression +PARTIALPASTE_SOFTLIGHT;Weiches Licht +PARTIALPASTE_TM_FATTAL;Dynamikkompression PARTIALPASTE_VIBRANCE;Dynamik PARTIALPASTE_VIGNETTING;Vignettierungskorrektur PARTIALPASTE_WAVELETGROUP;Wavelet PARTIALPASTE_WHITEBALANCE;Weißabgleich PREFERENCES_ADD;HINZU +PREFERENCES_APPEARANCE;Oberflächendesign (erfordert Neustart) +PREFERENCES_APPEARANCE_COLORPICKERFONT;Schriftart Farbwähler +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Farbe/Transparenz für Schnittmaske +PREFERENCES_APPEARANCE_MAINFONT;Schriftart: +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Farbe der Navigationshilfe +PREFERENCES_APPEARANCE_THEME;Oberflächendesign PREFERENCES_APPLNEXTSTARTUP;erfordert Neustart -PREFERENCES_AUTLISLOW;Niedrig -PREFERENCES_AUTLISMAX;Max.-Durchschnitt aller Kacheln -PREFERENCES_AUTLISSTD;Hoch -PREFERENCES_AUTLISVLOW;Keine -PREFERENCES_AUTLOW;Niedrig -PREFERENCES_AUTOMONPROFILE;Automatisch das für den aktuellen Monitor festgelegte Profil verwenden. +PREFERENCES_AUTOMONPROFILE;Automatisch das für den aktuellen Monitor festgelegte Profil verwenden PREFERENCES_AUTOSAVE_TP_OPEN;Werkzeugstatus vor dem Beenden automatisch speichern -PREFERENCES_AUTSTD;Standard PREFERENCES_BATCH_PROCESSING;Stapelverarbeitung PREFERENCES_BEHADDALL;Alle hinzufügen PREFERENCES_BEHADDALLHINT;Setzt alle Parameter auf Hinzufügen.\nAnpassungen der Parameter in der Hintergrundstapelverarbeitung werden als Deltas zu den gespeicherten Werten interpretiert. @@ -999,21 +1138,25 @@ PREFERENCES_BEHAVIOR;Verhalten PREFERENCES_BEHSETALL;Alle setzen PREFERENCES_BEHSETALLHINT;Setzt alle Parameter auf Setzen.\nAnpassungen der Parameter in der Hintergrundstapelverarbeitung werden als Absolut zu den gespeicherten Werten interpretiert. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Alles löschen -PREFERENCES_CACHECLEARPROFILES;Profile löschen -PREFERENCES_CACHECLEARTHUMBS;Miniaturbilder löschen +PREFERENCES_CACHECLEAR;Löschen +PREFERENCES_CACHECLEAR_ALL;Alle Dateien im Zwischenspeicher löschen: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Alle Dateien im Zwischenspeicher löschen mit Ausnahme der Bearbeitungsprofile: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Alle Bearbeitungsprofile im Zwischenspeicher löschen: +PREFERENCES_CACHECLEAR_SAFETY;Nur Dateien im Zwischenspeicher werden gelöscht. Bearbeitungsprofile im Bildordner bleiben unberührt. PREFERENCES_CACHEMAXENTRIES;Maximale Anzahl der Miniaturbilder im Festplatten-Cache PREFERENCES_CACHEOPTS;Einstellungen des Festplatten-Cache für Miniaturbilder PREFERENCES_CACHETHUMBHEIGHT;Maximale Höhe der Miniaturbilder -PREFERENCES_CIEART;CIECAM02-Optimierung -PREFERENCES_CIEART_FRAME;CIECAM02-spezifische Einstellungen -PREFERENCES_CIEART_LABEL;Einfache statt doppelte Genauigkeit -PREFERENCES_CIEART_TOOLTIP;Wenn aktiviert, werden CIECAM02-Berechnungen mit einfacher Genauigkeit statt doppelter durchgeführt. Dadurch wird der Vorgang etwas beschleunigt. Die Qualität nimmt jedoch geringfügig ab. PREFERENCES_CLIPPINGIND;Anzeige zu heller/dunkler Bereiche PREFERENCES_CLUTSCACHE;HaldCLUT-Zwischenspeicher 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 @@ -1025,7 +1168,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Format PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;Tag-ID PREFERENCES_CUSTPROFBUILDPATH;Anwendungspfad -PREFERENCES_CUTOVERLAYBRUSH;Farbe/Transparenz für Schnittmaske PREFERENCES_D50;5000K PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K @@ -1036,8 +1178,6 @@ PREFERENCES_DARKFRAMESHOTS;Aufnahmen PREFERENCES_DARKFRAMETEMPLATES;Vorlagen PREFERENCES_DATEFORMAT;Format PREFERENCES_DATEFORMATHINT;Die folgenden Variablen können verwendet werden:\n%y : Jahr\n%m : Monat\n%d : Tag\n\nBeispiele:\n%d.%m.%y (übliche deutsche Datumsschreibweise)\n%y-%m-%d (Datumsformat nach ISO 8601 und EN 28601) -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 @@ -1045,11 +1185,11 @@ PREFERENCES_DIRLAST;Zuletzt geöffnetes Verzeichnis PREFERENCES_DIROTHER;Anderes PREFERENCES_DIRSELECTDLG;Wähle das Bild-Verzeichnis beim Programmstart... PREFERENCES_DIRSOFTWARE;Installationsverzeichnis +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_FILEBROWSERTOOLBARSINGLEROW;Einzeilige Toolbar PREFERENCES_FILEFORMAT;Dateiformat PREFERENCES_FLATFIELDFOUND;Gefunden PREFERENCES_FLATFIELDSDIR;Weißbild-Verzeichnis @@ -1077,11 +1217,11 @@ PREFERENCES_GREYSC18;Yb = 18 CIE L#49 PREFERENCES_GREYSCA;Automatisch PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogramm linksseitig PREFERENCES_HISTOGRAMWORKING;Das Arbeitsprofil zur Darstellung des Haupthistogramms verwenden -PREFERENCES_HISTOGRAM_TOOLTIP;Wenn aktiviert wird das Arbeitsprofil für die Darstellung des\nHaupthistogramms, andernfalls das des gammakorrigierten\nAusgangsprofil, verwendet. +PREFERENCES_HISTOGRAM_TOOLTIP;Wenn aktiviert, wird das Arbeitsprofil für die Darstellung\ndes Haupthistogramms verwendet, andernfalls das des\ngammakorrigierten Ausgangsprofils. PREFERENCES_HLTHRESHOLD;Lichter - Schwelle PREFERENCES_ICCDIR;ICC-Profile-Verzeichnis PREFERENCES_IMG_RELOAD_NEEDED;Änderungen werden nur auf neu geöffnete Bilder angewendet -PREFERENCES_IMPROCPARAMS;Standard-Bildverarbeitungsparameter +PREFERENCES_IMPROCPARAMS;Standard-Bearbeitungsprofile PREFERENCES_INSPECT_LABEL;Bildzwischenspeicher PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Maximale Anzahl Bilder im Zwischenspeicher PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Legt die maximale Anzahl Bilder fest, die im Zwischenspeicher gehalten werden, wenn man in der Dateiverwaltung mit der Maus über ein Bild fährt.\n\nAuf Systemen mit nicht mehr als 2GB RAM, sollte der Wert nicht größer als 2 gewählt werden. @@ -1092,12 +1232,7 @@ PREFERENCES_INTENT_SATURATION;Sättigung PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Zeige das eingebettete JPEG als Miniaturbild, wenn die RAW-Datei noch nicht editiert wurde PREFERENCES_LANG;Sprache PREFERENCES_LANGAUTODETECT;Systemsprache verwenden -PREFERENCES_LEVAUTDN;Rauschreduzierungsstufe -PREFERENCES_LEVDN;Zellengröße -PREFERENCES_LISS;Automatische Glättung bei Mehrfachzonen -PREFERENCES_MAX;Maxi (Kachel) PREFERENCES_MAXRECENTFOLDERS;Maximale Anzahl der letzten Dateien -PREFERENCES_MED;Medium (Kachel/2) PREFERENCES_MENUGROUPEXTPROGS;Untermenü "Öffnen mit" PREFERENCES_MENUGROUPFILEOPERATIONS;Untermenü Dateioperationen PREFERENCES_MENUGROUPLABEL;Untermenü Farbmarkierung @@ -1105,16 +1240,13 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Untermenü Profiloperationen PREFERENCES_MENUGROUPRANK;Untermenü Bewertung PREFERENCES_MENUOPTIONS;Menüoptionen PREFERENCES_METADATA;Metadaten -PREFERENCES_MIN;Mini (100x115) PREFERENCES_MONINTENT;Standard-Rendering-Intent PREFERENCES_MONITOR;Monitor PREFERENCES_MONPROFILE;Standardfarbprofil PREFERENCES_MONPROFILE_WARNOSX;Aufgrund einer macOS-Limitierung wird nur sRGB unterstützt. PREFERENCES_MULTITAB;Multi-Reitermodus PREFERENCES_MULTITABDUALMON;Multi-Reitermodus (auf zweitem Monitor, wenn verfügbar) -PREFERENCES_NAVGUIDEBRUSH;Farbe der Navigationshilfe PREFERENCES_NAVIGATIONFRAME;Navigation -PREFERENCES_NOISE;Rauschreduzierung PREFERENCES_OUTDIR;Ausgabeverzeichnis PREFERENCES_OUTDIRFOLDER;In dieses Verzeichnis speichern PREFERENCES_OUTDIRFOLDERHINT;Alle Dateien im ausgewählten Verzeichnis speichern. @@ -1130,6 +1262,8 @@ PREFERENCES_PARSEDEXTADDHINT;Dateityp zur Liste hinzufügen PREFERENCES_PARSEDEXTDELHINT;Ausgewählten Dateityp aus Liste entfernen PREFERENCES_PARSEDEXTDOWNHINT;Ausgewählten Dateityp nach unten verschieben. PREFERENCES_PARSEDEXTUPHINT;Ausgewählten Dateityp nach oben verschieben. +PREFERENCES_PERFORMANCE_THREADS;Threads +PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximale Anzahl Threads der Rauschreduzierung und Wavelet (0 = Automatik) PREFERENCES_PREVDEMO;Farbinterpolation PREFERENCES_PREVDEMO_FAST;Schnell PREFERENCES_PREVDEMO_LABEL;Demosaikmethode für 100%-Ansicht @@ -1138,10 +1272,10 @@ PREFERENCES_PRINTER;Drucker (Soft-Proofing) PREFERENCES_PROFILEHANDLING;Behandlung der Bearbeitungsprofile PREFERENCES_PROFILELOADPR;Priorität der Profile beim Laden PREFERENCES_PROFILEPRCACHE;Bearbeitungsprofil im Festplatten-Cache -PREFERENCES_PROFILEPRFILE;Bearbeitungsprofil, welches geladener Datei beiliegt (Sidecar) -PREFERENCES_PROFILESAVEBOTH;Verarbeitungsparameter im Festplatten-Cache und zusammen mit der Datei speichern -PREFERENCES_PROFILESAVECACHE;Verarbeitungsparameter im Festplatten-Cache speichern -PREFERENCES_PROFILESAVEINPUT;Verarbeitungsparameter zusammen mit Datei speichern (Sidecar) +PREFERENCES_PROFILEPRFILE;Bearbeitungsprofil welches dem geladenen Bild beiliegt (Sidecar) +PREFERENCES_PROFILESAVEBOTH;Bearbeitungsprofile im Festplatten-Cache und zusammen mit dem Bild speichern +PREFERENCES_PROFILESAVECACHE;Bearbeitungsprofile im Festplatten-Cache speichern +PREFERENCES_PROFILESAVEINPUT;Bearbeitungsprofile zusammen mit dem Bild speichern (Sidecar) PREFERENCES_PROFILESAVELOCATION;Speicherort der Profile PREFERENCES_PROFILE_NONE;Kein Farbprofil PREFERENCES_PROPERTY;Eigenschaft @@ -1150,13 +1284,8 @@ PREFERENCES_PRTPROFILE;Farbprofil PREFERENCES_PSPATH;Adobe Photoshop Installationsverzeichnis PREFERENCES_REMEMBERZOOMPAN;Zoom und Bildposition merken 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 speichern -PREFERENCES_SELECTFONT;Schriftart -PREFERENCES_SELECTFONT_COLPICKER;Schriftart für die Farbwähler PREFERENCES_SELECTLANG;Sprache -PREFERENCES_SELECTTHEME;Oberflächendesign (erfordert Neustart) PREFERENCES_SERIALIZE_TIFF_READ;TIFF-Bilder PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialisiertes Lesen von TIFF-Bildern verwenden PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Beim Arbeiten mit Ordnern voll unkomprimierter TIFF-Bilder, kann diese Einstellung das Generieren von Miniaturbildern deutlich beschleunigen. @@ -1166,37 +1295,29 @@ PREFERENCES_SHOWDATETIME;Datum und Uhrzeit anzeigen PREFERENCES_SHOWEXPOSURECOMPENSATION;Belichtungskorrektur anfügen PREFERENCES_SHOWFILMSTRIPTOOLBAR;Toolbar oberhalb des Filmstreifens anzeigen PREFERENCES_SHTHRESHOLD;Schatten - Schwelle -PREFERENCES_SIMPLAUT;Werkzeugmodus PREFERENCES_SINGLETAB;Ein-Reitermodus PREFERENCES_SINGLETABVERTAB;Ein-Reitermodus (vertikale Reiter) -PREFERENCES_SMA;Klein (250x287) PREFERENCES_SND_BATCHQUEUEDONE;Warteschlange abgearbeitet PREFERENCES_SND_HELP;Geben Sie einen Pfad zu einer Sounddatei oder einen Systemklang ein.\n\nBeispiel Systemklänge:\nWindows: SystemDefault, SystemAsterisk ...\nLinux: complete, window-attention ...\n PREFERENCES_SND_LNGEDITPROCDONE;Bearbeitung abgeschlossen -PREFERENCES_SND_TRESHOLDSECS;Verzögerung in Sekunden +PREFERENCES_SND_THRESHOLDSECS;Verzögerung in Sekunden PREFERENCES_STARTUPIMDIR;Bildverzeichnis beim Programmstart -PREFERENCES_STDAUT;Standard PREFERENCES_TAB_BROWSER;Dateiverwaltung PREFERENCES_TAB_COLORMGR;Farbmanagement PREFERENCES_TAB_DYNAMICPROFILE;Dynamisches Profil PREFERENCES_TAB_GENERAL;Allgemein PREFERENCES_TAB_IMPROC;Bildbearbeitung -PREFERENCES_TAB_PERFORMANCE;Performance & Qualität +PREFERENCES_TAB_PERFORMANCE;Performance PREFERENCES_TAB_SOUND;Klänge -PREFERENCES_THEME;Oberflächendesign -PREFERENCES_TIMAX;Hoch -PREFERENCES_TINB;Anzahl Kacheln -PREFERENCES_TISTD;Standard +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Eingebundenes JPEG +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Bildanzeige +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrales RAW-Bild +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Eingebundenes JPEG wenn in Originalgröße, sonst neutrales RAW-Bild PREFERENCES_TP_LABEL;Werkzeugbereich: -PREFERENCES_TP_USEICONORTEXT;Symbole statt Text in Karteireitern PREFERENCES_TP_VSCROLLBAR;Keine vertikale Scrollbar PREFERENCES_TUNNELMETADATA;Exif/XMP unverändert in die Ausgabedatei übernehmen. PREFERENCES_USEBUNDLEDPROFILES;Standardprofile verwenden PREFERENCES_VIEW;Weißabgleich-Einstellung des Ausgabegerätes (Monitor, TV, Projektor, usw.) -PREFERENCES_WAVLEV;Die Qualität von Waveletebenen erhöhen -PREFERENCES_WLONE;Eine Ebene -PREFERENCES_WLTWO;Zwei Ebenen -PREFERENCES_WLZER;Nein PREFERENCES_WORKFLOW;Layout PROFILEPANEL_COPYPPASTE;Zu kopierende Parameter PROFILEPANEL_GLOBALPROFILES;Standardprofile @@ -1213,10 +1334,10 @@ PROFILEPANEL_PINTERNAL;Neutral PROFILEPANEL_PLASTSAVED;Zuletzt gespeichert PROFILEPANEL_SAVEDLGLABEL;Bearbeitungsprofil speichern... PROFILEPANEL_SAVEPPASTE;Zu speichernde Parameter -PROFILEPANEL_TOOLTIPCOPY;Profil in Zwischenablage kopieren\n\nStrg-Taste beim Klicken festhalten, um\nzu kopierende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPLOAD;Profil aus Datei laden\n\nStrg-Taste beim Klicken festhalten, um\nzu ladende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPPASTE;Profil aus Zwischenablage einfügen\n\nStrg-Taste beim Klicken festhalten, um\neinzufügende Parameter auszuwählen. -PROFILEPANEL_TOOLTIPSAVE;Profil speichern\n\nStrg-Taste beim Klicken festhalten, um\nzu speichernde Parameter auszuwählen. +PROFILEPANEL_TOOLTIPCOPY;Profil in Zwischenablage kopieren.\n\nStrg-Taste beim Klicken festhalten, um\nzu kopierende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPLOAD;Profil aus Datei laden.\n\nStrg-Taste beim Klicken festhalten, um\nzu ladende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPPASTE;Profil aus Zwischenablage einfügen.\n\nStrg-Taste beim Klicken festhalten, um\neinzufügende Parameter auszuwählen. +PROFILEPANEL_TOOLTIPSAVE;Profil speichern.\n\nStrg-Taste beim Klicken festhalten, um\nzu speichernde Parameter auszuwählen. PROGRESSBAR_LOADING;Lade Bild... PROGRESSBAR_LOADINGTHUMBS;Lade Miniaturbilder... PROGRESSBAR_LOADJPEG;Lade JPEG... @@ -1235,15 +1356,18 @@ 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 +QINFO_PIXELSHIFT;Pixel-Shift / %2 Frame(s) +SAMPLEFORMAT_0;Unbekanntes Datenformat +SAMPLEFORMAT_1;8 Bit ohne Vorzeichen +SAMPLEFORMAT_2;16 Bit ohne Vorzeichen +SAMPLEFORMAT_4;24 Bit LogLuv +SAMPLEFORMAT_8;32 Bit LogLuv +SAMPLEFORMAT_16;16 Bit Gleitkomma +SAMPLEFORMAT_32;24 Bit Gleitkomma +SAMPLEFORMAT_64;32 Bit Gleitkomma SAVEDLG_AUTOSUFFIX;Suffix anfügen, wenn die Datei bereits existiert SAVEDLG_FILEFORMAT;Dateiformat +SAVEDLG_FILEFORMAT_FLOAT; Fließkomma SAVEDLG_FORCEFORMATOPTS;Erzwinge Speicheroptionen SAVEDLG_JPEGQUAL;JPEG-Qualität SAVEDLG_PNGCOMPR;PNG-Kompression @@ -1251,7 +1375,7 @@ SAVEDLG_PUTTOQUEUE;Zur Warteschlange hinzufügen SAVEDLG_PUTTOQUEUEHEAD;An den Anfang der Warteschlange hinzufügen SAVEDLG_PUTTOQUEUETAIL;An das Ende der Warteschlange hinzufügen SAVEDLG_SAVEIMMEDIATELY;Sofort speichern -SAVEDLG_SAVESPP;Verarbeitungsparameter mit dem Bild speichern +SAVEDLG_SAVESPP;Bearbeitungsprofile mit dem Bild speichern SAVEDLG_SUBSAMP;Komprimierung SAVEDLG_SUBSAMP_1;Beste Kompression SAVEDLG_SUBSAMP_2;Ausgeglichen @@ -1260,8 +1384,8 @@ SAVEDLG_SUBSAMP_TOOLTIP;Beste Kompression: 4:2:0\nAusgeglichen: 4:2:2\nBeste Qua 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 @@ -1269,19 +1393,18 @@ THRESHOLDSELECTOR_HINT;Umschalt-Taste halten, um individuelle\nKontrollpu THRESHOLDSELECTOR_T;Oben THRESHOLDSELECTOR_TL;Oben-Links THRESHOLDSELECTOR_TR;Oben-Rechts -TOOLBAR_TOOLTIP_COLORPICKER;Farbwähler\n\nWenn eingeschaltet:\n- Mit der linken Maustaste können Sie einen Farbwähler setzen.\n- Zum Verschieben, linke Maustaste festhalten.\n- Umschalttaste + Rechts-Klick entfernt alle Farbwähler.\n- Rechts-Klick auf den Farbwählerbutton blendet die Farbwähler ein/aus\n- Rechts-Klick in einen freien Bereich schaltet auf das Hand-Werkzeug zurück. -TOOLBAR_TOOLTIP_CROP;Ausschnitt wählen\nTaste: c\n\nZum Verschieben des Ausschnitts,\nUmschalttaste festhalten. +TOOLBAR_TOOLTIP_COLORPICKER;Farbwähler\n\nWenn eingeschaltet:\n- Mit der linken Maustaste können Sie einen Farbwähler setzen.\n- Zum Verschieben, linke Maustaste festhalten.\n- Strg + Umschalttaste + Rechts-Klick entfernt alle Farbwähler.\n- Rechts-Klick auf den Farbwählerbutton blendet die Farbwähler ein/aus\n- Rechts-Klick in einen freien Bereich schaltet auf das Hand-Werkzeug zurück. +TOOLBAR_TOOLTIP_CROP;Ausschnitt wählen.\nTaste: c\n\nZum Verschieben des Ausschnitts,\nUmschalttaste festhalten. TOOLBAR_TOOLTIP_HAND;Hand-Werkzeug\nTaste: h TOOLBAR_TOOLTIP_STRAIGHTEN;Ausrichten / Drehen\nTaste: s\n\nRichtet das Bild entlang einer Leitlinie aus. -TOOLBAR_TOOLTIP_WB;Weißabgleich manuell setzen\nTaste: w +TOOLBAR_TOOLTIP_WB;Weißabgleich manuell setzen.\nTaste: w TP_BWMIX_ALGO;OYCPM-Algorithmus TP_BWMIX_ALGO_LI;Linear TP_BWMIX_ALGO_SP;Spezialeffekte -TP_BWMIX_ALGO_TOOLTIP;Linear liefert ein lineares Ergebnis\nSpezialeffekte liefert einen speziellen Effekt durch Mischen von Kanälen. +TP_BWMIX_ALGO_TOOLTIP;Linear liefert ein lineares Ergebnis.\nSpezialeffekte liefert einen speziellen Effekt durch Mischen von Kanälen. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Automatische Berechnung der RGB-Werte. TP_BWMIX_CC_ENABLED;Komplemantärfarbe anpassen -TP_BWMIX_CC_TOOLTIP;Aktiviert die automatische Anpassung der\nKomplementärfarbe im ROYGCBPM-Modus +TP_BWMIX_CC_TOOLTIP;Aktiviert die automatische Anpassung der\nKomplementärfarbe im ROYGCBPM-Modus. TP_BWMIX_CHANNEL;Luminanzequalizer TP_BWMIX_CURVEEDITOR1;“Bevor“-Kurve TP_BWMIX_CURVEEDITOR2;“Danach“-Kurve @@ -1306,10 +1429,9 @@ TP_BWMIX_MET;Methode TP_BWMIX_MET_CHANMIX;Kanalmixer TP_BWMIX_MET_DESAT;Entsättigung TP_BWMIX_MET_LUMEQUAL;Luminanz -TP_BWMIX_MIXC;Mixer -TP_BWMIX_NEUTRAL;Mixer zurücksetzen -TP_BWMIX_NEUTRAL_TIP;Alle Werte auf Standard zurücksetzen. (Farbfilter, Kanalmixer) -TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Gesamt: %4%% +TP_BWMIX_MIXC;Kanalmixer +TP_BWMIX_NEUTRAL;Zurücksetzen +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Gesamt: %4%% TP_BWMIX_RGBLABEL_HINT;RGB-Faktoren\n\nGesamt: Summe aller RGB-Werte.\n- immer 100% im Modus Relativ\n- höher (heller), oder niedriger (dunkler) 100% im Modus Absolut TP_BWMIX_RGB_TOOLTIP;Mischen Sie die Kanäle. Verwenden Sie die Vorgaben zur Orientierung.\nNegative Werte können zu Artefakten führen. TP_BWMIX_SETTING;Voreinstellung @@ -1346,36 +1468,33 @@ TP_CHMIXER_GREEN;Grün-Kanal TP_CHMIXER_LABEL;RGB-Kanalmixer TP_CHMIXER_RED;Rot-Kanal TP_CHROMATABERR_LABEL;Chromatische Aberration -TP_COARSETRAF_TOOLTIP_HFLIP;Horizontal spiegeln -TP_COARSETRAF_TOOLTIP_ROTLEFT;Nach links drehen\nTaste: [ -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Nach rechts drehen\nTaste: ] -TP_COARSETRAF_TOOLTIP_VFLIP;Vertikal spiegeln -TP_COLORAPP_ADAPTSCENE;Luminanz (cd/m²) -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute Luminanz der Szenenleuchstärket\n(normalerweise 2000cd/m²) -TP_COLORAPP_ADAPTVIEWING;Luminanz (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute Luminanz der Betrachtungsumgebung\n(normalerweise 16cd/m²) -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Wenn aktiviert (empfohlen), werden die optimalen\nWerte aus den Exif-Daten automatisch berechnet. +TP_COARSETRAF_TOOLTIP_HFLIP;Horizontal spiegeln. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Nach links drehen.\nTaste: [ +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Nach rechts drehen.\nTaste: ] +TP_COARSETRAF_TOOLTIP_VFLIP;Vertikal spiegeln. +TP_COLORAPP_ABSOLUTELUMINANCE;Absolute Luminanz TP_COLORAPP_ALGO;Algorithmus TP_COLORAPP_ALGO_ALL;Alle TP_COLORAPP_ALGO_JC;Helligkeit + Buntheit (JH) TP_COLORAPP_ALGO_JS;Helligkeit + Sättigung (JS) TP_COLORAPP_ALGO_QM;Helligkeit + Farbigkeit (QM) -TP_COLORAPP_ALGO_TOOLTIP;Auswahl zwischen Parameter-Teilmengen\nund allen Parametern +TP_COLORAPP_ALGO_TOOLTIP;Auswahl zwischen Parameter-Teilmengen\nund allen Parametern. TP_COLORAPP_BADPIXSL;Hot / Bad-Pixelfilter TP_COLORAPP_BADPIXSL_TOOLTIP;Unterdrückt “Hot / Bad“-Pixel\n\n0 = keine Auswirkung\n1 = Mittel\n2 = Gaussian TP_COLORAPP_BRIGHT;Helligkeit (Q) -TP_COLORAPP_BRIGHT_TOOLTIP;Helligkeit in CIECAM02 berücksichtigt die Weißintensität und unterscheidet sich von L*a*b* und RGB-Helligkeit +TP_COLORAPP_BRIGHT_TOOLTIP;Helligkeit in CIECAM02 berücksichtigt die Weißintensität und unterscheidet sich von L*a*b* und RGB-Helligkeit. +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Bei manueller Einstellung werden Werte über 65 empfohlen. TP_COLORAPP_CHROMA;Buntheit (H) TP_COLORAPP_CHROMA_M;Farbigkeit (M) -TP_COLORAPP_CHROMA_M_TOOLTIP;Die Farbigkeit in CIECAM02 unterscheidet sich\nvon L*a*b*- und RGB-Farbigkeit +TP_COLORAPP_CHROMA_M_TOOLTIP;Die Farbigkeit in CIECAM02 unterscheidet sich\nvon L*a*b*- und RGB-Farbigkeit. TP_COLORAPP_CHROMA_S;Sättigung (S) -TP_COLORAPP_CHROMA_S_TOOLTIP;Sättigung in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Sättigung -TP_COLORAPP_CHROMA_TOOLTIP;Buntheit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB-Buntheit +TP_COLORAPP_CHROMA_S_TOOLTIP;Sättigung in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Sättigung. +TP_COLORAPP_CHROMA_TOOLTIP;Buntheit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB-Buntheit. TP_COLORAPP_CIECAT_DEGREE;CAT02 Adaptation TP_COLORAPP_CONTRAST;Kontrast (J) TP_COLORAPP_CONTRAST_Q;Kontrast (Q) -TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast (Q) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast -TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast (J) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Kontrast (Q) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast. +TP_COLORAPP_CONTRAST_TOOLTIP;Kontrast (J) in CIECAM02 unterscheidet sich\nvom L*a*b*- und RGB-Kontrast. TP_COLORAPP_CURVEEDITOR1;Tonwertkurve 1 TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Zeigt das Histogramm von L (L*a*b*) vor CIECAM02.\nWenn "CIECAM02-Ausgabe-Histogramm in Kurven anzeigen" aktiviert ist, wird das Histogramm von J oder Q nach CIECAM02-Anpassungen angezeigt.\n\nJ und Q werden nicht im Haupt-Histogramm angezeigt.\nFür die endgültige Ausgabe verwenden Sie das Haupt-Histogramm. TP_COLORAPP_CURVEEDITOR2;Tonwertkurve 2 @@ -1384,27 +1503,24 @@ TP_COLORAPP_CURVEEDITOR3;Farbkurve TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Korrigiert Buntheit, Sättigung oder Farbigkeit.\n\nZeigt das Histogramm der Chromatizität (L*a*b* ) VOR den CIECAM02-Änderungen an.\nWenn "CIECAM02-Ausgabe-Histogramm in Kurven anzeigen" aktiviert ist, wird das Histogramm von C, S oder M NACH den CIECAM02-Änderungen angezeigt.\n\nC, S und M werden nicht im Haupt-Histogramm angezeigt.\nFür die endgültige Ausgabe verwenden Sie das Haupt-Histogramm. TP_COLORAPP_DATACIE;CIECAM02-Ausgabe-Histogramm in\nKurven anzeigen TP_COLORAPP_DATACIE_TOOLTIP;Wenn aktiviert, zeigen die Histogramme\nder CIECAM02-Kurven die angenäherten\nWerte/Bereiche für J oder Q und C, S oder M\nNACH den CIECAM02-Anpassungen an. Das\nbetrifft nicht das Haupt-Histogramm.\n\nWenn deaktiviert, zeigen die Histogramme\nder CIECAM02-Kurven die L*a*b*-Werte\nVOR den CIECAM02-Anpassungen an. -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Wenn aktiviert (empfohlen), wird ein optimaler\nWert berechnet, der von CAT02 und CIECAM02\nverwendet wird.\nUm den Wert manuell zu setzen, muss die Option\ndeaktiviert sein (Werte über 64 sind empfohlen). -TP_COLORAPP_DEGREE_TOOLTIP;Umfang der “CIE Chromatic Adaptation Transform 2002“ TP_COLORAPP_FREE;Farbtemperatur + Tönung + CAT02 + [Ausgabe] TP_COLORAPP_GAMUT;Gamutkontrolle (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Gamutkontrolle im L*a*b*-Modus erlauben. TP_COLORAPP_HUE;Farbton (H) -TP_COLORAPP_HUE_TOOLTIP;Farbton (H) - Winkel zwischen 0° und 360° +TP_COLORAPP_HUE_TOOLTIP;Farbton (H) - Winkel zwischen 0° und 360°. TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 TP_COLORAPP_LABEL_CAM02;Bildanpassungen TP_COLORAPP_LABEL_SCENE;Umgebungsbedingungen (Szene) TP_COLORAPP_LABEL_VIEWING;Betrachtungsbedingungen TP_COLORAPP_LIGHT;Helligkeit (J) -TP_COLORAPP_LIGHT_TOOLTIP;Helligkeit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Helligkeit +TP_COLORAPP_LIGHT_TOOLTIP;Helligkeit in CIECAM02 unterscheidet sich\nvon L*a*b* und RGB Helligkeit. +TP_COLORAPP_MEANLUMINANCE;Mittlere Luminanz (Yb%) TP_COLORAPP_MODEL;Weißpunktmodell TP_COLORAPP_MODEL_TOOLTIP;Weißabgleich [RT] + [Ausgabe]:\nRT's Weißabgleich wird für die Szene verwendet,\nCIECAM02 auf D50 gesetzt und der Weißabgleich\ndes Ausgabegerätes kann unter:\nEinstellungen > Farb-Management\neingestellt werden.\n\nWeißabgleich [RT+CAT02] + [Ausgabe]:\nRT's Weißabgleich wird für CAT02 verwendet und\nder Weißabgleich des Ausgabegerätes kann unter\nEinstellungen > Farb-Management\neingestellt werden. TP_COLORAPP_NEUTRAL;Zurücksetzen TP_COLORAPP_NEUTRAL_TIP;Setzt alle CIECAM02-Parameter auf Vorgabewerte zurück. TP_COLORAPP_RSTPRO;Hautfarbtöne schützen TP_COLORAPP_RSTPRO_TOOLTIP;Hautfarbtöne schützen\nWirkt sich auf Regler und Kurven aus. -TP_COLORAPP_SHARPCIE;--unused-- -TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- TP_COLORAPP_SURROUND;Umgebung TP_COLORAPP_SURROUND_AVER;Durchschnitt TP_COLORAPP_SURROUND_DARK;Dunkel @@ -1422,24 +1538,43 @@ TP_COLORAPP_TCMODE_LABEL3;Farbkurve Modus TP_COLORAPP_TCMODE_LIGHTNESS;Helligkeit (J) TP_COLORAPP_TCMODE_SATUR;Sättigung (S) TP_COLORAPP_TEMP_TOOLTIP;Um eine Farbtemperatur auszuwählen\nsetzen Sie die Tönung immer auf "1".\nA Temp=2856\nD50 Temp=5003\nD55 Temp=5503\nD65 Temp=6504\nD75 Temp=7504 -TP_COLORAPP_TONECIE;Dynamikkompression mittels\nCIECAM02-Helligkeit (Q) -TP_COLORAPP_TONECIE_TOOLTIP;Wenn diese Option ausgeschaltet ist, wird die Dynamikkompression im L*a*b*-Farbraum durchgeführt.\nWenn die Option eingeschaltet ist, wird CIECAM02 für die Dynamikkompression verwendet. Das Werkzeug Dynamikkompression muss aktiviert sein, damit diese Option berücksichtigt wird. +TP_COLORAPP_TONECIE;Tonwertkorrektur mittels\nCIECAM02-Helligkeit (Q) +TP_COLORAPP_TONECIE_TOOLTIP;Wenn diese Option ausgeschaltet ist, wird die Tonwertkorrektur im L*a*b*-Farbraum durchgeführt.\nWenn die Option eingeschaltet ist, wird CIECAM02 für die Tonwertkorrektur verwendet. Das Werkzeug Tonwertkorrektur muss aktiviert sein, damit diese Option berücksichtigt wird. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute Luminanz der Betrachtungsumgebung\n(normalerweise 16cd/m²). TP_COLORAPP_WBCAM;[RT+CAT02] + [Ausgabe] TP_COLORAPP_WBRT;[RT] + [Ausgabe] -TP_COLORAPP_YB;Yb% (Ø Luminanz) -TP_COLORAPP_YBSCENE;Yb% (Ø Luminanz) -TP_COLORAPP_YBSCENE_TOOLTIP;Wenn aktiviert, wird der Durchschnittswert der Luminanz berechnet. TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automatisch TP_COLORTONING_BALANCE;Farbausgleich TP_COLORTONING_BY;o C/L TP_COLORTONING_CHROMAC;Deckkraft TP_COLORTONING_COLOR;Farbe -TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Buntheitsdeckkraft als Funktion der Luminanz oB = f(L) +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Buntheitsdeckkraft als Funktion der Luminanz oB = f(L). TP_COLORTONING_HIGHLIGHT;Lichter 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_LABREGIONS;L*a*b*-Farbkorrektur Bereiche +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Kanal +TP_COLORTONING_LABREGION_CHANNEL_ALL;Alle +TP_COLORTONING_LABREGION_CHANNEL_B;Blau +TP_COLORTONING_LABREGION_CHANNEL_G;Grün +TP_COLORTONING_LABREGION_CHANNEL_R;Rot +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Helligkeit +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Farbkorrektur +TP_COLORTONING_LABREGION_MASK;Maske +TP_COLORTONING_LABREGION_MASKBLUR;Maskenunschärfe +TP_COLORTONING_LABREGION_OFFSET;Versatz +TP_COLORTONING_LABREGION_POWER;Verstärkung +TP_COLORTONING_LABREGION_SATURATION;Sättigung +TP_COLORTONING_LABREGION_SHOWMASK;Maske anzeigen +TP_COLORTONING_LABREGION_SLOPE;Steigung 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. @@ -1447,7 +1582,7 @@ TP_COLORTONING_METHOD;Methode TP_COLORTONING_METHOD_TOOLTIP;L*a*b*-Überlagerung, RGB-Regler und RGB-Kurven\nverwenden eine interpolierte Farbüberlagerung.\n\nFarbausgleich (Schatten/Mitten/Lichter) und Sättigung\n(2-Farben) verwenden direkte Farben. TP_COLORTONING_MIDTONES;Mitten TP_COLORTONING_NEUTRAL;Regler zurücksetzen -TP_COLORTONING_NEUTRAL_TIP;Alle Werte auf Standard zurücksetzen\n(Schatten, Mitten, Lichter) +TP_COLORTONING_NEUTRAL_TIP;Alle Werte auf Standard zurücksetzen.\n(Schatten, Mitten, Lichter) TP_COLORTONING_OPACITY;Deckkraft TP_COLORTONING_RGBCURVES;RGB-Kurven TP_COLORTONING_RGBSLIDERS;RGB-Regler @@ -1463,7 +1598,7 @@ TP_COLORTONING_STRENGTH;Intensität TP_COLORTONING_TWO2;Spezial-Farbe (2 Farben) TP_COLORTONING_TWOALL;Spezial-Farbe TP_COLORTONING_TWOBY;Spezial a* und b* -TP_COLORTONING_TWOCOLOR_TOOLTIP;Standardfarbe:\nLinearer Verlauf, a* = b*.\n\nSpezial-Farbe:\nLinearer Verlauf, a* = b*, aber nicht verbunden\n\nSpezial a* und b*:\nLinearer Verlauf, nicht verbunden, mit unterschiedlichen\nKurven für a* und b*. Bevorzugt für spezielle Effekte.\n\nSpezial-Farbe (2 Farben):\nBesser vorhersehbar +TP_COLORTONING_TWOCOLOR_TOOLTIP;Standardfarbe:\nLinearer Verlauf, a* = b*.\n\nSpezial-Farbe:\nLinearer Verlauf, a* = b*, aber nicht verbunden\n\nSpezial a* und b*:\nLinearer Verlauf, nicht verbunden, mit unterschiedlichen\nKurven für a* und b*. Bevorzugt für spezielle Effekte.\n\nSpezial-Farbe (2 Farben):\nBesser vorhersehbar. TP_COLORTONING_TWOSTD;Standardfarbe TP_CROP_FIXRATIO;Format TP_CROP_GTDIAGONALS;Diagonalregel @@ -1478,21 +1613,27 @@ TP_CROP_GTTRIANGLE2;Goldenes Dreieck 2 TP_CROP_GUIDETYPE;Hilfslinien: TP_CROP_H;Höhe TP_CROP_LABEL;Ausschnitt -TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Ausschnitt wählen +TP_CROP_PPI;PPI = +TP_CROP_RESETCROP;Zurücksetzen +TP_CROP_SELECTCROP;Ausschnitt TP_CROP_W;Breite -TP_CROP_X;x -TP_CROP_Y;y +TP_CROP_X;Links +TP_CROP_Y;Oben TP_DARKFRAME_AUTOSELECT;Automatische Auswahl TP_DARKFRAME_LABEL;Dunkelbild TP_DEFRINGE_LABEL;Farbsaum entfernen (Defringe) TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Schwelle +TP_DEHAZE_DEPTH;Tiefe +TP_DEHAZE_LABEL;Bildschleier entfernen +TP_DEHAZE_SHOW_DEPTH_MAP;Maske anzeigen +TP_DEHAZE_STRENGTH;Intensität 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) @@ -1509,6 +1650,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Kachelgröße = %1 Zentrum: Tx = % 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_LABEL;Rauschreduzierung TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Luminanzkontrolle TP_DIRPYRDENOISE_LUMINANCE_CURVE;Luminanzkurve TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Luminanzdetails @@ -1521,10 +1663,10 @@ 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_MAIN_MODE;Modus +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressiv +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Konservativ +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Konservativ" bewahrt Tieffrequenz-Chroma-Muster,\nwährend "Aggressiv" sie entfernt. TP_DIRPYRDENOISE_MEDIAN_METHOD;Methode TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Nur Farbe TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* @@ -1564,15 +1706,15 @@ TP_DISTORTION_AUTO_TIP;Korrigiert die Verzeichnung in RAW-Bildern durch Vergleic TP_DISTORTION_LABEL;Verzeichnungskorrektur TP_EPD_EDGESTOPPING;Kantenschutz TP_EPD_GAMMA;Gamma -TP_EPD_LABEL;Dynamikkompression +TP_EPD_LABEL;Tonwertkorrektur TP_EPD_REWEIGHTINGITERATES;Iterationen TP_EPD_SCALE;Faktor TP_EPD_STRENGTH;Intensität -TP_EPD_TOOLTIP;Dynamikkompression ist mit dem L*a*b*- und CIECAM02-Modus möglich.\n\nFür den CIECAM02-Modus müssen folgende Optionen aktiviert sein:\n1. CIECAM02\n2. Algorithmus = Helligkeit + Farbigkeit (QM)\n3. Dynamikkompression mittels CIECAM02-Helligkeit (Q) TP_EXPOSURE_AUTOLEVELS;Auto TP_EXPOSURE_AUTOLEVELS_TIP;Automatische Belichtungseinstellung\nbasierend auf Bildanalyse. TP_EXPOSURE_BLACKLEVEL;Schwarzwert TP_EXPOSURE_BRIGHTNESS;Helligkeit +TP_EXPOSURE_CLAMPOOG;Farben auf Farbraum beschränken TP_EXPOSURE_CLIP;Clip %: TP_EXPOSURE_CLIP_TIP;Anteil der Pixel, die sich bei automatischer\nBelichtungseinstellung im Bereich der\nSpitzlichter und Schatten befinden sollen. TP_EXPOSURE_COMPRHIGHLIGHTS;Lichterkompression @@ -1583,11 +1725,13 @@ TP_EXPOSURE_CURVEEDITOR1;Tonwertkurve 1 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 -TP_EXPOSURE_TCMODE_LABEL1;Tonwertkurve 1 Modus -TP_EXPOSURE_TCMODE_LABEL2;Tonwertkurve 2 Modus +TP_EXPOSURE_TCMODE_LABEL1;Tonwertkurve 1: Modus +TP_EXPOSURE_TCMODE_LABEL2;Tonwertkurve 2: Modus TP_EXPOSURE_TCMODE_LUMINANCE;Luminanz TP_EXPOSURE_TCMODE_PERCEPTUAL;Wahrnehmungsabhängig TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Sättigung und Überlagerung @@ -1620,12 +1764,12 @@ TP_GRADIENT_CENTER_X_TOOLTIP;Ankerpunkt der Rotationsachse X:\n-100 = linker Bil TP_GRADIENT_CENTER_Y;Rotationsachse Y TP_GRADIENT_CENTER_Y_TOOLTIP;Ankerpunkt der Rotationsachse Y:\n-100 = oberer Bildrand\n0 = Bildmitte\n+100 = unterer Bildrand TP_GRADIENT_DEGREE;Rotationswinkel -TP_GRADIENT_DEGREE_TOOLTIP;Rotationswinkel in Grad +TP_GRADIENT_DEGREE_TOOLTIP;Rotationswinkel in Grad. TP_GRADIENT_FEATHER;Bereich -TP_GRADIENT_FEATHER_TOOLTIP;Bereich des Verlaufs in Prozent der Bilddiagonalen +TP_GRADIENT_FEATHER_TOOLTIP;Bereich des Verlaufs in Prozent der Bilddiagonalen. TP_GRADIENT_LABEL;Grauverlaufsfilter TP_GRADIENT_STRENGTH;Intensität -TP_GRADIENT_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen +TP_GRADIENT_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen. TP_HLREC_BLEND;Überlagerung TP_HLREC_CIELAB;CIELab-Überlagerung TP_HLREC_COLOR;Farbübertragung @@ -1652,20 +1796,20 @@ TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpoliert TP_ICM_DCPILLUMINANT_TOOLTIP;DCP-Illumination auswählen. Vorgabe ist\nInterpoliert. Die Einstellung ist nur verfügbar\nwenn sie vom Eingangsfarbprofil unterstützt\nwird. TP_ICM_INPUTCAMERA;Kamera-Standard TP_ICM_INPUTCAMERAICC;Kameraspezifisches Profil -TP_ICM_INPUTCAMERAICC_TOOLTIP;Verwendet RawTherapees kameraspezifisches\nDCP/ICC-Eingangsfarbprofil, welches präziser als\neine einfache Matrix ist +TP_ICM_INPUTCAMERAICC_TOOLTIP;Verwendet RawTherapees kameraspezifisches\nDCP/ICC-Eingangsfarbprofil, welches präziser als\neine einfache Matrix ist. TP_ICM_INPUTCAMERA_TOOLTIP;Benutzt eine einfache Farbmatrix von DCRAW,\neine erweiterte RawTherapee-Version oder eine\naus einem DNG. TP_ICM_INPUTCUSTOM;DCP/ICC-Profil -TP_ICM_INPUTCUSTOM_TOOLTIP;Eigenes DCP/ICC-Farbprofil verwenden +TP_ICM_INPUTCUSTOM_TOOLTIP;Eigenes DCP/ICC-Farbprofil verwenden. TP_ICM_INPUTDLGLABEL;DCP/ICC-Profil wählen... TP_ICM_INPUTEMBEDDED;Eingebettetes Profil verwenden -TP_ICM_INPUTEMBEDDED_TOOLTIP;Farbprofil verwenden, das in Nicht-RAW-Bildern\neingebettet ist +TP_ICM_INPUTEMBEDDED_TOOLTIP;Farbprofil verwenden, das in Nicht-RAW-Bildern\neingebettet ist. TP_ICM_INPUTNONE;Kein Profil -TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden +TP_ICM_INPUTNONE_TOOLTIP;Kein Eingangsfarbprofil verwenden. TP_ICM_INPUTPROFILE;Eingangsfarbprofil TP_ICM_LABEL;Farbmanagement TP_ICM_NOICM;Kein ICM: sRGB-Ausgabe TP_ICM_OUTPUTPROFILE;Ausgabeprofil -TP_ICM_PROFILEINTENT;Rendering Intent +TP_ICM_PROFILEINTENT;Rendering-Intent TP_ICM_SAVEREFERENCE;Referenzbild speichern TP_ICM_SAVEREFERENCE_APPLYWB;Weißabgleich anwenden TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Um ICC-Profile zu erstellen, den Weißabgleich beim Speichern anwenden. Um DCP-Profile zu erstellen, den Weißabgleich NICHT beim Speichern anwenden. @@ -1673,6 +1817,12 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;Speichert das lineare TIFF-Bild bevor das\nEingangs TP_ICM_TONECURVE;Tonwertkurve TP_ICM_TONECURVE_TOOLTIP;Eingebettete DCP-Tonwertkurve verwenden.\nDie Einstellung ist nur verfügbar wenn sie\nvom Eingangsfarbprofil unterstützt wird. TP_ICM_WORKINGPROFILE;Arbeitsfarbraum +TP_ICM_WORKING_TRC;Farbtonkennlinie: +TP_ICM_WORKING_TRC_CUSTOM;Benutzerdefiniert +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;Keine +TP_ICM_WORKING_TRC_SLOPE;Steigung +TP_ICM_WORKING_TRC_TOOLTIP;Nur für die mitgelieferten\nProfile möglich. TP_IMPULSEDENOISE_LABEL;Impulsrauschreduzierung TP_IMPULSEDENOISE_THRESH;Schwelle TP_LABCURVE_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden @@ -1715,40 +1865,59 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Kann mit dem Chromatizitätsregler und\nder CC-Kurve TP_LENSGEOM_AUTOCROP;Auto-Schneiden TP_LENSGEOM_FILL;Auto-Füllen TP_LENSGEOM_LABEL;Objektivkorrekturen +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatisch (Lensfun) +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP-Datei +TP_LENSPROFILE_CORRECTION_MANUAL;Benutzerdefiniert (Lensfun) TP_LENSPROFILE_LABEL;Objektivkorrekturprofil -TP_LENSPROFILE_USECA;CA korrigieren -TP_LENSPROFILE_USEDIST;Verzeichnung korrigieren -TP_LENSPROFILE_USEVIGN;Vignettierung korrigieren +TP_LENSPROFILE_LENS_WARNING;Achtung: Der Crop-Faktor des Profils entspricht\nnicht dem der Kamera.\nDie Ergebnisse sind möglicherweise falsch. +TP_LENSPROFILE_MODE_HEADER;Profil auswählen +TP_LENSPROFILE_USE_CA;CA +TP_LENSPROFILE_USE_GEOMETRIC;Verzeichnung +TP_LENSPROFILE_USE_HEADER;Korrektur auswählen +TP_LENSPROFILE_USE_VIGNETTING;Vignettierung 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_NEUTRAL_TIP;Belichtungseinstellungen auf\nneutrale Werte zurücksetzen. TP_PCVIGNETTE_FEATHER;Bereich TP_PCVIGNETTE_FEATHER_TOOLTIP;Bereich:\n0 = nur Bildecken\n50 = halbe Strecke zum Mittelpunkt\n100 = bis zum Mittelpunkt TP_PCVIGNETTE_LABEL;Vignettierungsfilter TP_PCVIGNETTE_ROUNDNESS;Form TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Form:\n0 = Rechteck\n50 = Ellipse\n100 = Kreis TP_PCVIGNETTE_STRENGTH;Intensität -TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken) +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filterstärke in Blendenstufen (bezogen auf die Bildecken). TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspektive TP_PERSPECTIVE_VERTICAL;Vertikal TP_PFCURVE_CURVEEDITOR_CH;Farbton TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Regelt die Intensität der Farbsaumentfernung\nnach Farben. Je höher die Kurve desto stärker\nist der Effekt. TP_PREPROCESS_DEADPIXFILT;Dead-Pixel-Filter -TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt tote Pixel +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Entfernt tote Pixel. TP_PREPROCESS_GREENEQUIL;Grün-Ausgleich TP_PREPROCESS_HOTPIXFILT;Hot-Pixel-Filter -TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Entfernt Hot-Pixel +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Entfernt Hot-Pixel. TP_PREPROCESS_LABEL;Vorverarbeitung TP_PREPROCESS_LINEDENOISE;Zeilenrauschfilter +TP_PREPROCESS_LINEDENOISE_DIRECTION;Richtung +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Beide +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal (nur PDAF-Zeilen) +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertikal TP_PREPROCESS_NO_FOUND;Nichts gefunden +TP_PREPROCESS_PDAFLINESFILTER;PDAF-Zeilenfilter TP_PRSHARPENING_LABEL;Nach Skalierung schärfen TP_PRSHARPENING_TOOLTIP;Schärft das Bild nach der Größenänderung.\nFunktioniert nur mit der Methode “Lanczos“.\nDas Ergebnis wird nicht in RawTherapee\nangezeigt.\n\nWeitere Informationen finden Sie auf “RawPedia“. -TP_RAWCACORR_AUTO;Automatische Korrektur +TP_RAWCACORR_AUTO;Autokorrektur +TP_RAWCACORR_AUTOIT;Iterationen +TP_RAWCACORR_AUTOIT_TOOLTIP;Diese Einstellung ist verfügbar, wenn "Autokorrektur" aktiviert ist.\nDie Autokorrektur ist konservativ, d.h. sie korrigiert häufig nicht alle\nchromatischen Aberrationen. Um die verbleibenden chromatischen\nAberrationen zu korrigieren, können Sie bis zu fünf Iterationen\nverwenden. Jede Iteration verringert die verbleibende chromatische\nAberration auf Kosten zusätzlicher Verarbeitungszeit. +TP_RAWCACORR_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden TP_RAWCACORR_CABLUE;Blau TP_RAWCACORR_CARED;Rot TP_RAWCACORR_CASTR;Intensität @@ -1761,20 +1930,27 @@ TP_RAWEXPOS_BLACK_BLUE;Blau TP_RAWEXPOS_BLACK_GREEN;Grün TP_RAWEXPOS_BLACK_RED;Rot TP_RAWEXPOS_LINEAR;Korrekturfaktor -TP_RAWEXPOS_PRESER;Weißpunkt: Lichter schützen TP_RAWEXPOS_RGB;Rot, Grün, Blau TP_RAWEXPOS_TWOGREEN;Grün-Werte automatisch angleichen -TP_RAW_1PASSMEDIUM;1-Pass (Medium) -TP_RAW_3PASSBEST;3-Pass (Beste) +TP_RAW_1PASSMEDIUM;1-Pass (Markesteijn) +TP_RAW_2PASS;1-Pass + schnell +TP_RAW_3PASSBEST;3-Pass (Markesteijn) +TP_RAW_4PASS;3-Pass + schnell TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE + VNG4 +TP_RAW_BORDER;Bildrand TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;DCB-Verbesserung TP_RAW_DCBITERATIONS;Anzahl der DCB-Iterationen +TP_RAW_DCBVNG4;DCB + VNG4 TP_RAW_DMETHOD;Methode TP_RAW_DMETHOD_PROGRESSBAR;%1 verarbeitet TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Demosaikoptimierung -TP_RAW_DMETHOD_TOOLTIP;IGV und LMMSE sind speziel für High-ISO-Aufnahmen um die\nRauschreduzierung zu unterstützen ohne zu Maze-Mustern,\nPosterisierung oder einem ausgewaschenen Look zu führen.\n\nPixel Shift ist für “Pentax Pixel Shift“-Dateien. Für "Nicht-Pixel-\nShift"-Dateien wird automatisch AMaZE verwendet. +TP_RAW_DMETHOD_TOOLTIP;IGV und LMMSE sind speziel für High-ISO-Aufnahmen um die\nRauschreduzierung zu unterstützen ohne zu Maze-Mustern,\nPosterisierung oder einem ausgewaschenen Look zu führen.\n\nPixel-Shift ist für “Pentax Pixel-Shift“-Dateien. Für "Nicht-Pixel-\nShift"-Dateien wird automatisch AMaZE verwendet. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto-Kontrastschwelle +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Wenn das Kontrollkästchen aktiviert ist (empfohlen), berechnet\nRawTherapee einen optimalen Wert auf der Grundlage homogener\nBereiche im Bild. Wenn kein homogener Bereich vorhanden ist oder\ndas Bild zu sehr rauscht, wird der Wert auf 0 gesetzt. +TP_RAW_DUALDEMOSAICCONTRAST;Kontrastschwelle TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Falschfarbenreduzierung TP_RAW_FAST;Schnell @@ -1783,18 +1959,19 @@ TP_RAW_HD_TOOLTIP;Je niedriger der Wert, umso empfindlicher reagiert\ndie “Hot TP_RAW_HPHD;HPHD TP_RAW_IGV;IGV TP_RAW_IMAGENUM;Unterbild -TP_RAW_IMAGENUM_TOOLTIP;Einige RAW-Formate enthalten mehrere Unterbilder (Pentax Pixel Shift,\nPentax 3-in-1 HDR, Canon Dual Pixel).\n\n> Auswahl des zu verwendenden Unterbildes (nicht bei Pixel Shift).\n\n> Legt das Unterbild für die Bewegungsbereiche bei Pixel Shift fest. +TP_RAW_IMAGENUM_TOOLTIP;Einige RAW-Formate enthalten mehrere Unterbilder (Pentax Pixel-Shift,\nPentax 3-in-1 HDR, Canon Dual Pixel).\n\n> Auswahl des zu verwendenden Unterbildes (nicht bei Pixel-Shift).\n\n> Legt das Unterbild für die Bewegungsbereiche bei Pixel-Shift fest. TP_RAW_LABEL;Farbinterpolation TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;LMMSE-Verbesserungsstufen TP_RAW_LMMSE_TOOLTIP;Fügt Gamma (Stufe 1), Median (Stufe 2-4)\nund Optimierung (Stufe 5-6) zur Minimierung\nvon Artefakten hinzu und verbessert das\nSignalrauschverhältnis. TP_RAW_MONO;Mono TP_RAW_NONE;Keine -TP_RAW_PIXELSHIFT;Pixel Shift +TP_RAW_PIXELSHIFT;Pixel-Shift TP_RAW_PIXELSHIFTADAPTIVE;Adaptive Erkennung TP_RAW_PIXELSHIFTBLUR;Unschärfebewegungsmaske -TP_RAW_PIXELSHIFTEPERISO;ISO-Anpassung -TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Der Standardwert (0.0) empfiehlt sich für die Basis-ISO.\nErhöhen Sie den Wert, um die Bewegungserkennung für höhere ISO-Werte zu verbessern.\nErhöhen Sie den Wert nur in kleinen Schritten und achten Sie dabei auf die Bewegungsmaske. +TP_RAW_PIXELSHIFTDMETHOD;Bewegungsmethode +TP_RAW_PIXELSHIFTEPERISO;Empfindlichkeit +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;Der Standardwert 0 wird für die Basis-ISO empfohlen.\nHöhere Werte erhöhen die Empfindlichkeit der Bewegungserkennung.\nVerändern Sie den Wert in kleinen Schritten und beobachten Sie die\nBewegungsmaske. Erhöhen Sie die Empfindlichkeit für unterbelichtete\noder High-ISO-Bilder. TP_RAW_PIXELSHIFTEQUALBRIGHT;Frame-Helligkeit angleichen TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Ausgleich pro Kanal TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;EIN: Individueller Ausgleich der RGB-Kanäle.\nAUS: Identischer Ausgleichsfaktor für alle Kanäle. @@ -1802,7 +1979,7 @@ TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Gleicht die Helligkeit der Frames an den ak TP_RAW_PIXELSHIFTEXP0;Experimentell TP_RAW_PIXELSHIFTGREEN;Bewegung im Grün-Kanal erkennen TP_RAW_PIXELSHIFTHOLEFILL;Lücken in der Bewegungsmaske erkennen -TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Lücken in der Bewegungsmaske erkennen +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Lücken in der Bewegungsmaske erkennen. TP_RAW_PIXELSHIFTLMMSE;LMMSE für Bewegungsbereiche verwenden TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;LMMSE anstatt AMaZE für bewegte Bildbereiche verwenden.\nSinnvoll bei High-ISO-Aufnahmen. TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold @@ -1823,12 +2000,14 @@ TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green amaze 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 TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Nur Maske anzeigen TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Zeigt die Bewegungsmaske ohne Bild. -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Überlagert das Bild mit einer Maske um die\nBereiche mit Bewegung hervorzuheben. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Überlagert das Bild mit einer grünen Maske,\num die Bewegungsbereiche hervorzuheben. TP_RAW_PIXELSHIFTSIGMA;Unschärferadius TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Der Standard-Radius von 1,0 passt in der Regel für die Basis-ISO.\nErhöhen Sie den Wert für High-ISO-Aufnahmen, 5,0 ist ein guter\nAusgangspunkt für High-ISO-Aufnahmen. Achten Sie auf die\nBewegungsmaske, während Sie den Wert ändern. TP_RAW_PIXELSHIFTSMOOTH;Weicher Übergang @@ -1837,10 +2016,12 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD + VNG4 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_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.\n\n"+ schnell" erzeugt weniger Artefakte in kontrast-\narmen Bereichen. TP_RAW_SENSOR_XTRANS_LABEL;Sensor mit X-Trans-Matrix TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Hochskalieren zulassen TP_RESIZE_APPLIESTO;Anwenden auf: TP_RESIZE_CROPPEDAREA;Ausschnitt TP_RESIZE_FITBOX;Begrenzungsrahmen @@ -1906,7 +2087,7 @@ TP_RETINEX_MEDIAN;Medianfilter TP_RETINEX_METHOD;Methode TP_RETINEX_METHOD_TOOLTIP;Schatten wirkt sich auf dunkle Bereiche aus.\n\nSchatten / Lichter wirkt sich auf dunkle und helle Bereiche aus.\n\nLichter wirkt sich auf helle Bereiche aus.\n\nSpitzlichter wirkt sich auf sehr helle Bereiche aus und reduziert\nMagenta-Falschfarben. TP_RETINEX_MLABEL;Schleierred: Min = %1, Max = %2 -TP_RETINEX_MLABEL_TOOLTIP;Sollte nahe bei Min = 0 und Max = 32768 sein +TP_RETINEX_MLABEL_TOOLTIP;Sollte nahe bei Min = 0 und Max = 32768 sein. TP_RETINEX_NEIGHBOR;Radius TP_RETINEX_NEUTRAL;Zurücksetzen TP_RETINEX_NEUTRAL_TIP;Setzt alle Regler und Kurven\nauf ihre Standardwerte zurück. @@ -1959,6 +2140,8 @@ TP_SHARPENEDGE_LABEL;Kantenschärfung TP_SHARPENEDGE_PASSES;Iterationen TP_SHARPENEDGE_THREE;Nur Luminanz TP_SHARPENING_AMOUNT;Intensität +TP_SHARPENING_BLUR;Weichzeichnerradius +TP_SHARPENING_CONTRAST;Kontrastschwelle TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Kantentoleranz TP_SHARPENING_HALOCONTROL;Halokontrolle @@ -1974,12 +2157,16 @@ TP_SHARPENING_RLD_ITERATIONS;Iterationen TP_SHARPENING_THRESHOLD;Schwelle TP_SHARPENING_USM;Unschärfemaskierung TP_SHARPENMICRO_AMOUNT;Intensität +TP_SHARPENMICRO_CONTRAST;Kontrastschwelle TP_SHARPENMICRO_LABEL;Mikrokontrast TP_SHARPENMICRO_MATRIX;3×3-Matrix statt 5×5-Matrix TP_SHARPENMICRO_UNIFORMITY;Gleichmäßigkeit +TP_SOFTLIGHT_LABEL;Weiches Licht +TP_SOFTLIGHT_STRENGTH;Intensität TP_TM_FATTAL_AMOUNT;Intensität -TP_TM_FATTAL_LABEL;HDR-Dynamikkompression -TP_TM_FATTAL_THRESHOLD;Schwelle +TP_TM_FATTAL_ANCHOR;Helligkeitsverschiebung +TP_TM_FATTAL_LABEL;Dynamikkompression +TP_TM_FATTAL_THRESHOLD;Details TP_VIBRANCE_AVOIDCOLORSHIFT;Farbverschiebungen vermeiden TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Hautfarbtöne @@ -1987,7 +2174,7 @@ TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Rot / Violett TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Rot TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Rot / Gelb TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Gelb -TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Farbton als Funktion des Farbtons H = f(H) +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Farbton als Funktion des Farbtons H = f(H). TP_VIBRANCE_LABEL;Dynamik TP_VIBRANCE_PASTELS;Pastelltöne TP_VIBRANCE_PASTSATTOG;Pastell und gesättigte Töne koppeln @@ -2037,7 +2224,7 @@ TP_WAVELET_CHCU;Kurve TP_WAVELET_CHR;Farb-Kontrast-Verknüpfung TP_WAVELET_CHRO;Ebenengrenze Gesättigte/Pastellfarben TP_WAVELET_CHRO_TOOLTIP;Waveletebene (n) die, die Grenze zwischen gesättigten und Pastellfarben bestimmt.\n1-n: Gesättigte Farben\nn-9: Pastellfarben\n\nIst der Wert größer als die vorgegebene Anzahl an Waveletebenen werden diese ignoriert. -TP_WAVELET_CHR_TOOLTIP;Farbton als Funktion des Kontrasts und der Farb-Kontrast-Verknüpfung +TP_WAVELET_CHR_TOOLTIP;Farbton als Funktion des Kontrasts und der Farb-Kontrast-Verknüpfung. TP_WAVELET_CHSL;Regler TP_WAVELET_CHTYPE;Chrominanzmethode TP_WAVELET_COLORT;Deckkraft Rot / Grün @@ -2050,15 +2237,15 @@ TP_WAVELET_CONTR;Gamut TP_WAVELET_CONTRA;Kontrast TP_WAVELET_CONTRAST_MINUS;Kontrast - TP_WAVELET_CONTRAST_PLUS;Kontrast + -TP_WAVELET_CONTRA_TOOLTIP;Ändert den Kontrast des Restbildes +TP_WAVELET_CONTRA_TOOLTIP;Ändert den Kontrast des Restbildes. TP_WAVELET_CTYPE;Chrominanzkontrolle TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Lokaler Kontrast als Funktion des ursprünglichen Kontrasts.\n\nNiedrige Werte: Wenig lokaler Kontrast (Werte zwischen 10 - 20)\n50%: Durchschnittlicher lokaler Kontrast (Werte zwischen 100 - 300)\n66%: Standardabweichung des Lokalen Kontrasts (Werte zwischen 300 - 800)\n100%: Maximaler lokaler Kontrast (Werte zwischen 3000 - 8000)\n TP_WAVELET_CURVEEDITOR_CH;Kontrast = f(H) TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Kontrast als Funktion des Farbtons.\nAchten Sie darauf, dass Sie die Werte beim\nGamut-Farbton nicht überschreiben\n\nDie Kurve hat nur Auswirkung, wenn die Wavelet-\nKontrastregler nicht auf “0“ stehen. TP_WAVELET_CURVEEDITOR_CL;L -TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Wendet eine Kontrasthelligkeitskurve\nam Ende der Waveletverarbeitung an.\n +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Wendet eine Kontrasthelligkeitskurve\nam Ende der Waveletverarbeitung an. TP_WAVELET_CURVEEDITOR_HH;HH -TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H = f(H) +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Farbton als Funktion des Farbtons H = f(H). TP_WAVELET_DALL;Alle Richtungen TP_WAVELET_DAUB;Kantenperformance TP_WAVELET_DAUB2;D2 - niedrig @@ -2133,7 +2320,7 @@ TP_WAVELET_NPTYPE_TOOLTIP;Dieser Algorithmus verwendet ein Pixel und acht\nseine TP_WAVELET_OPACITY;Deckkraft Blau / Gelb TP_WAVELET_OPACITYW;Kontrastausgleichskurve TP_WAVELET_OPACITYWL;Lokale Kontrastkurve -TP_WAVELET_OPACITYWL_TOOLTIP;Wendet eine lokale Kontrastkurve am\nEnde der Wavelet-Verarbeitung an.\n\nLinks stellt den niedrigsten, rechts den\nhöchsten Kontrast dar.\n +TP_WAVELET_OPACITYWL_TOOLTIP;Wendet eine lokale Kontrastkurve am\nEnde der Wavelet-Verarbeitung an.\n\nLinks stellt den niedrigsten, rechts den\nhöchsten Kontrast dar. TP_WAVELET_PASTEL;Pastellfarben TP_WAVELET_PROC;Verarbeitung TP_WAVELET_RE1;Schärfung verstärken @@ -2164,7 +2351,7 @@ TP_WAVELET_TILESIZE;Kachelgröße TP_WAVELET_TILESLIT;Kleine Kacheln TP_WAVELET_TILES_TOOLTIP;“Ganzes Bild“ (empfohlen) liefert eine bessere Qualität.\n“Kacheln“ benötigen weniger Speicher und ist nur für\nComputer mit wenig RAM zu empfehlen. TP_WAVELET_TMSTRENGTH;Intensität -TP_WAVELET_TMSTRENGTH_TOOLTIP;Kontrolliert die Intensität der Dynamik- oder\nKontrastkompression des Restbildes. Ist der\nWert ungleich 0, werden die Intensitäts- und\nGammaregler des Dynamikkompressions-\nWerkzeugs im Belichtungsreiter deaktiviert. +TP_WAVELET_TMSTRENGTH_TOOLTIP;Kontrolliert die Intensität der Dynamik- oder\nKontrastkompression des Restbildes. Ist der\nWert ungleich 0, werden die Intensitäts- und\nGammaregler des Tonwertkorrektur-\nWerkzeugs im Belichtungsreiter deaktiviert. TP_WAVELET_TMTYPE;Kompression TP_WAVELET_TON;Tönung TP_WBALANCE_AUTO;Automatisch @@ -2201,6 +2388,7 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Methode +TP_WBALANCE_PICKER;Farbwähler TP_WBALANCE_SHADE;Schatten TP_WBALANCE_SIZE;Größe: TP_WBALANCE_SOLUX35;Solux 3500K @@ -2216,10 +2404,10 @@ TP_WBALANCE_WATER1;Unterwasser 1 TP_WBALANCE_WATER2;Unterwasser 2 TP_WBALANCE_WATER_HEADER;Unterwasser ZOOMPANEL_100;(100%) -ZOOMPANEL_NEWCROPWINDOW;Neues Detailfenster öffnen +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: - @@ -2227,25 +2415,4 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -BATCHQUEUE_STARTSTOPHINT;Startet / Stoppt die Verarbeitung\nder Warteschlange.\n\nTaste: Strg + s -GENERAL_SLIDER;Regler -HISTORY_MSG_173;(Rauschreduzierung)\nLuminanzdetails -HISTORY_MSG_203;(Rauschreduzierung)\nFarbraum -HISTORY_MSG_256;(Rauschreduzierung)\nMedianfilter - Mediantyp -HISTORY_MSG_297;(Rauschreduzierung)\nQualität -HISTORY_MSG_METADATA_MODE;(Metadaten)\nKopiermodus -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_EDITORCMDLINE;Benutzerdefinierte Befehlszeile -TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Erhöht / Reduziert die Intensität der\nChrominanz-Rauschreduzierung in\nAbhängigkeit der Farbsättigung. -TP_DIRPYRDENOISE_LABEL;Rauschreduzierung -TP_METADATA_EDIT;Veränderte Daten -TP_METADATA_MODE;Kopiermodus -TP_METADATA_STRIP;Keine -TP_METADATA_TUNNEL;Unveränderte Daten -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_IMAGENUM_SN;SN-Modus diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index 7d28deffa..f6f3cc518 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -2,7 +2,7 @@ EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Colour Suppression FILEBROWSER_COLORLABEL_TOOLTIP;Colour label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Colour\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_POPUPCOLORLABEL;Colour label FILEBROWSER_SHOWUNCOLORHINT;Show images without a colour label.\nShortcut: Alt-0 -FILECHOOSER_FILTER_COLPROF;Colour profiles +FILECHOOSER_FILTER_COLPROF;Colour profiles (*.icc) HISTORY_MSG_46;Colour denoising HISTORY_MSG_69;Working colour space HISTORY_MSG_70;Output colour space @@ -19,44 +19,51 @@ HISTORY_MSG_240;GF - Centre HISTORY_MSG_245;VC - Centre HISTORY_MSG_257;Colour Toning HISTORY_MSG_258;CT - Colour curve +HISTORY_MSG_273;CT - Colour Balance SMH HISTORY_MSG_322;W - Gamut - Avoid colour shift HISTORY_MSG_385;W - Residual - Colour Balance +HISTORY_MSG_392;W - Residual - Colour Balance HISTORY_MSG_419;Retinex - Colour space +HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colours +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Colour correction +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Colour correction +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid colour shift +HISTORY_MSG_SH_COLORSPACE;S/H - Colourspace 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 -MAIN_TOOLTIP_BACKCOLOR2;Background colour of the preview: White\nShortcut: 9 -MAIN_TOOLTIP_BACKCOLOR3;Background colour of the preview: Middle grey\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR0;Background colour of the preview: theme-based\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR1;Background colour of the preview: black\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR2;Background colour of the preview: white\nShortcut: 9 +MAIN_TOOLTIP_BACKCOLOR3;Background colour of the preview: middle grey\nShortcut: 9 PARTIALPASTE_COLORGROUP;Colour Related Settings PARTIALPASTE_COLORTONING;Colour toning PARTIALPASTE_ICMSETTINGS;Colour management settings +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid colour shift PARTIALPASTE_RAW_FALSECOLOR;False colour suppression +PREFERENCES_APPEARANCE_COLORPICKERFONT;Colour picker font +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask colour +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide colour PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor colour profile PREFERENCES_BEHAVIOR;Behaviour -PREFERENCES_CUTOVERLAYBRUSH;Crop mask colour/transparency PREFERENCES_ICCDIR;Directory containing colour profiles PREFERENCES_INTENT_ABSOLUTE;Absolute Colourimetric PREFERENCES_INTENT_RELATIVE;Relative Colourimetric PREFERENCES_MENUGROUPLABEL;Group "Colour label" PREFERENCES_MONPROFILE;Default colour profile -PREFERENCES_NAVGUIDEBRUSH;Navigator guide colour 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 Printer profile. -SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Colour Management. -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 +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 the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. 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 TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colours in ROYGCBPM mode. TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the colour components. TP_BWMIX_FILTER;Colour Filter TP_BWMIX_FILTER_TOOLTIP;The colour filter simulates shots taken with a coloured filter placed in front of the lens. Coloured filters reduce the transmission of specific colour ranges and therefore affect their lightness. E.g. a red filter darkens blue skies. -TP_BWMIX_NEUTRAL_TIP;Reset all values (Colour Filter, Channel Mixer) to default. TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behaviour. TP_COLORAPP_ALGO_QM;Brightness + Colourfulness (QM) TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly coloured) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. -TP_COLORAPP_CHROMA_M;Colourfulnes (M) +TP_COLORAPP_CHROMA_M;Colourfulness (M) TP_COLORAPP_CHROMA_M_TOOLTIP;Colourfulness in CIECAM02 differs from L*a*b* and RGB colourfulness. TP_COLORAPP_CURVEEDITOR3;Colour curve TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colourfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. @@ -65,6 +72,8 @@ TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colours to take into account the 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_LABREGIONS;Colour correction regions 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 @@ -78,7 +87,7 @@ 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. -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 + Colourfulness (QM)"\n3. "Tone mapping using CIECAM02 brightness (Q)" +TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colours 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 colour cast. TP_GRADIENT_CENTER;Centre TP_GRADIENT_CENTER_X;Centre X @@ -94,7 +103,9 @@ TP_LABCURVE_AVOIDCOLORSHIFT;Avoid colour shift TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colours into gamut of the working colour space and apply Munsell correction. TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to centre,\n100 = to centre. TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by colour.\nHigher = more,\nLower = less. +TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid colour shift TP_RAW_FALSECOLOR;False colour suppression steps +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. 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 colour. TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid colour shift TP_VIGNETTING_CENTER;Centre @@ -104,6 +115,7 @@ TP_WAVELET_AVOID;Avoid colour shift TP_WAVELET_CBENAB;Toning and Colour Balance TP_WAVELET_CB_TOOLTIP;For strong values product colour-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 colours.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored. +TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centreed on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. !!!!!!!!!!!!!!!!!!!!!!!!! @@ -115,7 +127,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash -!ADJUSTER_RESET_TO_DEFAULT;Reset to default +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -125,9 +137,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -151,6 +164,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -164,6 +181,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_FOCALLEN;Focal length +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_ISO;ISO !EXIFFILTER_LENS;Lens !EXIFFILTER_METADATAFILTER;Enable metadata filters @@ -221,8 +239,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_CLEARPROFILE;Clear !FILEBROWSER_COPYPROFILE;Copy !FILEBROWSER_CURRENT_NAME;Current name: @@ -321,6 +339,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !GENERAL_BEFORE;Before !GENERAL_CANCEL;Cancel !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_DISABLE;Disable !GENERAL_DISABLED;Disabled !GENERAL_ENABLE;Enable @@ -333,17 +352,19 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !GENERAL_OK;OK !GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait +!GENERAL_RESET;Reset !GENERAL_SAVE;Save +!GENERAL_SAVE_AS;Save as... !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. !HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. !HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. !HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_CHANGED;Changed @@ -468,12 +489,11 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -571,9 +591,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_241;VF - Feather @@ -605,7 +625,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -620,8 +639,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -722,7 +741,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -801,22 +819,101 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot !HISTORY_SNAPSHOTS;Snapshots +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !IPTCPANEL_CATEGORY;Category !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITY;City @@ -859,17 +956,14 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PREFERENCES;Preferences !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m @@ -898,6 +992,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 @@ -906,6 +1002,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !MAIN_TAB_EXPORT; Fast Export !MAIN_TAB_EXPOSURE;Exposure !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_FILTER; Filter !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_IPTC;IPTC @@ -915,17 +1013,16 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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: < !MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: > -!MAIN_TOOLTIP_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l @@ -945,8 +1042,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 @@ -959,6 +1058,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIALOGLABEL;Partial paste processing profile !PARTIALPASTE_DIRPYRDENOISE;Noise reduction @@ -983,20 +1083,22 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1011,43 +1113,38 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENING;Sharpening (USM/RL) !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_VIGNETTING;Vignetting correction -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PARTIALPASTE_WHITEBALANCE;White balance !PREFERENCES_ADD;Add +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_APPLNEXTSTARTUP;restart required -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !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_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CACHECLEARALL;Clear All -!PREFERENCES_CACHECLEARPROFILES;Clear Processing Profiles -!PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries !PREFERENCES_CACHEOPTS;Cache Options !PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. !PREFERENCES_CLIPPINGIND;Clipping Indication !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1073,8 +1170,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DATEFORMAT;Date format !PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y - year\n%m - month\n%d - day\n\nFor example, the ISO 8601 standard dictates the date format as follows:\n%y-%m-%d -!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 @@ -1083,11 +1178,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory !PREFERENCES_EDITORCMDLINE;Custom command line -!PREFERENCES_EDITORLAYOUT;Editor Layout -!PREFERENCES_EXPAUT;Expert +!PREFERENCES_EDITORLAYOUT;Editor layout !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FILEFORMAT;File format !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory @@ -1127,26 +1221,19 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!PREFERENCES_MIN;Mini (100x115) !PREFERENCES_MONINTENT;Default rendering intent !PREFERENCES_MONITOR;Monitor !PREFERENCES_MONPROFILE_WARNOSX;Due to MacOS limitations, only sRGB is supported. !PREFERENCES_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OUTDIR;Output Directory !PREFERENCES_OUTDIRFOLDER;Save to folder !PREFERENCES_OUTDIRFOLDERHINT;Save images to the selected folder. @@ -1162,6 +1249,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1181,51 +1270,39 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !PREFERENCES_PSPATH;Adobe Photoshop installation directory !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now !PREFERENCES_SELECTLANG;Select language -!PREFERENCES_SELECTTHEME;Select theme -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWBASICEXIF;Show basic Exif info !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows -!PREFERENCES_SIMPLAUT;Tool mode !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_STARTUPIMDIR;Image Directory at Startup -!PREFERENCES_STDAUT;Standard !PREFERENCES_TAB_BROWSER;File Browser !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_GENERAL;General !PREFERENCES_TAB_IMPROC;Image Processing -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1266,13 +1343,16 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FILEFORMAT;File format +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_JPEGQUAL;JPEG quality !SAVEDLG_PUTTOQUEUE;Put into processing queue @@ -1295,7 +1375,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop area using Shift-mouse drag +!TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. !TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h !TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w !TP_BWMIX_ALGO;Algorithm OYCPM @@ -1303,7 +1383,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CHANNEL;Luminance equalizer !TP_BWMIX_CURVEEDITOR1;'Before' curve !TP_BWMIX_CURVEEDITOR2;'After' curve @@ -1325,8 +1404,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_SETTING;Presets @@ -1367,11 +1446,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Editor Tabs Mode,\nAlt-[ - Single Editor Tab Mode. !TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. !TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1380,6 +1455,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COLORAPP_BADPIXSL;Hot/bad pixel filter !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1395,8 +1471,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1407,14 +1481,13 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1432,11 +1505,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1446,6 +1517,25 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !TP_COLORTONING_LUMA;Luminance !TP_COLORTONING_LUMAMODE;Preserve luminance !TP_COLORTONING_METHOD;Method @@ -1479,15 +1569,20 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_CROP_H;Height !TP_CROP_LABEL;Crop !TP_CROP_PPI;PPI= -!TP_CROP_SELECTCROP;Select Crop +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_CROP_W;Width -!TP_CROP_X;X -!TP_CROP_Y;Y +!TP_CROP_X;Left +!TP_CROP_Y;Top !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1576,6 +1671,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 @@ -1601,10 +1698,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_FLATFIELD_BT_VERTICAL;Vertical !TP_FLATFIELD_CLIPCONTROL;Clip control !TP_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). !TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). @@ -1655,6 +1748,12 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. !TP_ICM_WORKINGPROFILE;Working Profile +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_BRIGHTNESS;Lightness @@ -1695,10 +1794,16 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1727,10 +1832,18 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1743,20 +1856,27 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1764,7 +1884,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1772,58 +1893,41 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1838,10 +1942,10 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_W;Width: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1853,7 +1957,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1879,7 +1983,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1941,6 +2045,8 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only !TP_SHARPENING_AMOUNT;Amount +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_EDRADIUS;Radius !TP_SHARPENING_EDTOLERANCE;Edge tolerance !TP_SHARPENING_HALOCONTROL;Halo control @@ -1956,12 +2062,16 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_SHARPENING_THRESHOLD;Threshold !TP_SHARPENING_USM;Unsharp Mask !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple @@ -2046,7 +2156,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2057,7 +2167,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2174,13 +2283,14 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 !TP_WBALANCE_METHOD;Method +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SIZE;Size: !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K !TP_WBALANCE_SOLUX47;Solux 4700K (vendor) !TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -!TP_WBALANCE_SPOTWB;Spot WB +!TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. !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". !TP_WBALANCE_TEMPERATURE;Temperature @@ -2191,7 +2301,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh !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 --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 9173517cf..34975d449 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -8,7 +8,7 @@ !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash -!ADJUSTER_RESET_TO_DEFAULT;Reset to default +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -18,9 +18,10 @@ !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -44,6 +45,10 @@ !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -57,6 +62,7 @@ !EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) !EXIFFILTER_FILETYPE;File type !EXIFFILTER_FOCALLEN;Focal length +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_ISO;ISO !EXIFFILTER_LENS;Lens !EXIFFILTER_METADATAFILTER;Enable metadata filters @@ -115,8 +121,8 @@ !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_CLEARPROFILE;Clear !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_COPYPROFILE;Copy @@ -205,7 +211,7 @@ !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. !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -219,6 +225,7 @@ !GENERAL_BEFORE;Before !GENERAL_CANCEL;Cancel !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_DISABLE;Disable !GENERAL_DISABLED;Disabled !GENERAL_ENABLE;Enable @@ -231,17 +238,19 @@ !GENERAL_OK;OK !GENERAL_OPEN;Open !GENERAL_PORTRAIT;Portrait +!GENERAL_RESET;Reset !GENERAL_SAVE;Save +!GENERAL_SAVE_AS;Save as... !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. !HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. !HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. !HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_CHANGED;Changed @@ -372,12 +381,11 @@ !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -481,9 +489,9 @@ !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -519,7 +527,7 @@ !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -534,8 +542,8 @@ !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -638,7 +646,7 @@ !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -718,22 +726,106 @@ !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT;Add !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s !HISTORY_SNAPSHOT;Snapshot !HISTORY_SNAPSHOTS;Snapshots +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !IPTCPANEL_CATEGORY;Category !IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. !IPTCPANEL_CITY;City @@ -776,17 +868,14 @@ !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PREFERENCES;Preferences !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m @@ -815,6 +904,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 @@ -824,6 +915,8 @@ !MAIN_TAB_EXPORT; Fast Export !MAIN_TAB_EXPOSURE;Exposure !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_FILTER; Filter !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_IPTC;IPTC @@ -833,21 +926,20 @@ !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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: < !MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: > -!MAIN_TOOLTIP_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l @@ -867,8 +959,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 @@ -883,6 +977,7 @@ !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIALOGLABEL;Partial paste processing profile !PARTIALPASTE_DIRPYRDENOISE;Noise reduction @@ -908,20 +1003,23 @@ !PARTIALPASTE_LENSGROUP;Lens Related Settings !PARTIALPASTE_LENSPROFILE;Profiled lens correction !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PCVIGNETTE;Vignette filter !PARTIALPASTE_PERSPECTIVE;Perspective !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -937,21 +1035,21 @@ !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENING;Sharpening (USM/RL) !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance !PARTIALPASTE_VIGNETTING;Vignetting correction -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PARTIALPASTE_WHITEBALANCE;White balance !PREFERENCES_ADD;Add +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_APPLNEXTSTARTUP;restart required -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -959,23 +1057,21 @@ !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CACHECLEARALL;Clear All -!PREFERENCES_CACHECLEARPROFILES;Clear Processing Profiles -!PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries !PREFERENCES_CACHEOPTS;Cache Options !PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. !PREFERENCES_CLIPPINGIND;Clipping Indication !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -991,7 +1087,6 @@ !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1002,8 +1097,6 @@ !PREFERENCES_DARKFRAMETEMPLATES;templates !PREFERENCES_DATEFORMAT;Date format !PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y - year\n%m - month\n%d - day\n\nFor example, the ISO 8601 standard dictates the date format as follows:\n%y-%m-%d -!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 @@ -1012,11 +1105,10 @@ !PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... !PREFERENCES_DIRSOFTWARE;Installation directory !PREFERENCES_EDITORCMDLINE;Custom command line -!PREFERENCES_EDITORLAYOUT;Editor Layout -!PREFERENCES_EXPAUT;Expert +!PREFERENCES_EDITORLAYOUT;Editor layout !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FILEFORMAT;File format !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory @@ -1059,12 +1151,7 @@ !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1072,16 +1159,13 @@ !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OUTDIR;Output Directory !PREFERENCES_OUTDIRFOLDER;Save to folder !PREFERENCES_OUTDIRFOLDERHINT;Save images to the selected folder. @@ -1097,6 +1181,8 @@ !PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1117,53 +1203,40 @@ !PREFERENCES_PSPATH;Adobe Photoshop installation directory !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now !PREFERENCES_SELECTLANG;Select language -!PREFERENCES_SELECTTHEME;Select theme -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWBASICEXIF;Show basic Exif info !PREFERENCES_SHOWDATETIME;Show date and time !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows -!PREFERENCES_SIMPLAUT;Tool mode !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_STARTUPIMDIR;Image Directory at Startup -!PREFERENCES_STDAUT;Standard !PREFERENCES_TAB_BROWSER;File Browser !PREFERENCES_TAB_COLORMGR;Color Management !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules !PREFERENCES_TAB_GENERAL;General !PREFERENCES_TAB_IMPROC;Image Processing -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1204,13 +1277,16 @@ !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists !SAVEDLG_FILEFORMAT;File format +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_JPEGQUAL;JPEG quality !SAVEDLG_PUTTOQUEUE;Put into processing queue @@ -1226,8 +1302,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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1235,8 +1311,8 @@ !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 -!TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop area using Shift-mouse drag +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. +!TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. !TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h !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. Center of rotation is the geometrical center of the image. !TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w @@ -1245,7 +1321,6 @@ !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1272,9 +1347,8 @@ !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1316,11 +1390,7 @@ !TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Editor Tabs Mode,\nAlt-[ - Single Editor Tab Mode. !TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. !TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1331,8 +1401,9 @@ !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1350,8 +1421,6 @@ !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1363,14 +1432,13 @@ !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1390,11 +1458,9 @@ !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1406,6 +1472,27 @@ !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1445,15 +1532,20 @@ !TP_CROP_H;Height !TP_CROP_LABEL;Crop !TP_CROP_PPI;PPI= -!TP_CROP_SELECTCROP;Select Crop +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_CROP_W;Width -!TP_CROP_X;X -!TP_CROP_Y;Y +!TP_CROP_X;Left +!TP_CROP_Y;Top !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1535,11 +1627,11 @@ !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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;Auto Levels !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_BLACKLEVEL;Black !TP_EXPOSURE_BRIGHTNESS;Lightness +!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP;Clip % !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression @@ -1550,6 +1642,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 @@ -1576,10 +1670,6 @@ !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1640,6 +1730,12 @@ !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. !TP_ICM_WORKINGPROFILE;Working Profile +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1682,10 +1778,16 @@ !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1716,10 +1818,19 @@ !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1732,20 +1843,27 @@ !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FALSECOLOR;False color suppression steps !TP_RAW_FAST;Fast @@ -1754,7 +1872,8 @@ !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1762,58 +1881,42 @@ !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1828,10 +1931,10 @@ !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_W;Width: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1843,7 +1946,7 @@ !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1869,7 +1972,7 @@ !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1932,6 +2035,8 @@ !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only !TP_SHARPENING_AMOUNT;Amount +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENING_EDRADIUS;Radius !TP_SHARPENING_EDTOLERANCE;Edge tolerance !TP_SHARPENING_HALOCONTROL;Halo control @@ -1947,12 +2052,16 @@ !TP_SHARPENING_THRESHOLD;Threshold !TP_SHARPENING_USM;Unsharp Mask !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2045,7 +2154,7 @@ !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2056,7 +2165,7 @@ !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2174,13 +2283,14 @@ !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 !TP_WBALANCE_METHOD;Method +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SIZE;Size: !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K !TP_WBALANCE_SOLUX47;Solux 4700K (vendor) !TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -!TP_WBALANCE_SPOTWB;Spot WB +!TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. !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". !TP_WBALANCE_TEMPERATURE;Temperature @@ -2191,7 +2301,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 --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index 1973c1bcc..d32a430fd 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -60,6 +60,7 @@ #60 2013-01-03 OdeLama, translation for v4.0.12 of untranslated/changed strings #61 2014-01-14 mapelo, bug correction and small enhancements. #62 2014-10-10 fotger +#63 2018-12-09 Faber777 ABOUT_TAB_BUILD;Versión ABOUT_TAB_CREDITS;Créditos @@ -70,11 +71,17 @@ 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 +BATCHQUEUE_STARTSTOPHINT;Iniciar o detener el procesamiento de las imágenes en la cola.\nTecla de Atajo: Ctrl + s BATCH_PROCESSING;Proceso por lotes +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_LEFT_TAN;LT: +CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: CURVEEDITOR_CURVE;Curva CURVEEDITOR_CURVES;Curvas CURVEEDITOR_CUSTOM;Personalizado CURVEEDITOR_DARKS;Oscuros +CURVEEDITOR_EDITPOINT_HINT;Active la edición de los valores de entrada / salida del nodo. \nHaga clic con el botón derecho en un nodo para seleccionarlo. \nHaga clic con el botón derecho en el espacio vacío para anular la selección del nodo. CURVEEDITOR_HIGHLIGHTS;Luces altas CURVEEDITOR_LIGHTS;Luces CURVEEDITOR_LINEAR;Lineal @@ -91,6 +98,20 @@ CURVEEDITOR_TOOLTIPPASTE;Pegar curva desde el portapapeles CURVEEDITOR_TOOLTIPSAVE;Guardar curva actual CURVEEDITOR_TYPE;Tipo: DIRBROWSER_FOLDERS;Carpetas +DONT_SHOW_AGAIN;No muestres este mensaje otra vez. +DYNPROFILEEDITOR_DELETE;Borrar +DYNPROFILEEDITOR_EDIT;Editar +DYNPROFILEEDITOR_EDIT_RULE;Editar regla de perfil dinámico +DYNPROFILEEDITOR_ENTRY_TOOLTIP;La coincidencia no distingue entre mayúsculas y minúsculas. \nUtilice el prefijo "re:" para ingresar \nUna expresión regular. +DYNPROFILEEDITOR_IMGTYPE_ANY;Cualquier +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Cambio de píxel +DYNPROFILEEDITOR_IMGTYPE_STD;Estándar +DYNPROFILEEDITOR_MOVE_DOWN;Mover hacia abajo +DYNPROFILEEDITOR_MOVE_UP;Mover hacia arriba +DYNPROFILEEDITOR_NEW;Nuevo +DYNPROFILEEDITOR_NEW_RULE;Nueva regla de perfil dinámico +DYNPROFILEEDITOR_PROFILE;Perfil de procesamiento EDITWINDOW_TITLE;Edición de imagen EDIT_OBJECT_TOOLTIP;Muestra un instrumento en la ventana de previo, el cual le permitirá ajustar esta herramienta. EDIT_PIPETTE_TOOLTIP;Para agregar un punto de ajuste en la curva , mantenga presionada la tecla Ctrl mientras oprime el botón izquierdo del ratón sobre el punto deseado en el previo de la imagen.\nPara ajustar el punto, mantenga presionada la tecla Ctrl mientras oprime el botón izquierdo del ratón sobre la correspondiente area en el previo y muevase hacia arriba y/o hacia abajo, logrando un ajuste fino del punto en la curva. Si desea un ajuste mayor, libere la tecla Ctrl. @@ -99,6 +120,7 @@ EXIFFILTER_CAMERA;Cámara EXIFFILTER_EXPOSURECOMPENSATION;Compensación de exposición (EV) EXIFFILTER_FILETYPE;Tipo de archivo EXIFFILTER_FOCALLEN;Distancia focal +EXIFFILTER_IMAGETYPE;Tipo de imagen EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Lente EXIFFILTER_METADATAFILTER;Activar filtros de metadatos @@ -116,11 +138,14 @@ EXIFPANEL_RESET;Restablecer EXIFPANEL_RESETALL;Restablecer todo EXIFPANEL_RESETALLHINT;Restablecer todos los atributos a los valores predeterminados EXIFPANEL_RESETHINT;Restablecer atributos seleccionados a los valores predeterminados +EXIFPANEL_SHOWALL;Mostrar todo EXIFPANEL_SUBDIRECTORY;Subcarpeta +EXPORT_BYPASS;Procesamiento de pasos a bypass EXPORT_BYPASS_ALL;Seleccionar / Deseleccionar todo EXPORT_BYPASS_DEFRINGE;Saltar Quitar borde púrpura EXPORT_BYPASS_DIRPYRDENOISE;Saltar Reducción de ruido EXPORT_BYPASS_DIRPYREQUALIZER;Saltar Contraste por niveles de detalle +EXPORT_BYPASS_EQUALIZER;Bypass Wavelet niveles EXPORT_BYPASS_RAW_CA;Saltar [raw] Corrección de aberración cromática EXPORT_BYPASS_RAW_CCSTEPS;Saltar [raw] Supresión de falso color EXPORT_BYPASS_RAW_DCB_ENHANCE;Saltar [raw] Aplicar pasos de mejora DCB @@ -138,8 +163,12 @@ EXPORT_FASTEXPORTOPTIONS;Opciones de Exportación Rápida EXPORT_INSTRUCTIONS;Las opciones de Exportación Rápida proporcionan la posibilidad de saltarse pasos de revelado que consumen mucho tiempo y recursos, ejecutando en su lugar el procesamiento de la cola utilizando los ajustes de Exportación Rápida. Se recomienda este método para generar más rápidamente imágenes de menor resolución: cuando la velocidad es prioritaria, o cuando se desea cambiar el tamaño de una o muchas imágenes de salida sin modificar sus parámetros de revelado. EXPORT_MAXHEIGHT;Altura máxima: EXPORT_MAXWIDTH;Anchura máxima: +EXPORT_PIPELINE;Fuente de procesamiento EXPORT_PUTTOQUEUEFAST; Poner en la cola de Exportación Rápida EXPORT_RAW_DMETHOD;Método de interpolado +EXPORT_USE_FAST_PIPELINE;Dedicado (procesamiento completo en imagen redimensionada) +EXPORT_USE_FAST_PIPELINE_TIP;Usar un conducto de procesamiento dedicado para las imágenes en el modo Exportación rápida, que cambia la velocidad por la calidad. El cambio de tamaño de la imagen se realiza lo antes posible, en lugar de hacerlo al final como en el conducto normal. La aceleración puede ser importante, pero prepárese para ver elementos extraños y una degradación general de la calidad de salida. +EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) EXTPROGTARGET_1;Raw EXTPROGTARGET_2;procesado en cola FILEBROWSER_ADDDELTEMPLATE;Añadir/Borrar plantillas... @@ -172,6 +201,7 @@ FILEBROWSER_PARTIALPASTEPROFILE;Pegar perfil parcialmente FILEBROWSER_PASTEPROFILE;Pegar perfil FILEBROWSER_POPUPCANCELJOB;Cancelar trabajo FILEBROWSER_POPUPCOLORLABEL;Etiquetar con un color +FILEBROWSER_POPUPCOLORLABEL0;Etiqueta: Ninguna FILEBROWSER_POPUPCOLORLABEL1;Etiqueta: Rojo FILEBROWSER_POPUPCOLORLABEL2;Etiqueta: Amarillo FILEBROWSER_POPUPCOLORLABEL3;Etiqueta: Verde @@ -204,12 +234,13 @@ FILEBROWSER_POPUPUNTRASH;Sacar de la papelera FILEBROWSER_QUERYBUTTONHINT;Borrar la búsqueda FILEBROWSER_QUERYHINT;Escriba parte del nombre del archivo a buscar, o una lista separada con comas.\nP.ej. 1001,1004,1199\n\nCtrl-F Para poner el foco en el campo Buscar.\nEnter Para iniciar la búsqueda.\nEsc Para limpiar.\nShift-Esc Para quitar el foco. FILEBROWSER_QUERYLABEL; Buscar: -FILEBROWSER_RANK1_TOOLTIP;Rango 1 *\nAtajoShift-1 -FILEBROWSER_RANK2_TOOLTIP;Rango 2 **\nAtajoShift-2 -FILEBROWSER_RANK3_TOOLTIP;Rango 3 ***\nAtajoShift-3 -FILEBROWSER_RANK4_TOOLTIP;Rango 4 ****\nAtajoShift-4 -FILEBROWSER_RANK5_TOOLTIP;Rango 5 *****\nAtajoShift-5 +FILEBROWSER_RANK1_TOOLTIP;Rango 1 *\nTecla de AtajoShift-1 +FILEBROWSER_RANK2_TOOLTIP;Rango 2 **\nTecla de AtajoShift-2 +FILEBROWSER_RANK3_TOOLTIP;Rango 3 ***\nTecla de AtajoShift-3 +FILEBROWSER_RANK4_TOOLTIP;Rango 4 ****\nTecla de AtajoShift-4 +FILEBROWSER_RANK5_TOOLTIP;Rango 5 *****\nTecla de AtajoShift-5 FILEBROWSER_RENAMEDLGLABEL;Renombrar archivo +FILEBROWSER_RESETDEFAULTPROFILE;Restablecen a los predeterminados FILEBROWSER_SELECTDARKFRAME;Seleccionar Toma Negra… FILEBROWSER_SELECTFLATFIELD;Seleccionar Campo Plano… FILEBROWSER_SHOWCOLORLABEL1HINT;Mostrar imágenes etiquetadas con Rojo Alt-1 @@ -217,30 +248,42 @@ FILEBROWSER_SHOWCOLORLABEL2HINT;Mostrar imágenes etiquetadas con Amarillo Al FILEBROWSER_SHOWCOLORLABEL3HINT;Mostrar imágenes etiquetadas con Verde Alt-3 FILEBROWSER_SHOWCOLORLABEL4HINT;Mostrar imágenes etiquetadas con Azul Alt-4 FILEBROWSER_SHOWCOLORLABEL5HINT;Mostrar imágenes etiquetadas con Púrpura Alt-5 -FILEBROWSER_SHOWDIRHINT;Quitar todos los filtros.\nAtajo: d -FILEBROWSER_SHOWEDITEDHINT;Mostrar imágenes editadas.\nAtajo: 7 -FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imágenes no editadas.\nAtajo: 6 -FILEBROWSER_SHOWEXIFINFO;Mostrar datos Exif.\nAtajo: i\n\nAtajo en modo editor simple: Alt-I -FILEBROWSER_SHOWRANK1HINT;Mostrar imágenes con 1 estrella.\nAtajo: 1 -FILEBROWSER_SHOWRANK2HINT;Mostrar imágenes con 2 estrellas.\nAtajo: 2 -FILEBROWSER_SHOWRANK3HINT;Mostrar imágenes con 3 estrellas.\nAtajo: 3 -FILEBROWSER_SHOWRANK4HINT;Mostrar imágenes con 4 estrellas.\nAtajo: 4 -FILEBROWSER_SHOWRANK5HINT;Mostrar imágenes con 5 estrellas.\nAtajo: 5 -FILEBROWSER_SHOWRECENTLYSAVEDHINT;Mostrar imágenes guardadas recientemente.\nAtajo: Alt-7 -FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Mostrar imágenes no guardadas recientemente.\nAtajo: Alt-6 -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_SHOWDIRHINT;Quitar todos los filtros.\nTecla de Atajo: d +FILEBROWSER_SHOWEDITEDHINT;Mostrar imágenes editadas.\nTecla de Atajo: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imágenes no editadas.\nTecla de Atajo: 6 +FILEBROWSER_SHOWEXIFINFO;Mostrar datos Exif.\nTecla de Atajo: i\n\nTecla de Atajo en modo editor simple: Alt-I +FILEBROWSER_SHOWNOTTRASHHINT;Mostrar solo las imágenes no borradas. +FILEBROWSER_SHOWORIGINALHINT;Muestre solo imágenes originales. \nCuando existen varias imágenes con el mismo nombre de archivo pero con diferentes extensiones, la que se considera original es aquella cuya extensión está más cerca de la parte superior de la lista de extensiones analizadas en Preferencias> Explorador de archivos> Extensiones analizadas. +FILEBROWSER_SHOWRANK1HINT;Mostrar imágenes con 1 estrella.\nTecla de Atajo: 1 +FILEBROWSER_SHOWRANK2HINT;Mostrar imágenes con 2 estrellas.\nTecla de Atajo: 2 +FILEBROWSER_SHOWRANK3HINT;Mostrar imágenes con 3 estrellas.\nTecla de Atajo: 3 +FILEBROWSER_SHOWRANK4HINT;Mostrar imágenes con 4 estrellas.\nTecla de Atajo: 4 +FILEBROWSER_SHOWRANK5HINT;Mostrar imágenes con 5 estrellas.\nTecla de Atajo: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Mostrar imágenes guardadas recientemente.\nTecla de Atajo: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Mostrar imágenes no guardadas recientemente.\nTecla de Atajo: Alt-6 +FILEBROWSER_SHOWTRASHHINT;Mostrar el contenido de la papelera.\nTecla de Atajo: Ctrl-t +FILEBROWSER_SHOWUNCOLORHINT;Mostrar imágenes sin etiqueta de color.\nTecla de Atajo: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;Mostrar imágenes sin rango.\nTecla de Atajo: 0 FILEBROWSER_THUMBSIZE;Tamaño miniatura -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-- +FILEBROWSER_UNRANK_TOOLTIP;Sin Rango\nTecla de AtajoShift - 0 +FILEBROWSER_ZOOMINHINT;Agrandar miniatura.\nTecla de Atajo: +\n\nTecla de Atajo en modo editor simple: Alt-+ +FILEBROWSER_ZOOMOUTHINT;Reducir miniatura.\nTecla de Atajo: -\n\nTecla de Atajo en modo editor simple: Alt-- +FILECHOOSER_FILTER_ANY;Todos los archivos +FILECHOOSER_FILTER_COLPROF;Perfiles de color +FILECHOOSER_FILTER_CURVE;Archivos de curva +FILECHOOSER_FILTER_LCP;Perfiles de corrección de lentes. +FILECHOOSER_FILTER_PP;Processing profiles +FILECHOOSER_FILTER_SAME;Same format as current photo +FILECHOOSER_FILTER_TIFF;Archivos TIFF GENERAL_ABOUT;Acerca de GENERAL_AFTER;Después +GENERAL_APPLY;Aplicar +GENERAL_ASIMAGE;Como imagen GENERAL_AUTO;Automático GENERAL_BEFORE;Antes GENERAL_CANCEL;Cancelar GENERAL_CLOSE;Cerrar +GENERAL_CURRENT;Actual GENERAL_DISABLE;Desactivar GENERAL_DISABLED;Desactivado GENERAL_ENABLE;Activar @@ -251,16 +294,22 @@ GENERAL_NA;n/a GENERAL_NO;No GENERAL_NONE;Ninguno GENERAL_OK;Aceptar +GENERAL_OPEN;Abrir GENERAL_PORTRAIT;Retrato +GENERAL_RESET;Reiniciar GENERAL_SAVE;Guardar +GENERAL_SAVE_AS;Guardar como... +GENERAL_SLIDER;Deslizador GENERAL_UNCHANGED;(Sin cambios) GENERAL_WARNING;Advertencia +GIMP_PLUGIN_INFO;¡Bienvenido al complemento GIMP de RawTherapee! \nUna vez que haya terminado de editar, simplemente cierre la ventana principal de RawTherapee y la imagen se importará automáticamente en GIMP. HISTOGRAM_TOOLTIP_B;Mostrar/Ocultar Histograma Azul HISTOGRAM_TOOLTIP_BAR;Mostrar/Ocultar barra indicadora RGB\nHacer clic con el botón derecho del ratón en la previsualización para congelar/descongelar HISTOGRAM_TOOLTIP_CHRO;Mostrar/Ocultar Histograma de cromaticidad HISTOGRAM_TOOLTIP_FULL;Cambiar entre Histograma completo o escalado HISTOGRAM_TOOLTIP_G;Mostrar/Ocultar Histograma Verde HISTOGRAM_TOOLTIP_L;Mostrar/Ocultar Histograma de Luminancia CIELAB +HISTOGRAM_TOOLTIP_MODE;Alterne entre la escala lineal, log-linear y log-log del histograma. HISTOGRAM_TOOLTIP_R;Mostrar/Ocultar Histograma Rojo HISTOGRAM_TOOLTIP_RAW;Mostrar/ocultar Histograma Raw HISTORY_CHANGED;Cambiado @@ -361,7 +410,7 @@ HISTORY_MSG_91;RR - Crominancia Maestra HISTORY_MSG_92;RR - Gamma HISTORY_MSG_93;Contraste/niveles de detalle - Valor HISTORY_MSG_94;Contraste por niveles de detalle -HISTORY_MSG_95;Lab - Cromaticidad +HISTORY_MSG_95;Lab - Cromaticidad (saturación) HISTORY_MSG_96;Curva 'a' HISTORY_MSG_97;Curva 'b' HISTORY_MSG_98;Método de Interpolación @@ -391,7 +440,6 @@ HISTORY_MSG_121;Corrección automática AC HISTORY_MSG_122;Auto selección de arch. de Toma Negra HISTORY_MSG_123;Archivo de Toma Negra HISTORY_MSG_124;Corrección de punto blanco -HISTORY_MSG_125;Preservar Luces Altas HISTORY_MSG_126;Archivo de campo plano HISTORY_MSG_127;Auto selección archivo de campo plano HISTORY_MSG_128;Radio de difuminado de campo plano @@ -402,7 +450,7 @@ HISTORY_MSG_132;Reducción de ruido de crominancia HISTORY_MSG_133;Gamma de salida HISTORY_MSG_134;Gamma libre HISTORY_MSG_135;Gamma libre -HISTORY_MSG_136;Pendiente de gamma +HISTORY_MSG_136;Pendiente de (la curva) gamma HISTORY_MSG_137;Nivel de negro - Verde 1 HISTORY_MSG_138;Nivel de negro - Rojo HISTORY_MSG_139;Nivel de negro - Azul @@ -416,7 +464,7 @@ HISTORY_MSG_146;Enfoque de bordes (EB) HISTORY_MSG_147;EB - Sólo luminancia HISTORY_MSG_148;Micro-contraste HISTORY_MSG_149;Micro-contraste - matriz 3×3 -HISTORY_MSG_150;Reducción artefactos/ruido post interpolado +HISTORY_MSG_150;Reducción elementos extraños/ruido post interpolado HISTORY_MSG_151;Vibranza (Vib) HISTORY_MSG_152;Vib - Tonos pastel HISTORY_MSG_153;Vib - Tonos saturados @@ -432,12 +480,14 @@ HISTORY_MSG_162;Mapeo tonal (MT) HISTORY_MSG_163;Curvas RGB - Rojo HISTORY_MSG_164;Curvas RGB - Verde HISTORY_MSG_165;Curvas RGB - Azul +HISTORY_MSG_166;Exposición - Restablecer HISTORY_MSG_167;Método de Interpolación HISTORY_MSG_168;Curva 'CC' HISTORY_MSG_169;Curva 'CM' HISTORY_MSG_170;Vib - Curva HISTORY_MSG_171;Curva 'LC' HISTORY_MSG_172;Lab - Restringe 'LC' +HISTORY_MSG_173;NR - Recuperación del detalle HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02 - Adaptación CAT02 HISTORY_MSG_176;CAM02 - Entorno de visualización @@ -467,6 +517,7 @@ HISTORY_MSG_199;CAM02 - Histogramas de salida HISTORY_MSG_200;CAMO2 - Mapeo tonal HISTORY_MSG_201;RR - Crominancia Ro,Ve HISTORY_MSG_202;RR - Crominancia Az,Am +HISTORY_MSG_203;NR - Espacio de color HISTORY_MSG_204;Pasos de mejora LMMSE HISTORY_MSG_205;CAM02 - Píxel caliente/muerto HISTORY_MSG_206;CAT02 - Luz de escena auto. @@ -518,6 +569,7 @@ HISTORY_MSG_252;CbDL - Tono de piel HISTORY_MSG_253;CbDL - Reducir elementos extraños HISTORY_MSG_254;CbDL - Matiz de piel HISTORY_MSG_255;RR - Filtro Median +HISTORY_MSG_256;NR - La mediana - Tipo HISTORY_MSG_257;Tonificación de Color HISTORY_MSG_258;TC - Color HISTORY_MSG_259;TC - Opacidad @@ -558,47 +610,346 @@ HISTORY_MSG_293;Simulación de Fílmico 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;NR - Modo HISTORY_MSG_298;Filtro Pixel Muerto +HISTORY_MSG_299;NR - Curva de crominancia +HISTORY_MSG_300;- +HISTORY_MSG_301;NR - Luma control +HISTORY_MSG_302;NR - Método crominancia(color) +HISTORY_MSG_303;NR - Método crominancia(color) +HISTORY_MSG_304;W - Niveles de contraste +HISTORY_MSG_305;Wavelet niveles +HISTORY_MSG_306;W - Proceso +HISTORY_MSG_307;W - Proceso +HISTORY_MSG_308;W - dirección del Proceso +HISTORY_MSG_309;W - ES - Detalle +HISTORY_MSG_310;W - Residual - cielo tar/prot +HISTORY_MSG_311;W - Wavelet niveles +HISTORY_MSG_312;W - Residual - Umbral de sombras +HISTORY_MSG_313;W - Cromaticidad(color) - Saturados/pastel +HISTORY_MSG_314;W - Gamut - Reduce elementos extraños +HISTORY_MSG_315;W - Residual - Contraste +HISTORY_MSG_316;W - Gamut- Piel tar/prot +HISTORY_MSG_317;W - Gamut - Tono de piel +HISTORY_MSG_318;W - Contraste - Niveles luces altas +HISTORY_MSG_319;W - Contraste - Rango de luces altas +HISTORY_MSG_320;W - Contraste - Rango de las sombras +HISTORY_MSG_321;W - Contraste - Niveles de sombra +HISTORY_MSG_322;W - Gamut - Evita el cambio de color. +HISTORY_MSG_323;W - ES - Contraste local +HISTORY_MSG_324;W - Cromaticidad(colores) - Pastel +HISTORY_MSG_325;W - Cromaticidad(color) - Saturado +HISTORY_MSG_326;W - Cromaticidad(color) - Método +HISTORY_MSG_327;W - Contraste - Aplicar a +HISTORY_MSG_328;W - Cromaticidad - Fuerza de enlace +HISTORY_MSG_329;W - Tonificación - Opacidad RG +HISTORY_MSG_330;W - Tonificación - Opacidad BY +HISTORY_MSG_331;W - Niveles de contraste - Extra +HISTORY_MSG_332;W - Método de mosaico +HISTORY_MSG_333;W - Sombras-Residual +HISTORY_MSG_334;W - Cromaticidad(color)-Residual +HISTORY_MSG_335;W - Umbral de luces-Residual +HISTORY_MSG_336;W - Umbral de luces altas-Residual +HISTORY_MSG_337;W - Tono del cielo-Residual +HISTORY_MSG_338;W - ES - Radio +HISTORY_MSG_339;W - ES - Fuerza +HISTORY_MSG_340;W - Fuerza +HISTORY_MSG_341;W - Rendimiento del enfoque +HISTORY_MSG_342;W - ES-Primer nivel +HISTORY_MSG_343;W - Niveles de crominancia(color) +HISTORY_MSG_344;W - Método de crominancia (color)sl/cur +HISTORY_MSG_345;W - ES - Contraste local +HISTORY_MSG_346;W - ES - Método de contraste local +HISTORY_MSG_347;W - Quitar ruido - Nivel 1 +HISTORY_MSG_348;W - Quitar ruido - Nivel 2 +HISTORY_MSG_349;W - Quitar ruido - Nivel 3 +HISTORY_MSG_350;W - ES - Edge detection +HISTORY_MSG_351;W - Residual-curva HH +HISTORY_MSG_352;W - Fondo +HISTORY_MSG_353;W - ES - Sensibilidad del gradiente +HISTORY_MSG_354;W - ES - Mejorado +HISTORY_MSG_355;W - ES - Umbral bajo +HISTORY_MSG_356;W - ES - Umbral alto +HISTORY_MSG_357;W - Quitar ruido -Enlace con ES +HISTORY_MSG_358;W - Gamut - CH +HISTORY_MSG_359;Vivo/Muerto - Umbral +HISTORY_MSG_360;TM - gamma +HISTORY_MSG_361;W - Final - Balance del cromaticidad(color) +HISTORY_MSG_362;W - Residual - Método de compresión +HISTORY_MSG_363;W - Residual - Fuerza comprensiva +HISTORY_MSG_364;W - Final - Balance del contraste +HISTORY_MSG_365;W - Final - balance Delta +HISTORY_MSG_366;W - Residual - Compresión gamma +HISTORY_MSG_367;W - Final - curva de contraste 'Después' +HISTORY_MSG_368;W - Final - Balance de contraste +HISTORY_MSG_369;W - Final - Método de balance +HISTORY_MSG_370;W - Final - Curva de contraste local +HISTORY_MSG_371;Enfocar después del cambio de tamaño +HISTORY_MSG_372;PRS USM - Radio +HISTORY_MSG_373;PRS USM - Cantidad +HISTORY_MSG_374;PRS USM - Límite +HISTORY_MSG_375;PRS USM - Enfocar solo los bordes +HISTORY_MSG_376;PRS USM - Radio de detección de bordes +HISTORY_MSG_377;PRS USM - Tolerancia del borde +HISTORY_MSG_378;PRS USM - Control del halo +HISTORY_MSG_379;PRS USM - Cantidad de control del halo +HISTORY_MSG_380;PRS - Método +HISTORY_MSG_381;PRS RLD - Radio +HISTORY_MSG_382;PRS RLD - Cantidad +HISTORY_MSG_383;PRS RLD - Amortiguador +HISTORY_MSG_384;PRS RLD - Iteraciones +HISTORY_MSG_385;W - Residual - Balance del color +HISTORY_MSG_386;W - Residual - CB Verde Alto +HISTORY_MSG_387;W - Residual - CB Azul Alto +HISTORY_MSG_388;W - Residual - CB Verde medio +HISTORY_MSG_389;W - Residual - CB Azul medio +HISTORY_MSG_390;W - Residual - CB Verde Bajo +HISTORY_MSG_391;W - Residual - CB Azul Bajo +HISTORY_MSG_392;W - Residual - CB Reiniciar +HISTORY_MSG_393;DCP - revisar tabla +HISTORY_MSG_394;DCP - Punto de partida en la exposición +HISTORY_MSG_395;DCP - Tabla base +HISTORY_MSG_396;W - Contraste sub-herramienta +HISTORY_MSG_397;W - Cromaticidad(color) sub-herramienta +HISTORY_MSG_398;W - ES sub-herramienta +HISTORY_MSG_399;W - Residual sub-herramienta +HISTORY_MSG_400;W - Final sub-herramienta +HISTORY_MSG_401;W - Viraje sub-herramienta +HISTORY_MSG_402;W - Quitar ruido sub-herramienta +HISTORY_MSG_403;W - ES - Edge sensitivity +HISTORY_MSG_404;W - ES - Amplificación de base +HISTORY_MSG_405;W - Quitar ruido - Nivel 4 +HISTORY_MSG_406;W - ES - Píxeles vecinos +HISTORY_MSG_407;Retinex - Método +HISTORY_MSG_408;Retinex - Radio +HISTORY_MSG_409;Retinex - Contraste +HISTORY_MSG_410;Retinex - Offset +HISTORY_MSG_411;Retinex - Fuerza +HISTORY_MSG_412;Retinex - Gradiente gaussiano +HISTORY_MSG_413;Retinex - Contraste +HISTORY_MSG_414;Retinex - Histograma - Lab +HISTORY_MSG_415;Retinex - Transmisión +HISTORY_MSG_416;Retinex +HISTORY_MSG_417;Retinex - Transmisión mediana +HISTORY_MSG_418;Retinex - Límite +HISTORY_MSG_419;Retinex - Espacio de color +HISTORY_MSG_420;Retinex - Histograma - HSL +HISTORY_MSG_421;Retinex - Gamma +HISTORY_MSG_422;Retinex - Gamma +HISTORY_MSG_423;Retinex - Gamma slope +HISTORY_MSG_424;Retinex - HL Límite +HISTORY_MSG_425;Retinex - Base del registro +HISTORY_MSG_426;Retinex - Ecualizador(ajuste) de tono +HISTORY_MSG_427;Intento de reproducción de salida +HISTORY_MSG_428;Monitoreo del intento de representación +HISTORY_MSG_429;Retinex - Iteraciones +HISTORY_MSG_430;Retinex - Transmisión gradiente +HISTORY_MSG_431;Retinex - Fuerza del gradiente +HISTORY_MSG_432;Retinex - M - Luces altas +HISTORY_MSG_433;Retinex - M - Luces altas TW +HISTORY_MSG_434;Retinex - M - Sombras +HISTORY_MSG_435;Retinex - M - Sombras TW +HISTORY_MSG_436;Retinex - M - Radio +HISTORY_MSG_437;Retinex - M - Método +HISTORY_MSG_438;Retinex - M - Equalizer +HISTORY_MSG_439;Retinex - Proceso +HISTORY_MSG_440;CbDL - Método +HISTORY_MSG_441;Retinex - Ganancia de la transmisión +HISTORY_MSG_442;Retinex - Escala +HISTORY_MSG_443;Compensación del punto negro de salida +HISTORY_MSG_444;WB - Sesgo temporal +HISTORY_MSG_445;Raw sub-imágen +HISTORY_MSG_449;PS - ISO adaptación +HISTORY_MSG_452;PS - Mostrar movimiento +HISTORY_MSG_453;PS - Mostrar máscara solamente +HISTORY_MSG_457;PS - Verificar rojo/azul +HISTORY_MSG_462;PS - Verificar verde +HISTORY_MSG_464;PS - Máscara de desenfoque del movimiento +HISTORY_MSG_465;PS - Radio de desenfoque +HISTORY_MSG_468;PS - Rellenar fallos +HISTORY_MSG_469;PS - Mediano/a +HISTORY_MSG_471;PS - Corrección del movimiento +HISTORY_MSG_472;PS - Transiciones suaves +HISTORY_MSG_473;PS - Utilizar LMMSE +HISTORY_MSG_474;PS - Ecualizar (ajustar) +HISTORY_MSG_475;PS - Equalizar(ajustar) el canal +HISTORY_MSG_476;CAM02 - Fuera de tempera +HISTORY_MSG_477;CAM02 - Fuera del verde +HISTORY_MSG_478;CAM02 - Yb Fuera +HISTORY_MSG_479;CAM02 - CAT02 adaptación incorrecta +HISTORY_MSG_480;CAM02 - Salida automática CAT02 +HISTORY_MSG_481;CAM02 - Temperatura de la scena +HISTORY_MSG_482;CAM02 - Escena verde +HISTORY_MSG_483;CAM02 - Yb escena +HISTORY_MSG_484;CAM02 - Auto Yb escena +HISTORY_MSG_485;Corrección de lentes +HISTORY_MSG_486;Corrección de lente - Cámara +HISTORY_MSG_487;Lente Corrección - Lente +HISTORY_MSG_488;HDR Mapeo de tonos +HISTORY_MSG_489;HDR TM - Límite +HISTORY_MSG_490;HDR TM - Cantidad +HISTORY_MSG_491;Balance de Blancos +HISTORY_MSG_492;RGB Curvas +HISTORY_MSG_493;L*a*b* Ajustes +HISTORY_MSG_CLAMPOOG;Recortar la gama de colores +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Corrección del color +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Corrección de color +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Canal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - máscara de región C +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - Mascara h +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - luminosidad +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L máscara +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - Lista +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - desenfoque la máscara de región +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - Compensar la region +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - Poder de la región +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturacion +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT -Muetra la máscara de región +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - Región de la pendiente +HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Profundidad +HISTORY_MSG_DEHAZE_ENABLED;Haze Eliminación +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Mostrar mapa de profundidad +HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Fuerza +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Doble demosaicado - Umbral automático +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Doble demosaicado - Umbral de contraste +HISTORY_MSG_HISTMATCHING;Curva de tono auto-emparejado +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Salida - Primaria +HISTORY_MSG_ICM_OUTPUT_TEMP;Salida - ICC-v4 iluminante D +HISTORY_MSG_ICM_OUTPUT_TYPE;Salida - Tipo +HISTORY_MSG_ICM_WORKING_GAMMA;Trabajando - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Trabajando - pendiente +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Trabajando - TRC método +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contraste cantidad-local +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contraste Oscuridad-local +HISTORY_MSG_LOCALCONTRAST_ENABLED;Contraste local +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contraste luminosidad-local +HISTORY_MSG_LOCALCONTRAST_RADIUS;Contraste radio-local +HISTORY_MSG_METADATA_MODE;Modo de copia de metadatos +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Umbral de contraste +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaicado método para el movimiento. +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Dirección del filtro de ruido de línea +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF filtro de líneas +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Umbral de contraste +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Corrección - Iteraciones +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw Corrección de CA bruta - Evite el cambio de color +HISTORY_MSG_RAW_BORDER;Raw margen/borde +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Redimensionar - Permitir escalado +HISTORY_MSG_SHARPENING_CONTRAST;Enfoque - Umbral de contraste +HISTORY_MSG_SH_COLORSPACE;S/H - Espacio de color +HISTORY_MSG_SOFTLIGHT_ENABLED;Luz tenue +HISTORY_MSG_SOFTLIGHT_STRENGTH;Luz tenue - Fuerza +HISTORY_MSG_TM_FATTAL_ANCHOR;HDR TM - Ancla HISTORY_NEWSNAPSHOT;Agregar -HISTORY_NEWSNAPSHOT_TOOLTIP;Atajo: Alt-s +HISTORY_NEWSNAPSHOT_TOOLTIP;Tecla de Atajo: Alt-s HISTORY_SNAPSHOT;Instantánea HISTORY_SNAPSHOTS;Instantáneas +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Restablecer los derechos de autor predeterminados, otorgados a "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Personalizado +ICCPROFCREATOR_DESCRIPTION;Descripción: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Anexar los valores de gamma y pendiente a la descripción. +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Deje vacío para establecer la descripción por defecto. +ICCPROFCREATOR_GAMMA;Gamma (curva) +ICCPROFCREATOR_ICCVERSION;ICC versión: +ICCPROFCREATOR_ILL;Illuminante: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Valor por defecto +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Solo se puede configurar el iluminante para los perfiles ICC v4. +ICCPROFCREATOR_PRIMARIES;Primarios: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;MejorRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Azul X +ICCPROFCREATOR_PRIM_BLUY;Azul Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Verde X +ICCPROFCREATOR_PRIM_GREY;Verde Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Rojo X +ICCPROFCREATOR_PRIM_REDY;Rojo Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;Solo puede establecer (colores) primarios personalizados para los perfiles ICC v4. +ICCPROFCREATOR_PRIM_WIDEG;Gamma Amplia +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Guardar el perfil ICC como ... +ICCPROFCREATOR_SLOPE;Pendiente de la curva gamma +ICCPROFCREATOR_TRC_PRESET;Curva de respuesta de tono: IPTCPANEL_CATEGORY;Categoría +IPTCPANEL_CATEGORYHINT;Identifica el tema de la imagen en la opinión del proveedor. IPTCPANEL_CITY;Ciudad +IPTCPANEL_CITYHINT;Ingrese el nombre de la ciudad representada en esta imagen. IPTCPANEL_COPYHINT;Copiar ajustes IPTC al portapapeles +IPTCPANEL_COPYRIGHT;aviso de copyright +IPTCPANEL_COPYRIGHTHINT;Ingrese un Aviso sobre el propietario actual de los derechos de autor de esta imagen, como © 2008 Jane Doe. IPTCPANEL_COUNTRY;País +IPTCPANEL_COUNTRYHINT;Ingrese el nombre del país representado en esta imagen. +IPTCPANEL_CREATOR;Creador +IPTCPANEL_CREATORHINT;Ingrese el nombre de la persona que creó esta imagen. +IPTCPANEL_CREATORJOBTITLE;Título del trabajo del creador +IPTCPANEL_CREATORJOBTITLEHINT;Ingrese el título de trabajo de la persona que aparece en el campo Creador. IPTCPANEL_CREDIT;Créditos IPTCPANEL_CREDITHINT;Identifica el proveedor de la imagen, que no necesariamente el dueño o creador. IPTCPANEL_DATECREATED;Fecha de creación +IPTCPANEL_DATECREATEDHINT;Ingrese la fecha en que se tomó la imagen. +IPTCPANEL_DESCRIPTION;Descripción +IPTCPANEL_DESCRIPTIONHINT;Ingrese una "leyenda" que describa quién, qué y por qué de lo que está sucediendo en esta imagen, esto podría incluir nombres de personas y / o su rol en la acción que se lleva a cabo dentro de la imagen. +IPTCPANEL_DESCRIPTIONWRITER;Descripción del escritor +IPTCPANEL_DESCRIPTIONWRITERHINT;Ingrese el nombre de la persona involucrada en escribir, editar o corregir la descripción de la imagen. IPTCPANEL_EMBEDDED;Incrustado IPTCPANEL_EMBEDDEDHINT;Restablecer a los datos IPTC incrustados en el archivo de la imagen IPTCPANEL_HEADLINE;Encabezado +IPTCPANEL_HEADLINEHINT;Ingrese un breve resumen publicable o resumen de los contenidos de la imagen. IPTCPANEL_INSTRUCTIONS;Instrucciones +IPTCPANEL_INSTRUCTIONSHINT;Ingrese información sobre embargos u otras restricciones no cubiertas por el campo de Copyright. IPTCPANEL_KEYWORDS;Palabras clave +IPTCPANEL_KEYWORDSHINT;Ingrese cualquier número de palabras clave, términos o frases utilizadas para expresar el tema en la imagen. IPTCPANEL_PASTEHINT;Pegar ajustes IPTC desde el portapapeles +IPTCPANEL_PROVINCE;Provincia o Estado +IPTCPANEL_PROVINCEHINT;Ingrese el nombre de la provincia o estado que se muestra en esta imagen. IPTCPANEL_RESET;Restablecer IPTCPANEL_RESETHINT;Restablecer a los ajustes predeterminados del perfil. IPTCPANEL_SOURCE;Fuente +IPTCPANEL_SOURCEHINT;Ingrese o edite el nombre de una persona o parte que tiene un rol en la cadena de suministro de contenido, como una persona o entidad de la que recibió esta imagen. +IPTCPANEL_SUPPCATEGORIES;Categorias suplementarias +IPTCPANEL_SUPPCATEGORIESHINT;Además purifica el tema de la imagen. IPTCPANEL_TITLE;Título +IPTCPANEL_TITLEHINT;Ingrese un nombre corto legible y humano para la imagen, este puede ser el nombre del archivo. +IPTCPANEL_TRANSREFERENCE;Identificación del trabajo +IPTCPANEL_TRANSREFERENCEHINT;Ingrese un número o identificador necesario para el control o seguimiento del flujo de trabajo. +LENSPROFILE_CORRECTION_AUTOMATCH;Parámetros de corrección auto-emparejados +LENSPROFILE_CORRECTION_LCPFILE;LCP archivo +LENSPROFILE_CORRECTION_MANUAL;Parámetros de corrección manual +LENSPROFILE_LENS_WARNING;Advertencia: el factor de recorte utilizado para el perfilado de la lente es mayor que el factor de recorte de la cámara, los resultados pueden ser incorrectos. MAIN_BUTTON_FULLSCREEN;Pantalla completa +MAIN_BUTTON_ICCPROFCREATOR;Creador de perfiles ICC MAIN_BUTTON_NAVNEXT_TOOLTIP;Navegar hasta la imagen Siguiente a la que está abierta en el editor:\nShift-F4\n\nPara navegar hasta la imagen Siguiente a aquella cuya miniatura está seleccionada en el Explorador de Archivos:\nF4 MAIN_BUTTON_NAVPREV_TOOLTIP;Navegar hasta la imagen Anterior a la que está abierta en el editor:\nShift-F3\n\nPara navegar hasta la imagen Anterior a aquella cuya miniatura está seleccionada en el Explorador de Archivos:\nF3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Sincronizar el Navegador de Archivos con el Editor para mostrar la miniatura de la imagen actualmente abierta y quitar los filtros en el Navegador de Archivos:\nx\n\nPara hacer lo dicho anteriormente, pero sin quitar los filtros en el Navegador de Archivos:\ny\n(Note que la miniatura del archivo abierto no será mostrada si los filtros la excluyen). MAIN_BUTTON_PREFERENCES;Preferencias MAIN_BUTTON_PUTTOQUEUE;Poner en la cola -MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Añadir imagen actual a la cola de procesamiento.\nAtajo: Ctrl+B +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Añadir imagen actual a la cola de procesamiento.\nTecla de Atajo: Ctrl+B MAIN_BUTTON_SAVE;Guardar imagen -MAIN_BUTTON_SAVE_TOOLTIP;Guardar imagen actual.\nAtajo: Ctrl+S +MAIN_BUTTON_SAVE_TOOLTIP;Guardar imagen actual.\nTecla de Atajo: Ctrl+S MAIN_BUTTON_SENDTOEDITOR;Abrir con editor -MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Editar imagen actual en editor externo.\nAtajo: Ctrl+E -MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Mostrar/ocultar todos los paneles laterales.\nAtajo: m +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Editar imagen actual en editor externo.\nTecla de Atajo: Ctrl+E +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Mostrar/ocultar todos los paneles laterales.\nTecla de Atajo: m MAIN_BUTTON_UNFULLSCREEN;Salir de Pantalla completa MAIN_FRAME_BATCHQUEUE;Cola de lotes -MAIN_FRAME_BATCHQUEUE_TOOLTIP; Cola de lotes.\nAtajo: Ctrl-F3 +MAIN_FRAME_BATCHQUEUE_TOOLTIP; Cola de lotes.\nTecla de Atajo: Ctrl-F3 MAIN_FRAME_EDITOR;Editor -MAIN_FRAME_EDITOR_TOOLTIP; Editor.\nAtajo: Ctrl-F4 +MAIN_FRAME_EDITOR_TOOLTIP; Editor.\nTecla de Atajo: Ctrl-F4 MAIN_FRAME_FILEBROWSER;Explorador de archivos -MAIN_FRAME_FILEBROWSER_TOOLTIP; Explorador de archivos.\nAtajo: Ctrl-F2 +MAIN_FRAME_FILEBROWSER_TOOLTIP; Explorador de archivos.\nTecla de Atajo: Ctrl-F2 MAIN_FRAME_PLACES;Ubicaciones MAIN_FRAME_PLACES_ADD;Añadir MAIN_FRAME_PLACES_DEL;Borrar @@ -615,52 +966,70 @@ MAIN_MSG_OPERATIONCANCELLED;Operación cancelada MAIN_MSG_PATHDOESNTEXIST;La ruta\n\n%1\n\nno existe. Por favor, establezca una ruta correcta en la ventana de Preferencias. MAIN_MSG_QOVERWRITE;¿Quiere sobre-escribirlo? MAIN_MSG_SETPATHFIRST;Para poder usar esta función, primero tiene que establecer una \nruta objetivo en la ventana de Preferencias! +MAIN_MSG_TOOMANYOPENEDITORS;Demasiados editores abiertos.\nPor favor cierre un editor para continuar. MAIN_MSG_WRITEFAILED;Falla al escribir\n\n"%1"\n\nAsegurese de que el folder exista y que usted tenga permiso de escritura sobre él. +MAIN_TAB_ADVANCED;Avanzado +MAIN_TAB_ADVANCED_TOOLTIP;Tecla de Atajo: Alt-w MAIN_TAB_COLOR;Color -MAIN_TAB_COLOR_TOOLTIP;Atajo: Alt-C +MAIN_TAB_COLOR_TOOLTIP;Tecla de Atajo: Alt-C MAIN_TAB_DETAIL;Detalle -MAIN_TAB_DETAIL_TOOLTIP;Atajo: Alt-D +MAIN_TAB_DETAIL_TOOLTIP;Tecla de Atajo: Alt-D MAIN_TAB_DEVELOP;Revelar MAIN_TAB_EXIF;Exif MAIN_TAB_EXPORT; Exportación Rápida MAIN_TAB_EXPOSURE;Exposición -MAIN_TAB_EXPOSURE_TOOLTIP;Atajo: Alt-E +MAIN_TAB_EXPOSURE_TOOLTIP;Tecla de Atajo: Alt-E MAIN_TAB_FILTER;Filtro +MAIN_TAB_INSPECT; Inspeccionar MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Metadatos -MAIN_TAB_METADATA_TOOLTIP;Atajo: Alt-M +MAIN_TAB_METADATA_TOOLTIP;Tecla de Atajo: Alt-M MAIN_TAB_RAW;Raw -MAIN_TAB_RAW_TOOLTIP;Atajo: Alt-R +MAIN_TAB_RAW_TOOLTIP;Tecla de Atajo: Alt-R MAIN_TAB_TRANSFORM;Transformar -MAIN_TAB_TRANSFORM_TOOLTIP;Atajo: Alt-T -MAIN_TOOLTIP_BACKCOLOR0;Color de fondo de la previsualización: Color del tema\nAtajo: 8 -MAIN_TOOLTIP_BACKCOLOR1;Color de fondo de la previsualización: Negro\nAtajo: 9 -MAIN_TOOLTIP_BACKCOLOR2;Color de fondo de la previsualización: Blanco\nAtajo: 0 +MAIN_TAB_TRANSFORM_TOOLTIP;Tecla de Atajo: Alt-T +MAIN_TOOLTIP_BACKCOLOR0;Color de fondo de la previsualización: Color del tema\nTecla de Atajo: 8 +MAIN_TOOLTIP_BACKCOLOR1;Color de fondo de la previsualización: Negro\nTecla de Atajo: 9 +MAIN_TOOLTIP_BACKCOLOR2;Color de fondo de la previsualización: Blanco\nTecla de Atajo: 0 +MAIN_TOOLTIP_BACKCOLOR3;Color de fondo de la vista previa: Medio gris \nMétodo rápido: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;Bloquear / Desbloquear la vista Antes\n\nBloquear: la vista Antes permanece inalterada - \nútil para evaluar el efecto acumulativo de varias herramientas.\nAdemás, se puede hacer una comparación con cualquier estado en el Historial\n\nDesbloquear: la vista Antes seguirá a la vista Después un paso por detrás, mostrando la imagen antes del efecto de la herramienta que se está usando -MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar panel izquierdo (incluyendo historial).\nAtajo: i -MAIN_TOOLTIP_INDCLIPPEDH;Indicación de luces altas recortadas.\nAtajo: < -MAIN_TOOLTIP_INDCLIPPEDS;Indicación de sombras recortadas.\nAtajo: > -MAIN_TOOLTIP_PREVIEWB;Previsualización Canal azul.\nAtajo: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Previsualización Máscara de Foco.\nAtajo: Shift-F\n\nMás preciso en imágenes con poca profundidad de campo, bajo ruido y a mayores niveles de aumento\n\nPara mejorar la precisión en imágenes con ruido evalúe usando menor aumento (10%-30%)\n\nPreview es realizada más lentamente cuando la Máscara de Foco esta activa. -MAIN_TOOLTIP_PREVIEWG;Previsualización Canal verde.\nAtajo: g -MAIN_TOOLTIP_PREVIEWL;Previsualización Luminosidad.\nAtajo: v\n\n0.299*R + 0.587*G + 0.114*B -MAIN_TOOLTIP_PREVIEWR;Previsualización Canal rojo.\nAtajo: r -MAIN_TOOLTIP_QINFO; Información breve de la imagen.\nAtajo: i -MAIN_TOOLTIP_SHOWHIDELP1;Mostrar/ocultar el panel izquierdo.\nAtajo: l -MAIN_TOOLTIP_SHOWHIDERP1;Mostrar/ocultar el panel derecho.\nAtajo: Alt-L -MAIN_TOOLTIP_SHOWHIDETP1;Mostrar/ocultar el panel superior.\nAtajo: Shift-L +MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar panel izquierdo (incluyendo historial).\nTecla de Atajo: i +MAIN_TOOLTIP_INDCLIPPEDH;Indicación de luces altas recortadas.\nTecla de Atajo: < +MAIN_TOOLTIP_INDCLIPPEDS;Indicación de sombras recortadas.\nTecla de Atajo: > +MAIN_TOOLTIP_PREVIEWB;Previsualización Canal azul.\nTecla de Atajo: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Previsualización Máscara de Foco.\nTecla de Atajo: Shift-F\n\nMás preciso en imágenes con poca profundidad de campo, bajo ruido y a mayores niveles de aumento\n\nPara mejorar la precisión en imágenes con ruido evalúe usando menor aumento (10%-30%)\n\nLa vista previa es realizada más lentamente cuando la Máscara de Foco esta activa. +MAIN_TOOLTIP_PREVIEWG;Previsualización Canal verde.\nTecla de Atajo: g +MAIN_TOOLTIP_PREVIEWL;Previsualización Luminosidad.\Tecla de Atajo: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Previsualización Canal rojo.\nTecla de Atajo: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Obtenga una vista previa de la máscara de contraste de nitidez . \n Tecla de atajo: p \n\nSólo funciona cuando la nitidez está activada y el zoom> = 100%. +MAIN_TOOLTIP_QINFO; Información breve de la imagen.\nTecla de Atajo : i +MAIN_TOOLTIP_SHOWHIDELP1;Mostrar/ocultar el panel izquierdo.\nTecla de Atajo: l +MAIN_TOOLTIP_SHOWHIDERP1;Mostrar/ocultar el panel derecho.\nTecla de Atajo: Alt-L +MAIN_TOOLTIP_SHOWHIDETP1;Mostrar/ocultar el panel superior.\nTecla de Atajo: Shift-L MAIN_TOOLTIP_THRESHOLD;Umbral -MAIN_TOOLTIP_TOGGLE;Cambiar vista antes/después.\nAtajo: Shift-B +MAIN_TOOLTIP_TOGGLE;Cambiar vista antes/después.\nTecla de Atajo: Shift-B +MONITOR_PROFILE_SYSTEM;Sistema por defecto +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;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. +OPTIONS_BUNDLED_MISSING;No se pudo encontrar el perfil "% 1 " incluido. \nSe podría dañar su instalación. \nnLos valores internos predeterminados se usarán en su lugar. +OPTIONS_DEFIMG_MISSING;No se pudo encontrar el perfil predeterminado para fotos sin formato o no está establecido. \nPor favor, compruebe el directorio de sus perfiles, puede que falte o esté dañado. \n "% 1 "se utilizará en su lugar +OPTIONS_DEFRAW_MISSING;No se pudo encontrar el perfil predeterminado para fotos sin procesar o no está configurado. \nPor favor, compruebe el directorio de sus perfiles, puede que falte o esté dañado. \n "% 1 < / b> "será usado en su lugar. +PARTIALPASTE_ADVANCEDGROUP;Ajustes avanzados PARTIALPASTE_BASICGROUP;Ajustes básicos PARTIALPASTE_CACORRECTION;Corrección de aberraciones cromáticas PARTIALPASTE_CHANNELMIXER;Mezclador de canales PARTIALPASTE_CHANNELMIXERBW;Blanco y Negro -PARTIALPASTE_COARSETRANS;Rotar 90º/ voltear +PARTIALPASTE_COARSETRANS;Rotar 90°/ voltear PARTIALPASTE_COLORAPP;Modelo CIE 2002 de apariencia de color PARTIALPASTE_COLORGROUP;Ajustes de color PARTIALPASTE_COLORTONING;Tonificación de Color @@ -670,12 +1039,14 @@ PARTIALPASTE_CROP;Recortar PARTIALPASTE_DARKFRAMEAUTOSELECT;Auto Selección de la Toma Negra PARTIALPASTE_DARKFRAMEFILE;Archivo con Toma negra PARTIALPASTE_DEFRINGE;Eliminar borde púrpura +PARTIALPASTE_DEHAZE;Remoción de neblina PARTIALPASTE_DETAILGROUP;Ajustes de detalle PARTIALPASTE_DIALOGLABEL;Pegar parcialmente perfil de procesamiento PARTIALPASTE_DIRPYRDENOISE;Reducción de ruido PARTIALPASTE_DIRPYREQUALIZER;Contraste por niveles de detalle PARTIALPASTE_DISTORTION;Corrección de Distorsión PARTIALPASTE_EPD;Mapeo tonal +PARTIALPASTE_EQUALIZER;Niveles Wavelet PARTIALPASTE_EVERYTHING;Todo PARTIALPASTE_EXIFCHANGES;Cambio en datos Exif PARTIALPASTE_EXPOSURE;Exposición @@ -685,6 +1056,7 @@ PARTIALPASTE_FLATFIELDBLURRADIUS;Radio de difuminado de campo plano PARTIALPASTE_FLATFIELDBLURTYPE;Tipo de difuminado de campo plano PARTIALPASTE_FLATFIELDCLIPCONTROL;Control de recorte de Campo Plano PARTIALPASTE_FLATFIELDFILE;Archivo de campo plano +PARTIALPASTE_GRADIENT;Graduar filtro PARTIALPASTE_HSVEQUALIZER;Ecualizador HSV PARTIALPASTE_ICMSETTINGS;Ajustes de Gestión de Color PARTIALPASTE_IMPULSEDENOISE;Impulsar Reducción de ruido @@ -692,6 +1064,8 @@ PARTIALPASTE_IPTCINFO;Información IPTC PARTIALPASTE_LABCURVE;Ajustes Lab PARTIALPASTE_LENSGROUP;Ajustes relativos al lente PARTIALPASTE_LENSPROFILE;Perfil de corrección de lente +PARTIALPASTE_LOCALCONTRAST;Contraste local +PARTIALPASTE_METADATA;Modo de metadatos PARTIALPASTE_METAGROUP;Ajustes de metadatos PARTIALPASTE_PCVIGNETTE;Filtro quitar viñeteado PARTIALPASTE_PERSPECTIVE;Perspectiva @@ -699,29 +1073,51 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Aplicar filtro Pixel Muerto PARTIALPASTE_PREPROCESS_GREENEQUIL;Equilibrio del verde PARTIALPASTE_PREPROCESS_HOTPIXFILT;Aplicar filtro Pixel Caliente PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtro de ruido de línea +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF filtro de líneas +PARTIALPASTE_PRSHARPENING;Enfocar después del cambio de tamaño PARTIALPASTE_RAWCACORR_AUTO;Auto corrección de Aberración Cromática +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA evitar el cambio de color +PARTIALPASTE_RAWCACORR_CAREDBLUE;CA Rojo & Azul PARTIALPASTE_RAWEXPOS_BLACK;Nivel de negro PARTIALPASTE_RAWEXPOS_LINEAR;Corrección de punto blanco -PARTIALPASTE_RAWEXPOS_PRESER;Preservar Luces Altas PARTIALPASTE_RAWGROUP;Ajustes Raw +PARTIALPASTE_RAW_BORDER;Raw margen/borde PARTIALPASTE_RAW_DCBENHANCE;Aplicar paso de mejora DCB PARTIALPASTE_RAW_DCBITERATIONS;Número de iteraciones DCB PARTIALPASTE_RAW_DMETHOD;Método de interpolado PARTIALPASTE_RAW_FALSECOLOR;Pasos de supresión de falso color de interpolado +PARTIALPASTE_RAW_IMAGENUM;Sub-imagen PARTIALPASTE_RAW_LMMSEITERATIONS;Pasos de mejora LMMSE +PARTIALPASTE_RAW_PIXELSHIFT;Cambio de píxel PARTIALPASTE_RESIZE;Cambiar tamaño +PARTIALPASTE_RETINEX;Retinex PARTIALPASTE_RGBCURVES;Curvas RGB PARTIALPASTE_ROTATION;Rotar PARTIALPASTE_SHADOWSHIGHLIGHTS;Sombras/Luces altas PARTIALPASTE_SHARPENEDGE;Bordes PARTIALPASTE_SHARPENING;Enfoque PARTIALPASTE_SHARPENMICRO;Micro-contraste +PARTIALPASTE_SOFTLIGHT;Luz tenue +PARTIALPASTE_TM_FATTAL;Mapeo de tonos HDR PARTIALPASTE_VIBRANCE;Vibranza PARTIALPASTE_VIGNETTING;Corrección de viñeteo PARTIALPASTE_WHITEBALANCE;Equilibrio de blancos PREFERENCES_ADD;Añadir +PREFERENCES_APPEARANCE;Apariencia +PREFERENCES_APPEARANCE_COLORPICKERFONT;Selector del color de la fuente +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Recortar la máscara de color +PREFERENCES_APPEARANCE_MAINFONT;Fuente principal +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Color de la guía del navegador +PREFERENCES_APPEARANCE_THEME;Tema PREFERENCES_APPLNEXTSTARTUP;requiere reinicio +PREFERENCES_AUTLISLOW;Bajo +PREFERENCES_AUTLISMAX;Max - Promedio de todos los mosaicos +PREFERENCES_AUTLISSTD;Alto +PREFERENCES_AUTLISVLOW;Ninguno +PREFERENCES_AUTLOW;Bajo PREFERENCES_AUTOMONPROFILE;Usar perfil de color del monitor principal en el sistema operativo +PREFERENCES_AUTOSAVE_TP_OPEN;Guardar automáticamente las herramientas contraídas/expandidas \nEstado antes de salir +PREFERENCES_AUTSTD;Estandar PREFERENCES_BATCH_PROCESSING;Procesamiento por lotes PREFERENCES_BEHADDALL;Todo para 'Agregar' PREFERENCES_BEHADDALLHINT;Establezca todos los parámetros del modo Agregar.\nLos ajustes de parámetros en el panel de la herramienta de lotes serán deltas de los valores guardados @@ -729,17 +1125,37 @@ PREFERENCES_BEHAVIOR;Comportamiento PREFERENCES_BEHSETALL;Todo para 'Establecer' PREFERENCES_BEHSETALLHINT;Todos los parámetros para el modo Establecer.\nLos ajustes de parámetros en el panel de la herramienta de lotes serán serán absolutos, se mostrarán los valores vigentes PREFERENCES_BLACKBODY;Tungsteno +PREFERENCES_CACHECLEAR;Borrar PREFERENCES_CACHECLEARALL;Borrar todo PREFERENCES_CACHECLEARPROFILES;Borrar perfiles PREFERENCES_CACHECLEARTHUMBS;Borrar miniaturas +PREFERENCES_CACHECLEAR_ALL;Borrar todos los archivos en caché: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Borre todos los archivos en caché excepto los perfiles de procesamiento en caché: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Borrar solo los perfiles de procesamiento en caché: +PREFERENCES_CACHECLEAR_SAFETY;Sólo se borran los archivos en el caché. Los perfiles de procesamiento almacenados junto con las imágenes de origen no se tocan. PREFERENCES_CACHEMAXENTRIES;Cantidad máxima de entradas en la memoria intermedia PREFERENCES_CACHEOPTS;Opciones de memoria intermedia PREFERENCES_CACHETHUMBHEIGHT;Altura máxima de las miniaturas PREFERENCES_CIEART;Optimización CIECAM02 +PREFERENCES_CIEART_FRAME;Configuración específica de CIECAM02 PREFERENCES_CIEART_LABEL;Usar precisión flotante simple en lugar de doble. PREFERENCES_CIEART_TOOLTIP;Si se habilita, los cálculos CIECAM02 se realizan con precisión flotante simple en lugar de doble. Esto provee un pequeño aumento en la velocidad de cálculo a expensas de una casi imperceptible pérdida de calidad PREFERENCES_CLIPPINGIND;Indicación de recortes +PREFERENCES_CLUTSCACHE;HaldCLUT Cache +PREFERENCES_CLUTSCACHE_LABEL;Número máximo de CLUTs en caché PREFERENCES_CLUTSDIR;Directorio HaldCLUT +PREFERENCES_CMMBPC;Compensación de punto negro +PREFERENCES_CROP;Edición del corte +PREFERENCES_CROP_AUTO_FIT;Zoom automático para adaptarse al área de recorte +PREFERENCES_CROP_GUIDES;Guías mostradas al no editar el recorte. +PREFERENCES_CROP_GUIDES_FRAME;Cuadro +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;Ninguno +PREFERENCES_CURVEBBOXPOS;Posición de la curva copiar y pegar nodos +PREFERENCES_CURVEBBOXPOS_ABOVE;Encima +PREFERENCES_CURVEBBOXPOS_BELOW;Abajo +PREFERENCES_CURVEBBOXPOS_LEFT;Izquierda +PREFERENCES_CURVEBBOXPOS_RIGHT;Derecha PREFERENCES_CUSTPROFBUILD;Programa generador de perfiles de procesamiento de imagen del usuario PREFERENCES_CUSTPROFBUILDHINT;Archivo ejecutable (o script) invocado un nuevo perfil de procesamiento inicial debe ser generado para una imagen.\n\nLa ruta del archivo de comunicación (estilo .ini) es agregado como parámetro de comando en línea. Éste contiene diversos parámetros requeridos y metadatos Exif de la imagen para permitir la generación de perfiles de procesamientos basados en reglas.\n\nADVERTENCIA:Usted es responsable de colocar comillas donde se requieren cuando se usan rutas conteniendo espacios en blanco. PREFERENCES_CUSTPROFBUILDKEYFORMAT;Clave de formato @@ -747,22 +1163,28 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nombre PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;ID Etiqueta PREFERENCES_CUSTPROFBUILDPATH;Ruta al programa ejecutable PREFERENCES_CUTOVERLAYBRUSH;Recortar máscara de color/transparencia -PREFERENCES_D50;5000ºK -PREFERENCES_D55;5500ºK -PREFERENCES_D60;6000ºK -PREFERENCES_D65;6500ºK +PREFERENCES_D50;5000°K +PREFERENCES_D50_OLD;5000°K +PREFERENCES_D55;5500°K +PREFERENCES_D60;6000°K +PREFERENCES_D65;6500°K PREFERENCES_DARKFRAMEFOUND;Encontrado PREFERENCES_DARKFRAMESHOTS;disparos PREFERENCES_DARKFRAMETEMPLATES;plantillas PREFERENCES_DATEFORMAT;Formato de fecha PREFERENCES_DATEFORMATHINT;Puede usar las siguientes variables :\n%y : año\n%m : mes\n%d : dia\n\nPor ejemplo, la fecha en formato Húngaro es: \n%y/%m/%d +PREFERENCES_DAUB_LABEL;Use las wavelets D6 de Daubechies en lugar de D4 +PREFERENCES_DAUB_TOOLTIP;Las herramientas de reducción de ruido y niveles de wavelet utilizan una wavelet madre de Debauchies. Si elige D6 en lugar de D4, aumenta el número de coeficientes de Daubechies ortogonales y probablemente aumenta la calidad de los niveles de pequeña escala. \nNo hay diferencia entre los dos, en el uso de memoria o de tiempo de procesamiento. PREFERENCES_DIRDARKFRAMES;Carpeta con las Tomas Negras +PREFERENCES_DIRECTORIES;Directorios PREFERENCES_DIRHOME;Carpeta de usuario PREFERENCES_DIRLAST;Última carpeta visitada PREFERENCES_DIROTHER;Otro PREFERENCES_DIRSELECTDLG;Seleccionar carpeta de imágenes en el arranque... PREFERENCES_DIRSOFTWARE;Carpeta de instalación +PREFERENCES_EDITORCMDLINE;Línea de comando personalizada PREFERENCES_EDITORLAYOUT;Disposición del editor +PREFERENCES_EXPAUT;Experto 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) @@ -776,27 +1198,44 @@ PREFERENCES_FLUOF7;Fluorescente F7 PREFERENCES_FLUOF11;Fluorescente F11 PREFERENCES_FORIMAGE;Para fotos de tipo diferente a raw PREFERENCES_FORRAW;Para fotos Raw +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;La misma altura en miniatura entre la tira de película y el explorador de archivos +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Tener un tamaño separado,en las miniaturas, requerirá más tiempo de procesamiento cada vez que alterne entre la única pestaña Editor y el Explorador de archivos. PREFERENCES_GIMPPATH;Carpeta de instalación de GIMP PREFERENCES_GREY;Luminancia (%) Yb del dispositivo de salida 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_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 +PREFERENCES_GREYSC;Escena Yb luminancia (%) +PREFERENCES_GREYSC18;Yb=18 CIE L#50 +PREFERENCES_GREYSCA;Automático PREFERENCES_HISTOGRAMPOSITIONLEFT;Histograma en panel izquierdo PREFERENCES_HISTOGRAMWORKING;Usar perfil de trabajo para el histograma principal y el navegador -PREFERENCES_HISTOGRAM_TOOLTIP;Si está activado, el perfil de trabajo se utiliza para renderizar el histograma principal y el panel navegador, de lo contrario se utiliza el perfil de Gamma Corregida de salida. +PREFERENCES_HISTOGRAM_TOOLTIP;Si está activado, el perfil de trabajo se utiliza para renderizar el histograma principal y el panel navegador, de lo contrario se utiliza el perfil de Gamma de la Corrección de salida. PREFERENCES_HLTHRESHOLD;Umbral de luces altas cortadas PREFERENCES_ICCDIR;Carpeta con perfiles de color ICC +PREFERENCES_IMG_RELOAD_NEEDED;Estos cambios requieren que la imagen se vuelva a cargar (o que se abra una nueva imagen) para que tenga efecto. PREFERENCES_IMPROCPARAMS;Parámetros de procesamiento de imágenes predeterminados +PREFERENCES_INSPECT_LABEL;Inspeccionar +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Número máximo de imágenes en caché +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Establezca el número máximo de imágenes almacenadas en la memoria caché cuando se desplaza sobre ellas en el explorador de archivos;\nLos sistemas con poca RAM (2 GB) deben mantener este valor establecido en 1 o 2. PREFERENCES_INTENT_ABSOLUTE;Colorimétrico absoluto PREFERENCES_INTENT_PERCEPTUAL;Perceptual PREFERENCES_INTENT_RELATIVE;Colorimétrico relativo PREFERENCES_INTENT_SATURATION;Saturación PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Mostrar miniatura JPEG incrustada si foto Raw no se ha editado +PREFERENCES_LANG;Idioma PREFERENCES_LANGAUTODETECT;Usar idioma del sistema +PREFERENCES_LEVAUTDN;Nivel de supresión de ruido +PREFERENCES_LEVDN;Tamaño de celda +PREFERENCES_LISS;Suavizado automático multizona +PREFERENCES_MAX;Maxi (baldoza) +PREFERENCES_MAXRECENTFOLDERS;Número máximo de carpetas recientes +PREFERENCES_MED;Medio(Tile/2) PREFERENCES_MENUGROUPEXTPROGS;Grupo "Abrir con" PREFERENCES_MENUGROUPFILEOPERATIONS;Grupo "Operaciones de archivo" PREFERENCES_MENUGROUPLABEL;Grupo "Etiquetado con color" @@ -804,57 +1243,104 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Grupo "Operaciones de Perfil de Procesami PREFERENCES_MENUGROUPRANK;Grupo "Asignar Rango" PREFERENCES_MENUOPTIONS;Opciones de menú de contexto PREFERENCES_METADATA;Metadatos +PREFERENCES_MONINTENT;Intento de representación predeterminado +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Perfil de color predeterminado +PREFERENCES_MONPROFILE_WARNOSX;Debido a las limitaciones de MacOS, solo se admite sRGB. PREFERENCES_MULTITAB;Modo Editor de varias pestañas PREFERENCES_MULTITABDUALMON;Modo Editor de varias pestañas, si está disponible en segundo monitor PREFERENCES_NAVGUIDEBRUSH;Color de la guía del navegador +PREFERENCES_NAVIGATIONFRAME;Navegación +PREFERENCES_NOISE;Reducción de ruido PREFERENCES_OUTDIR;Carpeta de salida PREFERENCES_OUTDIRFOLDER;Guardar en carpeta PREFERENCES_OUTDIRFOLDERHINT;Guardar las imágenes creadas en una carpeta elegida PREFERENCES_OUTDIRTEMPLATE;Usar plantilla PREFERENCES_OUTDIRTEMPLATEHINT;Se pueden usar las variables siguientes:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nEstas variables son referencias a las carpetas y subrutas de las rutas del lugar donde se encuentra la imagen raw.\n\nPor ejemplo, si abres /home/tom/image/02-09-2006/dsc0012.nef, los valores de las variables son:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\nSi quieres guardar la imagen de salida en el lugar original, usa:\n%p1/%f\n\nSi quieres guardar la imagen de salida en una carpeta 'convertida' dentro de la carpeta original, usa:\n%p1/convertida/%f\n\nSi quieres guardar la imagen de salida en la carpeta '/home/tom/convertida' conservando la misma subcarpeta de fechas, usa:\n%p2/convertida/%d1/%f PREFERENCES_OVERLAY_FILENAMES;Superponer nombres de archivo en miniaturas +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Superponer los nombres de archivo en las miniaturas en el panel del editor PREFERENCES_OVERWRITEOUTPUTFILE;Sobreescribir archivos de salida existentes PREFERENCES_PANFACTORLABEL;Factor PREFERENCES_PARSEDEXT;Extensiones analizadas PREFERENCES_PARSEDEXTADD;Agregar extensión PREFERENCES_PARSEDEXTADDHINT;Ingrese una extensión y pulse este botón para agregarla a la lista PREFERENCES_PARSEDEXTDELHINT;Borrar de la lista las extensiones seleccionadas +PREFERENCES_PARSEDEXTDOWNHINT;Mueve la extensión seleccionada hacia abajo en la lista. +PREFERENCES_PARSEDEXTUPHINT;Mueve la extensión seleccionada hacia arriba en la lista. +PREFERENCES_PERFORMANCE_THREADS;Hilos(Procesos) +PREFERENCES_PERFORMANCE_THREADS_LABEL;Número máximo de subprocesos para reducción de ruido y niveles de wavelet (0 = automático) +PREFERENCES_PREVDEMO;Vista previa del método Desmosaicado +PREFERENCES_PREVDEMO_FAST;Rápido +PREFERENCES_PREVDEMO_LABEL;Método de desmosaicado utilizado para la vista previa al <100% de zoom: +PREFERENCES_PREVDEMO_SIDECAR;Como en PP3 +PREFERENCES_PRINTER;Impresora(tenue-corregir) PREFERENCES_PROFILEHANDLING;Tratamiento de perfiles de procesamiento PREFERENCES_PROFILELOADPR;Prioridad de perfiles cuando se abre imagen PREFERENCES_PROFILEPRCACHE;Perfil en memoria intermedia PREFERENCES_PROFILEPRFILE;Perfil junto a imagen de entrada +PREFERENCES_PROFILESAVEBOTH;Guarda el perfil de procesamiento tanto en la memoria caché como junto al archivo de entrada PREFERENCES_PROFILESAVECACHE;Guardar perfiles de procesamiento en memoria intermedia PREFERENCES_PROFILESAVEINPUT;Guardar perfiles de procesamiento junto con imagen de entrada +PREFERENCES_PROFILESAVELOCATION;Ubicación del lugar donde se guardo el perfil de procesamiento +PREFERENCES_PROFILE_NONE;Ninguno PREFERENCES_PROPERTY;Propiedad +PREFERENCES_PRTINTENT;Intento de representación +PREFERENCES_PRTPROFILE;Perfil de color PREFERENCES_PSPATH;Carpeta de instalación de Adobe Photoshop +PREFERENCES_REMEMBERZOOMPAN;Recuerde el % de zoom y el desplazamiento del paneo +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Recuerde que el% de zoom y el desplazamiento de la panorámica de la imagen actual al abrir una nueva imagen. \nEsta opción solo funciona en el "Modo de pestaña Editor único" y cuando el "Método de demostración utilizado para la vista previa a <100% de zoom" está configurado en " Como en PP3 " PREFERENCES_RGBDTL_LABEL;Número máximo de hilos para reducción de ruido PREFERENCES_RGBDTL_TOOLTIP;La Reducción de Ruido requiere como base 128MB de RAM para una imagen de 10MPix o 512MB para una imagen de 40MPix; más 128MB RAM por hilo de proceso.\nMientras más hilos corren en paralelo, más rápido es el procesamiento. Coloque “0” para que automáticamente se use tantos hilos como sea posible según la capacidad de su equipo. +PREFERENCES_SAVE_TP_OPEN_NOW;Guardar herramientas colapsadas/expandidas ahora PREFERENCES_SELECTFONT;Seleccionar fuente +PREFERENCES_SELECTFONT_COLPICKER;Seleccione la fuente del Selector de color PREFERENCES_SELECTLANG;Seleccionar idioma PREFERENCES_SELECTTHEME;Seleccionar tema +PREFERENCES_SERIALIZE_TIFF_READ;Configuración de lectura Tiff +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serializar la lectura de archivos tiff +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Cuando trabaje con carpetas llenas de archivos tiff sin comprimir, habilitar esta opción puede aumentar el rendimiento en la generación de la miniatura. PREFERENCES_SET;Establecer PREFERENCES_SHOWBASICEXIF;Mostrar datos Exif básicos PREFERENCES_SHOWDATETIME;Mostrar fecha y hora PREFERENCES_SHOWEXPOSURECOMPENSATION;Mostrar compensación de exposición +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Mostrar barra de herramientas estilo tira de película PREFERENCES_SHTHRESHOLD;Umbral de sombras cortadas +PREFERENCES_SIMPLAUT;Modo de herramienta PREFERENCES_SINGLETAB;Modo Editor de pestaña única PREFERENCES_SINGLETABVERTAB;Modo Editor de pestaña única, pestañas verticales +PREFERENCES_SMA;A una escala pequeña(250x287) PREFERENCES_SND_BATCHQUEUEDONE;Trabajos en cola finalizados PREFERENCES_SND_HELP;Introducir el path o dejar en blanco (sin sonido). En Windows, usar "SystemDefault", "SystemAsterisk" etc. para los sonidos del sistema\nEn Linux use "complete", "window-attention" etc. para los sonidos del sistema. PREFERENCES_SND_LNGEDITPROCDONE;Procesado del editor terminado +PREFERENCES_SND_THRESHOLDSECS;Despues de segundos PREFERENCES_SND_TRESHOLDSECS;después de seg. PREFERENCES_STARTUPIMDIR;Carpeta de imágenes en el arranque +PREFERENCES_STDAUT;Estándar PREFERENCES_TAB_BROWSER;Explorador de archivos PREFERENCES_TAB_COLORMGR;Gestión del color +PREFERENCES_TAB_DYNAMICPROFILE;Reglas de perfil dinámico PREFERENCES_TAB_GENERAL;General PREFERENCES_TAB_IMPROC;Procesamiento de imágenes PREFERENCES_TAB_PERFORMANCE;Rendimiento PREFERENCES_TAB_SOUND;Sonidos +PREFERENCES_THEME;Tema +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Vista previa de JPEG incrustado +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Imagen para mostrar +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Representación (Render) Raw neutral +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;JPEG incrustado si es de tamaño completo, de lo contrario es neutral sin formato +PREFERENCES_TIMAX;Alto +PREFERENCES_TINB;Número de mosaicos +PREFERENCES_TISTD;Estándar PREFERENCES_TP_LABEL;Panel de herramientas: PREFERENCES_TP_USEICONORTEXT;Usar iconos de pestaña en lugar de texto PREFERENCES_TP_VSCROLLBAR;Ocultar barra de desplazamiento vertical del panel de herramientas +PREFERENCES_TUNNELMETADATA;Copie Exif / IPTC / XMP sin cambios en el archivo de salida PREFERENCES_USEBUNDLEDPROFILES;Usar perfiles empaquetados PREFERENCES_VIEW;Balance de blancos en el dispositivo de salida (monitor, TV, proyector...) +PREFERENCES_WAVLEV;Aumentar el nivel de wavelet en calidad 'alta' +PREFERENCES_WLONE;Un nivel +PREFERENCES_WLTWO;Dos niveles +PREFERENCES_WLZER;No PREFERENCES_WORKFLOW;Disposición PROFILEPANEL_COPYPPASTE;Parámetros a copiar PROFILEPANEL_GLOBALPROFILES;Perfiles empaquetados @@ -865,6 +1351,7 @@ PROFILEPANEL_MODE_TIP;Modo de procesamiento de perfiles.\n\nBotón Presionado: l PROFILEPANEL_MYPROFILES;Mis perfiles PROFILEPANEL_PASTEPPASTE;Parámetros PROFILEPANEL_PCUSTOM;A medida +PROFILEPANEL_PDYNAMIC;Dinámico PROFILEPANEL_PFILE;Desde archivo PROFILEPANEL_PINTERNAL;Neutro PROFILEPANEL_PLASTSAVED;Último guardado @@ -888,10 +1375,22 @@ PROGRESSBAR_SAVEPNG;Guardando archivo PNG... PROGRESSBAR_SAVETIFF;Guardando archivo TIFF... PROGRESSBAR_SNAPSHOT_ADDED;Se añadió instantánea PROGRESSDLG_PROFILECHANGEDINBROWSER;Perfil de procesamiento cambiado en explorador +QINFO_FRAMECOUNT;%2 cuadro +QINFO_HDR;HDR / %2 cuadro(s) QINFO_ISO;ISO QINFO_NOEXIF;No hay datos EXIF. +QINFO_PIXELSHIFT;Pixel variación /% 2 cuadro(s) +SAMPLEFORMAT_0;Formato de datos desconocido +SAMPLEFORMAT_1;Sin firma 8 bits +SAMPLEFORMAT_2;Sin firma 16 bits +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;Punto flotante de 32 bits +SAMPLEFORMAT_32;24-bit punto flotante +SAMPLEFORMAT_64;32-bit punto flotante SAVEDLG_AUTOSUFFIX;Automáticamente añade un sufijo cuando el archivo ya existe SAVEDLG_FILEFORMAT;Formato de archivo +SAVEDLG_FILEFORMAT_FLOAT; punto flotante SAVEDLG_FORCEFORMATOPTS;Opciones de guardar forzado SAVEDLG_JPEGQUAL;Calidad JPEG SAVEDLG_PNGCOMPR;Compresión PNG @@ -904,9 +1403,12 @@ SAVEDLG_SUBSAMP;Submuestreo SAVEDLG_SUBSAMP_1;Máxima compresión SAVEDLG_SUBSAMP_2;Balanceado SAVEDLG_SUBSAMP_3;Máxima calidad +SAVEDLG_SUBSAMP_TOOLTIP;Mejor compresión: \nJ: a: b 4: 2: 0 \nh / v 2/2 \nColor reducido a la mitad horizontal y verticalmente. \n Equilibrado: \nJ: a: b 4: 2: 2 \nh / v 2 / 1 \nColor dividido a la mitad horizontalmente. \nMejor calidad: \ nJ: a: b 4: 4: 4 \nh / v 1/1 \nNo hay submuestreo del color. SAVEDLG_TIFFUNCOMPRESSED;TIFF sin compresión SAVEDLG_WARNFILENAME;Se asignará nombre al archivo SHCSELECTOR_TOOLTIP;Pulsar el botón derecho del ratón para restablecer la posición de los tres controles deslizantes +SOFTPROOF_GAMUTCHECK_TOOLTIP;Resalta los píxeles con colores fuera de gamma con respecto a: \n-El perfil de la impresora, si se establece uno y la prueba evaluacion de la correspondencia con el perfil está habilitada, \n-El perfil de salida, si el perfil de la impresora no está configurado y la prueba de la evaluacion de la saturación del perfil está habilitada \n-El perfil del monitor, si la prueba de evaluacion de la correspondencia con el perfil está deshabilitada. +SOFTPROOF_TOOLTIP;La prueba evaluacion de la correspondencia con el perfil simula la apariencia de la imagen: \n-Cuando se imprime, si un perfil de impresora está configurado en Preferencias-> Administración de color, \n-Cuando se ve en una pantalla que usa el perfil de salida actual, si no se configura un perfil de impresora . THRESHOLDSELECTOR_B;Inferior THRESHOLDSELECTOR_BL;Inferior izquierdo THRESHOLDSELECTOR_BR;Inferior derecho @@ -914,10 +1416,11 @@ THRESHOLDSELECTOR_HINT;Mantenga la tecla Mayús presionada para mover pun THRESHOLDSELECTOR_T;Superior THRESHOLDSELECTOR_TL;Superior izquierdo THRESHOLDSELECTOR_TR;Superior derecho -TOOLBAR_TOOLTIP_CROP;Selección de recorte.\nAtajo: c -TOOLBAR_TOOLTIP_HAND;Herramienta mano.\nAtajo: h -TOOLBAR_TOOLTIP_STRAIGHTEN;Enderezado / Rotación Fina.\nAtajo: s\n\nIndique la vertical u horizontal trazando una línea guía sobre la vista previa de la imagen. El ángulo de rotación será mostrado al continuación de la línea guía. El centro de la imagen es el centro de rotación. -TOOLBAR_TOOLTIP_WB;Muestrea equilibrio de blancos.\nAtajo: w +TOOLBAR_TOOLTIP_COLORPICKER;Selector de color bloqueable \nCuando esté habilitado: \nHaga clic en la vista previa con el botón izquierdo del ratón para agregar un selector de color \nArrastre alrededor mientras presiona el botón izquierdo del mouse \nElimine el selector de color con el botón derecho del mouse haga clic en \nEliminar todos los selectores de color con Mayús + clic con el botón derecho del mouse \nHaz clic derecho para alejarse de cualquier selector de color y volver a la herramienta Mano +TOOLBAR_TOOLTIP_CROP;Selección de recorte.\nTecla de Atajo: c +TOOLBAR_TOOLTIP_HAND;Herramienta mano.\nTecla de Atajo: h +TOOLBAR_TOOLTIP_STRAIGHTEN;Enderezado / Rotación Fina.\nTecla de Atajo: s\n\nIndique la vertical u horizontal trazando una línea guía sobre la vista previa de la imagen. El ángulo de rotación será mostrado al continuación de la línea guía. El centro de la imagen es el centro de rotación. +TOOLBAR_TOOLTIP_WB;Muestrea equilibrio de blancos.\nTecla de Atajo: w TP_BWMIX_ALGO;Algoritmo OYCPM TP_BWMIX_ALGO_LI;Lineal TP_BWMIX_ALGO_SP;Efectos especiales @@ -981,15 +1484,20 @@ TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;Azul TP_CACORRECTION_LABEL;Corrección de aberraciones cromáticas TP_CACORRECTION_RED;Rojo +TP_CBDL_AFT;Después de blanco y negro +TP_CBDL_BEF;Antes de blanco y negro +TP_CBDL_METHOD;Proceso localizado +TP_CBDL_METHOD_TOOLTIP;Elija si la herramienta Contraste por niveles de detalle se colocará después de la herramienta Blanco y negro, que la hace funcionar en el espacio L * a * b *, o antes, que la hace funcionar en el espacio RGB. TP_CHMIXER_BLUE;Canal Azul TP_CHMIXER_GREEN;Canal Verde TP_CHMIXER_LABEL;Mezclador de canales TP_CHMIXER_RED;Canal Rojo TP_CHROMATABERR_LABEL;Aberración cromática (AC) -TP_COARSETRAF_TOOLTIP_HFLIP;Voltear horizontalmente.\nAtajo: '[' -TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotar a la izquierda.\nAtajo: ']' +TP_COARSETRAF_TOOLTIP_HFLIP;Voltear horizontalmente.\nTecla de Atajo: '[' +TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotar a la izquierda.\nTecla de Atajo: ']' TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotar a la derecha TP_COARSETRAF_TOOLTIP_VFLIP;Voltear verticalmente +TP_COLORAPP_ABSOLUTELUMINANCE;Luminancia absoluta TP_COLORAPP_ADAPTSCENE;Adaptación a la luminosidad de la escena TP_COLORAPP_ADAPTSCENE_TOOLTIP;Luminancia absoluta del entorno de la escena (cd/m²).\n1) Calculado en base a datos Exif: \nTiempo de Exposición - Velocidad ISO - Número F de apertura - Corrección de exposición\n2) Calculado a partir del Punto Blanco raw y Compensación de Exposición RT. TP_COLORAPP_ADAPTVIEWING;Luminosidad de visualización (cd/m²) @@ -1005,6 +1513,7 @@ TP_COLORAPP_BADPIXSL;Filtro de píxeles calientes/muertos TP_COLORAPP_BADPIXSL_TOOLTIP;Supresión de píxeles calientes/muertos (con coloreado brillante).\n 0 = Sin efecto \n 1 = Mediana \n 2 = Gaussiano.\n\nEstos elementos extraños son causados por limitaciones de CIECAM02. Como alternativa, ajuste la imagen para evitar sombras muy oscuras. TP_COLORAPP_BRIGHT;Brillo (Q) TP_COLORAPP_BRIGHT_TOOLTIP;En CIECAM02 el Brillo tiene en cuenta la luminosidad de los blancos y es diferente al de Lab y al de RGB +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Cuando se configura manualmente, se recomiendan valores por encima de 65. TP_COLORAPP_CHROMA;Crominancia (C) TP_COLORAPP_CHROMA_M;Colorido (M) TP_COLORAPP_CHROMA_M_TOOLTIP;El Colorido CIECAM02 es diferente al de Lab y al de RGB @@ -1026,6 +1535,7 @@ TP_COLORAPP_DATACIE;Curvas con histogramas de salida CIECAM02 TP_COLORAPP_DATACIE_TOOLTIP;Si está seleccionada, los histogramas en las curvas CIECAM02 muestran aproximadamente valores/rangos de J o Q, y C, s o M después de los ajustes CIECAM02.\nEsta selección no influye en el histograma del panel principal.\n\nCuando no está seleccionada, los histogramas en las curvas CIECAM02 muestran valores Lab antes de los ajustes CIECAM02 TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Si la casilla está seleccionada (como se recomienda), RT calcula el valor óptimo, que es usado por CAT02, y también por todo CIECAM02.\nPara establecer manualmente el valor, primero desmarque la casilla (se recomienda usar valores mayores a 65) TP_COLORAPP_DEGREE_TOOLTIP;Cantidad de transformación de adaptación cromática CIE 2002 +TP_COLORAPP_FREE;Libre tempera+verde + CAT02 + [output] TP_COLORAPP_GAMUT;Control de Gamut (Lab) TP_COLORAPP_GAMUT_TOOLTIP;Permite control de gamut en modo Lab TP_COLORAPP_HUE;Matiz (h) @@ -1036,8 +1546,11 @@ TP_COLORAPP_LABEL_SCENE;Condiciones de la escena TP_COLORAPP_LABEL_VIEWING;Condiciones de visualización TP_COLORAPP_LIGHT;Claridad (J) TP_COLORAPP_LIGHT_TOOLTIP;Claridad en CIECAM02 es diferente a la de Lab y a la de RGB +TP_COLORAPP_MEANLUMINANCE;Luminancia media (Yb%) TP_COLORAPP_MODEL;Modelo de Punto Blanco TP_COLORAPP_MODEL_TOOLTIP;Modelo de Punto Blanco\n\nWB [RT] + [salida]:\nEl Balance de Blancos de RT es usado para la escena, CIECAM02 es establecido a D50, y el Balance de Blancos del dispositivo de salida es el establecido en Preferencias > Gestión de Color\n\nWB [RT+CAT02] + [salida]:\nEl Balance de Blancos de RT es usado por CAT02 y el del dispositivo de salida es el establecido en preferencias +TP_COLORAPP_NEUTRAL;Restablecer +TP_COLORAPP_NEUTRAL_TIP;Restablecer todos los controles deslizantes y las curvas a sus valores predeterminados TP_COLORAPP_RSTPRO; Protección de tonos rojos y color piel TP_COLORAPP_RSTPRO_TOOLTIP;Intensidad de protección de tonos rojos y color piel (en curvas y en controles deslizantes) TP_COLORAPP_SHARPCIE;Enfoque, Contraste por niveles de detalle, Micro-contraste & Eliminación de AC con Q/C @@ -1058,10 +1571,15 @@ TP_COLORAPP_TCMODE_LABEL2;Curve modo 2 TP_COLORAPP_TCMODE_LABEL3;Curva en modo crominancia TP_COLORAPP_TCMODE_LIGHTNESS;Claridad TP_COLORAPP_TCMODE_SATUR;Saturación +TP_COLORAPP_TEMP_TOOLTIP;Para seleccionar un iluminante, configure siempre Tinte = 1. \nA temperatura = 2856 \nD50 temperatura = 5003 \nD55 temperatura = 5503 \nD65 temperatura = 6504 \nD75 temperatura = 7504 TP_COLORAPP_TONECIE;Mapeo tonal usando Brillo (Q) CIECAM02. TP_COLORAPP_TONECIE_TOOLTIP;Si esta opción no está seleccionada, el mapeo tonal se hace usando el espacio de color Lab.\nSi esta opción está seleccionada, el mapeo tonal se hace usando CIECAM02.\nLa herramienta de mapeo tonal debe de estar habilitada para que esta selección tenga efecto +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Luminancia absoluta del entorno de visualización \ n (normalmente 16 cd / m²). TP_COLORAPP_WBCAM;BalBlanco [RT+CAT02] + [salida] TP_COLORAPP_WBRT;BalBlanco [RT] + [salida] +TP_COLORAPP_YB;Yb% (luminancia media) +TP_COLORAPP_YBSCENE;Yb% (luminancia media) +TP_COLORAPP_YBSCENE_TOOLTIP;Si está habilitado el modo automático, Yb se calcula a partir del valor medio de la luminancia de la imagen real TP_COLORTONING_AB;o C/L TP_COLORTONING_AUTOSAT;Automático TP_COLORTONING_BALANCE;Balance @@ -1073,6 +1591,27 @@ TP_COLORTONING_HIGHLIGHT;Luces Altas TP_COLORTONING_HUE;Matiz TP_COLORTONING_LAB;Mezcla Lab TP_COLORTONING_LABEL;Tonificación de Color +TP_COLORTONING_LABGRID;L*a*b* cuadrícula de corrección del color +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;Regiones de corrección de color +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Canal +TP_COLORTONING_LABREGION_CHANNEL_ALL;Todos +TP_COLORTONING_LABREGION_CHANNEL_B;Azul +TP_COLORTONING_LABREGION_CHANNEL_G;Verde +TP_COLORTONING_LABREGION_CHANNEL_R;Rojo +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Luminosidad +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Corrección +TP_COLORTONING_LABREGION_MASK;Máscara +TP_COLORTONING_LABREGION_MASKBLUR;Desenfoque de la máscara +TP_COLORTONING_LABREGION_OFFSET;Compensar +TP_COLORTONING_LABREGION_POWER;Potencia +TP_COLORTONING_LABREGION_SATURATION;Saturación +TP_COLORTONING_LABREGION_SHOWMASK;Mostrar máscara +TP_COLORTONING_LABREGION_SLOPE;Bajar TP_COLORTONING_LUMA;Luminancia TP_COLORTONING_LUMAMODE;Preservar luminancia TP_COLORTONING_LUMAMODE_TOOLTIP;Si está activado, cuando se cambia el color(rojo, verde, cian, azul, etc.) la luminancia de cada pixel es preservada. @@ -1096,19 +1635,23 @@ TP_COLORTONING_STRENGTH;Intensidad TP_COLORTONING_TWO2;Crominancia especial '2 colores' TP_COLORTONING_TWOALL;Crominancia especial TP_COLORTONING_TWOBY;Especial 'a' y 'b' -TP_COLORTONING_TWOCOLOR_TOOLTIP;Crominancia estándar:\nRespuesta lineal, a* = b*.\n\nCrominancia especial:\nRespuesta lineal, a* = b*, pero no unidas - intentar debajo de la diagonal.\n\nEspecial a* and b*:\nRespuesta lineal no unida con curvas separadas para a* y b*. Previsto para efectos especiales.\n\nCrominancia especial 2 colores:\nMás predecible. +TP_COLORTONING_TWOCOLOR_TOOLTIP;Crominancia estándar:\nRespuesta lineal, a* = b*.\n\nCrominancia especial:\nRespuesta lineal, a* = b*, pero no unidas - intentar debajo de la diagonal.\n\nEspecial a* and b*:\nRespuesta lineal no unida con curvas separadas para a* y b*. Previsto para efectos especiales.\nCrominancia especial 2 colores:\nMás predecible. TP_COLORTONING_TWOSTD;Crominancia estándar TP_CROP_FIXRATIO;Fijar proporciones: TP_CROP_GTDIAGONALS;Regla de las diagonales TP_CROP_GTEPASSPORT;Pasaporte biométrico TP_CROP_GTFRAME;Marco TP_CROP_GTGRID;Rejilla +TP_CROP_GTHARMMEANS;Proporciones Armónicas TP_CROP_GTNONE;Ninguna TP_CROP_GTRULETHIRDS;Regla de los tercios +TP_CROP_GTTRIANGLE1;Triángulos de oro(áureo)1 +TP_CROP_GTTRIANGLE2;Triángulos de oro(áureo)2 TP_CROP_GUIDETYPE;Clase de guía: TP_CROP_H;Al TP_CROP_LABEL;Recortar TP_CROP_PPI;Ptos/Pulgada= +TP_CROP_RESETCROP;Reiniciar TP_CROP_SELECTCROP;Seleccionar recorte TP_CROP_W;Ancho TP_CROP_X;x @@ -1118,15 +1661,40 @@ TP_DARKFRAME_LABEL;Toma Negra TP_DEFRINGE_LABEL;Quitar borde púrpura TP_DEFRINGE_RADIUS;Radio TP_DEFRINGE_THRESHOLD;Umbral +TP_DEHAZE_DEPTH;Profundidad +TP_DEHAZE_LABEL;Eliminación de neblina +TP_DEHAZE_SHOW_DEPTH_MAP;Mostrar mapa de profundidad +TP_DEHAZE_STRENGTH;Fuerza +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Control automático de multi-zonas +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Control automático global +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Trate de evaluar el ruido del color \nTenga cuidado, este cálculo es promedio y es bastante subjetivo. TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Crominancia: Azul-Amarillo +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Curva de Crominancia +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Aumente (multiplique) el valor de todos los controles deslizantes de crominancia. \nEsta curva le permite ajustar la intensidad de la reducción de ruido cromático en función de la cromaticidad, por ejemplo, para aumentar la acción en áreas de baja saturación y para disminuirla en aquellas de alta saturación. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Crominancia +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominancia: Maestra +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Método +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual \nActos en la imagen completa. \nUsted controla la configuración de reducción de ruido manualmente. \nAutomático global \ nAcciones en la imagen completa. \n9 zonas se utilizan para calcular una configuración de reducción de ruido de crominancia global. \nVista previa \nAcciones activadas en la totalidad de la imagen. \ nLa parte de la imagen visible en la vista previa se utiliza para calcular la configuración global de reducción de ruido de crominancia. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual \nAcciones en la imagen completa. \nUsted controla las configuraciones de reducción de ruido manualmente. \nAutomático global \nAcciones en la imagen completa. \n9 zonas se utilizan para calcular una configuración global de reducción de ruido de crominancia. \nMúltiples zonas automáticas \ nNo hay vista previa: funciona solo durante el guardado, pero al usar el método de "Vista previa" al hacer coincidir el tamaño y centro del mosaico con el centro y el tamaño de la vista previa, puede obtener una idea de los resultados esperados. \ nLa imagen se divide en mosaicos (aproximadamente 10 a 70 dependiendo del tamaño de la imagen) y cada ficha recibe su propia configuración de reducción de ruido de crominancia. \nPrevisión \nAcciones en toda la imagen. \nLa parte de la imagen visible en la vista previa se utiliza para calcular la configuración global de reducción de ruido de crominancia. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Vista previa de múltiples zonas +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Vista previa +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Muestra los niveles de ruido restantes de la parte de la imagen visible en la vista previa después de wavelet. \n> 300 Muy ruidoso \n100-300 Ruidoso \n50-100 Un poco ruidoso \n <50 Muy bajo ruido \n Cuidado, los valores diferirán entre los modos RGB y L * a * b *. Los valores RGB son menos precisos porque el modo RGB no separa completamente la luminancia y la crominancia. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Tamaño de la vista previa =% 1, Centro: Px =% 2 Py =% 3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Previsualización de ruido: Media =% 1 Alta =% 2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Previsualización del ruido: Media = - Alta = - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Tamaño del mosaico =% 1, Centro: Tx =% 2 Ty =% 3 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_LABEL;Reducción del ruido +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Control de luminancia TP_DIRPYRDENOISE_LUMINANCE_CURVE;Curva de Luminancia TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Detalle en luminancia +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminancia TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminancia TP_DIRPYRDENOISE_MAIN_COLORSPACE;Método +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* 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. @@ -1137,15 +1705,27 @@ 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_CHROMINANCE;Solo croma(color) +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* 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_METHOD_WEIGHTED;Ponderado L * (pequeño) + a * b * (normal) TP_DIRPYRDENOISE_MEDIAN_PASSES;Iteracciones Median +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;La aplicación de tres iteraciones de filtro de mediana con un tamaño de ventana de 3 × 3 a menudo conduce a mejores resultados que el uso de una iteración de filtro de mediana con un tamaño de ventana de 7 × 7. TP_DIRPYRDENOISE_MEDIAN_TYPE;Tipo Median +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Aplica un filtro de mediana para el tamaño de la ventana deseada. Cuanto mayor sea el tamaño de la ventana, más tiempo tardará. \n3 × 3 soft: trata 5 píxeles en una ventana de 3 × 3 píxeles. \n3 × 3: trata 9 píxeles en una ventana de 3 × 3 píxeles. \n5 × 5 suave: trata 13 píxeles en una ventana de 5 × 5 píxeles. \n5 × 5: trata 25 píxeles en una ventana de 5 × 5 píxeles. \n7 × 7: trata 49 píxeles en una ventana de 7 × 7 píxeles. \n9 × 9: trata 81 píxeles en una ventana de 9 × 9 píxeles. \nA veces es posible lograr una mayor calidad ejecutando varias iteraciones con un tamaño de ventana más pequeño que una iteración con una más grande. +TP_DIRPYRDENOISE_SLI;Deslizador +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 suavisado +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 suavisado +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 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_ARTIF;Reduce elementos extraños TP_DIRPYREQUALIZER_HUESKIN;Matiz de la piel TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;En la parte superior se selecciona la zona con los valores máximos.\nEn la parte inferior se ajusta la transición.\nSi necesita para mover el área de manera significativa a la izquierda o a la derecha - o si hay elementos extraños:.. El balance de blancos es incorrecto \nPuedes reducir ligeramente la zona para evitar que el resto de la imagen se vea afectada. TP_DIRPYREQUALIZER_LABEL;Contraste por niveles de detalle @@ -1159,17 +1739,19 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;A -100 se focalizan los tonos de piel.\nA 0 todo TP_DIRPYREQUALIZER_THRESHOLD;Umbral TP_DIRPYREQUALIZER_TOOLTIP;Reduce los elementos extraños producidos en la transición entre los colores de piel (matiz, crominancia, luminancia) y el resto de la imagen. TP_DISTORTION_AMOUNT;Cantidad +TP_DISTORTION_AUTO_TIP;Corrige automáticamente la distorsión de la lente en archivos sin procesar al compararla con la imagen JPEG incrustada, si existe, y la cámara ha corregido automáticamente la distorsión de la lente. TP_DISTORTION_LABEL;Corrección de Distorsión TP_EPD_EDGESTOPPING;Parada en los bordes +TP_EPD_GAMMA;Gamma TP_EPD_LABEL;Mapeo tonal TP_EPD_REWEIGHTINGITERATES;Iteraciones de reponderación TP_EPD_SCALE;Escala TP_EPD_STRENGTH;Intensidad -TP_EPD_TOOLTIP;El mapeo tonal puede hacerse en modo Lab (estándar) y en modo CIECAM02.\n\nPara activar mapeo tonal modo CIECAM02 haga los siguientes ajustes:\n1. CIECAM02\n2. Algoritmo="Brillo + Colorido (QM)"\n3. "Mapeo tonal usando Brillo CIECAM02 (Q)" TP_EXPOSURE_AUTOLEVELS;Niveles automáticos TP_EXPOSURE_AUTOLEVELS_TIP;Ejecuta Niveles Automáticos. Establece automáticamente los valores de los parámetros basándose en el análisis de la imagen.\nHabilita la reconstrucción de luces altas si es necesario TP_EXPOSURE_BLACKLEVEL;Nivel de Negro TP_EXPOSURE_BRIGHTNESS;Brillo +TP_EXPOSURE_CLAMPOOG;Corte fuera de la gama de colores TP_EXPOSURE_CLIP;Recorte % TP_EXPOSURE_CLIP_TIP;Fracción de los píxeles que se recortará en una operación de Niveles Automáticos TP_EXPOSURE_COMPRHIGHLIGHTS;Compresión de luces altas @@ -1180,17 +1762,22 @@ TP_EXPOSURE_CURVEEDITOR1;Curva tonal 1 TP_EXPOSURE_CURVEEDITOR2;Curva tonal 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Por favor, consulte RawPedia para aprender cómo obtener mejores resultados usando dos curvas tonales TP_EXPOSURE_EXPCOMP;Compensación de exposición +TP_EXPOSURE_HISTMATCHING;Curva de tono auto-balanceada +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Ajuste automáticamente los controles deslizantes y las curvas (excepto la compensación de exposición) para que coincidan con el aspecto de la miniatura JPEG incrustada. TP_EXPOSURE_LABEL;Exposición TP_EXPOSURE_SATURATION;Saturación TP_EXPOSURE_TCMODE_FILMLIKE;Similar a película TP_EXPOSURE_TCMODE_LABEL1;Curva modo 1 TP_EXPOSURE_TCMODE_LABEL2;Curva modo 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Luminancia +TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Mezcla de saturación y valor TP_EXPOSURE_TCMODE_STANDARD;Estándar TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Estándar ponderado TP_EXPOS_BLACKPOINT_LABEL;Raw - Puntos Negros TP_EXPOS_WHITEPOINT_LABEL;Raw - Puntos Blancos TP_FILMSIMULATION_LABEL;Simulación de Fílmico +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee está configurado para buscar imágenes Hald CLUT, que se usan para la herramienta Simulación de película, en una carpeta que tarda demasiado en cargarse. \nVaya a Preferencias> Procesamiento de imagen> Simulación de película \npara ver qué carpeta se está utilizando. Debería apuntar RawTherapee a una carpeta que contenga solo imágenes de Hald CLUT y nada más, o a una carpeta vacía si no desea usar la herramienta Simulación de película. \nLea el artículo de Simulación de película en RawPedia para obtener más información. \n¿Desea cancelar el escaneo ahora? TP_FILMSIMULATION_STRENGTH;Intensidad TP_FILMSIMULATION_ZEROCLUTSFOUND;Seleccionar el directorio HaldCLUT en Preferencias TP_FLATFIELD_AUTOSELECT;Auto selección @@ -1232,8 +1819,15 @@ TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;Ecualizador HSV TP_HSVEQUALIZER_SAT;S TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Exposición, punto de partida +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Emplear el desplazamiento de la línea de base de DCP incrustado. La configuración solo está disponible si el DCP seleccionado tiene uno. +TP_ICM_APPLYHUESATMAP;Tabla base +TP_ICM_APPLYHUESATMAP_TOOLTIP;Emplear la tabla base DCP incrustada (Mapa Hue Sat). La configuración solo está disponible si el DCP seleccionado tiene unoloy the embedded DCP base table (HueSatMap). The setting is only available if the selected DCP has one. +TP_ICM_APPLYLOOKTABLE;Revisar tabla +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Emplear la tabla de apariencia DCP incrustada. La configuración solo está disponible si el DCP seleccionado tiene uno. TP_ICM_BLENDCMSMATRIX;Mezclar las luces altas ICC con matriz TP_ICM_BLENDCMSMATRIX_TOOLTIP;Permite recuperar luces altas quemadas cuando se usan perfiles ICC basados en LUT +TP_ICM_BPC;Compensación de punto negro TP_ICM_DCPILLUMINANT;Iluminante TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolado TP_ICM_DCPILLUMINANT_TOOLTIP;Seleccione el Iluminante a emplear. El valor predeterminado es "interpolado", que es una mezcla entre dos basados en el Balance de Blancos. Este ajuste es posible solo si un Iluminante dual DCP con soporte de interpolación es seleccionado. @@ -1252,16 +1846,26 @@ TP_ICM_INPUTPROFILE;Perfil de entrada TP_ICM_LABEL;Gestión de color TP_ICM_NOICM;Sin ICM: Salida sRGB TP_ICM_OUTPUTPROFILE;Perfil de salida +TP_ICM_PROFILEINTENT;Iintento de interpretación. +TP_ICM_SAVEREFERENCE;Guardar imagen de referencia +TP_ICM_SAVEREFERENCE_APPLYWB;Aplicar balance de blancos +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;En general, aplique el balance de blancos cuando guarde imágenes para crear perfiles ICC, y no aplique el balance de blancos para crear perfiles DCP. TP_ICM_SAVEREFERENCE_TOOLTIP;Guardar la imagen TIFF lineal antes de aplicar el perfil de entrada. El resultado puede ser utilizado para fines de calibración y la generación de un perfil de cámara. TP_ICM_TONECURVE;Usar la curva tonal en DCP TP_ICM_TONECURVE_TOOLTIP;Activa el uso de las curvas de tono que pueden contener los perfiles DCP. Este ajuste es posible solo si el DCP seleccionado contiene una curva tonal. TP_ICM_WORKINGPROFILE;Perfil de trabajo +TP_ICM_WORKING_TRC;Curva de respuesta de tono: +TP_ICM_WORKING_TRC_CUSTOM;Personalizado +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;Ninguna/o +TP_ICM_WORKING_TRC_SLOPE;Bajar +TP_ICM_WORKING_TRC_TOOLTIP;Solo para perfiles incorporados. TP_IMPULSEDENOISE_LABEL;Impulsar Reducc. ruido TP_IMPULSEDENOISE_THRESH;Umbral TP_LABCURVE_AVOIDCOLORSHIFT;Evitar desplazamiento de colores -TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Encaja los colores dentro de la gama del espacio de color de trabajo y aplica la corrección de Munsell +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Encaja los colores dentro de la gamma del espacio de color de trabajo y aplica la corrección de Munsell TP_LABCURVE_BRIGHTNESS;Brillo -TP_LABCURVE_CHROMATICITY;Cromaticidad +TP_LABCURVE_CHROMATICITY;Cromaticidad (Saturación) TP_LABCURVE_CHROMA_TOOLTIP;Para aplicar mapeo tonal en blanco y negro, establezca la Cromaticidad a -100 TP_LABCURVE_CONTRAST;Contraste TP_LABCURVE_CURVEEDITOR;Curva de luminancia @@ -1273,6 +1877,7 @@ TP_LABCURVE_CURVEEDITOR_B_RANGE1;Azul saturado TP_LABCURVE_CURVEEDITOR_B_RANGE2;Azul pastel TP_LABCURVE_CURVEEDITOR_B_RANGE3;Amarillo pastel TP_LABCURVE_CURVEEDITOR_B_RANGE4;Amarillo saturado +TP_LABCURVE_CURVEEDITOR_CC;CC TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutros TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Mates TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel @@ -1297,10 +1902,29 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Puede usarse con el deslizador Cromaticidad y con la TP_LENSGEOM_AUTOCROP;Auto recorte TP_LENSGEOM_FILL;Auto relleno TP_LENSGEOM_LABEL;Lente / Geometría +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automáticamente +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP archivo +TP_LENSPROFILE_CORRECTION_MANUAL;Manual TP_LENSPROFILE_LABEL;Perfil de corrección de lente +TP_LENSPROFILE_LENS_WARNING;Advertencia: el factor de recorte utilizado para el perfilado de la lente es mayor que el factor de recorte de la cámara, los resultados pueden ser incorrectos. +TP_LENSPROFILE_MODE_HEADER;Seleccione el perfil de la lente: TP_LENSPROFILE_USECA;Corrección de AC TP_LENSPROFILE_USEDIST;Corrección de distorsión TP_LENSPROFILE_USEVIGN;Corrección de viñeteo +TP_LENSPROFILE_USE_CA;Aberración cromática +TP_LENSPROFILE_USE_GEOMETRIC;Geométrico +TP_LENSPROFILE_USE_HEADER;Seleccione distorsiones para corregir: +TP_LENSPROFILE_USE_VIGNETTING;Viñeteado +TP_LOCALCONTRAST_AMOUNT;Cantidad +TP_LOCALCONTRAST_DARKNESS;Nivel de sombras +TP_LOCALCONTRAST_LABEL;Contraste local +TP_LOCALCONTRAST_LIGHTNESS;Nivel de luminosidad +TP_LOCALCONTRAST_RADIUS;Radio +TP_METADATA_EDIT;Aplicar modificaciones +TP_METADATA_MODE;Modo de copia de metadatos +TP_METADATA_STRIP;Eliminar todos los metadatos +TP_METADATA_TUNNEL;Copiar sin cambios +TP_NEUTRAL;Reiniciar TP_NEUTRAL_TIP;Restablecer controles de exposición a valores neutros\nAplica a los mismos controles que son afectados por Niveles Automáticos, sin importar si usa o no Niveles Automáticos TP_PCVIGNETTE_FEATHER;Difuminado TP_PCVIGNETTE_FEATHER_TOOLTIP;Difuminación: \n0=Solo Esquinas\n50=Hasta medio camino al centro\n100=Hasta el Centro @@ -1321,10 +1945,22 @@ TP_PREPROCESS_HOTPIXFILT;Filtro Pixel Caliente TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Trata de eliminar los píxeles calientes. TP_PREPROCESS_LABEL;Preprocesado TP_PREPROCESS_LINEDENOISE;Filtro de ruido de línea +TP_PREPROCESS_LINEDENOISE_DIRECTION;Dirección +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Ambos +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal solo en filas PDAF +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical TP_PREPROCESS_NO_FOUND;No encontrado +TP_PREPROCESS_PDAFLINESFILTER;PDAF filtro de líneas +TP_PRSHARPENING_LABEL;Enfocar después del cambio de tamaño +TP_PRSHARPENING_TOOLTIP;Enfoca la imagen después de cambiar el tamaño. Solo funciona cuando se utiliza el método de cambio de tamaño "Lanczos". Es imposible previsualizar los efectos de esta herramienta. Ver RawPedia para instrucciones de uso. TP_RAWCACORR_AUTO;Auto corrección +TP_RAWCACORR_AUTOIT;Iterations +TP_RAWCACORR_AUTOIT_TOOLTIP;Esta configuración está disponible si se marca "Corrección automática". \nLa autocorrección es conservadora, lo que significa que a menudo no corrige toda la aberración cromática. \nPara corregir la aberración cromática restante, puede usar hasta cinco iteraciones de aberración cromática automática. corrección. \nCada iteración reducirá la aberración cromática restante de la última iteración al costo de un tiempo de procesamiento adicional. +TP_RAWCACORR_AVOIDCOLORSHIFT;Evitar el cambio de color TP_RAWCACORR_CABLUE;Azul TP_RAWCACORR_CARED;Rojo +TP_RAWCACORR_CASTR;Fuerza TP_RAWEXPOS_BLACKS;Niveles de negro TP_RAWEXPOS_BLACK_0;Verde 1 (principal) TP_RAWEXPOS_BLACK_1;Rojo @@ -1334,22 +1970,98 @@ TP_RAWEXPOS_BLACK_BLUE;Azul TP_RAWEXPOS_BLACK_GREEN;Verde TP_RAWEXPOS_BLACK_RED;Rojo TP_RAWEXPOS_LINEAR;Corrección de punto blanco -TP_RAWEXPOS_PRESER;Preservación de Luces Altas TP_RAWEXPOS_RGB;Rojo, Verde, Azul TP_RAWEXPOS_TWOGREEN;Vincular verdes +TP_RAW_1PASSMEDIUM;1-pasaje (medio) +TP_RAW_2PASS;1-paso+rápido +TP_RAW_3PASSBEST;3-Pasaje (Mejor) +TP_RAW_4PASS;3-paso+rápido +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Borde +TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;Aplicar paso de mejora DCB TP_RAW_DCBITERATIONS;Número de iteraciones DCB +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Método TP_RAW_DMETHOD_PROGRESSBAR;%1 interpolando mosaico... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Refinando la interpolación del mosaico... TP_RAW_DMETHOD_TOOLTIP;Nota: IGV y LMMSE están dedicados a imágenes tomadas con grandes velocidades ISO +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Umbral automático +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Si la casilla está marcada (recomendado), RawTherapee calcula un valor óptimo según las regiones planas de la imagen. \nSi no hay una región plana en la imagen o la imagen es demasiado ruidosa, el valor se establecerá en 0. \nPara establecer manualmente el valor, desmarque la casilla de verificación primero (los valores razonables dependen de la imagen). +TP_RAW_DUALDEMOSAICCONTRAST;Umbral de contraste +TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Pasos de supresión de color falso +TP_RAW_FAST;Fast +TP_RAW_HD;Límite +TP_RAW_HD_TOOLTIP;Los valores más bajos hacen que la detección de píxeles muertos/vivos sea más agresiva, pero los falsos positivos pueden llevar a producir elementos extraños. Si observa que aparecen elementos extraños al habilitar los filtros de píxeles calientes/muertos, aumente gradualmente el valor del umbral hasta que desaparezcan. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Sub-imagen +TP_RAW_IMAGENUM_TOOLTIP;Algunos archivos en bruto constan de varias sub-imágenes (Pentax / Sony Pixel Shift, Pentax 3-en-1 HDR, Canon Dual Pixel). \nAl usar cualquier método de demostración que no sea Pixel Shift, esto selecciona qué sub-imagen se usa . \nCuando se usa el método de demostración Pixel Shift en un Pixel Shift sin procesar, se usan todas las subimágenes, y esto selecciona qué subimagen se debe usar para mover partes. TP_RAW_LABEL;Desmosaicado +TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;Pasos de mejora LMMSE TP_RAW_LMMSE_TOOLTIP;Agregar gamma (paso 1)\n Agregar mediana (pasos 2,3,4)\nAgregar refinamientos (pasos 5,6) para reducir objetos espurios y mejorar la relación señal a ruido +TP_RAW_MONO;Mono +TP_RAW_NONE;Ninguno (muestra el patrón del sensor) +TP_RAW_PIXELSHIFT;Cambio de píxel +TP_RAW_PIXELSHIFTADAPTIVE;Detección adaptativa +TP_RAW_PIXELSHIFTBLUR;Máscara de movimiento de desenfoque +TP_RAW_PIXELSHIFTDMETHOD;Demosaicado, método para el movimiento +TP_RAW_PIXELSHIFTEPERISO;ISO adaptación +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;El valor predeterminado de 0 debería funcionar bien para la base ISO. \nAumente el valor para mejorar la detección del movimiento para una ISO más alta. \nAumente en pequeños pasos y observe la máscara de movimiento mientras aumenta. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Ecualiza el brillo de los cuadros. +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Igualar por canal +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Activado: ecualice los canales RGB individualmente. \nDeshabilitado: use el mismo factor de ecualización para todos los canales. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Ecualice el brillo de los cuadros con el brillo del cuadro seleccionado. \nSi hay áreas sobreexpuestas en los cuadros, seleccione el cuadro más brillante para evitar la aparición de colores magenta en áreas sobreexpuestas o habilite la corrección de movimiento. +TP_RAW_PIXELSHIFTEXP0;Experimental +TP_RAW_PIXELSHIFTGREEN;Compruebe el canal verde para el movimiento +TP_RAW_PIXELSHIFTHOLEFILL;Rellene los fallos en la máscara de movimiento +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Rellene los fallos en la máscara de movimiento +TP_RAW_PIXELSHIFTLMMSE;Utilice LMMSE para regiones móviles +TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE en lugar de AMaZE para las áreas de movimiento. \nÚtil para imágenes de alta ISO. +TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 nuevo umbral +TP_RAW_PIXELSHIFTMEDIAN;Usa la mediana pa3x3 nuevo umbral parara las regiones móviles. +TP_RAW_PIXELSHIFTMEDIAN3;Excluir el cuadro seleccionado de la mediana +TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excluye el cuadro seleccionado de la mediana. \nUtilícelo si los objetos en movimiento se superponen en el cuadro 2 y 3 +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use la mediana de todos los cuadros en lugar del cuadro seleccionado para las regiones con movimiento. \nElimina los objetos que se encuentran en diferentes lugares en todos los cuadros. \nBrinda efecto de movimiento en objetos de movimiento lento (superpuestos). +TP_RAW_PIXELSHIFTMM_AUTO;Automático +TP_RAW_PIXELSHIFTMM_CUSTOM;Personalizado +TP_RAW_PIXELSHIFTMM_OFF;Apagado +TP_RAW_PIXELSHIFTMOTION;Nivel de detección de movimiento (en desuso) +TP_RAW_PIXELSHIFTMOTIONCORRECTION;Magnitudo de la corrección del movimiento verde +TP_RAW_PIXELSHIFTMOTIONMETHOD;Corrección del movimiento +TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 significa que no hay detección de movimiento. \n1 - 99 significa que el movimiento se detectará de acuerdo con este valor. Aumente el valor para aumentar la tasa de detección. \n100 significa que se utilizará el marco de demostración AMaZE.ción de movimiento. \n1 - 99 significa que el movimiento se detectará de acuerdo con este valor. Aumente el valor para aumentar la tasa de detección. \n100 significa que se utilizará el marco de demostración AMaZE.no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. +TP_RAW_PIXELSHIFTNONGREENAMAZE;Compruebe AMaZE rojo / azul +TP_RAW_PIXELSHIFTNONGREENCROSS;Compruebe los canales rojos/azules para el movimiento +TP_RAW_PIXELSHIFTNONGREENCROSS2;Compruebe verde AMaZE +TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Compruebe rojo/azul horizontal +TP_RAW_PIXELSHIFTNONGREENVERTICAL;Compruebe rojo/azul vertical +TP_RAW_PIXELSHIFTNREADISO;nLeer +TP_RAW_PIXELSHIFTONEGREEN;Utilice un verde en lugar de media +TP_RAW_PIXELSHIFTONEGREEN_TOOLTIP;Use un verde en lugar de promediar dos verdes para regiones sin movimiento. +TP_RAW_PIXELSHIFTPRNU;PRNU (%) +TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Fuerza Rojo&Azul +TP_RAW_PIXELSHIFTSHOWMOTION;Mostrar máscara de movimiento +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Mostrar solo máscara de movimiento +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Muestra la máscara de movimiento sin la imagen. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Superpone la imagen con una máscara que muestra las regiones con movimiento. +TP_RAW_PIXELSHIFTSIGMA;Radio de desenfoque +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;El radio predeterminado de 1.0 por lo general se ajusta bien a la base ISO. \nAumente el valor para tomas con ISO alto, 5.0 es un buen punto de partida. \nMire la máscara de movimiento mientras cambia el valor. +TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Transiciones suaves entre áreas con movimiento y áreas sin movimiento. \nConfigure en 0 para deshabilitar el suavizado en la transición. \nConfigure en 1 para obtener el resultado AMaZE / LMMSE del marco seleccionado (dependiendo de si se selecciona "Usar LMMSE") o la mediana de los cuatro cuadros si se selecciona "Usar mediana". +TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;Factor de StdDev Azul +TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;Factor de StdDev Verde +TP_RAW_PIXELSHIFTSTDDEVFACTORRED;Factor de StdDev Rojo +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;Sensor con matriz Bayer TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pases da mejores resultados (recomendado para imágenes de ISO bajo).\n1-pase es más rápido y es casi indistinguible del modo 3-pases para imágenes de ISO altas. TP_RAW_SENSOR_XTRANS_LABEL;Sensor con matriz X-Trans +TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Permitir escalado TP_RESIZE_APPLIESTO;Aplica a: TP_RESIZE_CROPPEDAREA;Área recortada TP_RESIZE_FITBOX;Rectángulo límite @@ -1364,6 +2076,86 @@ TP_RESIZE_SCALE;Escala TP_RESIZE_SPECIFY;Especificar: TP_RESIZE_W;An: TP_RESIZE_WIDTH;Anchura +TP_RETINEX_CONTEDIT_HSL;Ecualizador HSL del histograma +TP_RETINEX_CONTEDIT_LAB;Ecualizador L * a * b * del histograma +TP_RETINEX_CONTEDIT_LH;Ecualizador de tono +TP_RETINEX_CONTEDIT_MAP;Ecualizador de máscara +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminancia según luminancia L = f (L) \nCorregir datos sin procesar para reducir halos y elementos extraños. +TP_RETINEX_CURVEEDITOR_LH;Fuerza=f(H) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Fuerza según el tono Fuerza = f (H) \nEsta curva también actúa sobre el croma cuando se usa el método 'Resaltar' retinex. +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Esta curva se puede aplicar sola o con una máscara gaussiana o una máscara wavelet. \n¡Cuidado con los elementos extraños! +TP_RETINEX_EQUAL;Equalizador +TP_RETINEX_FREEGAMMA;Gamma libre +TP_RETINEX_GAIN;Aumentar +TP_RETINEX_GAINOFFS;Aumentar y Offset (brillo) +TP_RETINEX_GAINTRANSMISSION;Aumentar transmisión +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplifique o reduzca el mapa de transmisión para lograr la luminancia. \nAbscisa: transmisión -min desde 0, media y valores (máx.). \nOrdena: ganancia. +TP_RETINEX_GAIN_TOOLTIP;Actúa sobre la imagen restaurada. \nÉsta es muy diferente de las otras configuraciones. Se utiliza para píxeles blancos o negros, y para ayudar a equilibrar el histograma. +TP_RETINEX_GAMMA;Gamma +TP_RETINEX_GAMMA_FREE;Libre +TP_RETINEX_GAMMA_HIGH;Alta +TP_RETINEX_GAMMA_LOW;Baja +TP_RETINEX_GAMMA_MID;Media +TP_RETINEX_GAMMA_NONE;Ninguna +TP_RETINEX_GAMMA_TOOLTIP;Restaura los tonos aplicando gamma antes y después de Retinex. Diferente de las curvas de Retinex u otras curvas (Lab, Exposición, etc.). +TP_RETINEX_GRAD;Gradiente de transmisión +TP_RETINEX_GRADS;Fuerza del Gradiente +TP_RETINEX_GRADS_TOOLTIP;Si el control deslizante está en 0, todas las iteraciones son idénticas. \nSi es mayor a 0, la fuerza se reduce cuando las iteraciones aumentan, y viceversa. +TP_RETINEX_GRAD_TOOLTIP;Si el control deslizante está en 0, todas las iteraciones son idénticas. \nSi es mayor a 0, la variación y el umbral se reducen cuando las iteraciones aumentan, y viceversa. +TP_RETINEX_HIGH;Alto +TP_RETINEX_HIGHLIG;Luces Altas +TP_RETINEX_HIGHLIGHT;Umbral de resaltado +TP_RETINEX_HIGHLIGHT_TOOLTIP;Aumente la acción del algoritmo alto. \nPuede requerir que vuelva a ajustar "Píxeles adyacentes" y aumentar la "Corrección de punto blanco" en la pestaña Sin formato -> Herramienta Puntos blancos sin procesar. +TP_RETINEX_HSLSPACE_LIN;HSL-Lineal +TP_RETINEX_HSLSPACE_LOG;HSL-Logarítmica +TP_RETINEX_ITER;Iteracciones (mapeo-tonos) +TP_RETINEX_ITERF;Mapeo de tonos +TP_RETINEX_ITER_TOOLTIP;Simule un operador de mapeo de tonos. \nLos valores altos aumentan el tiempo de procesamiento. +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Máscara +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Bajo +TP_RETINEX_MAP;Método de máscara +TP_RETINEX_MAP_GAUS;Máscara Gaussian +TP_RETINEX_MAP_MAPP;Máscara de enfoque (wavelet partial) +TP_RETINEX_MAP_MAPT;Máscara de enfoque(wavelet total) +TP_RETINEX_MAP_METHOD_TOOLTIP;Use la máscara generada por la función gaussiana anterior (Radio, Método) para reducir los halos y los elementos extraños. \nCortar solo: aplique una curva de contraste diagonal en la máscara. \n¡Cuidado con los elementos extraños! \nMáscara gaussiana: genere y use un Desenfoque gaussiano de la máscara original. \nRápido. \nMáscara de corte: genere y use un wavelet en la máscara original. \nBajo. +TP_RETINEX_MAP_NONE;Ninguno +TP_RETINEX_MEDIAN;filtro de transmision mediana +TP_RETINEX_METHOD;Método +TP_RETINEX_METHOD_TOOLTIP;Baja = Reforzar la luz baja. \nUniforme = Ecualizar la acción. \nAlta = Reforzar la luz alta. \nLuces Altas = Eliminar magenta en las partes altas +TP_RETINEX_MLABEL;Restaurado sin turbidez Min. =% 1 Max =% 2. +TP_RETINEX_MLABEL_TOOLTIP;Debe estar cerca del mín = 0 máx = 32768 \nImagen restaurada sin mezcla. +TP_RETINEX_NEIGHBOR;Radio +TP_RETINEX_NEUTRAL;Restablecer +TP_RETINEX_NEUTRAL_TIP;Restablecer todos los controles deslizantes y curvas a sus valores predeterminados. +TP_RETINEX_OFFSET;compensar(brillo) +TP_RETINEX_SCALES;Gradiente gaussiano +TP_RETINEX_SCALES_TOOLTIP;Si el control deslizante está en 0, todas las iteraciones son idénticas. \nSi es mayor a 0 la escala y el radio se reducen cuando aumentan las iteraciones, y viceversa. +TP_RETINEX_SETTINGS;Ajustes +TP_RETINEX_SKAL;Escala +TP_RETINEX_SLOPE;Gamma Libre al bajarla +TP_RETINEX_STRENGTH;Fuerza +TP_RETINEX_THRESHOLD;Límite +TP_RETINEX_THRESHOLD_TOOLTIP; Límites de entrada/salida. \nEn = fuente de imagen,\nhacia afuera = imagen gauss. +TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Resultado del mapa de transmisión. \nMin y Max son utilizados por diferencia.\nMean y Sigma. \nTm = Min TM = Max de mapa de transmisión. +TP_RETINEX_TRANF;transmisión +TP_RETINEX_TRANSMISSION;Mapa de transmisión +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmisión según la transmisión. \nAbscisa: transmisión desde valores negativos (mín.), Media y valores positivos (máx.). \nDerecha: amplificación o reducción. +TP_RETINEX_UNIFORM;Uniforme +TP_RETINEX_VARIANCE;Contraste +TP_RETINEX_VARIANCE_TOOLTIP;La varianza baja aumenta el contraste y la saturación locales, pero puede producir elementos extraños. +TP_RETINEX_VIEW;Proceso +TP_RETINEX_VIEW_MASK;Máscara +TP_RETINEX_VIEW_METHOD_TOOLTIP;Estándar - Visualización normal. \nMascara - Muestra la máscara. \nUna máscara de enfoque - Muestra la imagen con una máscara de desenfoque de radio alto. \nTransmisión - Automática \nFija - Muestra el mapa de transmisión del archivo, antes de cualquier acción sobre contraste y brillo. \nAtención: la máscara no corresponde a la realidad, pero se amplifica para hacerla más visible. +TP_RETINEX_VIEW_NONE;Estandard +TP_RETINEX_VIEW_TRAN;Transmisión - Auto +TP_RETINEX_VIEW_TRAN2;Transmisión - Fija +TP_RETINEX_VIEW_UNSHARP;Máscara de enfoque TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;Canal TP_RGBCURVES_GREEN;G @@ -1374,7 +2166,7 @@ TP_RGBCURVES_RED;R TP_ROTATE_DEGREE;Grados TP_ROTATE_LABEL;Rotar TP_ROTATE_SELECTLINE;Seleccionar línea recta -TP_SAVEDIALOG_OK_TIP;Atajo Ctrl-Enter +TP_SAVEDIALOG_OK_TIP;Tecla de Atajo Ctrl-Enter TP_SHADOWSHLIGHTS_HIGHLIGHTS;Luces altas TP_SHADOWSHLIGHTS_HLTONALW;Ancho tonal de Luces Altas TP_SHADOWSHLIGHTS_LABEL;Sombras/Luces altas @@ -1388,6 +2180,7 @@ TP_SHARPENEDGE_LABEL;Bordes TP_SHARPENEDGE_PASSES;Iteraciones TP_SHARPENEDGE_THREE;Sólo luminancia TP_SHARPENING_AMOUNT;Cantidad +TP_SHARPENING_CONTRAST;Umbral de contraste TP_SHARPENING_EDRADIUS;Radio TP_SHARPENING_EDTOLERANCE;Tolerancia de bordes TP_SHARPENING_HALOCONTROL;Control de halo @@ -1403,9 +2196,16 @@ TP_SHARPENING_RLD_ITERATIONS;Iteraciones TP_SHARPENING_THRESHOLD;Umbral TP_SHARPENING_USM;Máscara de enfoque TP_SHARPENMICRO_AMOUNT;Cantidad +TP_SHARPENMICRO_CONTRAST;Umbral de contraste TP_SHARPENMICRO_LABEL;Microcontraste TP_SHARPENMICRO_MATRIX;Matriz 3×3 en lugar de 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformidad +TP_SOFTLIGHT_LABEL;Luz tenue +TP_SOFTLIGHT_STRENGTH;Fuerza +TP_TM_FATTAL_AMOUNT;Cantidad +TP_TM_FATTAL_ANCHOR;Ancla +TP_TM_FATTAL_LABEL;HDR Mapeo de tonos +TP_TM_FATTAL_THRESHOLD;Límite TP_VIBRANCE_AVOIDCOLORSHIFT;Evitar desplazamiento de color TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tonos de piel @@ -1430,6 +2230,170 @@ TP_VIGNETTING_CENTER_Y;Centro Y TP_VIGNETTING_LABEL;Corrección de viñeteo TP_VIGNETTING_RADIUS;Radio TP_VIGNETTING_STRENGTH;Intensidad +TP_WAVELET_1;Nivel 1 +TP_WAVELET_2;Nivel 2 +TP_WAVELET_3;Nivel 3 +TP_WAVELET_4;Nivel 4 +TP_WAVELET_5;Nivel 5 +TP_WAVELET_6;Nivel 6 +TP_WAVELET_7;Nivel 7 +TP_WAVELET_8;Nivel 8 +TP_WAVELET_9;Nivel 9 +TP_WAVELET_APPLYTO;Aplicar para +TP_WAVELET_AVOID;Evitar el cambio de color +TP_WAVELET_B0;negro +TP_WAVELET_B1;Gris +TP_WAVELET_B2;Residual +TP_WAVELET_BACKGROUND;Fondo +TP_WAVELET_BACUR;Curva +TP_WAVELET_BALANCE;Balance de contraste d/v-h +TP_WAVELET_BALANCE_TOOLTIP;Altera el balance entre las direcciones wavelet: vertical-horizontal y diagonal. \nSi se activa el contraste, en el color o el mapeo de tonos residuales, el efecto debido al balance se amplifica. +TP_WAVELET_BALCHRO;Balance del color +TP_WAVELET_BALCHRO_TOOLTIP;Si está habilitado, la curva o el control deslizante 'Balance de contraste' también modifica el balance del color. +TP_WAVELET_BANONE;Ninguno +TP_WAVELET_BASLI;Deslizador +TP_WAVELET_BATYPE;Método de balance de contraste +TP_WAVELET_CBENAB;Tonificación y balance de color +TP_WAVELET_CB_TOOLTIP;Para valores fuertes, el tono del color del producto se combina o no con la descomposición de niveles 'tonificación' \nPara valores bajos, puede cambiar el balance de blancos del fondo (cielo, ...) sin cambiar el del plano frontal, generalmente más contrastado +TP_WAVELET_CCURVE;Contraste local +TP_WAVELET_CH1;gamma completa del color +TP_WAVELET_CH2;Saturado/pastel +TP_WAVELET_CH3;Enlazar con los niveles de contraste +TP_WAVELET_CHCU;Curva +TP_WAVELET_CHR;Fuerza de enlace con el contraste del color +TP_WAVELET_CHRO;Umbral saturado/pastel +TP_WAVELET_CHRO_TOOLTIP;Establece el nivel de wavelet que será el umbral entre los colores saturados y pastel. \n1-x: saturado \nx-9: pastel \nSi el valor supera la cantidad de niveles de wavelet que está utilizando, se ignorará. +TP_WAVELET_CHR_TOOLTIP;Ajusta el color en función de los "niveles de contraste" y la "fuerza de enlace del contraste de croma" +TP_WAVELET_CHSL;Deslizadores +TP_WAVELET_CHTYPE;Método de crominancia +TP_WAVELET_COLORT;Opacidad rojo-verde +TP_WAVELET_COMPCONT;Contraste +TP_WAVELET_COMPGAMMA;Gamma de compresión +TP_WAVELET_COMPGAMMA_TOOLTIP;Ajustar la gamma de la imagen residual le permite equilibrar los datos y el histograma. +TP_WAVELET_COMPTM;Mapeo de tonos +TP_WAVELET_CONTEDIT;'Después',Curva de contraste +TP_WAVELET_CONTR;Gamma +TP_WAVELET_CONTRA;Contraste +TP_WAVELET_CONTRAST_MINUS;Contraste - +TP_WAVELET_CONTRAST_PLUS;Contraste + +TP_WAVELET_CONTRA_TOOLTIP;Cambia el contraste de la imagen residual. +TP_WAVELET_CTYPE;Control de crominancia +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifica el contraste local como una función del contraste local original (abscisa). \nLos valores bajos de abscisa representan un contraste local pequeño (valores reales aproximadamente 10 ... 20). \n50% de abscisa representa el contraste local promedio (valor real aproximadamente 100..300) . \n66% de abscisas representa la desviación estándar del contraste local (valor real de aproximadamente 300 ... 800). \n100% de abscisa representa el máximo contraste local (valor real de aproximadamente 3000 ... 8000). +TP_WAVELET_CURVEEDITOR_CH;Niveles de contrate=f(Matiz) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifica el contraste de cada nivel en función del tono. \nTenga cuidado de no sobrescribir los cambios realizados con los controles de tono de la subherramienta Gamut. \nLa curva solo tendrá efecto cuando los controles deslizantes del nivel de contraste de wavelets no sean cero. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Aplica una curva de luminancia de contraste definitiva al final del tratamiento con wavelets. +TP_WAVELET_CURVEEDITOR_HH;HH +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifica el matiz de la imagen residual en función del matiz. +TP_WAVELET_DALL;Todas las direcciones +TP_WAVELET_DAUB;Cualidad del borde +TP_WAVELET_DAUB2;D2 - bajo +TP_WAVELET_DAUB4;D4 - estandar +TP_WAVELET_DAUB6;D6 - estándar mayor +TP_WAVELET_DAUB10;D10 - medio +TP_WAVELET_DAUB14;D14 - alto +TP_WAVELET_DAUB_TOOLTIP;Cambios en los coeficientes de Daubechies: \nD4 = Estándar, \nD14 = A menudo, el mejor rendimiento, un 10% más de tiempo. \nAfecta la detección de bordes, así como la calidad general de los primeros niveles. Sin embargo, la calidad no está estrictamente relacionada con este coeficiente y puede variar con las imágenes y los usos. +TP_WAVELET_DONE;Vertical +TP_WAVELET_DTHR;Diagonal +TP_WAVELET_DTWO;Horizontal +TP_WAVELET_EDCU;Curva +TP_WAVELET_EDGCONT;Contraste local +TP_WAVELET_EDGCONT_TOOLTIP;El ajuste de los puntos a la izquierda disminuye el contraste, y a la derecha lo aumenta. \nAbajo-izquierda, Arriba-Izquierda, Arriba-Derecha, Abajo-derecha \nRepresenta respectivamente el contraste local para valores bajos, media, mean + stdev, máxima +TP_WAVELET_EDGE;Nitidez del borde +TP_WAVELET_EDGEAMPLI;Amplificación de base +TP_WAVELET_EDGEDETECT;Sensibilidad de gradiente +TP_WAVELET_EDGEDETECTTHR;Umbral bajo (ruido) +TP_WAVELET_EDGEDETECTTHR2;Umbral alto (detección) +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Este ajustador le permite trabajar la detección de bordes, por ejemplo, para evitar aplicar la nitidez de los bordes a detalles finos, como el ruido en el cielo. +TP_WAVELET_EDGEDETECT_TOOLTIP;Al mover el control deslizante hacia la derecha aumenta la sensibilidad del borde. Esto afecta el contraste local, la configuración de borde y el ruido. +TP_WAVELET_EDGESENSI;Sensibilidad del borde +TP_WAVELET_EDGREINF_TOOLTIP;Refuerza o reduce la acción del primer nivel, hace lo contrario con el segundo nivel y deja el resto sin cambios. +TP_WAVELET_EDGTHRESH;Detalle +TP_WAVELET_EDGTHRESH_TOOLTIP;Cambiar el reparto entre los primeros niveles y los demás. Cuanto más alto sea el umbral, más se centrará la acción en los primeros niveles. Tenga cuidado con los valores negativos, aumentan la acción de los niveles altos y pueden producir elementos extraños +TP_WAVELET_EDRAD;Radio +TP_WAVELET_EDRAD_TOOLTIP;Este ajuste de radio es muy diferente de aquellos en otras herramientas de enfoque. Su valor se compara con cada nivel a través de una función compleja. En este sentido, un valor de cero todavía tiene un efecto +TP_WAVELET_EDSL;Deslizadores de umbral +TP_WAVELET_EDTYPE;Método de contraste local +TP_WAVELET_EDVAL;Fuerza +TP_WAVELET_FINAL;Retoque final +TP_WAVELET_FINEST;Mejor +TP_WAVELET_HIGHLIGHT;Rango de luminancia +TP_WAVELET_HS1;Rango de luminancia total +TP_WAVELET_HS2;Sombras/Luces altas +TP_WAVELET_HUESKIN;Tono de piel +TP_WAVELET_HUESKIN_TOOLTIP;Los puntos inferiores establecen el comienzo de la zona de transición, y los puntos superiores el final de la misma, donde el efecto es máximo.\nSi necesita mover el área significativamente, o si hay elementos extraños, es porque el balance de blancos es incorrecto +TP_WAVELET_HUESKY;Tono del cielo +TP_WAVELET_HUESKY_TOOLTIP;Los puntos inferiores establecen el comienzo de la zona de transición, y los puntos superiores el final de la misma, donde el efecto es máximo. \nSi necesita mover el área significativamente, o si hay elementos extraños, entonces el balance de blancos es incorrecto . +TP_WAVELET_ITER;Niveles de equilibrio delta +TP_WAVELET_ITER_TOOLTIP;Izquierda: aumenta los niveles bajos y reduce los niveles altos, \nDerecha: reduce los niveles bajos y aumenta los niveles altos. +TP_WAVELET_LABEL;Niveles wavelet +TP_WAVELET_LARGEST;Más grueso +TP_WAVELET_LEVCH;Cromaticidad(Color): saturación ó pureza +TP_WAVELET_LEVDIR_ALL;Todos los nivels en todas las direcciones. +TP_WAVELET_LEVDIR_INF;Por debajo o igual al nivel +TP_WAVELET_LEVDIR_ONE;Un solo nivel +TP_WAVELET_LEVDIR_SUP;Por encima del nivel +TP_WAVELET_LEVELS;Niveles wavelet +TP_WAVELET_LEVELS_TOOLTIP;Elija la cantidad de niveles de detalle en que se descompondrá la imagen. Más niveles requieren más RAM y más tiempo de procesamiento. +TP_WAVELET_LEVF;Contraste +TP_WAVELET_LEVLABEL;Vista previa de los niveles máximos posibles = %1 +TP_WAVELET_LEVONE;Nivel 2 +TP_WAVELET_LEVTHRE;Nivel 4 +TP_WAVELET_LEVTWO;Nivel 3 +TP_WAVELET_LEVZERO;Nivel 1 +TP_WAVELET_LINKEDG;Enlaza con la fuerza de la nitidez de los bordes +TP_WAVELET_LIPST;Algoritmo mejorado +TP_WAVELET_LOWLIGHT;Rango de luminancia de la sombra +TP_WAVELET_MEDGREINF;Primer nivel +TP_WAVELET_MEDI;Reduce los elementos extraños en el cielo azul +TP_WAVELET_MEDILEV;Detección de bordes +TP_WAVELET_MEDILEV_TOOLTIP;Cuando habilita la detección de bordes, se recomienda: \nTener los niveles de bajo contraste deshabilitados para evitar elementos extraños, \nusar para valores altos de sensibilidad de gradiente. \nPuede modular la fuerza con 'enfocar' desde quitar ruido y enfocar. +TP_WAVELET_NEUTRAL;Neutral +TP_WAVELET_NOIS;Quitar ruido +TP_WAVELET_NOISE;Quitar ruido y clarificar +TP_WAVELET_NPHIGH;Alto +TP_WAVELET_NPLOW;Bajo +TP_WAVELET_NPNONE;Ninguno +TP_WAVELET_NPTYPE;Píxeles vecinos +TP_WAVELET_NPTYPE_TOOLTIP;Este algoritmo utiliza la proximidad de un píxel y ocho de sus vecinos. Si hay una diferencia menor, los bordes se refuerzan. +TP_WAVELET_OPACITY;Opacidad Azul-Amarillo +TP_WAVELET_OPACITYW; Curva de balance d/v-h para contrast +TP_WAVELET_OPACITYWL;Contraste local final +TP_WAVELET_OPACITYWL_TOOLTIP;Modifica el contraste local definitivo al final del tratamiento wavelet \ nEl lado izquierdo representa el contraste local más pequeño, avanzando hacia la derecha el contraste local más grande +TP_WAVELET_PASTEL;Cromaticidad(colores) pastel +TP_WAVELET_PROC;Proceso +TP_WAVELET_RE1;Reforzado +TP_WAVELET_RE2;Sin alterar +TP_WAVELET_RE3;Reducir +TP_WAVELET_RESCHRO;Cromaticidad(aquí saturación) +TP_WAVELET_RESCON;Sombras +TP_WAVELET_RESCONH;Luces altas(Reflejos) +TP_WAVELET_RESID;Imagen residual +TP_WAVELET_SAT;Saturar la cromaticidad(color) +TP_WAVELET_SETTINGS;Configuraciones Wavelet +TP_WAVELET_SKIN;Enfocar piel/proteción +TP_WAVELET_SKIN_TOOLTIP;A (menos)-100 los tonos de piel están afectados. \nA 0 todos los tonos se tratan por igual. \nA +100 los tonos de piel están protegidos, mientras que todos los demás tonos están afectados. +TP_WAVELET_SKY;protección del cielo al enfocar +TP_WAVELET_SKY_TOOLTIP;A -100 se apuntan los tonos del cielo. \nEn 0 todos los tonos se tratan por igual. \nEn +100 los tonos del cielo están protegidos, mientras que todos los demás tonos están afectados. +TP_WAVELET_SKY_TOOLTIPEn (menos)-100se afecta a los tonos del cielo. \nEn 0 todos los tonos se tratan por igual. \nen +100 los tonos del cielo están protegidos, mientras que todos los demás tonos están afectados. +TP_WAVELET_STREN;Fuerza +TP_WAVELET_STRENGTH;Fuerza +TP_WAVELET_SUPE;Extra +TP_WAVELET_THR;Límite de la sombra +TP_WAVELET_THRESHOLD;Niveles de luces altas +TP_WAVELET_THRESHOLD2;Niveles de sombra +TP_WAVELET_THRESHOLD2_TOOLTIP;Solo los niveles entre 9 y 9 menos el valor se verán afectados por el rango de luminancia de la sombra. Otros niveles serán tratados completamente. El nivel más alto posible está limitado por el valor del nivel de resaltado (9 menos el valor del nivel de resaltado) +TP_WAVELET_THRESHOLD_TOOLTIP;Solo los niveles más allá del valor elegido se verán afectados por el rango de luminancia de resaltado. Otros niveles serán tratados completamente. El valor elegido aquí limita el valor más alto posible de la sombra.niveles +TP_WAVELET_THRH;Umbral de luces altas +TP_WAVELET_TILESBIG;Mosaicos grandes +TP_WAVELET_TILESFULL;Imagen completa +TP_WAVELET_TILESIZE;Método de mosaico +TP_WAVELET_TILESLIT;Mosaicos pequeños +TP_WAVELET_TILES_TOOLTIP;El procesamiento de la imagen completa conduce a una mejor calidad y es la opción recomendada, mientras que el uso de mosaicos es una solución alternativa para los usuarios con poca memoria RAM. Consulte RawPedia para los requisitos de memoria. +TP_WAVELET_TMSTRENGTH;Fuerza comprensiva +TP_WAVELET_TMSTRENGTH_TOOLTIP;Controle la intensidad del mapeo de tonos o la compresión de contraste de la imagen residual. Cuando el valor es diferente de 0 , los controles deslizantes Fuerza y ​​Gamma de la herramienta de asignación de tonos en la pestaña Exposición se atenuarán. +TP_WAVELET_TMTYPE;Método de compresión +TP_WAVELET_TON;Viraje TP_WBALANCE_AUTO;Auto TP_WBALANCE_CAMERA;Cámara TP_WBALANCE_CLOUDY;Nublado @@ -1464,6 +2428,7 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Método +TP_WBALANCE_PICKER;Seleccionar TP_WBALANCE_SHADE;Sombra TP_WBALANCE_SIZE;Tamaño: TP_WBALANCE_SOLUX35;Solux 3500K @@ -1471,6 +2436,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (proveedor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;Muestra bal. blancos +TP_WBALANCE_TEMPBIAS;Sesgo de temperatura AWB +TP_WBALANCE_TEMPBIAS_TOOLTIP;Permite alterar el cálculo del "balance de blancos automático" \ndirigiéndolo hacia temperaturas más cálidas o más bajas. \nEl sesgo se expresa como un porcentaje de la temperatura calculada, por lo que el resultado viene dado por "computedTemp + computedTemp * bias". TP_WBALANCE_TEMPERATURE;Temperatura TP_WBALANCE_TUNGSTEN;Tungsteno TP_WBALANCE_WATER1;Subacuático 1 @@ -1478,787 +2445,19 @@ TP_WBALANCE_WATER2;Subacuático 2 TP_WBALANCE_WATER_HEADER;Subacuático 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_ZOOMIN;Aumentar Zoom\nAtajo: + -ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - +ZOOMPANEL_ZOOM100;Zoom al 100%\nTecla de Atajo: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Ajustar el recorte a la pantalla \nCorte corto: f +ZOOMPANEL_ZOOMFITSCREEN;Ajustar a pantalla\nTecla de Atajo: Alt-f +ZOOMPANEL_ZOOMIN;Aumentar Zoom\nTecla de Atajo: + +ZOOMPANEL_ZOOMOUT;Reducir Zoom\nTecla de Atajo: - !!!!!!!!!!!!!!!!!!!!!!!!! ! 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: -!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 -!EXIFPANEL_SHOWALL;Show all -!EXPORT_BYPASS;Processing steps to bypass -!EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels -!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_POPUPCOLORLABEL0;Label: None -!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 -!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 -!HISTORY_MSG_302;NR - Chroma method -!HISTORY_MSG_303;NR - Chroma method -!HISTORY_MSG_304;W - Contrast levels -!HISTORY_MSG_305;Wavelet Levels -!HISTORY_MSG_306;W - Process -!HISTORY_MSG_307;W - Process -!HISTORY_MSG_308;W - Process direction -!HISTORY_MSG_309;W - ES - Detail -!HISTORY_MSG_310;W - Residual - Sky tar/prot -!HISTORY_MSG_311;W - Wavelet levels -!HISTORY_MSG_312;W - Residual - Shadows threshold -!HISTORY_MSG_313;W - Chroma - Sat/past -!HISTORY_MSG_314;W - Gamut - Reduce artifacts -!HISTORY_MSG_315;W - Residual - Contrast -!HISTORY_MSG_316;W - Gamut - Skin tar/prot -!HISTORY_MSG_317;W - Gamut - Skin hue -!HISTORY_MSG_318;W - Contrast - Highlight levels -!HISTORY_MSG_319;W - Contrast - Highlight range -!HISTORY_MSG_320;W - Contrast - Shadow range -!HISTORY_MSG_321;W - Contrast - Shadow levels -!HISTORY_MSG_322;W - Gamut - Avoid color shift -!HISTORY_MSG_323;W - ES - Local contrast -!HISTORY_MSG_324;W - Chroma - Pastel -!HISTORY_MSG_325;W - Chroma - Saturated -!HISTORY_MSG_326;W - Chroma - Method -!HISTORY_MSG_327;W - Contrast - Apply to -!HISTORY_MSG_328;W - Chroma - Link strength -!HISTORY_MSG_329;W - Toning - Opacity RG -!HISTORY_MSG_330;W - Toning - Opacity BY -!HISTORY_MSG_331;W - Contrast levels - Extra -!HISTORY_MSG_332;W - Tiling method -!HISTORY_MSG_333;W - Residual - Shadows -!HISTORY_MSG_334;W - Residual - Chroma -!HISTORY_MSG_335;W - Residual - Highlights -!HISTORY_MSG_336;W - Residual - Highlights threshold -!HISTORY_MSG_337;W - Residual - Sky hue -!HISTORY_MSG_338;W - ES - Radius -!HISTORY_MSG_339;W - ES - Strength -!HISTORY_MSG_340;W - Strength -!HISTORY_MSG_341;W - Edge performance -!HISTORY_MSG_342;W - ES - First level -!HISTORY_MSG_343;W - Chroma levels -!HISTORY_MSG_344;W - Meth chroma sl/cur -!HISTORY_MSG_345;W - ES - Local contrast -!HISTORY_MSG_346;W - ES - Local contrast method -!HISTORY_MSG_347;W - Denoise - Level 1 -!HISTORY_MSG_348;W - Denoise - Level 2 -!HISTORY_MSG_349;W - Denoise - Level 3 -!HISTORY_MSG_350;W - ES - Edge detection -!HISTORY_MSG_351;W - Residual - HH curve -!HISTORY_MSG_352;W - Background -!HISTORY_MSG_353;W - ES - Gradient sensitivity -!HISTORY_MSG_354;W - ES - Enhanced -!HISTORY_MSG_355;W - ES - Threshold low -!HISTORY_MSG_356;W - ES - Threshold high -!HISTORY_MSG_357;W - Denoise - Link with ES -!HISTORY_MSG_358;W - Gamut - CH -!HISTORY_MSG_359;Hot/Dead - Threshold -!HISTORY_MSG_360;TM - Gamma -!HISTORY_MSG_361;W - Final - Chroma balance -!HISTORY_MSG_362;W - Residual - Compression method -!HISTORY_MSG_363;W - Residual - Compression strength -!HISTORY_MSG_364;W - Final - Contrast balance -!HISTORY_MSG_365;W - Final - Delta balance -!HISTORY_MSG_366;W - Residual - Compression gamma -!HISTORY_MSG_367;W - Final - 'After' contrast curve -!HISTORY_MSG_368;W - Final - Contrast balance -!HISTORY_MSG_369;W - Final - Balance method -!HISTORY_MSG_370;W - Final - Local contrast curve -!HISTORY_MSG_371;Post-Resize Sharpening -!HISTORY_MSG_372;PRS USM - Radius -!HISTORY_MSG_373;PRS USM - Amount -!HISTORY_MSG_374;PRS USM - Threshold -!HISTORY_MSG_375;PRS USM - Sharpen only edges -!HISTORY_MSG_376;PRS USM - Edge detection radius -!HISTORY_MSG_377;PRS USM - Edge tolerance -!HISTORY_MSG_378;PRS USM - Halo control -!HISTORY_MSG_379;PRS USM - Halo control amount -!HISTORY_MSG_380;PRS - Method -!HISTORY_MSG_381;PRS RLD - Radius -!HISTORY_MSG_382;PRS RLD - Amount -!HISTORY_MSG_383;PRS RLD - Damping -!HISTORY_MSG_384;PRS RLD - Iterations -!HISTORY_MSG_385;W - Residual - Color Balance -!HISTORY_MSG_386;W - Residual - CB green high -!HISTORY_MSG_387;W - Residual - CB blue high -!HISTORY_MSG_388;W - Residual - CB green mid -!HISTORY_MSG_389;W - Residual - CB blue mid -!HISTORY_MSG_390;W - Residual - CB green low -!HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset -!HISTORY_MSG_393;DCP - Look table -!HISTORY_MSG_394;DCP - Baseline exposure -!HISTORY_MSG_395;DCP - Base table -!HISTORY_MSG_396;W - Contrast sub-tool -!HISTORY_MSG_397;W - Chroma sub-tool -!HISTORY_MSG_398;W - ES sub-tool -!HISTORY_MSG_399;W - Residual sub-tool -!HISTORY_MSG_400;W - Final sub-tool -!HISTORY_MSG_401;W - Toning sub-tool -!HISTORY_MSG_402;W - Denoise sub-tool -!HISTORY_MSG_403;W - ES - Edge sensitivity -!HISTORY_MSG_404;W - ES - Base amplification -!HISTORY_MSG_405;W - Denoise - Level 4 -!HISTORY_MSG_406;W - ES - Neighboring pixels -!HISTORY_MSG_407;Retinex - Method -!HISTORY_MSG_408;Retinex - Radius -!HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Offset -!HISTORY_MSG_411;Retinex - Strength -!HISTORY_MSG_412;Retinex - Gaussian gradient -!HISTORY_MSG_413;Retinex - Contrast -!HISTORY_MSG_414;Retinex - Histogram - Lab -!HISTORY_MSG_415;Retinex - Transmission -!HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median -!HISTORY_MSG_418;Retinex - Threshold -!HISTORY_MSG_419;Retinex - Color space -!HISTORY_MSG_420;Retinex - Histogram - HSL -!HISTORY_MSG_421;Retinex - Gamma -!HISTORY_MSG_422;Retinex - Gamma -!HISTORY_MSG_423;Retinex - Gamma slope -!HISTORY_MSG_424;Retinex - HL threshold -!HISTORY_MSG_425;Retinex - Log base -!HISTORY_MSG_426;Retinex - Hue equalizer -!HISTORY_MSG_427;Output rendering intent -!HISTORY_MSG_428;Monitor rendering intent -!HISTORY_MSG_429;Retinex - Iterations -!HISTORY_MSG_430;Retinex - Transmission gradient -!HISTORY_MSG_431;Retinex - Strength gradient -!HISTORY_MSG_432;Retinex - M - Highlights -!HISTORY_MSG_433;Retinex - M - Highlights TW -!HISTORY_MSG_434;Retinex - M - Shadows -!HISTORY_MSG_435;Retinex - M - Shadows TW -!HISTORY_MSG_436;Retinex - M - Radius -!HISTORY_MSG_437;Retinex - M - Method -!HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Process -!HISTORY_MSG_440;CbDL - Method -!HISTORY_MSG_441;Retinex - Gain transmission -!HISTORY_MSG_442;Retinex - Scale -!HISTORY_MSG_443;Output black point compensation -!HISTORY_MSG_444;WB - Temp bias -!HISTORY_MSG_445;Raw sub-image -!HISTORY_MSG_449;PS - ISO adaption -!HISTORY_MSG_452;PS - Show motion -!HISTORY_MSG_453;PS - Show mask only -!HISTORY_MSG_457;PS - Check red/blue -!HISTORY_MSG_462;PS - Check green -!HISTORY_MSG_464;PS - Blur motion mask -!HISTORY_MSG_465;PS - Blur radius -!HISTORY_MSG_468;PS - Fill holes -!HISTORY_MSG_469;PS - Median -!HISTORY_MSG_471;PS - Motion correction -!HISTORY_MSG_472;PS - Smooth transitions -!HISTORY_MSG_473;PS - Use LMMSE -!HISTORY_MSG_474;PS - Equalize -!HISTORY_MSG_475;PS - Equalize channel -!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 -!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_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 -!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 -!IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. -!IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. -!IPTCPANEL_CREATOR;Creator -!IPTCPANEL_CREATORHINT;Enter the name of the person that created this image. -!IPTCPANEL_CREATORJOBTITLE;Creator's job title -!IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field. -!IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken. -!IPTCPANEL_DESCRIPTION;Description -!IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image. -!IPTCPANEL_DESCRIPTIONWRITER;Description writer -!IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image. -!IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image. -!IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field. -!IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image. -!IPTCPANEL_PROVINCE;Province or state -!IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image. -!IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from. -!IPTCPANEL_SUPPCATEGORIES;Supplemental categories -!IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image. -!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_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 -!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_R;R: -!NAVIGATOR_S;S: -!NAVIGATOR_V;V: -!PARTIALPASTE_EQUALIZER;Wavelet levels -!PARTIALPASTE_GRADIENT;Graduated filter -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_PRSHARPENING;Post-resize sharpening -!PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue -!PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift -!PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!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 -!PREFERENCES_CURVEBBOXPOS_LEFT;Left -!PREFERENCES_CURVEBBOXPOS_RIGHT;Right -!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. -!PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 -!PREFERENCES_GREYSC;Scene Yb luminance (%) -!PREFERENCES_GREYSC18;Yb=18 CIE L#50 -!PREFERENCES_GREYSCA;Automatic -!PREFERENCES_IMG_RELOAD_NEEDED;These changes require the image to be reloaded (or a new image to be opened) to take effect. -!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 -!PREFERENCES_MAX;Maxi (Tile) -!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_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 -!PREFERENCES_PROFILE_NONE;None -!PREFERENCES_PRTINTENT;Rendering intent -!PREFERENCES_PRTPROFILE;Color profile -!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset -!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!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 -!PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!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 -!TP_CBDL_METHOD;Process located -!TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!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 is enabled, Yb is calculated from the mean value of the actual image's luminance -!TP_CROP_GTHARMMEANS;Harmonic Means -!TP_CROP_GTTRIANGLE1;Golden Triangles 1 -!TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!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_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_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? -!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure -!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. -!TP_ICM_APPLYHUESATMAP;Base table -!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_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_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. -!TP_RAWCACORR_CASTR;Strength -!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/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) -!TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection -!TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. -!TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames -!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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental -!TP_RAW_PIXELSHIFTGREEN;Check green channel for motion -!TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask -!TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask -!TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts -!TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold -!TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 -!TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. -!TP_RAW_PIXELSHIFTMM_AUTO;Automatic -!TP_RAW_PIXELSHIFTMM_CUSTOM;Custom -!TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size -!TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction -!TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE -!TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 -!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask -!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. -!TP_RAW_PIXELSHIFTSIGMA;Blur radius -!TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. -!TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions -!TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!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* -!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 -!TP_RETINEX_GAIN;Gain -!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_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. -!TP_RETINEX_GAMMA;Gamma -!TP_RETINEX_GAMMA_FREE;Free -!TP_RETINEX_GAMMA_HIGH;High -!TP_RETINEX_GAMMA_LOW;Low -!TP_RETINEX_GAMMA_MID;Middle -!TP_RETINEX_GAMMA_NONE;None -!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). -!TP_RETINEX_GRAD;Transmission gradient -!TP_RETINEX_GRADS;Strength gradient -!TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. -!TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. -!TP_RETINEX_HIGH;High -!TP_RETINEX_HIGHLIG;Highlight -!TP_RETINEX_HIGHLIGHT;Highlight threshold -!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. -!TP_RETINEX_HSLSPACE_LIN;HSL-Linear -!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic -!TP_RETINEX_ITER;Iterations (Tone-mapping) -!TP_RETINEX_ITERF;Tone mapping -!TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. -!TP_RETINEX_LABEL;Retinex -!TP_RETINEX_LABEL_MASK;Mask -!TP_RETINEX_LABSPACE;L*a*b* -!TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method -!TP_RETINEX_MAP_GAUS;Gaussian mask -!TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) -!TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) -!TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. -!TP_RETINEX_MAP_NONE;None -!TP_RETINEX_MEDIAN;Transmission median filter -!TP_RETINEX_METHOD;Method -!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. -!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2 -!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture. -!TP_RETINEX_NEIGHBOR;Radius -!TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Offset (brightness) -!TP_RETINEX_SCALES;Gaussian gradient -!TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. -!TP_RETINEX_SETTINGS;Settings -!TP_RETINEX_SKAL;Scale -!TP_RETINEX_SLOPE;Free gamma slope -!TP_RETINEX_STRENGTH;Strength -!TP_RETINEX_THRESHOLD;Threshold -!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. -!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 -!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 -!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. -!TP_RETINEX_TRANF;Transmission -!TP_RETINEX_TRANSMISSION;Transmission map -!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_UNIFORM;Uniform -!TP_RETINEX_VARIANCE;Contrast -!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts. -!TP_RETINEX_VIEW;Process -!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_RETINEX_VIEW_NONE;Standard -!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_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold -!TP_WAVELET_1;Level 1 -!TP_WAVELET_2;Level 2 -!TP_WAVELET_3;Level 3 -!TP_WAVELET_4;Level 4 -!TP_WAVELET_5;Level 5 -!TP_WAVELET_6;Level 6 -!TP_WAVELET_7;Level 7 -!TP_WAVELET_8;Level 8 -!TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To -!TP_WAVELET_AVOID;Avoid color shift -!TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey -!TP_WAVELET_B2;Residual -!TP_WAVELET_BACKGROUND;Background -!TP_WAVELET_BACUR;Curve -!TP_WAVELET_BALANCE;Contrast balance d/v-h -!TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. -!TP_WAVELET_BALCHRO;Chroma balance -!TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -!TP_WAVELET_BANONE;None -!TP_WAVELET_BASLI;Slider -!TP_WAVELET_BATYPE;Contrast balance method -!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_CCURVE;Local contrast -!TP_WAVELET_CH1;Whole chroma range -!TP_WAVELET_CH2;Saturated/pastel -!TP_WAVELET_CH3;Link contrast levels -!TP_WAVELET_CHCU;Curve -!TP_WAVELET_CHR;Chroma-contrast link strength -!TP_WAVELET_CHRO;Saturated/pastel threshold -!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. -!TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" -!TP_WAVELET_CHSL;Sliders -!TP_WAVELET_CHTYPE;Chrominance method -!TP_WAVELET_COLORT;Opacity Red-Green -!TP_WAVELET_COMPCONT;Contrast -!TP_WAVELET_COMPGAMMA;Compression gamma -!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. -!TP_WAVELET_COMPTM;Tone mapping -!TP_WAVELET_CONTEDIT;'After' contrast curve -!TP_WAVELET_CONTR;Gamut -!TP_WAVELET_CONTRA;Contrast -!TP_WAVELET_CONTRAST_MINUS;Contrast - -!TP_WAVELET_CONTRAST_PLUS;Contrast + -!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image. -!TP_WAVELET_CTYPE;Chrominance control -!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). -!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue) -!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero. -!TP_WAVELET_CURVEEDITOR_CL;L -!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment. -!TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. -!TP_WAVELET_DALL;All directions -!TP_WAVELET_DAUB;Edge performance -!TP_WAVELET_DAUB2;D2 - low -!TP_WAVELET_DAUB4;D4 - standard -!TP_WAVELET_DAUB6;D6 - standard plus -!TP_WAVELET_DAUB10;D10 - medium -!TP_WAVELET_DAUB14;D14 - high -!TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the firsts levels. However the quality is not strictly related to this coefficient and can vary with images and uses. -!TP_WAVELET_DONE;Vertical -!TP_WAVELET_DTHR;Diagonal -!TP_WAVELET_DTWO;Horizontal -!TP_WAVELET_EDCU;Curve -!TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima -!TP_WAVELET_EDGE;Edge Sharpness -!TP_WAVELET_EDGEAMPLI;Base amplification -!TP_WAVELET_EDGEDETECT;Gradient sensitivity -!TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) -!TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection) -!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky. -!TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. -!TP_WAVELET_EDGESENSI;Edge sensitivity -!TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. -!TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. -!TP_WAVELET_EDRAD;Radius -!TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. -!TP_WAVELET_EDSL;Threshold Sliders -!TP_WAVELET_EDTYPE;Local contrast method -!TP_WAVELET_EDVAL;Strength -!TP_WAVELET_FINAL;Final Touchup -!TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range -!TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights -!TP_WAVELET_HUESKIN;Skin hue -!TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -!TP_WAVELET_HUESKY;Sky hue -!TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -!TP_WAVELET_ITER;Delta balance levels -!TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. -!TP_WAVELET_LABEL;Wavelet Levels -!TP_WAVELET_LARGEST;Coarsest -!TP_WAVELET_LEVCH;Chroma -!TP_WAVELET_LEVDIR_ALL;All levels in all directions -!TP_WAVELET_LEVDIR_INF;Below or equal the level -!TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level -!TP_WAVELET_LEVELS;Wavelet levels -!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of detail levels the image is to be decomposed into. More levels require more RAM and require a longer processing time. -!TP_WAVELET_LEVF;Contrast -!TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 -!TP_WAVELET_LEVONE;Level 2 -!TP_WAVELET_LEVTHRE;Level 4 -!TP_WAVELET_LEVTWO;Level 3 -!TP_WAVELET_LEVZERO;Level 1 -!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength -!TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range -!TP_WAVELET_MEDGREINF;First level -!TP_WAVELET_MEDI;Reduce artifacts in blue sky -!TP_WAVELET_MEDILEV;Edge detection -!TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. -!TP_WAVELET_NEUTRAL;Neutral -!TP_WAVELET_NOIS;Denoise -!TP_WAVELET_NOISE;Denoise and Refine -!TP_WAVELET_NPHIGH;High -!TP_WAVELET_NPLOW;Low -!TP_WAVELET_NPNONE;None -!TP_WAVELET_NPTYPE;Neighboring pixels -!TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. -!TP_WAVELET_OPACITY;Opacity Blue-Yellow -!TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast -!TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. -!TP_WAVELET_PASTEL;Pastel chroma -!TP_WAVELET_PROC;Process -!TP_WAVELET_RE1;Reinforced -!TP_WAVELET_RE2;Unchanged -!TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma -!TP_WAVELET_RESCON;Shadows -!TP_WAVELET_RESCONH;Highlights -!TP_WAVELET_RESID;Residual Image -!TP_WAVELET_SAT;Saturated chroma -!TP_WAVELET_SETTINGS;Wavelet Settings -!TP_WAVELET_SKIN;Skin targetting/protection -!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 -!TP_WAVELET_THRESHOLD2;Shadow levels -!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). -!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. -!TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles -!TP_WAVELET_TILESFULL;Full image -!TP_WAVELET_TILESIZE;Tiling method -!TP_WAVELET_TILESLIT;Little tiles -!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. -!TP_WAVELET_TMSTRENGTH;Compression strength -!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. -!TP_WAVELET_TMTYPE;Compression method -!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 +!CURVEEDITOR_CATMULLROM;Flexible +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!TP_RAW_IMAGENUM_SN;SN mode +!TP_SHARPENING_BLUR;Blur radius diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara index 0fd7866a6..7c934c7cb 100644 --- a/rtdata/languages/Euskara +++ b/rtdata/languages/Euskara @@ -1,6 +1,5 @@ #01 2008-03-03 Ioritz Ibarguren -ADJUSTER_RESET_TO_DEFAULT;Hasierako balioetara itzuli CURVEEDITOR_LINEAR;Lineala CURVEEDITOR_LOADDLGLABEL;Kurba ireki... CURVEEDITOR_SAVEDLGLABEL;Kurba gorde... @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;hurrengo abioan aplikatua -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Save Processing Parameters to the Cache PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File PREFERENCES_PSPATH;Adobe Photoshop installation directory PREFERENCES_SELECTLANG;Hizkuntza hautatu -PREFERENCES_SELECTTHEME;Select theme PREFERENCES_SHOWBASICEXIF;Oinarrizko EXIF datuak bistaratu PREFERENCES_SHOWDATETIME;Data eta ordua bistratu PREFERENCES_SHTHRESHOLD;Moztutako itzalen muga @@ -335,7 +330,6 @@ TP_CROP_GTRULETHIRDS;Herenen erregela TP_CROP_GUIDETYPE;Gida mota: TP_CROP_H;H TP_CROP_LABEL;Moztu -TP_CROP_SELECTCROP; Mozketa hautatu TP_CROP_W;W TP_CROP_X;x TP_CROP_Y;y @@ -421,6 +415,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -430,9 +425,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -449,6 +445,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -459,6 +459,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -499,8 +500,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -557,7 +558,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -569,16 +570,19 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -623,12 +627,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -732,9 +735,9 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -770,7 +773,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -785,8 +788,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -889,7 +892,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -969,19 +972,103 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1007,16 +1094,13 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1032,27 +1116,30 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1071,8 +1158,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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 @@ -1081,6 +1170,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1099,19 +1189,22 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1123,18 +1216,18 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1142,16 +1235,17 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1167,7 +1261,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1176,14 +1269,11 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1215,12 +1305,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1228,22 +1313,21 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1257,43 +1341,31 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1313,12 +1385,15 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1328,8 +1403,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1337,13 +1412,12 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1370,9 +1444,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1403,11 +1476,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1418,8 +1487,9 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1437,8 +1507,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1450,14 +1518,13 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1477,11 +1544,9 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1493,6 +1558,27 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1525,11 +1611,17 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1609,13 +1701,15 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1641,10 +1735,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1691,6 +1781,12 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1733,10 +1829,16 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1767,10 +1869,19 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1783,19 +1894,26 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1803,7 +1921,8 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1811,58 +1930,42 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1871,10 +1974,10 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1886,7 +1989,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1912,7 +2015,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1964,13 +2067,19 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2060,7 +2169,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2071,7 +2180,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2183,6 +2292,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2197,7 +2307,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura !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 --git a/rtdata/languages/Francais b/rtdata/languages/Francais index a3bf8759a..6691d98db 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -5,7 +5,7 @@ ABOUT_TAB_CREDITS;Crédits ABOUT_TAB_LICENSE;Licence ABOUT_TAB_RELEASENOTES;Notes de version ABOUT_TAB_SPLASH;Splash -ADJUSTER_RESET_TO_DEFAULT;Réglages par défaut +ADJUSTER_RESET_TO_DEFAULT;Clic - réinitialise à la valeur par défaut.\nCtrl+clic - réinitialise à la valeur initiale. 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 @@ -15,6 +15,7 @@ CURVEEDITOR_AXIS_IN;E: CURVEEDITOR_AXIS_LEFT_TAN;TG: CURVEEDITOR_AXIS_OUT;S: CURVEEDITOR_AXIS_RIGHT_TAN;TD: +CURVEEDITOR_CATMULLROM;Flexible CURVEEDITOR_CURVE;Courbe CURVEEDITOR_CURVES;Courbes CURVEEDITOR_CUSTOM;Personnalisé @@ -41,6 +42,10 @@ DYNPROFILEEDITOR_DELETE;Supprimer DYNPROFILEEDITOR_EDIT;Modifier DYNPROFILEEDITOR_EDIT_RULE;Modifier une règle de Profil Dynamique DYNPROFILEEDITOR_ENTRY_TOOLTIP;La correspondance est insensible à la casse.\nUtilisez le préfix "re:" pour entrer\nune expression régulière. +DYNPROFILEEDITOR_IMGTYPE_ANY;Tout +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard DYNPROFILEEDITOR_MOVE_DOWN;Déplacer vers le bas DYNPROFILEEDITOR_MOVE_UP;Déplacer vers le haut DYNPROFILEEDITOR_NEW;Nouveau @@ -54,6 +59,7 @@ EXIFFILTER_CAMERA;Appareil photo EXIFFILTER_EXPOSURECOMPENSATION;Compensation d'exposition (EV) EXIFFILTER_FILETYPE;Type de fichier EXIFFILTER_FOCALLEN;Longueur focale +EXIFFILTER_IMAGETYPE;Type d'image EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Objectif EXIFFILTER_METADATAFILTER;Activer les filtres sur les Métadonnées @@ -112,8 +118,8 @@ FILEBROWSER_AUTOFLATFIELD;Champ Uniforme auto FILEBROWSER_BROWSEPATHBUTTONHINT;Cliquez pour parcourir le chemin saisi FILEBROWSER_BROWSEPATHHINT;Saisissez le chemin à parcourir\nCtrl-O pour placer le focus sur le champ de saisie.\nEntrée / Ctrl-Entrée pour y naviguer;\nEsc pour effacer les modifications.\nShift-Esc pour enlever le focus.\n\n\nRaccourcis pour les chemins:\n ~ - le dossier utilisateur\n ! - le dossier Images de l'utilisateur FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Supprimer du cache (complet) -FILEBROWSER_CACHECLEARFROMPARTIAL;Supprimer du cache (partiel) +FILEBROWSER_CACHECLEARFROMFULL;Vider tout y compris les profils mis en cache +FILEBROWSER_CACHECLEARFROMPARTIAL;Vider tout sauf les profils mis en cache FILEBROWSER_CLEARPROFILE;Remettre le profil à zéro FILEBROWSER_COLORLABEL_TOOLTIP;Label couleur\n\nUtilisez le menu déroulant ou le raccourci clavier:\nShift-Ctrl-0 Pas de couleur\nShift-Ctrl-1 Rouge\nShift-Ctrl-2 Jaune\nShift-Ctrl-3 Vert\nShift-Ctrl-4 Bleu\nShift-Ctrl-5 Pourpre FILEBROWSER_COPYPROFILE;Copier le profil @@ -202,7 +208,7 @@ 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-- FILECHOOSER_FILTER_ANY;Tous les fichiers -FILECHOOSER_FILTER_COLPROF;Profils couleur +FILECHOOSER_FILTER_COLPROF;Profils couleur (*.icc) FILECHOOSER_FILTER_CURVE;Fichiers de courbe FILECHOOSER_FILTER_LCP;Profils de correction d'objectif FILECHOOSER_FILTER_PP;Fichiers de traitement @@ -216,6 +222,7 @@ GENERAL_AUTO;Automatique GENERAL_BEFORE;Avant GENERAL_CANCEL;Annuler GENERAL_CLOSE;Fermer +GENERAL_CURRENT;Actuel GENERAL_DISABLE;Désactiver GENERAL_DISABLED;Désactivé GENERAL_ENABLE;Activer @@ -228,7 +235,9 @@ GENERAL_NONE;Aucun GENERAL_OK;OK GENERAL_OPEN;Ouvrir GENERAL_PORTRAIT;Portrait +GENERAL_RESET;Réinitialiser GENERAL_SAVE;Enregistrer +GENERAL_SAVE_AS;Enregistrer sous... GENERAL_SLIDER;Curseur GENERAL_UNCHANGED;(Inchangé) GENERAL_WARNING;Attention @@ -239,6 +248,7 @@ HISTOGRAM_TOOLTIP_CHRO;Montrer/Cacher l'histogramme de Chromaticité HISTOGRAM_TOOLTIP_FULL;Basculer la vue de l'histogramme : complet (activé) / zoomé (désactivé) HISTOGRAM_TOOLTIP_G;Montrer/cacher l'histogramme VERT HISTOGRAM_TOOLTIP_L;Montrer/cacher l'histogramme Luminance CIELAB +HISTOGRAM_TOOLTIP_MODE;Bascule entre une échelle linéaire, linéaire-log et log-log de l'histogramme. HISTOGRAM_TOOLTIP_R;Montrer/cacher l'histogramme ROUGE HISTOGRAM_TOOLTIP_RAW;Montrer/Cacher l'histogramme des données RAW HISTORY_CHANGED;Changé @@ -369,7 +379,6 @@ HISTORY_MSG_121;A.C. Raw - Auto HISTORY_MSG_122;Sélection auto de trame noire HISTORY_MSG_123;Fichier de trame noire HISTORY_MSG_124;Correct. du point blanc -HISTORY_MSG_125;Préservation des HL HISTORY_MSG_126;Champ Uniforme - Fichier HISTORY_MSG_127;Champ Uniforme - Sélection auto HISTORY_MSG_128;Champ Uniforme - Rayon @@ -478,9 +487,9 @@ HISTORY_MSG_231;N&B - Courbe 'Avant' HISTORY_MSG_232;N&B - Type de courbe 'Avant' HISTORY_MSG_233;N&B - Courbe 'Après' HISTORY_MSG_234;N&B - Type de courbe 'Après' -HISTORY_MSG_235;N&B - Mixeur - Mode auto +HISTORY_MSG_235;N&B - Mixeur de Canaux - Auto HISTORY_MSG_236;Retrait de taches - Modif. de points -HISTORY_MSG_237;N&B - Mixeur +HISTORY_MSG_237;N&B - Mixeur de Canaux HISTORY_MSG_238;FD - Étendu HISTORY_MSG_239;FD - Force HISTORY_MSG_240;FD - Centre @@ -501,33 +510,33 @@ HISTORY_MSG_254;CpND - Teinte chair HISTORY_MSG_255;Réd. de bruit - Filtre médian 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é -HISTORY_MSG_260;Virage Partiel - Opacité 'a[b]' -HISTORY_MSG_261;Virage Partiel - Méthode -HISTORY_MSG_262;Virage Partiel - Opacité 'b' -HISTORY_MSG_263;Virage Partiel - Ombres - Rouge -HISTORY_MSG_264;Virage Partiel - Ombres - Vert -HISTORY_MSG_265;Virage Partiel - Ombres - Bleu -HISTORY_MSG_266;Virage Partiel - Moyen - Rouge -HISTORY_MSG_267;Virage Partiel - Moyen - Vert -HISTORY_MSG_268;Virage Partiel - Moyen - Bleu -HISTORY_MSG_269;Virage Partiel - HL - Rouge -HISTORY_MSG_270;Virage Partiel - HL - Vert -HISTORY_MSG_271;Virage Partiel - HL - Bleu -HISTORY_MSG_272;Virage Partiel - Balance -HISTORY_MSG_273;Virage Partiel - Réinit. -HISTORY_MSG_274;Virage Partiel - Saturation des ombres -HISTORY_MSG_275;Virage Partiel - Saturation des HL -HISTORY_MSG_276;Virage Partiel - Opacité +HISTORY_MSG_258;VP - Couleur +HISTORY_MSG_259;VP - Opacité +HISTORY_MSG_260;VP - Opacité 'a[b]' +HISTORY_MSG_261;VP - Méthode +HISTORY_MSG_262;VP - Opacité 'b' +HISTORY_MSG_263;VP - Ombres - Rouge +HISTORY_MSG_264;VP - Ombres - Vert +HISTORY_MSG_265;VP - Ombres - Bleu +HISTORY_MSG_266;VP - Moyen - Rouge +HISTORY_MSG_267;VP - Moyen - Vert +HISTORY_MSG_268;VP - Moyen - Bleu +HISTORY_MSG_269;VP - HL - Rouge +HISTORY_MSG_270;VP - HL - Vert +HISTORY_MSG_271;VP - HL - Bleu +HISTORY_MSG_272;VP - Balance +HISTORY_MSG_273;VP - Balance Couleur O/TM/HL +HISTORY_MSG_274;VP - Saturation des ombres +HISTORY_MSG_275;VP - Saturation des HL +HISTORY_MSG_276;VP - Opacité HISTORY_MSG_277;--inutilisé-- -HISTORY_MSG_278;Virage Partiel - Préserver luminance -HISTORY_MSG_279;Virage partiel - Ombres -HISTORY_MSG_280;Virage partiel - Hautes lumières -HISTORY_MSG_281;Virage partiel - Protect. Saturé -HISTORY_MSG_282;Virage partiel - Seuil de protection -HISTORY_MSG_283;Virage partiel - Force -HISTORY_MSG_284;Virage partiel - Protect. saturé auto +HISTORY_MSG_278;VP - Préserver luminance +HISTORY_MSG_279;VP - Ombres +HISTORY_MSG_280;VP - Hautes lumières +HISTORY_MSG_281;VP - Protect. Saturé +HISTORY_MSG_282;VP - Seuil de protection +HISTORY_MSG_283;VP - Force +HISTORY_MSG_284;VP - Protect. saturé auto HISTORY_MSG_285;Réd. de bruit - Médiane - Méthode HISTORY_MSG_286;Réd. de bruit - Médiane - Type HISTORY_MSG_287;Réd. de bruit - Médiane - Itérations @@ -635,7 +644,7 @@ HISTORY_MSG_388;O - Résiduel - BC vert moyen HISTORY_MSG_389;O - Résiduel - BC bleu moyen HISTORY_MSG_390;O - Résiduel - BC vert bas HISTORY_MSG_391;O - Résiduel - BC bleu bas -HISTORY_MSG_392;O - Résiduel - BC Réinitialiser +HISTORY_MSG_392;O - Résiduel - Balance Couleur HISTORY_MSG_393;DCP - Table de corresp. (LUT) HISTORY_MSG_394;DCP - Exposition de base HISTORY_MSG_395;DCP - Table de base @@ -715,24 +724,106 @@ 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_488;Compression de Plage Dymanique +HISTORY_MSG_489;CPD - Détail +HISTORY_MSG_490;CPD - 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_CLAMPOOG;Tronquer les couleurs hors gamut +HISTORY_MSG_COLORTONING_LABGRID_VALUE;VP - Correction couleur +HISTORY_MSG_COLORTONING_LABREGION_AB;VP - Correction couleur +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;VP - Canal +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;VP - Masque C +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;VP - Masque T +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;VP - Luminosité +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;VP - Masque L +HISTORY_MSG_COLORTONING_LABREGION_LIST;VP - Liste +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;VP - Masque flou local +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;VP - Offset local +HISTORY_MSG_COLORTONING_LABREGION_POWER;VP - Puissance locale +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;VP - Saturation +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;VP - Montrer le masque +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;VP - Pente locale +HISTORY_MSG_DEHAZE_DEPTH;EB - Profondeur +HISTORY_MSG_DEHAZE_ENABLED;Élimination de la Brume +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;EB - Montrer carte de profondeur +HISTORY_MSG_DEHAZE_STRENGTH;EB - Force +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Double dématriçage - Seuil auto +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Double dématriçage - Seuil de contraste HISTORY_MSG_HISTMATCHING;Calcul Courbe Tonale svt Aperçu +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Sortie - Primaires +HISTORY_MSG_ICM_OUTPUT_TEMP;Sortie - ICC-v4 illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;Sortie - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Travail - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Travail - Pente +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Travail - Méthode TRC 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_MICROCONTRAST_CONTRAST;Microcontraste - Seuil de contraste +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Méthode de dématriçage pour les mouvements +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Direction du filtre de bruit de ligne +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF +HISTORY_MSG_PRSHARPEN_CONTRAST;NPR - Seuil de contraste +HISTORY_MSG_RAWCACORR_AUTOIT;A.C. Raw - Itérations +HISTORY_MSG_RAWCACORR_COLORSHIFT;A.C. Raw - Éviter les dérives de teinte +HISTORY_MSG_RAW_BORDER;Bord Raw +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Redim. - Autoriser l'agrandissement +HISTORY_MSG_SHARPENING_CONTRAST;Netteté - Seuil de contraste +HISTORY_MSG_SH_COLORSPACE;O/HL - Espace couleur +HISTORY_MSG_SOFTLIGHT_ENABLED;Lumière douce +HISTORY_MSG_SOFTLIGHT_STRENGTH;Lumière douce - Force +HISTORY_MSG_TM_FATTAL_ANCHOR;CPD - Ancre HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: Alt-s HISTORY_SNAPSHOT;Capture HISTORY_SNAPSHOTS;Captures +ICCPROFCREATOR_ADD_PARAM_IN_DESC;Ajoute le paramètre Gamma et Pente (Slope) à la fin de la description +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Réinitialise au copyright par défaut, attribué à "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Personnalisé +ICCPROFCREATOR_DESCRIPTION;Description: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Ajouter les valeurs gamma et pente à la description +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Laisser vide pour que mettre la description par défaut +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;Version du profil généré: +ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Valeur par défaut +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Vous ne pouvez régler l'Illuminant que pour les profils ICC v4 +ICCPROFCREATOR_PRIMARIES;Primaires: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Bleu X +ICCPROFCREATOR_PRIM_BLUY;Bleu Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Vert X +ICCPROFCREATOR_PRIM_GREY;Vert Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Rouge X +ICCPROFCREATOR_PRIM_REDY;Rouge Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;Vous ne pouvez régler des Primaires personnalisées que pour les profils ICC v4 +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Enregistrer le profil ICC sous... +ICCPROFCREATOR_SLOPE;Pente +ICCPROFCREATOR_TRC_PRESET;Courbe de réponse tonale: IPTCPANEL_CATEGORY;Catégorie IPTCPANEL_CATEGORYHINT;Identifie le sujet de l'image selon l'opinion du fournisseur. IPTCPANEL_CITY;Ville @@ -775,11 +866,9 @@ IPTCPANEL_TITLE;Titre 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_ICCPROFCREATOR;Créateur de Profil ICC 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 MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronise le Navigateur de fichiers avec l'Éditeur pour révéler la vignette de l'image actuellement ouverte, et efface les filtres dans le Navigateur de fichiers\nRaccourci: x\n\nComme ci-dessus, mais sans effacer les filtres dans le Navigateur de fichiers\nRaccourci: y\n(Notez que la vignette ne sera pas visible si elle a été filtrée). @@ -849,6 +938,7 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;Affichage du Masque du focus\nRaccourci: canal Vert\nRaccourci: g MAIN_TOOLTIP_PREVIEWL;Affichage de la Luminosité\nRaccourci: v\n\n0.299*R + 0.587*V + 0.114*B MAIN_TOOLTIP_PREVIEWR;Affichage du canal Rouge\nRaccourci: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Prévisualiser le masque de contraste de netteté.\nRaccourci: p\n\nNe fonctionne que si l'outil Netteté est activé et pour un zomm >= 100%. MAIN_TOOLTIP_QINFO;Informations rapide sur l'image\nRaccourci: i MAIN_TOOLTIP_SHOWHIDELP1;Montrer/Cacher le panneau gauche\nRaccourci: l MAIN_TOOLTIP_SHOWHIDERP1;Afficher/Cacher le panneau droit\nRaccourci: Alt-l @@ -868,8 +958,9 @@ NAVIGATOR_S;S: 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 profil 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 @@ -885,6 +976,7 @@ PARTIALPASTE_CROP;Recadrage PARTIALPASTE_DARKFRAMEAUTOSELECT;Sélection auto de la Trame Noire PARTIALPASTE_DARKFRAMEFILE;Fichier de Trame Noire PARTIALPASTE_DEFRINGE;Aberration chromatique +PARTIALPASTE_DEHAZE;Élimination de la Brume PARTIALPASTE_DETAILGROUP;Détail PARTIALPASTE_DIALOGLABEL;Collage partiel de profil de traitement PARTIALPASTE_DIRPYRDENOISE;Réduction du bruit @@ -918,13 +1010,15 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtrage des pixels morts PARTIALPASTE_PREPROCESS_GREENEQUIL;Équilibrage du vert PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtrage des pixels chauds PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF PARTIALPASTE_PRSHARPENING;Netteté post-redim. PARTIALPASTE_RAWCACORR_AUTO;Corr. auto. de l'aberr. chromatique -PARTIALPASTE_RAWCACORR_CAREDBLUE;Aberr. chromatique rouge et bleu +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;A.C. Raw - Éviter les dérives couleurs +PARTIALPASTE_RAWCACORR_CAREDBLUE;A.C. Raw - Rouge et bleu PARTIALPASTE_RAWEXPOS_BLACK;Niveaux de noir PARTIALPASTE_RAWEXPOS_LINEAR;Correction du point blanc -PARTIALPASTE_RAWEXPOS_PRESER;Préservation des hautes humières PARTIALPASTE_RAWGROUP;Réglages RAW +PARTIALPASTE_RAW_BORDER;Bord Raw PARTIALPASTE_RAW_DCBENHANCE;Amélioration de DCB PARTIALPASTE_RAW_DCBITERATIONS;Nombre d'itération de DCB PARTIALPASTE_RAW_DMETHOD;Algorithme de dématriçage @@ -940,21 +1034,22 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Ombres/Hautes lumières PARTIALPASTE_SHARPENEDGE;Bords PARTIALPASTE_SHARPENING;Netteté PARTIALPASTE_SHARPENMICRO;Microcontraste -PARTIALPASTE_TM_FATTAL;Compression tonale HDR +PARTIALPASTE_SOFTLIGHT;Lumière douce +PARTIALPASTE_TM_FATTAL;Compression de plage dynamique PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Correction du vignettage PARTIALPASTE_WAVELETGROUP;Niveaux d'ondelette PARTIALPASTE_WHITEBALANCE;Balance des blancs PREFERENCES_ADD;Ajoute +PREFERENCES_APPEARANCE;Apparence +PREFERENCES_APPEARANCE_COLORPICKERFONT;Police des ancres de vérification couleur +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Couleur du masque de recadrage +PREFERENCES_APPEARANCE_MAINFONT;Police principale +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Couleur du cadre dans le Navigateur +PREFERENCES_APPEARANCE_THEME;Thème PREFERENCES_APPLNEXTSTARTUP;appliqué au prochain lancement -PREFERENCES_AUTLISLOW;Bas -PREFERENCES_AUTLISMAX;Max - Moyenne de toutes les tuiles -PREFERENCES_AUTLISSTD;Haut -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_AUTOSAVE_TP_OPEN;Sauvegarder l'état ouvert/fermé des outils en quittant PREFERENCES_BATCH_PROCESSING;Traitement par lot PREFERENCES_BEHADDALL;Tout à 'Ajoute' PREFERENCES_BEHADDALLHINT;Règle tous les paramètres sur le mode Ajoute.\nLa modification des paramètres dans le panneau d'édition en par lot sera des deltas par-rapport aux valeurs existantes @@ -962,16 +1057,14 @@ PREFERENCES_BEHAVIOR;Comportement PREFERENCES_BEHSETALL;Tout à 'Remplace' PREFERENCES_BEHSETALLHINT;Règle tous les paramètres sur le mode Remplace.\nLa modification des paramètres dans le panneau d'édition en par lot sera absolue, les valeurs réelles seront affichées PREFERENCES_BLACKBODY;Tungstène -PREFERENCES_CACHECLEARALL;Tout nettoyer -PREFERENCES_CACHECLEARPROFILES;Nettoyer les profils -PREFERENCES_CACHECLEARTHUMBS;Nettoyer les vignettes +PREFERENCES_CACHECLEAR;Vider +PREFERENCES_CACHECLEAR_ALL;Vider tous les fichiers mis en cache : +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Vider tous les fichiers mis en cache excepté les profils de traitement : +PREFERENCES_CACHECLEAR_ONLYPROFILES;Vider seulement les profils de traitement mis en cache : +PREFERENCES_CACHECLEAR_SAFETY;Seuls les fichiers mis en cache sont effacés. Les profils de traitement enregitrés à côté des images sources ne sont pas touchés. PREFERENCES_CACHEMAXENTRIES;Nombre maximal d'éléments dans le Cache PREFERENCES_CACHEOPTS;Options du Cache PREFERENCES_CACHETHUMBHEIGHT;Hauteur maximale des vignettes -PREFERENCES_CIEART;CIECAM02 optimisation -PREFERENCES_CIEART_FRAME;Réglages spécifiques à CIECAM02 -PREFERENCES_CIEART_LABEL;Utilise la précision float au lieu de double pour CIECAM02 -PREFERENCES_CIEART_TOOLTIP;Si activé, les calculs CIECAM sont réalisés en précision float au lieu de précision double. Cela amène un léger accroissement de vitesse, et une légère réduction de qualité PREFERENCES_CLIPPINGIND;Indication du dépassement de plage dynamique PREFERENCES_CLUTSCACHE;Cache HaldCLUT PREFERENCES_CLUTSCACHE_LABEL;Nombre maximum de chache CLUT @@ -994,7 +1087,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Format des clés PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nom PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Chemin de l'exécutable -PREFERENCES_CUTOVERLAYBRUSH;Masque de recadrage PREFERENCES_D50;5000K PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K @@ -1005,8 +1097,6 @@ PREFERENCES_DARKFRAMESHOTS;image(s) PREFERENCES_DARKFRAMETEMPLATES;modèle(s) PREFERENCES_DATEFORMAT;Format PREFERENCES_DATEFORMATHINT;Vous pouvez utiliser les paramètres de chaînes formatées suivants:\n%y : année\n%m : mois\n%d : jour\n\nPar exemple, le format de date française est:\n%d/%m/%y -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 @@ -1016,10 +1106,9 @@ PREFERENCES_DIRSELECTDLG;Choix du dossier Image au lancement... PREFERENCES_DIRSOFTWARE;Dossier d'installation 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_FILEBROWSERTOOLBARSINGLEROW;Barre d'outil compact dans le Navigateur de Fichiers PREFERENCES_FILEFORMAT;Format du fichier PREFERENCES_FLATFIELDFOUND;Trouvé PREFERENCES_FLATFIELDSDIR;Dossier des images de Champ Uniforme @@ -1046,8 +1135,8 @@ PREFERENCES_GREYSC;Luminance Yb de la scène (%) PREFERENCES_GREYSC18;Yb=18 CIE L#50 PREFERENCES_GREYSCA;Automatique PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogramme dans le panneau de gauche -PREFERENCES_HISTOGRAMWORKING;Utiliser le profil de travail pour l'histograme principal et le Navigateur -PREFERENCES_HISTOGRAM_TOOLTIP;Si activé, le profil couleur de travail est utilisé pour les données d'histograme et le panneau Navigateur, sinon le profil de travail de sortie "gamma-corrigé" est utilisé. +PREFERENCES_HISTOGRAMWORKING;Utiliser le profil de travail pour l'histogramme principal et le Navigateur +PREFERENCES_HISTOGRAM_TOOLTIP;Si activé, le profil couleur de travail est utilisé pour les données d'histogramme et le panneau Navigateur, sinon le profil de travail de sortie "gamma-corrigé" est utilisé. PREFERENCES_HLTHRESHOLD;Seuil pour le dépassement de domaine supérieur PREFERENCES_ICCDIR;Dossier des profils ICC PREFERENCES_IMG_RELOAD_NEEDED;Ces changements nécessitent un rechargement de l'image (ou l'ouverture d'une autre image) pour prendre effet. @@ -1062,12 +1151,7 @@ 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 -PREFERENCES_LISS;Adoucissement auto multi-zone -PREFERENCES_MAX;Maxi (Tuile) PREFERENCES_MAXRECENTFOLDERS;Nombre maximum de dossiers récents -PREFERENCES_MED;Moyen (Tuile/2) PREFERENCES_MENUGROUPEXTPROGS;Groupe "Ouvrir avec" PREFERENCES_MENUGROUPFILEOPERATIONS;Opérations sur les fichiers PREFERENCES_MENUGROUPLABEL;Label @@ -1075,16 +1159,13 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Opérations sur les profils PREFERENCES_MENUGROUPRANK;Classement PREFERENCES_MENUOPTIONS;Options du menu PREFERENCES_METADATA;Metadonnées -PREFERENCES_MIN;Mini (100x115) PREFERENCES_MONINTENT;Intention de rendu par défaut PREFERENCES_MONITOR;Moniteur PREFERENCES_MONPROFILE;Profil couleur par défaut PREFERENCES_MONPROFILE_WARNOSX;Due à des limitations de macOS, seul sRGB est supporté. PREFERENCES_MULTITAB;Éditeurs multiple PREFERENCES_MULTITABDUALMON;Éditeurs multiple, si possible sur un second moniteur -PREFERENCES_NAVGUIDEBRUSH;Couleur du cadre dans le Navigateur PREFERENCES_NAVIGATIONFRAME;Navigation -PREFERENCES_NOISE;Réduction de Bruit PREFERENCES_OUTDIR;Dossier de sortie PREFERENCES_OUTDIRFOLDER;Dossier de sauvegarde PREFERENCES_OUTDIRFOLDERHINT;Place les images traitées dans le dossier selectionné @@ -1100,6 +1181,8 @@ PREFERENCES_PARSEDEXTADDHINT;Tapez une extension et cliquez ce bouton pour l'ajo PREFERENCES_PARSEDEXTDELHINT;Supprime de la liste les extensions sélectionnées PREFERENCES_PARSEDEXTDOWNHINT;Déplacer l'extension sélectionnée plus bas dans la liste. PREFERENCES_PARSEDEXTUPHINT;Déplacer l'extension sélectionnée plus haut dans la liste. +PREFERENCES_PERFORMANCE_THREADS;Unités d'exécution (Threads) +PREFERENCES_PERFORMANCE_THREADS_LABEL;Nombre maximum d'unité d'exécution pour la Réduction de Bruit et les Niveaux d'Ondelettes (0 = Automatique) PREFERENCES_PREVDEMO;Méthode de Dématriçage de l'Aperçu PREFERENCES_PREVDEMO_FAST;Rapide PREFERENCES_PREVDEMO_LABEL;Méthode de dématriçage utilisé pour l'aperçu à un zoom <100%: @@ -1120,13 +1203,8 @@ PREFERENCES_PRTPROFILE;Profil couleur PREFERENCES_PSPATH;Dossier d'installation d'Adobe Photoshop PREFERENCES_REMEMBERZOOMPAN;Se souvenir de niveau de zoom et de la position de l'image 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 -PREFERENCES_SELECTTHEME;Choisissez un thème PREFERENCES_SERIALIZE_TIFF_READ;Réglage de lecture des images TIFF PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Sérialiser la lecture des fichiers TIFF PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Lorsque d'un travail avec des dossiers plein de fichier TIFF non compressé, activer cette option peut augmenter les performance de la génération des vignettes. @@ -1136,16 +1214,13 @@ PREFERENCES_SHOWDATETIME;Voir la date et l'heure PREFERENCES_SHOWEXPOSURECOMPENSATION;Ajoute la compensation d'exposition PREFERENCES_SHOWFILMSTRIPTOOLBAR;Montrer la barre d'outil de la pellicule d'image ("filmstrip") PREFERENCES_SHTHRESHOLD;Seuil pour le dépassement de domaine inférieur -PREFERENCES_SIMPLAUT;Mode de l'outil PREFERENCES_SINGLETAB;Éditeur unique PREFERENCES_SINGLETABVERTAB;Éditeur unique, onglets verticaux -PREFERENCES_SMA;Petit (250x287) PREFERENCES_SND_BATCHQUEUEDONE;File de traitement terminée PREFERENCES_SND_HELP;Saisissez un chemin de fichier ou rien du tout (pour ne pas avoir de son). Pour Windows,\nsaisissez "SystemDefault", "SystemAsterisk" etc. pour utiliser les sons systèmes. PREFERENCES_SND_LNGEDITPROCDONE;Traitement de la zone de prévisualisation terminé -PREFERENCES_SND_TRESHOLDSECS;après (s) +PREFERENCES_SND_THRESHOLDSECS;après (s) PREFERENCES_STARTUPIMDIR;Répertoire Image au démarrage -PREFERENCES_STDAUT;Standard PREFERENCES_TAB_BROWSER;Navigateur de fichiers PREFERENCES_TAB_COLORMGR;Gestion des couleurs PREFERENCES_TAB_DYNAMICPROFILE;Règles de Profil Dynamique @@ -1153,20 +1228,15 @@ PREFERENCES_TAB_GENERAL;Général 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 +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Prévisualisation JPEG incluse +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image à montrer +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Rendu Neutre des données Raw +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;JPEG inclus si pleine taille, rendu Neutre des données Raw sinon PREFERENCES_TP_LABEL;Panneau des outils: -PREFERENCES_TP_USEICONORTEXT;Utiliser des icônes au lieu de textes PREFERENCES_TP_VSCROLLBAR;Cacher la barre de défilement verticale PREFERENCES_TUNNELMETADATA;Copier les données Exif/IPTC/XMP tel quel dans le fichier de sortie PREFERENCES_USEBUNDLEDPROFILES;Utiliser les profils fournis PREFERENCES_VIEW;Point blanc du périphérique sortie (moniteur, TV, projecteur,...) -PREFERENCES_WAVLEV;Augmenter le nombre de niveau d'ondelette en qualité "haute" -PREFERENCES_WLONE;Un niveau -PREFERENCES_WLTWO;Deux niveaux -PREFERENCES_WLZER;Non PREFERENCES_WORKFLOW;Habitudes de travail PROFILEPANEL_COPYPPASTE;Paramètres à copier PROFILEPANEL_GLOBALPROFILES;Profils fournis @@ -1211,9 +1281,12 @@ 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 +SAMPLEFORMAT_16;16 bits à virgule flottante +SAMPLEFORMAT_32;24 bits à virgule flottante +SAMPLEFORMAT_64;32 bits à virgule flottante SAVEDLG_AUTOSUFFIX;Ajouter automatiquement un suffixe si le fichier existe déjà SAVEDLG_FILEFORMAT;Format de fichier +SAVEDLG_FILEFORMAT_FLOAT; virgule flottante SAVEDLG_FORCEFORMATOPTS;Forcer les options d'enregistrement SAVEDLG_JPEGQUAL;Qualité JPEG SAVEDLG_PNGCOMPR;Compression PNG @@ -1230,8 +1303,8 @@ SAVEDLG_SUBSAMP_TOOLTIP;Meilleurs compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma div 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 Imprimante -SOFTPROOF_TOOLTIP;Épreuvage écran\nSi activé, vous permet de simuler le rendu obtenu par votre imprimante en utilisant le profil Imprimante réglé dans Préférences > Gestion des couleurs. +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 @@ -1239,7 +1312,7 @@ THRESHOLDSELECTOR_HINT;Maintenez la touche Shift appuyée pour déplacer THRESHOLDSELECTOR_T;Haut THRESHOLDSELECTOR_TL;Haut-Gauche THRESHOLDSELECTOR_TR;Haut-droite -TOOLBAR_TOOLTIP_COLORPICKER;Ancre de Vérification Couleur\n\nLorque activé:\nCliquez la zone d'image avec le bouton gauche de la souris pour ajouter une ancre\nDéplacez-le en le "tirant" avec le bouton gauche de la souris\nSupprimez une ancre en cliquant dessus avec le bouton droit de la souris\nSupprimez toutes les ancres avec Shift + click avec le bouton droit\nCliquez avec le bouton droit de la souris en dehors de toute ancre pour revenir au mode Déplacement +TOOLBAR_TOOLTIP_COLORPICKER;Ancre de Vérification Couleur\n\nLorque activé:\n- Ajouter une ancre: clic-gauche.\n- Déplacer une ancre: clic-gauche et tirer.\n- Supprimez une ancre: clic-droit.\n- Supprimez toutes les ancres: ctrl+shift+clic-droit.\n- Revenir au mode Déplacement: clic-droit en dehors de toute ancre. TOOLBAR_TOOLTIP_CROP;Sélection du recadrage\nRaccourci: c\nDéplacez le recadrage en utilisant Shift + Glisser TOOLBAR_TOOLTIP_HAND;Outil de navigation\nRaccourci: h TOOLBAR_TOOLTIP_STRAIGHTEN;Sélection de la ligne d'horizon\nRaccourci: s\n\nIndiquez la verticale ou l'horizontale en dessinant une ligne à travers l'image de prévisualisation. L'angle de rotation sera affiché près de la ligne guide. Le centre de rotation est le centre géométrique de l'image. @@ -1249,7 +1322,6 @@ TP_BWMIX_ALGO_LI;Linéaire TP_BWMIX_ALGO_SP;Effets spéciaux TP_BWMIX_ALGO_TOOLTIP;Linéaire: produira une réponse normale linéaire.\nEffets spéciaux: produira des effets spéciaux en mixant les canaux de manière non linéaire. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Calcul les valeurs optimales du mixeur de canaux TP_BWMIX_CC_ENABLED;Ajuster les couleurs complémentaires TP_BWMIX_CC_TOOLTIP;Activer pour permettre l'ajustage automatique des couleur complémentaire dans le mode ROJVCBPM TP_BWMIX_CHANNEL;Égaliseur de Luminance @@ -1276,9 +1348,8 @@ TP_BWMIX_MET;Méthode TP_BWMIX_MET_CHANMIX;Mixeur de Canaux TP_BWMIX_MET_DESAT;Désaturation TP_BWMIX_MET_LUMEQUAL;Égaliseur de Luminance -TP_BWMIX_MIXC;Mixeur -TP_BWMIX_NEUTRAL;Réinit. Mixeur -TP_BWMIX_NEUTRAL_TIP;Réinitialise tous les paramètres (filtre, mixeur de canaux) à zéro +TP_BWMIX_MIXC;Mixeur de cannaux +TP_BWMIX_NEUTRAL;Réinitialiser TP_BWMIX_RGBLABEL;R: %1%% V: %2%% B: %3%% Total: %4%% TP_BWMIX_RGBLABEL_HINT;Coefficients RVB finaux qui tiennent compte de toutes les options du mixeur\nTotal affiche la somme des valeurs RVB actuellement appliqué:\n- toujours 100% en mode relatif\n- supérieur (plus clair) ou inférieur (plus sombre) à 100% en mode absolu. TP_BWMIX_RGB_TOOLTIP;Mixe les canaux RVB. Utilisez les Préréglages pour vous guider.\nAttention aux valeurs négatives qui peuvent causer des artefacts ou un comportement erratique. @@ -1320,11 +1391,7 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Symétriser / axe vertical TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotation vers la gauche\nRaccourci: [\n\nRaccourci en mode Éditeur unique: Alt-[ TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotation vers la droite\nRaccourci: ]\n\nRaccourci en mode Éditeur unique: Alt-] TP_COARSETRAF_TOOLTIP_VFLIP;Symétriser / axe horizontal -TP_COLORAPP_ADAPTSCENE;Luminosité de la scène -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Luminance absolue de l'environnement de la scène (cd/m²).\n1) Calculé à partir des données Exif:\nVitesse d'obturation - val. ISO - ouverture F - correction d'expos. du boitier.\n2) Calculé à partir du Point Blanc Raw et de la Compensation d'Exposition de RawTherapee -TP_COLORAPP_ADAPTVIEWING;Luminosité du visionnage (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Luminance absolue de l'environnement de visionnage\n(souvent 16cd/m²) -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Si la case est cochée (recommandé), une valeur optimum est calculée à partir des données Exif.\nPour régler la valeur manuellement, décochez d'abord la case +TP_COLORAPP_ABSOLUTELUMINANCE;Luminance absolue TP_COLORAPP_ALGO;Algorithme TP_COLORAPP_ALGO_ALL;Tout TP_COLORAPP_ALGO_JC;Luminosité + Chroma (JC) @@ -1335,6 +1402,7 @@ TP_COLORAPP_BADPIXSL;Filtrer les pixels chauds/morts TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression des pixels chauds/morts (colorés de manière intense).\n0=Aucun effet 1=Médian 2=Gaussien.\n\nCes artefacts sont dus aux limitations de CIECAM02. Vous pouvez également adjuster l'image afin d'éviter les ombres très sombres. TP_COLORAPP_BRIGHT;Brillance (Q) TP_COLORAPP_BRIGHT_TOOLTIP;Brillance dans CIECAM02 est différent de Lab et RVB, prend en compte la luminosité du blanc +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Lorsque réglé manuellement, les valeurs au-dessus de 65 sont recommandées. TP_COLORAPP_CHROMA;Chroma (C) TP_COLORAPP_CHROMA_M;Niveau de couleurs (M) TP_COLORAPP_CHROMA_M_TOOLTIP;Niveau de couleurs dans CIECAM02 est différent de Lab et RVB @@ -1354,8 +1422,6 @@ TP_COLORAPP_CURVEEDITOR3;Courbes chroma TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Vous pouvez choisir entre chroma -saturation- niveau couleurs.\n Histogramme affiche la chromaticité Lab avant CIECAM.\n On peut voir le résultat final dans la fenêtre histogramme.\n Histogramme de C,s,M avant/après si la cas à cocher "Données CIECAM" est activée.\n (C,s,M) ne sont pas affichés dans le panneau histogramme TP_COLORAPP_DATACIE;Histogrammes post CIECAM dans les courbes 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 @@ -1367,14 +1433,13 @@ TP_COLORAPP_LABEL_SCENE;Conditions de la scène TP_COLORAPP_LABEL_VIEWING;Conditions de visionnage TP_COLORAPP_LIGHT;Luminosité (J) TP_COLORAPP_LIGHT_TOOLTIP;Luminosité dans CIECAM02 est différent de celui de Lab et RVB +TP_COLORAPP_MEANLUMINANCE;Luminance moyenne (Yb%) 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 -TP_COLORAPP_SHARPCIE_TOOLTIP;Netteté, Contraste par niveau de détails, Microcontraste & Aberration chromatique utiliseront CIECAM02 si activé. TP_COLORAPP_SURROUND;Entourage TP_COLORAPP_SURROUND_AVER;Moyen TP_COLORAPP_SURROUND_DARK;Sombre @@ -1394,11 +1459,9 @@ 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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Luminance absolue de l'environnement de visionnage\n(souvent 16cd/m²) 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 @@ -1412,6 +1475,25 @@ 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_LABREGIONS;Régions de correction L*a*b* +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Canal +TP_COLORTONING_LABREGION_CHANNEL_ALL;Tous +TP_COLORTONING_LABREGION_CHANNEL_B;Bleu +TP_COLORTONING_LABREGION_CHANNEL_G;Vert +TP_COLORTONING_LABREGION_CHANNEL_R;Rouge +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;T +TP_COLORTONING_LABREGION_LIGHTNESS;Luminosité +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_MASK;Masque +TP_COLORTONING_LABREGION_MASKBLUR;Masque Flou +TP_COLORTONING_LABREGION_OFFSET;Décalage +TP_COLORTONING_LABREGION_POWER;Puissance +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_SHOWMASK;Montrer le masque +TP_COLORTONING_LABREGION_SLOPE;Pente 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é @@ -1451,7 +1533,8 @@ TP_CROP_GUIDETYPE;Type de guide: TP_CROP_H;H TP_CROP_LABEL;Recadrage TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP; Sélection du recadrage +TP_CROP_RESETCROP;Réinitialiser +TP_CROP_SELECTCROP;Sélectionner TP_CROP_W;L TP_CROP_X;X TP_CROP_Y;Y @@ -1460,6 +1543,10 @@ TP_DARKFRAME_LABEL;Trame Noire TP_DEFRINGE_LABEL;Aberration chromatique TP_DEFRINGE_RADIUS;Rayon TP_DEFRINGE_THRESHOLD;Seuil +TP_DEHAZE_DEPTH;Profondeur +TP_DEHAZE_LABEL;Élimination de la Brume +TP_DEHAZE_SHOW_DEPTH_MAP;Montrer la Carte de Profondeur +TP_DEHAZE_STRENGTH;Force 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 ! @@ -1474,7 +1561,7 @@ TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manuel\nAgit sur l'image ent 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_PREVIEWRESIDUAL_INFO_TOOLTIP;Affiche les niveaux de bruit résiduels 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= - @@ -1488,18 +1575,18 @@ 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;Espace colorimétrique 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_MAIN_MODE;Mode +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Agressif +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservatif +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservatif" préserve les motifs chromatiques de basse fréquence tandis que "agressif" les efface. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Méthode médiane TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Chroma uniquement TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtre Médian @@ -1543,11 +1630,11 @@ TP_EPD_LABEL;Compression tonale TP_EPD_REWEIGHTINGITERATES;Itérations de la pondération TP_EPD_SCALE;Échelle TP_EPD_STRENGTH;Force -TP_EPD_TOOLTIP;Vous pouvez choisir entre le mode Lab (standard) ou le mode CIECAM02.\n En activant "Compression tonale avec brillance Q CIECAM" dans le menu "Brillance + Niveau de couleur CIECAM" TP_EXPOSURE_AUTOLEVELS;Niveaux Auto TP_EXPOSURE_AUTOLEVELS_TIP;Bascule l'usage de Niveaux automatiques afin de régler automatiquement les valeurs basé sur l'analyse de l'image\nActive la Reconstruction des Hautes Lumières si nécessaire. TP_EXPOSURE_BLACKLEVEL;Noir TP_EXPOSURE_BRIGHTNESS;Luminosité +TP_EXPOSURE_CLAMPOOG;Tronquer les couleurs hors gamut TP_EXPOSURE_CLIP;Rognage % TP_EXPOSURE_CLIP_TIP;La fraction de pixels que l'outil Niveaux Auto passera en dehors du domaine TP_EXPOSURE_COMPRHIGHLIGHTS;Compression hautes lumières @@ -1586,10 +1673,10 @@ TP_FLATFIELD_BT_VERTICAL;Vertical TP_FLATFIELD_CLIPCONTROL;Control de l'écrêtage TP_FLATFIELD_CLIPCONTROL_TOOLTIP;"Contrôle de l'écrêtage" évite les hautes lumière brûlées dûs à l'application du champ uniforme. S'il y a déjà des hautes lumières brûlées avant l'application du champ uniforme, "Contrôle de l'écrêtage" peut conduire à une dérive couleur. TP_FLATFIELD_LABEL;Champ Uniforme -TP_GAMMA_CURV;Gamma -TP_GAMMA_FREE;Manuel -TP_GAMMA_OUTPUT;Gamma de sortie -TP_GAMMA_SLOP;Pente (linéaire) +TP_GAMMA_CURV;Gamma: +TP_GAMMA_CUSTOM;Manuel +TP_GAMMA_OUTPUT_TRC_PRESET;Courbe de réponse tonale (TRC): +TP_GAMMA_SLOP;Pente (linéaire): TP_GENERAL_11SCALE_TOOLTIP;Les effets de cet outil ne sont visible ou fiable qu'avec un aperçu à l'échelle 1:1. TP_GRADIENT_CENTER;Centre TP_GRADIENT_CENTER_X;Centre X @@ -1650,6 +1737,12 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;Sauvegarde une image TIFF linéaire avant que le pr TP_ICM_TONECURVE;Utiliser la courbe tonale du profil DCP TP_ICM_TONECURVE_TOOLTIP;Utilise la courbe tonale DCP incluse. Ce paramètre ne sera actif que si le profil DCP contient une courbe tonale TP_ICM_WORKINGPROFILE;Profil de Travail +TP_ICM_WORKING_TRC;Courbe de réponse tonale: +TP_ICM_WORKING_TRC_CUSTOM;Personnalisé +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;Aucune +TP_ICM_WORKING_TRC_SLOPE;Pente +TP_ICM_WORKING_TRC_TOOLTIP;Seulement pour les profils internes TP_IMPULSEDENOISE_LABEL;Réduction du bruit d'impulsion TP_IMPULSEDENOISE_THRESH;Seuil TP_LABCURVE_AVOIDCOLORSHIFT;Éviter les dérives de teinte @@ -1692,10 +1785,16 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Peut être utilisé avec le curseur Chromaticité et TP_LENSGEOM_AUTOCROP;Recadrage auto TP_LENSGEOM_FILL;Remplir TP_LENSGEOM_LABEL;Objectif / Géométrie +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatiquement +TP_LENSPROFILE_CORRECTION_LCPFILE;Fichier LCP +TP_LENSPROFILE_CORRECTION_MANUAL;Manuellement TP_LENSPROFILE_LABEL;Profil de correction d'objectif -TP_LENSPROFILE_USECA;Corr. de l'aber. chromatique -TP_LENSPROFILE_USEDIST;Corr. de la distortion -TP_LENSPROFILE_USEVIGN;Corr. du vignettage +TP_LENSPROFILE_LENS_WARNING;Attention: le facteur de recadrage utilisé pour la caractérisation d'un objectif est plus grand que le facteur de recadrage de l'appareil photo, les résultats pourraient être faux. +TP_LENSPROFILE_MODE_HEADER;Sélectionner le profil d'objectif: +TP_LENSPROFILE_USE_CA;Aberration chromatique +TP_LENSPROFILE_USE_GEOMETRIC;Géometrique +TP_LENSPROFILE_USE_HEADER;Sélectionner les distortions à corriger: +TP_LENSPROFILE_USE_VIGNETTING;Vignetage TP_LOCALCONTRAST_AMOUNT;Quantité TP_LOCALCONTRAST_DARKNESS;Niveau des ombres TP_LOCALCONTRAST_LABEL;Contraste Local @@ -1726,10 +1825,19 @@ TP_PREPROCESS_HOTPIXFILT;Filtrer les pixels chauds TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Essaie de supprimer les pixels chauds TP_PREPROCESS_LABEL;Traitement pre-dématriçage TP_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Toutes +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontale +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontale seulement sur les lignes PDAF +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Verticale TP_PREPROCESS_NO_FOUND;Aucun trouvé +TP_PREPROCESS_PDAFLINESFILTER;Filtre de ligne PDAF TP_PRSHARPENING_LABEL;Netteté post-redimensionnement TP_PRSHARPENING_TOOLTIP;Augmente la netteté de l'image après le redimentionnement. Ne fonctionne que si la méthode de redimensionnement "Lanczos" est utilisé. Il est impossible de prévisualiser les effets de cet outil. Cf. RawPedia pour les instructions d'utilisation. TP_RAWCACORR_AUTO;Correction automatique +TP_RAWCACORR_AUTOIT;Itérations +TP_RAWCACORR_AUTOIT_TOOLTIP;Ce réglage est disponible si "Correction-auto" est activé.\nCorrection-auto est conservatif, signifiant qu'il ne corrige souvent pas toute l'aberration chromatique.\nPour corriger l'aberration restante, vous pouvez uttiliser jusqu'à cinq itérations de de la correction automatique de l'aberration chromatique.\nChaque itération réduira l'aberration restante de l'itération précédente avec un prix d'un temps de traitement plus long. +TP_RAWCACORR_AVOIDCOLORSHIFT;Éviter les dérives couleurs TP_RAWCACORR_CABLUE;Bleu TP_RAWCACORR_CARED;Rouge TP_RAWCACORR_CASTR;Force @@ -1742,20 +1850,27 @@ TP_RAWEXPOS_BLACK_BLUE;Bleu TP_RAWEXPOS_BLACK_GREEN;Vert TP_RAWEXPOS_BLACK_RED;Rouge TP_RAWEXPOS_LINEAR;Corr. du Point Blanc -TP_RAWEXPOS_PRESER;Préservation des HL TP_RAWEXPOS_RGB;Rouge, Vert, Bleu TP_RAWEXPOS_TWOGREEN;Lier les verts TP_RAW_1PASSMEDIUM;1-Passe (Medium) +TP_RAW_2PASS;1-passe+Fast TP_RAW_3PASSBEST;3-Passes (Meilleur) +TP_RAW_4PASS;3-passes+Fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Bord TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;Amélioration de DCB TP_RAW_DCBITERATIONS;Nombre d'itération de DCB +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Méthode TP_RAW_DMETHOD_PROGRESSBAR;Dématriçage %1... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Affinage du dématriçage... TP_RAW_DMETHOD_TOOLTIP;Note: IGV et LMMSE sont dédiés aux images à haut ISO +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Seuil auto +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Si la case est cochée (recommandé), RawTherapee calcul une valeur optimum basée sur les régions de "couleur unie" de l'image.\nS'il n'y en a pas ou que l'image est trop bruité, la valeur sera réglée à 0.\nPour régler la valeur manuellement, décochez la case d'abord (les valeurs raisonables dépendent de l'image). +TP_RAW_DUALDEMOSAICCONTRAST;Seuil de contraste TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;Itérations pour la suppression\ndes fausses couleurs TP_RAW_FAST;Fast @@ -1774,8 +1889,9 @@ TP_RAW_NONE;Aucun (montre ce que voit le capteur) TP_RAW_PIXELSHIFT;Pixel Shift TP_RAW_PIXELSHIFTADAPTIVE;Détection adaptative TP_RAW_PIXELSHIFTBLUR;Flouter le masque de mouvement -TP_RAW_PIXELSHIFTEPERISO;Adaptation ISO -TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;La valeur par défaut de 0 devrait bien fonctionner pour l'ISO de base.\nAugmenter la valeur pour améliorer la détection de mouvement pour les ISO plus haut.\nAugmentez par petit incrément et vérifier le masque de mouvement à chaque itération. +TP_RAW_PIXELSHIFTDMETHOD;Méthode de dématriçage pour les mouvements +TP_RAW_PIXELSHIFTEPERISO;Sensibilité +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;La valeur par défaut de 0 devrait bien fonctionner pour l'ISO de base.\nLes valeurs plus hautes augmentent la sensibilité de la détection de mouvement.\nChangez par petits incréments et observez le masque de mouvement se mettre à jour pendant votre ajustement.\nAugmentez la sensibilité pour les images sous-exposées ou à haut ISO. TP_RAW_PIXELSHIFTEQUALBRIGHT;Égaliser la luminosité des sous-images TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Égaliser par canal TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Activé: Égalise les canaux RVB individuellement.\nDésactivé: Utilise le même facteur d'égalisation pour tous les canaux. @@ -1811,7 +1927,7 @@ TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Poid Rouge&Bleu TP_RAW_PIXELSHIFTSHOWMOTION;Voir le masque de mouvement TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Voir uniquement le masque TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Affiche le masque sans l'image. -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Superpose sur l'image le masque montrant les zones avec mouvement. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Applique un masque vert montrant les régions contenant du mouvement. TP_RAW_PIXELSHIFTSIGMA;Rayon de floutage TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;Le rayon par défaut de 1.0 fonctionne généralement bien pour l'ISO de base.\nAugmentez cette valeur pour les images de haut ISO, 5.0 est un bon point de départ.\nContrôlez le masque de mouvement à chaque nouvelle valeur. TP_RAW_PIXELSHIFTSMOOTH;Adoucir les transitions @@ -1820,10 +1936,12 @@ TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;Facteur DevStd Bleu TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;Facteur DevStd Vert TP_RAW_PIXELSHIFTSTDDEVFACTORRED;Facteur DevStd Rouge TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 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 TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Autoriser l'Agrandissement TP_RESIZE_APPLIESTO;S'applique à: TP_RESIZE_CROPPEDAREA;La zone recadrée TP_RESIZE_FITBOX;Boîte englobante @@ -1841,7 +1959,7 @@ TP_RESIZE_WIDTH;Largeur TP_RETINEX_CONTEDIT_HSL;Égaliseur d'histogramme TSV TP_RETINEX_CONTEDIT_LAB;Égaliseur d'histogramme L*a*b* TP_RETINEX_CONTEDIT_LH;Égaliseur de teinte -TP_RETINEX_CONTEDIT_MAP;Égaliseur de masque +TP_RETINEX_CONTEDIT_MAP;Égaliseur TP_RETINEX_CURVEEDITOR_CD;L=f(L) TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance en fonction de la luminance L=f(L)\nCorrige les données raw pour réduire halos et artéfacts. TP_RETINEX_CURVEEDITOR_LH;Force=f(T) @@ -1879,7 +1997,7 @@ TP_RETINEX_LABEL;Retinex TP_RETINEX_LABEL_MASK;Masque TP_RETINEX_LABSPACE;L*a*b* TP_RETINEX_LOW;Bas -TP_RETINEX_MAP;Méthode de masquage +TP_RETINEX_MAP;Méthode TP_RETINEX_MAP_GAUS;Masque gaussien TP_RETINEX_MAP_MAPP;Masque pointu (ondelettes partielles) TP_RETINEX_MAP_MAPT;Masque pointu (ondelettes totales) @@ -1942,6 +2060,7 @@ TP_SHARPENEDGE_LABEL;Bords TP_SHARPENEDGE_PASSES;Itérations TP_SHARPENEDGE_THREE;Luminance uniquement TP_SHARPENING_AMOUNT;Quantité +TP_SHARPENING_CONTRAST;Seuil de contraste TP_SHARPENING_EDRADIUS;Rayon TP_SHARPENING_EDTOLERANCE;Tolérance des bords TP_SHARPENING_HALOCONTROL;Contrôle du halo @@ -1957,15 +2076,19 @@ TP_SHARPENING_RLD_ITERATIONS;Itérations TP_SHARPENING_THRESHOLD;Seuil TP_SHARPENING_USM;Masque flou (USM) TP_SHARPENMICRO_AMOUNT;Quantité +TP_SHARPENMICRO_CONTRAST;Seuil de contraste TP_SHARPENMICRO_LABEL;Microcontraste TP_SHARPENMICRO_MATRIX;Matrice 3×3 au lieu de 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformité +TP_SOFTLIGHT_LABEL;Lumière douce +TP_SOFTLIGHT_STRENGTH;Force TP_SPOT_COUNTLABEL;%1 point(s) TP_SPOT_ENTRYCHANGED;Modification d'un point TP_SPOT_LABEL;Retrait de taches TP_TM_FATTAL_AMOUNT;Quantité -TP_TM_FATTAL_LABEL;Compression Tonale HDR -TP_TM_FATTAL_THRESHOLD;Seuil +TP_TM_FATTAL_ANCHOR;Ancre +TP_TM_FATTAL_LABEL;Compression de Plage Dynamique +TP_TM_FATTAL_THRESHOLD;Détail TP_VIBRANCE_AVOIDCOLORSHIFT;Éviter les dérives de teinte TP_VIBRANCE_CURVEEDITOR_SKINTONES;TT TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tons chair @@ -2029,7 +2152,7 @@ TP_WAVELET_CHTYPE;Méthode de chrominance TP_WAVELET_COLORT;Opacité Rouge-Vert TP_WAVELET_COMPCONT;Contraste TP_WAVELET_COMPGAMMA;Compression gamma -TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histograme. +TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histogramme. TP_WAVELET_COMPTM;Compression tonale TP_WAVELET_CONTEDIT;Courbe de contraste 'Après' TP_WAVELET_CONTR;Gamut @@ -2187,6 +2310,7 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Méthode +TP_WBALANCE_PICKER;Sélectionner TP_WBALANCE_SHADE;Ombre TP_WBALANCE_SIZE;Taille: TP_WBALANCE_SOLUX35;Solux 3500K @@ -2204,8 +2328,17 @@ TP_WBALANCE_WATER_HEADER;Sous-marin 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. +!!!!!!!!!!!!!!!!!!!!!!!!! + +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!TP_RAW_IMAGENUM_SN;SN mode +!TP_SHARPENING_BLUR;Blur radius diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek index 3051bd490..b7787fa7d 100644 --- a/rtdata/languages/Greek +++ b/rtdata/languages/Greek @@ -1,6 +1,5 @@ #01 2008-05-14 zeusalmighty -ADJUSTER_RESET_TO_DEFAULT;Επαναφορά προεπιλογών CURVEEDITOR_LINEAR;Γραμμικό CURVEEDITOR_LOADDLGLABEL;Φόρτωση καμπύλης... CURVEEDITOR_SAVEDLGLABEL;Αποθήκευση καμπλης... @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;εφαρμόζεται στην επόμενη εκκίνηση -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Save Processing Parameters to the Cache PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File PREFERENCES_PSPATH;Adobe Photoshop installation directory PREFERENCES_SELECTLANG;Επιλογή γλώσσας -PREFERENCES_SELECTTHEME;Επιλογή θέματος PREFERENCES_SHOWBASICEXIF;Προβολή βασικών στοιχείων Exif PREFERENCES_SHOWDATETIME;Προβολή ημερομηνίας και ώρας PREFERENCES_SHTHRESHOLD;Κατώφλι ψαλιδίσματος σκιών @@ -335,7 +330,6 @@ TP_CROP_GTRULETHIRDS;Κανόνας τρίτων TP_CROP_GUIDETYPE;Είδος βοηθών: TP_CROP_H;H TP_CROP_LABEL;Αποκοπή -TP_CROP_SELECTCROP; Επιλογή αποκοπής TP_CROP_W;W TP_CROP_X;x TP_CROP_Y;y @@ -420,6 +414,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -429,9 +424,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -448,6 +444,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -458,6 +458,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -498,8 +499,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -556,7 +557,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -568,16 +569,19 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -622,12 +626,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -731,9 +734,9 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -769,7 +772,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -784,8 +787,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -888,7 +891,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -968,19 +971,103 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1006,16 +1093,13 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1031,27 +1115,30 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1070,8 +1157,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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 @@ -1080,6 +1169,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1098,19 +1188,22 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1122,18 +1215,18 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1141,16 +1234,17 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1166,7 +1260,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1175,14 +1268,11 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1214,12 +1304,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1227,22 +1312,21 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1256,43 +1340,31 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1312,12 +1384,15 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1327,8 +1402,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1336,13 +1411,12 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1369,9 +1443,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1402,11 +1475,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1417,8 +1486,9 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1436,8 +1506,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1449,14 +1517,13 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1476,11 +1543,9 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1492,6 +1557,27 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1524,11 +1610,17 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1608,13 +1700,15 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1640,10 +1734,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1690,6 +1780,12 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1732,10 +1828,16 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1766,10 +1868,19 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1782,19 +1893,26 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1802,7 +1920,8 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1810,58 +1929,42 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1870,10 +1973,10 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1885,7 +1988,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1911,7 +2014,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1963,13 +2066,19 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2059,7 +2168,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2070,7 +2179,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2182,6 +2291,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2196,7 +2306,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία !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 --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew index 5fe10c54c..440b96b3f 100644 --- a/rtdata/languages/Hebrew +++ b/rtdata/languages/Hebrew @@ -1,6 +1,5 @@ #01 2008-02-21 -ADJUSTER_RESET_TO_DEFAULT;ברירת מחדל CURVEEDITOR_LINEAR;ישיר CURVEEDITOR_LOADDLGLABEL;הטען עקמה CURVEEDITOR_SAVEDLGLABEL;שמור עקמה @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;ייושם באתחול הבא -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Save Processing Parameters to the Cache PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File PREFERENCES_PSPATH;Adobe Photoshop installation directory PREFERENCES_SELECTLANG;בחר שפה -PREFERENCES_SELECTTHEME;Select theme PREFERENCES_SHOWBASICEXIF;Exif הראה מידע PREFERENCES_SHOWDATETIME;הראה תאריך ושעה PREFERENCES_SHTHRESHOLD;סף קיצוץ תחתון @@ -335,7 +330,6 @@ TP_CROP_GTRULETHIRDS;כלל השליש TP_CROP_GUIDETYPE;סוג מדריך TP_CROP_H;גובה TP_CROP_LABEL;גזור -TP_CROP_SELECTCROP;בחור גזירה TP_CROP_W;רוחב TP_CROP_X;x TP_CROP_Y;y @@ -421,6 +415,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -430,9 +425,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -449,6 +445,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -459,6 +459,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -499,8 +500,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -557,7 +558,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -569,16 +570,19 @@ TP_WBALANCE_TEMPERATURE;מידת חום !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -623,12 +627,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -732,9 +735,9 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -770,7 +773,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -785,8 +788,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -889,7 +892,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -969,19 +972,103 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1007,16 +1094,13 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1032,27 +1116,30 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1071,8 +1158,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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 @@ -1081,6 +1170,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1099,19 +1189,22 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1123,18 +1216,18 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1142,16 +1235,17 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1167,7 +1261,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1176,14 +1269,11 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1215,12 +1305,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1228,22 +1313,21 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1257,43 +1341,31 @@ TP_WBALANCE_TEMPERATURE;מידת חום !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1313,12 +1385,15 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1328,8 +1403,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1337,13 +1412,12 @@ TP_WBALANCE_TEMPERATURE;מידת חום !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1370,9 +1444,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1403,11 +1476,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1418,8 +1487,9 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1437,8 +1507,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1450,14 +1518,13 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1477,11 +1544,9 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1493,6 +1558,27 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1525,11 +1611,17 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1609,13 +1701,15 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1641,10 +1735,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1691,6 +1781,12 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1733,10 +1829,16 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1767,10 +1869,19 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1783,19 +1894,26 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1803,7 +1921,8 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1811,58 +1930,42 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1871,10 +1974,10 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1886,7 +1989,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1912,7 +2015,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1964,13 +2067,19 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2060,7 +2169,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2071,7 +2180,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2183,6 +2292,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2197,7 +2307,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום !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 --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 2da39b47b..8f68d5cf9 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -9,7 +9,6 @@ ABOUT_TAB_CREDITS;Riconoscimenti ABOUT_TAB_LICENSE;Licenza ABOUT_TAB_RELEASENOTES;Note di rilascio 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 @@ -93,8 +92,6 @@ FILEBROWSER_AUTOFLATFIELD;Flat Field automatico FILEBROWSER_BROWSEPATHBUTTONHINT;Premi per aprire il percorso inserito FILEBROWSER_BROWSEPATHHINT;Inserisci il percorso da aprire\nCtrl-o seleziona il percorso\nEnter, Ctrl-Enter (solo nel Navigatore) porta alla destinazione ;\nScorciatoie:\n ~ - Cartella home\n ! - Cartella Immagini FILEBROWSER_CACHE;Memoria -FILEBROWSER_CACHECLEARFROMFULL;Rimuovi dalla memoria - totale -FILEBROWSER_CACHECLEARFROMPARTIAL;Rimuovi dalla memoria - parziale FILEBROWSER_CLEARPROFILE;Cancella FILEBROWSER_COLORLABEL_TOOLTIP;Etichetta colore.\n\nUsa il menù o le scorciatoie:\nShift-Ctrl-0 Nessun Colore\nShift-Ctrl-1 Rosso\nShift-Ctrl-2 Giallo\nShift-Ctrl-3 Verde\nShift-Ctrl-4 Blu\nShift-Ctrl-5 Viola FILEBROWSER_COPYPROFILE;Copia @@ -335,7 +332,6 @@ HISTORY_MSG_121;AC automatica (Raw) HISTORY_MSG_122;Dark Frame - Automatico HISTORY_MSG_123;Dark Frame - File HISTORY_MSG_124;Correzione Punto di Bianco -HISTORY_MSG_125;Protezione AlteLuci HISTORY_MSG_126;Flat Field - File HISTORY_MSG_127;Flat Field - Automatico HISTORY_MSG_128;Flat Field - Raggio di Sfocamento @@ -441,9 +437,7 @@ HISTORY_MSG_231;BN - Curva 'Prima' HISTORY_MSG_232;BN - Tipo Curva 'Prima' HISTORY_MSG_233;BN - Curva 'Dopo' HISTORY_MSG_234;BN - Tipo Curva 'Dopo' -HISTORY_MSG_235;BN - Misc. Canali Automatico HISTORY_MSG_236;--unused-- -HISTORY_MSG_237;BN - Miscelatore HISTORY_MSG_238;GF - Scia HISTORY_MSG_239;GF - Forza HISTORY_MSG_240;GF - Centro @@ -563,8 +557,6 @@ NAVIGATOR_S;S: 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 @@ -607,7 +599,6 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtro per rumore a bande PARTIALPASTE_RAWCACORR_AUTO;Autocorrezione AC PARTIALPASTE_RAWEXPOS_BLACK;Punto del Nero PARTIALPASTE_RAWEXPOS_LINEAR;Correzione Punto del Bianco -PARTIALPASTE_RAWEXPOS_PRESER;Conservazione Alteluci PARTIALPASTE_RAWGROUP;Impostazioni del Raw PARTIALPASTE_RAW_DCBENHANCE;Miglioramento DCB PARTIALPASTE_RAW_DCBITERATIONS;Numero di iterazioni DCB @@ -625,6 +616,7 @@ PARTIALPASTE_VIBRANCE;Vividezza PARTIALPASTE_VIGNETTING;Correzione Vignettatura PARTIALPASTE_WHITEBALANCE;Bilanciamento del bianco PREFERENCES_ADD;Somma +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Colore delle guide del Navigatore PREFERENCES_APPLNEXTSTARTUP;applicato al prossimo avvio PREFERENCES_AUTOMONPROFILE;Usa il profilo colore dello schermo principale del sistema operativo PREFERENCES_BATCH_PROCESSING;Sviluppo in serie @@ -634,15 +626,9 @@ PREFERENCES_BEHAVIOR;Comportamento PREFERENCES_BEHSETALL;Tutti a 'Imposta' PREFERENCES_BEHSETALLHINT;Imposta tutti i parametri nella modalità Imposta.\nLe regolazioni dei parametri nel pannello strumenti batch saranno assoluti, verranno mostrati i valori reali. PREFERENCES_BLACKBODY;Tungsteno -PREFERENCES_CACHECLEARALL;Rimuovi tutto -PREFERENCES_CACHECLEARPROFILES;Rimuovi i profili di sviluppo -PREFERENCES_CACHECLEARTHUMBS;Rimuovi le miniature PREFERENCES_CACHEMAXENTRIES;Numero massimo di voci in memoria PREFERENCES_CACHEOPTS;Opzioni della memoria PREFERENCES_CACHETHUMBHEIGHT;Massima altezza delle miniature -PREFERENCES_CIEART;Ottimizzazione CIECAM02 -PREFERENCES_CIEART_LABEL;Utilizza precisione singola anziché doppia -PREFERENCES_CIEART_TOOLTIP;Se abilitata, i calcoli CIECAM02 sono effettuati in formato a virgola mobile a precisione singola anziché doppia. Questo permette un piccolo incremento di velocità al costo di una trascurabile perdita di qualità. PREFERENCES_CLIPPINGIND;Indicazione di tosaggio PREFERENCES_CUSTPROFBUILD;Generatore profili personalizzati PREFERENCES_CUSTPROFBUILDHINT;File eseguibile (o script) richiamato quando è necessario generare un nuovo profilo per un'immagine.\nIl percorso del file di comunicazione (del tipo *.ini, detto "Keyfile") è aggiunto come parametro da linea di comando. Contiene diversi paramentri necessari agli script e ai dati Exif per generare un profilo di elaborazione.\n\nATTENZIONE:: Devi utilizzare le virgolette doppie quando necessario se utilizzi percorsi contenenti spazi. @@ -650,7 +636,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Formato tasti PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nome PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Percorso dell'eseguibile -PREFERENCES_CUTOVERLAYBRUSH;Colore/Trasparenza della maschera di ritaglio PREFERENCES_D50;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K @@ -669,7 +654,6 @@ PREFERENCES_DIRSOFTWARE;Cartella d'installazione 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_FLATFIELDFOUND;Trovati PREFERENCES_FLATFIELDSDIR;Cartella dei fotogrammi di campo (Flat Field) @@ -710,7 +694,6 @@ PREFERENCES_MENUOPTIONS;Opzioni del menù a discesa PREFERENCES_METADATA;Metadati PREFERENCES_MULTITAB;Modalità a Schede Multiple PREFERENCES_MULTITABDUALMON;Modalità a Schede Multiple (se disponibile sul secondo schermo) -PREFERENCES_NAVGUIDEBRUSH;Colore delle guide del Navigatore PREFERENCES_OUTDIR;Cartella di destinazione PREFERENCES_OUTDIRFOLDER;Salva nella cartella PREFERENCES_OUTDIRFOLDERHINT;Salva le immagini nella cartella scelta @@ -731,11 +714,7 @@ PREFERENCES_PROFILESAVECACHE;Salva il profilo di sviluppo nella memoria PREFERENCES_PROFILESAVEINPUT;Salva il profilo di sviluppo a fianco del file originario PREFERENCES_PROPERTY;Proprietà PREFERENCES_PSPATH;Cartella d'installazione di Adobe Photoshop -PREFERENCES_RGBDTL_LABEL;Numero massimo di thread per la Riduzione Rumore -PREFERENCES_RGBDTL_TOOLTIP;La Riduzione Rumore richiede un minimo di circa 128MB di RAM per un'immagine di 10MPixel o 512MB per una di 40MPixel più 128MB di RAM per ogni thread. Più thread vengono eseguiti in parallelo, più rapida sarà l'elaborazione. Lascia l'impostazione a "0" per usare automaticamente quanti più thread possibili. -PREFERENCES_SELECTFONT;Seleziona il carattere PREFERENCES_SELECTLANG;Seleziona la lingua -PREFERENCES_SELECTTHEME;Seleziona il tema PREFERENCES_SET;Imposta PREFERENCES_SHOWBASICEXIF;Mostra dati Exif di base PREFERENCES_SHOWDATETIME;Mostra data e ora @@ -746,16 +725,14 @@ PREFERENCES_SINGLETABVERTAB;Modalità a Scheda Singola, schede verticali PREFERENCES_SND_BATCHQUEUEDONE;Al termine dell'elaborazione della coda PREFERENCES_SND_HELP;Inserire un percorso oppure nulla (per non avere suoni).\nSu Windows usa "SystemDefault", "SystemAsterisk" ecc. per i suoni di sistema.\nSu Linux usa "complete", "window-attention" ecc. per i suoni di sistema. PREFERENCES_SND_LNGEDITPROCDONE;Al termine delle operazioni di modifica -PREFERENCES_SND_TRESHOLDSECS;dopo un tempo in secondi +PREFERENCES_SND_THRESHOLDSECS;dopo un tempo in secondi PREFERENCES_STARTUPIMDIR;Cartella delle immagini all'avvio PREFERENCES_TAB_BROWSER;Navigatore PREFERENCES_TAB_COLORMGR;Gestione Colore PREFERENCES_TAB_GENERAL;Generale PREFERENCES_TAB_IMPROC;Elaborazione immagine -PREFERENCES_TAB_PERFORMANCE;Prestazioni PREFERENCES_TAB_SOUND;Suoni PREFERENCES_TP_LABEL;Pannello Strumenti: -PREFERENCES_TP_USEICONORTEXT;Utilizza le icone delle schede anziché il testo PREFERENCES_TP_VSCROLLBAR;Nascondi la barra di scorrimento verticale PREFERENCES_USEBUNDLEDPROFILES;Usa profili inclusi PREFERENCES_VIEW;Bilanciamento del bianco del dispositivo di uscita (monitor, TV, proiettore...) @@ -827,7 +804,6 @@ TP_BWMIX_ALGO_LI;Lineare TP_BWMIX_ALGO_SP;Effetti speciali TP_BWMIX_ALGO_TOOLTIP;Lineare: produrrà una risposta normale lineare.\nEffetti speciali: produrrà effetti speciali miscelando i canali non-linearmente. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Calcola i valori ottimali del Miscelatore Canali. TP_BWMIX_CC_ENABLED;Regola il colore complementare TP_BWMIX_CC_TOOLTIP;Abilita per consentire le regolazioni automatiche dei colori complementari nella modalità ROYGCBPM. TP_BWMIX_CHANNEL;Equalizzatore di Luminanza @@ -854,9 +830,6 @@ TP_BWMIX_MET;Metodo TP_BWMIX_MET_CHANMIX;Miscelatore Canali TP_BWMIX_MET_DESAT;Desaturazione TP_BWMIX_MET_LUMEQUAL;Equalizzatore di Luminanza -TP_BWMIX_MIXC;Miscelatore -TP_BWMIX_NEUTRAL;Ripristina il miscelatore -TP_BWMIX_NEUTRAL_TIP;Ripristina tutti i valori (Filtro Colore, Miscelatore Canali). TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Totale: %4%% TP_BWMIX_RGBLABEL_HINT;Fattori RGB finali che si occupano di tutte le opzioni del miscelatore.\n"Totale" mostra la somma dei valori RGB:\n- sempre 100% nella modalità relativa\n- Più alto (luminoso) or più basso (scuro) del 100% nella modalità assoluta. TP_BWMIX_RGB_TOOLTIP;Miscela i canali RGB. Usa i valori preimpostati per orientarti.\nFai attenzione ai valori negativi: possono causare artefatti o comportamenti imprevisti. @@ -894,11 +867,6 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Rifletti orizzontalmente. TP_COARSETRAF_TOOLTIP_ROTLEFT;Ruota a sinistra.\nScorciatoie:\n[ - Modalità a Scheda Multipla,\nAlt-[ - Modalità a Scheda Singola. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Ruota a destra.\nScorciatoie:\n] - Modalità a Scheda Multipla,\nAlt-] - Modalità a Scheda Singola. TP_COARSETRAF_TOOLTIP_VFLIP;Rifletti verticalmente -TP_COLORAPP_ADAPTSCENE;Luminanza della scena -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Luminanza assoluta dell'ambiente della scena (cd/m²)\n1) Calcolata dai dati Exif:\nTempo - ISO - Diaframma - Compensazione dell'Esposizione.\n2) Calcolata dal punto di bianco del raw e dal cursore di Compensazione dell'Esposizione. -TP_COLORAPP_ADAPTVIEWING;Luminanza di visualizzazione (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Luminanza assoluta dell'ambiente di visualizzazione\n(normalmente 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Se questa casella è selezionata (raccomandato) RT calcola un valore ottimale dai dati Exif.\nPer impostare un valore manualmente, deseleziona la casella. TP_COLORAPP_ALGO;Algoritmo TP_COLORAPP_ALGO_ALL;Tutto TP_COLORAPP_ALGO_JC;Chiarezza + Croma (JC) @@ -928,8 +896,6 @@ TP_COLORAPP_CURVEEDITOR3;Curva Colore TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Regola Croma, Saturazione o Pienezza.\nL'Istogramma mostra la Cromaticità (Lab) prima di CIECAM02.\nSe "Mostra gli istogrammi di uscita CIECAM02 nelle curve" è abilitato, l'Istogramma mostra C, s e M dopo CIECAM02.\nC, s e M non sono mostrati direttamente nel pannello Istogramma.\nPer l'output finale fare riferimento al pannello Istogramma TP_COLORAPP_DATACIE;Mostra gli istogrammi di uscita CIECAM02 nelle curve TP_COLORAPP_DATACIE_TOOLTIP;Quando abilitato, gli istogrammi nelle curve CIECAM02 mostrano valori e intervalli approssimati di J o Q, e C, s o M dopo le regolazioni CIECAM02.\nQuesta selezione non ha effetto nel pannello Istogramma principale.\n\nQuando disabilitato, gli istogrammi nelle curve CIECAM02 mostrano i valori Lab, come sono prima delle regolazioni CIECAM02. -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Se abilitato (raccomandato), RT calcola un valore ottimale, che sarà utilizzato da CAT02, e anche per l'intero CIECAM02.\nDisabilitare per impostare il valore manualmente (sono raccomandati valori superiori a 65). -TP_COLORAPP_DEGREE_TOOLTIP;Quantità di Trasformazione di Adattamento Cromatico CIE 2002 TP_COLORAPP_GAMUT;Controllo Gamut (Lab) TP_COLORAPP_GAMUT_TOOLTIP;Consenti il controllo gamut nella modalità Lab TP_COLORAPP_HUE;Tinta (h) @@ -944,8 +910,6 @@ TP_COLORAPP_MODEL;Modello del Punto di Bianco TP_COLORAPP_MODEL_TOOLTIP;Modello del Punto di bianco.\n\nWB [RT] + [output]: Per la scena viene usato il Bilanciamento del Bianco di RT, CIECAM02 è impostato a D50, il bianco del dispositivo di uscita utilizza il valore impostato in Preferenze > Gestione Colore.\n\nWB [RT+CAT02] + [output]: Le impostazioni di Bilanciamento del Bianco di RT sono utilizzate da CAT02 e il bianco del dispositivo di uscita utilizza il valore impostato in Preferenze > Gestione Colore. TP_COLORAPP_RSTPRO;Protezione rossi e incarnato TP_COLORAPP_RSTPRO_TOOLTIP;Protezione dei toni rossi e dell'incarnato (cursori e curve) -TP_COLORAPP_SHARPCIE;--inutilizzato-- -TP_COLORAPP_SHARPCIE_TOOLTIP;--inutilizzato-- TP_COLORAPP_SURROUND;Ambiente TP_COLORAPP_SURROUND_AVER;Medio TP_COLORAPP_SURROUND_DARK;Scuro @@ -964,6 +928,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;Chiarezza TP_COLORAPP_TCMODE_SATUR;Saturazione TP_COLORAPP_TONECIE;Tone mapping con CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;Se questa opzione è disabilitata, il Tone Mapping è eseguito nello spazio Lab.\nSe l'opzione è abilitata, il Tone Mapping è fatto usando CIECAM02.\nLo strumento Tone Mapping (Lab/CIECAM02) deve essere abilitato affinché questa impostazione abbia effetto. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Luminanza assoluta dell'ambiente di visualizzazione\n(normalmente 16cd/m²). TP_COLORAPP_WBCAM;WB [RT+CAT02] + [output] TP_COLORAPP_WBRT;WB [RT] + [output] TP_CROP_FIXRATIO;Rapporto fisso: @@ -977,7 +942,6 @@ TP_CROP_GUIDETYPE;Tipo di guida: TP_CROP_H;A TP_CROP_LABEL;Ritaglio TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP; Seleziona Area TP_CROP_W;L TP_CROP_X;X TP_CROP_Y;Y @@ -1021,7 +985,6 @@ TP_EPD_LABEL;Tone Mapping TP_EPD_REWEIGHTINGITERATES;Iterazioni di Ribilanciamento TP_EPD_SCALE;Scala TP_EPD_STRENGTH;Forza -TP_EPD_TOOLTIP;Il Tone Mapping è possibile in modalità Lab (standard) o CIECAM02.\n\nPer utilizare il Tone Mapping CIECAM02 abilita quste impostazioni: \n 1. CIECAM02\n 2. Algoritmo="Brillanza + Pienezza (QM)"\n 3. "Tone mapping con CIECAM02" TP_EXPOSURE_AUTOLEVELS;Livelli automatici TP_EXPOSURE_AUTOLEVELS_TIP;Abilita l'esecuzione dei livelli automatici per impostare automaticamente il cursore Esposizione in base all'analisi dell'immagine.\nSe necessario, abilita Ricostruzione Alteluci. TP_EXPOSURE_BLACKLEVEL;Livello del nero @@ -1148,9 +1111,6 @@ TP_LENSGEOM_AUTOCROP; Ritaglio automatico TP_LENSGEOM_FILL;Adattamento automatico TP_LENSGEOM_LABEL;Obiettivo/Geometria TP_LENSPROFILE_LABEL;Profilo di Correzione dell'Obiettivo -TP_LENSPROFILE_USECA;Correzione dell'Aberrazione Cromatica (AC) -TP_LENSPROFILE_USEDIST;Correzione della Distorsione -TP_LENSPROFILE_USEVIGN;Correzione della Vignettatura TP_NEUTRAL_TIP;Riporta i controlli dell'esposizione ai valori neutrali.\nVale per gli stessi controlli cui è applicato Livelli Automatici, indipendentemente dal fatto che Livelli Automatici sia abilitato. TP_PCVIGNETTE_FEATHER;Scia TP_PCVIGNETTE_FEATHER_TOOLTIP;Scia:\n0 = solo i bordi,\n50 = a metà strada con il centro,\n100 = al centro. @@ -1173,7 +1133,6 @@ TP_RAWCACORR_CABLUE;Blu TP_RAWCACORR_CARED;Rosso TP_RAWEXPOS_BLACKS;Livelli del nero TP_RAWEXPOS_LINEAR;Punto del Bianco - Correzione -TP_RAWEXPOS_PRESER;Punto del Bianco - Protezione Alteluci TP_RAWEXPOS_TWOGREEN;Valori del verde uniti TP_RAW_DCBENHANCE;Miglioramento DCB TP_RAW_DCBITERATIONS;Numero di iterazioni DCB @@ -1314,7 +1273,7 @@ TP_WBALANCE_WATER_HEADER;Subacqueo 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: - @@ -1322,22 +1281,29 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels @@ -1345,11 +1311,13 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !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_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -1357,12 +1325,18 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_CURRENT;Current !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_256;NR - Median - Type !HISTORY_MSG_257;Color Toning !HISTORY_MSG_258;CT - Color curve @@ -1380,7 +1354,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -1395,8 +1369,8 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -1499,7 +1473,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1579,18 +1553,102 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1616,45 +1674,57 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_ICCPROFCREATOR;ICC Profile Creator !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_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !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_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !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_DEHAZE;Haze removal !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_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1665,11 +1735,9 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PREFERENCES_CURVEBBOXPOS_LEFT;Left !PREFERENCES_CURVEBBOXPOS_RIGHT;Right !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !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 @@ -1681,22 +1749,17 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1709,50 +1772,48 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!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 +!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 the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !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 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 @@ -1764,6 +1825,27 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1792,6 +1874,12 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1839,6 +1927,9 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1860,6 +1951,21 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1874,8 +1980,17 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength !TP_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1885,11 +2000,19 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1897,67 +2020,52 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !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_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1969,7 +2077,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1995,7 +2103,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2034,9 +2142,15 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2105,7 +2219,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2116,7 +2230,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2200,6 +2314,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: - !TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WBALANCE_PICKER;Pick !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 --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 10979e399..a05eaacda 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -38,15 +38,17 @@ ABOUT_TAB_CREDITS;クレジット ABOUT_TAB_LICENSE;ライセンス ABOUT_TAB_RELEASENOTES;リリースノート ABOUT_TAB_SPLASH;スプラッシュ -ADJUSTER_RESET_TO_DEFAULT;デフォルト値に戻す +ADJUSTER_RESET_TO_DEFAULT;クリック - デフォルト値にリセット\nCtrl+クリック - 初期値にリセット BATCHQUEUE_AUTOSTART;オートスタート BATCHQUEUE_AUTOSTARTHINT;新しいrawファイルが送られて来たら自動的に現像処理を開始します BATCHQUEUE_DESTFILENAME;パスとファイル名 +BATCHQUEUE_STARTSTOPHINT;キューにある画像の現像を始める、或いは中止する\n\nショートカット: Ctrl+s BATCH_PROCESSING;バッチ処理 CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_LEFT_TAN;LT: CURVEEDITOR_AXIS_OUT;O: CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;フレキシブル CURVEEDITOR_CURVE;カーブ CURVEEDITOR_CURVES;カーブ CURVEEDITOR_CUSTOM;カスタム @@ -68,6 +70,20 @@ CURVEEDITOR_TOOLTIPPASTE;クリップボードからカーブを貼り付け CURVEEDITOR_TOOLTIPSAVE;現在のカーブを保存 CURVEEDITOR_TYPE;タイプ: DIRBROWSER_FOLDERS;フォルダ +DONT_SHOW_AGAIN;次回からこのメッセージを表示しない +DYNPROFILEEDITOR_DELETE;削除 +DYNPROFILEEDITOR_EDIT;編集 +DYNPROFILEEDITOR_EDIT_RULE;ダイナミックプロファイルの規定を変更 +DYNPROFILEEDITOR_ENTRY_TOOLTIP;既定の符号は鈍いので\n入力する際に"re:"という接頭語を付けます\n通常の表現を使います +DYNPROFILEEDITOR_IMGTYPE_ANY;任意 +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;ピクセルシフト +DYNPROFILEEDITOR_IMGTYPE_STD;標準え +DYNPROFILEEDITOR_MOVE_DOWN;下に移動 +DYNPROFILEEDITOR_MOVE_UP;上に移動 +DYNPROFILEEDITOR_NEW;新規 +DYNPROFILEEDITOR_NEW_RULE;新しいダイナミックプロファイルの規定 +DYNPROFILEEDITOR_PROFILE;処理プロファイル EDITWINDOW_TITLE;画像編集 EDIT_OBJECT_TOOLTIP;この機能を使うための目安に、プレビュー画面にガイドを表示する EDIT_PIPETTE_TOOLTIP;カーブ上に調整ポイントを追加するには、Ctrlキーを押しながら、プレビューの画像上の目標ポイントを左クリックします。\n追加されたそのポイントを調整するには、Ctrlキーを押しながら、プレビュー画像のそのポイントに当たる部分を左クリックします。それからCtrlキーを離し(微妙な調整をする場合はそのまま)、左クリックしたままマウスを画面上で上下に動かすと、それに合わせてトーンカーブが調整されます。 @@ -76,6 +92,7 @@ EXIFFILTER_CAMERA;カメラ EXIFFILTER_EXPOSURECOMPENSATION;露光量補正 (EV) EXIFFILTER_FILETYPE;ファイル タイプ EXIFFILTER_FOCALLEN;焦点距離 +EXIFFILTER_IMAGETYPE;画像の種類 EXIFFILTER_ISO;ISO EXIFFILTER_LENS;レンズ EXIFFILTER_METADATAFILTER;メタデータ絞り込みの適用 @@ -93,11 +110,13 @@ EXIFPANEL_RESET;リセット EXIFPANEL_RESETALL;すべてリセット EXIFPANEL_RESETALLHINT;すべて元の値にリセット EXIFPANEL_RESETHINT;選択タグを元の値にリセット +EXIFPANEL_SHOWALL;全て表示 EXIFPANEL_SUBDIRECTORY;サブディレクトリ +EXPORT_BYPASS;迂回させる機能 EXPORT_BYPASS_ALL;全て選択 / 全て解除 EXPORT_BYPASS_DEFRINGE;フリンジ低減を迂回 EXPORT_BYPASS_DIRPYRDENOISE;ノイズ低減を迂回 -EXPORT_BYPASS_DIRPYREQUALIZER;ディテール・レベルのコントラストを迂回 +EXPORT_BYPASS_DIRPYREQUALIZER;詳細レベルによるコントラスト調整を迂回 EXPORT_BYPASS_EQUALIZER;ウェーブレットのレベルを迂回 EXPORT_BYPASS_RAW_CA;[raw] 色収差補正を迂回 EXPORT_BYPASS_RAW_CCSTEPS;[raw] 偽色抑制を迂回 @@ -108,16 +127,20 @@ EXPORT_BYPASS_RAW_FF;[raw] フラットフィールドを迂回 EXPORT_BYPASS_RAW_GREENTHRESH;[raw] グリーン平衡化を迂回 EXPORT_BYPASS_RAW_LINENOISE;[raw] ラインノイズ フィルタを迂回 EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;[raw] LMMSE 拡張処理を迂回 -EXPORT_BYPASS_SHARPENEDGE;エッジ・シャープ化を迂回 -EXPORT_BYPASS_SHARPENING;シャープ化を迂回 +EXPORT_BYPASS_SHARPENEDGE;エッジ・シャープニングを迂回 +EXPORT_BYPASS_SHARPENING;シャープニングを迂回 EXPORT_BYPASS_SHARPENMICRO;マイクロコントラストを迂回 EXPORT_BYPASS_SH_HQ;シャドウ/ハイライト(高画質)を迂回 EXPORT_FASTEXPORTOPTIONS;高速書き出しオプション EXPORT_INSTRUCTIONS;現像の設定に要する時間と手間を省くために、高速書き出しを優先させるオプションです。処理速度が優先される場合や、既定の現像パラメータを変えずに何枚ものリサイズ画像が要求される場合に奨められる方法で、低解像度画像を迅速に生成します。 EXPORT_MAXHEIGHT;最大高: EXPORT_MAXWIDTH;最大幅: +EXPORT_PIPELINE;高速書き出しの方法 EXPORT_PUTTOQUEUEFAST; 高速書き出しのキューに追加 EXPORT_RAW_DMETHOD;デモザイクの方式 +EXPORT_USE_FAST_PIPELINE;処理速度優先(リサイズした画像に調整を全て行う) +EXPORT_USE_FAST_PIPELINE_TIP;処理速度を優先すると、処理は速くなりますが、画像の質は落ちます。通常、画像のリサイズは全現像処理工程の最後で行われますが、ここでは処理工程の初めの方でリサイズが行われます。処理速度は著しく上がりますが、現像処理された画像にアーティファクトが発生したり、全体的な質が低下したりします。 +EXPORT_USE_NORMAL_PIPELINE;標準(リサイズ処理は最後、幾つかの処理を迂回) EXTPROGTARGET_1;raw EXTPROGTARGET_2;キュー処理 FILEBROWSER_ADDDELTEMPLATE;テンプレートの追加/削除... @@ -128,8 +151,8 @@ FILEBROWSER_AUTOFLATFIELD;オート・フラットフィールド FILEBROWSER_BROWSEPATHBUTTONHINT;クリックで選択したパスをブラウズ FILEBROWSER_BROWSEPATHHINT;参照するパスを入力します\nCtrl-O パスのテキストボックスにフォーカス\nEnter / Ctrl-Enterその場所をブラウズします\nEsc 変更をクリア\nShift-Escフォーカスを削除\nパスのショートカット:\n ~ - ユーザーのホームディレクトリ\n ! - ユーザーの画像ディレクトリ FILEBROWSER_CACHE;cache -FILEBROWSER_CACHECLEARFROMFULL;cacheをクリア - すべて -FILEBROWSER_CACHECLEARFROMPARTIAL;cacheをクリア - 一部 +FILEBROWSER_CACHECLEARFROMFULL;プロファイルを含めcache内をクリアにする +FILEBROWSER_CACHECLEARFROMPARTIAL;プロファイルを除き、cache内をクリアにする FILEBROWSER_CLEARPROFILE;プロファイルのクリア FILEBROWSER_COLORLABEL_TOOLTIP;カラー・ラベル\n\nドロップダウン・メニューからか、ショートカット:\nShift-Ctrl-1 レッド\nShift-Ctrl-2 イエロー\nShift-Ctrl-3 グリーン\nShift-Ctrl-4 ブルー\nShift-Ctrl-5 パープル FILEBROWSER_COPYPROFILE;プロファイルをコピー @@ -146,7 +169,7 @@ FILEBROWSER_MOVETODARKFDIR;ダークフレーム・ディレクトリに移動 FILEBROWSER_MOVETOFLATFIELDDIR;フラットフィールド・ディレクトリに移動 FILEBROWSER_NEW_NAME;新しい名前: FILEBROWSER_OPENDEFAULTVIEWER;Windowsのデフォルト・ビューア(キュー処理) -FILEBROWSER_PARTIALPASTEPROFILE;プロファイルの貼り付け - 一部 +FILEBROWSER_PARTIALPASTEPROFILE;プロファイルの貼り付け - 一部 FILEBROWSER_PASTEPROFILE;プロファイルの貼り付け FILEBROWSER_POPUPCANCELJOB;ジョブ キャンセル FILEBROWSER_POPUPCOLORLABEL;カラー・ラベル @@ -168,11 +191,11 @@ FILEBROWSER_POPUPPROCESSFAST;キューに追加 (高速書き出し) FILEBROWSER_POPUPPROFILEOPERATIONS;プロファイルの操作 FILEBROWSER_POPUPRANK;ランク FILEBROWSER_POPUPRANK0;ランクなし -FILEBROWSER_POPUPRANK1;ランク 1 * +FILEBROWSER_POPUPRANK1;ランク 1 * FILEBROWSER_POPUPRANK2;ランク 2 ** -FILEBROWSER_POPUPRANK3;ランク 3 *** -FILEBROWSER_POPUPRANK4;ランク 4 **** -FILEBROWSER_POPUPRANK5;ランク 5 ***** +FILEBROWSER_POPUPRANK3;ランク 3 *** +FILEBROWSER_POPUPRANK4;ランク 4 **** +FILEBROWSER_POPUPRANK5;ランク 5 ***** FILEBROWSER_POPUPREMOVE;ファイルシステムから削除 FILEBROWSER_POPUPREMOVEINCLPROC;ファイルシステムとバッチの結果から削除 FILEBROWSER_POPUPRENAME;名前変更 @@ -189,6 +212,7 @@ FILEBROWSER_RANK3_TOOLTIP;ランク 3 *\nショートカット: Shift-3 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 @@ -201,6 +225,7 @@ FILEBROWSER_SHOWEDITEDHINT;編集済み画像を表示\nショートカット: < FILEBROWSER_SHOWEDITEDNOTHINT;未編集画像を表示\nショートカット: 6 FILEBROWSER_SHOWEXIFINFO;EXIF情報を表示\nショートカット: i\n\nシングル・エディタ・タブのショートカット: Alt-i FILEBROWSER_SHOWNOTTRASHHINT;削除されていない画像だけ表示 +FILEBROWSER_SHOWORIGINALHINT;元画像だけを表示\n\nファイル名は同じだが拡張子が異なる画像がある場合は、環境設定の中のファイルブラウザタブにある拡張子リストの上位に位置する拡張子を持った画像を元画像とする。 FILEBROWSER_SHOWRANK1HINT;1つ星ランクを表示\nショートカット: 1 FILEBROWSER_SHOWRANK2HINT;2つ星ランクを表示\nショートカット: 2 FILEBROWSER_SHOWRANK3HINT;3つ星ランクを表示\nショートカット: 3 @@ -224,11 +249,13 @@ FILECHOOSER_FILTER_SAME;現在の画像と同じフォーマット FILECHOOSER_FILTER_TIFF;TIFFファイル GENERAL_ABOUT;RawTherapeeについて.. GENERAL_AFTER;補正後 +GENERAL_APPLY;適用 GENERAL_ASIMAGE;画像通り GENERAL_AUTO;自動 GENERAL_BEFORE;補正前 GENERAL_CANCEL;キャンセル GENERAL_CLOSE;閉じる +GENERAL_CURRENT;現在 GENERAL_DISABLE;無効 GENERAL_DISABLED;無効 GENERAL_ENABLE;有効 @@ -239,16 +266,22 @@ GENERAL_NA;n/a GENERAL_NO;No GENERAL_NONE;なし GENERAL_OK;OK +GENERAL_OPEN;開く GENERAL_PORTRAIT;縦 +GENERAL_RESET;リセット GENERAL_SAVE;保存 +GENERAL_SAVE_AS;...で保存 +GENERAL_SLIDER;スライダー GENERAL_UNCHANGED;(変更なし) GENERAL_WARNING;警告 +GIMP_PLUGIN_INFO;RawTherapee GIMPプラグインにようこそ!\n画像編集終了後、単にRawTherapeeのメインウィンドウを閉じるだけで、画像が自動的にGIMPに送られます。 HISTOGRAM_TOOLTIP_B;ブルー・ヒストグラム 表示/非表示 HISTOGRAM_TOOLTIP_BAR;RGBインジケーター・バーの表示/非表示\nプレビュー画像上でマウスの右ボタンクリックで 固定/開放 HISTOGRAM_TOOLTIP_CHRO;色度・ヒストグラム 表示/非表示 HISTOGRAM_TOOLTIP_FULL;完全/縮尺調整の表示切り替え HISTOGRAM_TOOLTIP_G;グリーン・ヒストグラム 表示/非表示 HISTOGRAM_TOOLTIP_L;CIEL*a*b* 輝度・ヒストグラム 表示/非表示 +HISTOGRAM_TOOLTIP_MODE;ヒストグラムの尺度を線形、対数-線形、対数-対数でトグルします HISTOGRAM_TOOLTIP_R;レッド・ヒストグラム 表示/非表示 HISTOGRAM_TOOLTIP_RAW;rawヒストグラム 表示/非表示 HISTORY_CHANGED;変更されました @@ -268,22 +301,22 @@ HISTORY_MSG_10;シャドウ圧縮 HISTORY_MSG_11;トーンカーブ 1 HISTORY_MSG_12;自動露光補正 HISTORY_MSG_13;露光 クリッピング -HISTORY_MSG_14;L*a*b* - 明度 -HISTORY_MSG_15;L*a*b* - コントラスト +HISTORY_MSG_14;L*a*b* - 明度 +HISTORY_MSG_15;L*a*b* - コントラスト HISTORY_MSG_16;輝度 黒レベル HISTORY_MSG_17;輝度 ハイライト圧縮 HISTORY_MSG_18;輝度 シャドウ圧縮 HISTORY_MSG_19;L*a*b* - L*カーブ -HISTORY_MSG_20;シャープ化 -HISTORY_MSG_21;シャープ化 半径 -HISTORY_MSG_22;シャープ化 適用量 -HISTORY_MSG_23;シャープ化 しきい値 -HISTORY_MSG_24;シャープ化 エッジのみ -HISTORY_MSG_25;シャープ化 エッジ検出 半径 -HISTORY_MSG_26;シャープ化 エッジ許容 -HISTORY_MSG_27;シャープ化 ハロ抑制 +HISTORY_MSG_20;シャープニング +HISTORY_MSG_21;シャープニング 半径 +HISTORY_MSG_22;シャープニング 適用量 +HISTORY_MSG_23;シャープニング しきい値 +HISTORY_MSG_24;シャープニング エッジのみ +HISTORY_MSG_25;シャープニング エッジ検出 半径 +HISTORY_MSG_26;シャープニング エッジ許容 +HISTORY_MSG_27;シャープニング ハロ抑制 HISTORY_MSG_28;ハロ抑制 適用量 -HISTORY_MSG_29;シャープ化 方式 +HISTORY_MSG_29;シャープニング 方式 HISTORY_MSG_30;デコンボリューション 半径 HISTORY_MSG_31;デコンボリューション 適用量 HISTORY_MSG_32;デコンボリューション 減衰 @@ -323,9 +356,9 @@ HISTORY_MSG_65;色収差補正 HISTORY_MSG_66;ハイライト復元 HISTORY_MSG_67;ハイライト復元 量 HISTORY_MSG_68;ハイライト復元 方式 -HISTORY_MSG_69;作業カラースペース -HISTORY_MSG_70;出力カラースペース -HISTORY_MSG_71;入力カラースペース +HISTORY_MSG_69;作業色空間 +HISTORY_MSG_70;出力色空間 +HISTORY_MSG_71;入力色空間 HISTORY_MSG_72;周辺光量補正 HISTORY_MSG_73;チャンネルミキサー HISTORY_MSG_74;リサイズ スケール @@ -347,9 +380,9 @@ HISTORY_MSG_89;ノイズ低減 HISTORY_MSG_90;輝度ノイズの低減 HISTORY_MSG_91;色ノイズの低減 HISTORY_MSG_92;ノイズ低減のガンマ -HISTORY_MSG_93;ディテールのコントラスト係数 -HISTORY_MSG_94;ディテールのコントラスト -HISTORY_MSG_95;L*a*b*の色度 +HISTORY_MSG_93;詳細レベルコントラスト係数 +HISTORY_MSG_94;詳細レベルコントラスト +HISTORY_MSG_95;L*a*b* - 色度 HISTORY_MSG_96;L*a*b* - a*カーブ HISTORY_MSG_97;L*a*b* - b*カーブ HISTORY_MSG_98;デモザイク 方式 @@ -365,9 +398,9 @@ HISTORY_MSG_107;フリンジ低減 しきい値 HISTORY_MSG_108;ハイライト圧縮 しきい値 HISTORY_MSG_109;リサイズ バウンディングボックス HISTORY_MSG_110;リサイズの適用領域 -HISTORY_MSG_111;L*a*b* - 色ずれ回避 +HISTORY_MSG_111;L*a*b* - 色ずれの回避 HISTORY_MSG_112;--未使用-- -HISTORY_MSG_113;L*a*b* - レッドと肌色トーンを保護 +HISTORY_MSG_113;L*a*b* - レッドと肌色トーンを保護 HISTORY_MSG_114;DCB 反復 HISTORY_MSG_115;偽色抑制 HISTORY_MSG_116;DCB 拡張 @@ -379,7 +412,6 @@ HISTORY_MSG_121;raw 色収差 自動 HISTORY_MSG_122;ダークフレーム 自動 HISTORY_MSG_123;ダークフレーム ファイル HISTORY_MSG_124;リニア露光補正 -HISTORY_MSG_125;露光補正 HLを保持 HISTORY_MSG_126;フラットフィールド ファイル HISTORY_MSG_127;フラットフィールド 自動選択 HISTORY_MSG_128;フラットフィールド・ぼかし半径 @@ -396,12 +428,12 @@ HISTORY_MSG_138;黒レベル レッド HISTORY_MSG_139;黒レベル ブルー HISTORY_MSG_140;黒レベル グリーン 2 HISTORY_MSG_141;黒レベル グリーン 連動 -HISTORY_MSG_142;エッジ シャープ化 - 反復 -HISTORY_MSG_143;エッジ シャープ化 - 適用量 +HISTORY_MSG_142;エッジ シャープニング - 反復 +HISTORY_MSG_143;エッジ シャープニング - 適用量 HISTORY_MSG_144;マイクロコントラスト - 適用量 HISTORY_MSG_145;マイクロコントラスト - 均等 -HISTORY_MSG_146;エッジ シャープ化 -HISTORY_MSG_147;エッジ シャープ化 - 輝度のみ +HISTORY_MSG_146;エッジ シャープニング +HISTORY_MSG_147;エッジ シャープニング - 輝度のみ HISTORY_MSG_148;マイクロコントラスト HISTORY_MSG_149;マイクロコントラスト - 3×3 マトリクス HISTORY_MSG_150;デモザイク後にアーティファクトとノイズを軽減 @@ -420,12 +452,14 @@ HISTORY_MSG_162;トーンマッピング HISTORY_MSG_163;RGB カーブ - レッド HISTORY_MSG_164;RGB カーブ - グリーン HISTORY_MSG_165;RGB カーブ - ブルー +HISTORY_MSG_166;露光補正 - リセット HISTORY_MSG_167;デモザイク 方式 HISTORY_MSG_168;L*a*b* CC カーブ HISTORY_MSG_169;L*a*b* CH カーブ 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 - 観視の暗い周囲環境 @@ -455,6 +489,7 @@ HISTORY_MSG_199;CAM02 - カーブでCIECAM02出力のヒストグラムを表示 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 - 自動で順応 @@ -485,9 +520,9 @@ HISTORY_MSG_231;白黒 ‘前の‘カーブ HISTORY_MSG_232;白黒 ‘前の‘カーブのタイプ HISTORY_MSG_233;白黒 ‘後の‘カーブ HISTORY_MSG_234;白黒 ‘後の‘カーブのタイプ -HISTORY_MSG_235;白黒 オートチャンネルミキサー +HISTORY_MSG_235;白黒 チャンネルミキサー 自動 HISTORY_MSG_236;--未使用-- -HISTORY_MSG_237;白黒 ミキサー +HISTORY_MSG_237;白黒 チャンネルミキサー HISTORY_MSG_238;グラデーションフィルター フェザー処理 HISTORY_MSG_239;グラデーションフィルター 強さ HISTORY_MSG_240;グラデーションフィルター 中央 @@ -497,39 +532,40 @@ HISTORY_MSG_243;半径 HISTORY_MSG_244;ビネットフィルター 強さ HISTORY_MSG_245;ビネットフィルター 中央 HISTORY_MSG_246;L*a*b* CL カーブ -HISTORY_MSG_247;L*a*b* LH カーブ -HISTORY_MSG_248;L*a*b* HH カーブ -HISTORY_MSG_249;ディテールレベルのコントラスト - しきい値 +HISTORY_MSG_247;L*a*b* LH カーブ +HISTORY_MSG_248;L*a*b* HH カーブ +HISTORY_MSG_249;詳細レベルによるコントラスト調整 - しきい値 HISTORY_MSG_250;ノイズ低減 - 強化 HISTORY_MSG_251;白黒 - アルゴリズム -HISTORY_MSG_252;CbDL 肌色の目標/保護 -HISTORY_MSG_253;CbDL アーティファクトを軽減 -HISTORY_MSG_254;CbDL 肌色の色相 -HISTORY_MSG_255;ノイズ低減 - メディアン +HISTORY_MSG_252;CbDL 肌色の目標/保護 +HISTORY_MSG_253;CbDL アーティファクトを軽減 +HISTORY_MSG_254;CbDL 肌色の色相 +HISTORY_MSG_255;ノイズ低減 - メディアン +HISTORY_MSG_256;ノイズ低減 - フィルターの種類 HISTORY_MSG_257;カラートーン調整 -HISTORY_MSG_258;カラートーン調整 - カラーのカーブ +HISTORY_MSG_258;カラートーン調整 - カラーのカーブ HISTORY_MSG_259;カラートーン調整 - 不透明度のカーブ -HISTORY_MSG_260;カラートーン調整 - a*(b*)の不透明度 +HISTORY_MSG_260;カラートーン調整 - a*(b*)の不透明度 HISTORY_MSG_261;カラートーン調整 - 方法 HISTORY_MSG_262;カラートーン調整 - b*の不透明度 -HISTORY_MSG_263;カラートーン調整 - シャドウのレッド -HISTORY_MSG_264;カラートーン調整 - シャドウのグリーン -HISTORY_MSG_265;カラートーン調整 - シャドウのブルー +HISTORY_MSG_263;カラートーン調整 - シャドウのレッド +HISTORY_MSG_264;カラートーン調整 - シャドウのグリーン +HISTORY_MSG_265;カラートーン調整 - シャドウのブルー HISTORY_MSG_266;カラートーン調整 - 中間トーンのレッド HISTORY_MSG_267;カラートーン調整 - 中間トーンのグリーン HISTORY_MSG_268;カラートーン調整 - 中間トーンのブルー -HISTORY_MSG_269;カラートーン調整 - ハイライトのレッド -HISTORY_MSG_270;カラートーン調整 - ハイライトのグリーン -HISTORY_MSG_271;カラートーン調整 - ハイライトのブルー -HISTORY_MSG_272;カラートーン調整 - バランス -HISTORY_MSG_273;カラートーン調整 - リセット +HISTORY_MSG_269;カラートーン調整 - ハイライトのレッド +HISTORY_MSG_270;カラートーン調整 - ハイライトのグリーン +HISTORY_MSG_271;カラートーン調整 - ハイライトのブルー +HISTORY_MSG_272;カラートーン調整 - バランス +HISTORY_MSG_273;カラートーン調整 - SMHでカラーバランス HISTORY_MSG_274;カラートーン調整 - シャドウの彩度 HISTORY_MSG_275;カラートーン調整 - ハイライトの彩度 HISTORY_MSG_276;カラートーン調整 - 不透明度 HISTORY_MSG_277;カラートーン調整 - カーブをリセット HISTORY_MSG_278;カラートーン調整 - 明度を維持 HISTORY_MSG_279;カラートーン調整 - シャドウ -HISTORY_MSG_280;カラートーン調整 - ハイライト +HISTORY_MSG_280;カラートーン調整 - ハイライト HISTORY_MSG_281;カラートーン調整 - 彩度の保護 HISTORY_MSG_282;カラートーン調整 - 彩度のしきい値 HISTORY_MSG_283;カラートーン調整 - 強さを維持 @@ -546,80 +582,81 @@ HISTORY_MSG_293;フィルムシミュレーション HISTORY_MSG_294;フィルムシミュレーション - 強さ HISTORY_MSG_295;フィルムシミュレーション - フィルム HISTORY_MSG_296;輝度ノイズ低減のカーブ +HISTORY_MSG_297;ノイズ低減 - 質 HISTORY_MSG_298;デッドピクセルフィルター HISTORY_MSG_299;色ノイズ低減のカーブ HISTORY_MSG_300;- HISTORY_MSG_301;輝度ノイズの調整方法 HISTORY_MSG_302;色ノイズの調整方法 HISTORY_MSG_303;色ノイズの調整方法 -HISTORY_MSG_304;W- コントラストレベル -HISTORY_MSG_305;ウェーブレットのレベル -HISTORY_MSG_306;W- プロセス -HISTORY_MSG_307;W- プレビュー -HISTORY_MSG_308;W- プレビューの方向 -HISTORY_MSG_309;W- ES ディテール -HISTORY_MSG_310;W- 残差 青空の目標/保護 +HISTORY_MSG_304;W- コントラストレベル +HISTORY_MSG_305;ウェーブレット +HISTORY_MSG_306;W- プロセス +HISTORY_MSG_307;W- プレビュー +HISTORY_MSG_308;W- プレビューの方向 +HISTORY_MSG_309;W- ES ディテール +HISTORY_MSG_310;W- 残差 青空の目標/保護 HISTORY_MSG_311;W- ウェーブレットのレベル -HISTORY_MSG_312;W- 残差 シャドウのしきい値 -HISTORY_MSG_313;W- 色度 明星色/純色 -HISTORY_MSG_314;W- 色域 アーティファクトの軽減 -HISTORY_MSG_315;W- 残差 コントラスト -HISTORY_MSG_316;W- 色域 肌色の目標/保護 -HISTORY_MSG_317;W- 色域 肌色の色相 -HISTORY_MSG_318;W- コントラスト ハイライトレベル -HISTORY_MSG_319;W- コントラスト ハイライト範囲 -HISTORY_MSG_320;W- コントラスト シャドウ範囲 -HISTORY_MSG_321;W- コントラスト シャドウレベル -HISTORY_MSG_322;W- 色域 色ずれの回避 -HISTORY_MSG_323;W- ES ローカルコントラスト -HISTORY_MSG_324;W- 色度 明星色 -HISTORY_MSG_325;W- 色度 純色 -HISTORY_MSG_326;W- 色度 方法 -HISTORY_MSG_327;W- コントラスト 適用先 -HISTORY_MSG_328;W- 色度 リンクを強化 -HISTORY_MSG_329;W- 色調 R/Gの不透明度 -HISTORY_MSG_330;W- 色調 B/Yの不透明度 -HISTORY_MSG_331;W- コントラストレベル エキストラ -HISTORY_MSG_332;W- タイルの種類 -HISTORY_MSG_333;W- 残差 シャドウ -HISTORY_MSG_334;W- 残差 色度 -HISTORY_MSG_335;W- 残差 ハイライト -HISTORY_MSG_336;W- 残差 ハイライトのしきい値 -HISTORY_MSG_337;W- 残差 青空の色相 -HISTORY_MSG_338;W- ES 半径 -HISTORY_MSG_339;W- ES 強さ -HISTORY_MSG_340;W- 強さ -HISTORY_MSG_341;W- エッジパフォーマンス -HISTORY_MSG_342;W- ES 最初のレベル -HISTORY_MSG_343;W- 色度のレベル -HISTORY_MSG_344;W- 色度 方式 スライダー/カーブ -HISTORY_MSG_345;W- ES ローカルコントラスト -HISTORY_MSG_346;W- ES ローカルコントラスト 方式 -HISTORY_MSG_347;W- ノイズ低減とリファイン レベル1 -HISTORY_MSG_348;W- ノイズ低減とリファイン レベル2 -HISTORY_MSG_349;W- ノイズ低減とリファイン レベル3 -HISTORY_MSG_350;W- ES エッジ検出 -HISTORY_MSG_351;W- 残差 HHカーブ -HISTORY_MSG_352;W- 背景色 -HISTORY_MSG_353;W- ES グラデーション感度 -HISTORY_MSG_354;W- ES 強化 -HISTORY_MSG_355;W- ES しきい値(低) -HISTORY_MSG_356;W- ES しきい値(高) -HISTORY_MSG_357;W- ノイズ低減 ESとリンク -HISTORY_MSG_358;W- 色域 CHカーブ +HISTORY_MSG_312;W- 残差 シャドウのしきい値 +HISTORY_MSG_313;W- 色度 明清色/純色 +HISTORY_MSG_314;W- 色域 アーティファクトの軽減 +HISTORY_MSG_315;W- 残差 コントラスト +HISTORY_MSG_316;W- 色域 肌色の目標/保護 +HISTORY_MSG_317;W- 色域 肌色の色相 +HISTORY_MSG_318;W- コントラスト ハイライトレベル +HISTORY_MSG_319;W- コントラスト ハイライト範囲 +HISTORY_MSG_320;W- コントラスト シャドウ範囲 +HISTORY_MSG_321;W- コントラスト シャドウレベル +HISTORY_MSG_322;W- 色域 色ずれの回避 +HISTORY_MSG_323;W- ES ローカルコントラスト +HISTORY_MSG_324;W- 色度 明清色 +HISTORY_MSG_325;W- 色度 純色 +HISTORY_MSG_326;W- 色度 方法 +HISTORY_MSG_327;W- コントラスト 適用先 +HISTORY_MSG_328;W- 色度 リンクを強化 +HISTORY_MSG_329;W- 色調 R/Gの不透明度 +HISTORY_MSG_330;W- 色調 B/Yの不透明度 +HISTORY_MSG_331;W- コントラストレベル エキストラ +HISTORY_MSG_332;W- タイルの種類 +HISTORY_MSG_333;W- 残差 シャドウ +HISTORY_MSG_334;W- 残差 色度 +HISTORY_MSG_335;W- 残差 ハイライト +HISTORY_MSG_336;W- 残差 ハイライトのしきい値 +HISTORY_MSG_337;W- 残差 青空の色相 +HISTORY_MSG_338;W- ES 半径 +HISTORY_MSG_339;W- ES 強さ +HISTORY_MSG_340;W- 強さ +HISTORY_MSG_341;W- エッジパフォーマンス +HISTORY_MSG_342;W- ES 最初のレベル +HISTORY_MSG_343;W- 色度のレベル +HISTORY_MSG_344;W- 色度 方式 スライダー/カーブ +HISTORY_MSG_345;W- ES ローカルコントラスト +HISTORY_MSG_346;W- ES ローカルコントラスト 方式 +HISTORY_MSG_347;W- ノイズ低減とリファイン レベル1 +HISTORY_MSG_348;W- ノイズ低減とリファイン レベル2 +HISTORY_MSG_349;W- ノイズ低減とリファイン レベル3 +HISTORY_MSG_350;W- ES エッジ検出 +HISTORY_MSG_351;W- 残差 HHカーブ +HISTORY_MSG_352;W- 背景色 +HISTORY_MSG_353;W- ES グラデーション感度 +HISTORY_MSG_354;W- ES 強化 +HISTORY_MSG_355;W- ES しきい値(低) +HISTORY_MSG_356;W- ES しきい値(高) +HISTORY_MSG_357;W- ノイズ低減 ESとリンク +HISTORY_MSG_358;W- 色域 CHカーブ HISTORY_MSG_359;ホット/デッド しきい値 HISTORY_MSG_360;トーンマッピング ガンマ -HISTORY_MSG_361;W- 最終 色度バランス -HISTORY_MSG_362;W- 残差 圧縮の方法 -HISTORY_MSG_363;W- 残差 圧縮の強さ -HISTORY_MSG_364;W- 最終 コントラストバランス -HISTORY_MSG_365;W- 最終 デルタバランス -HISTORY_MSG_366;W- 残差 圧縮のガンマ -HISTORY_MSG_367;W- ES ローカルコントラストカーブ -HISTORY_MSG_368;W- 最終 コントラストバランス -HISTORY_MSG_369;W- 最終 バランスの方法 -HISTORY_MSG_370;W- 最終 ローカルコントラストカーブ -HISTORY_MSG_371;リサイズ後のシャープ化(PRS) +HISTORY_MSG_361;W- 最終 色度バランス +HISTORY_MSG_362;W- 残差 圧縮の方法 +HISTORY_MSG_363;W- 残差 圧縮の強さ +HISTORY_MSG_364;W- 最終 コントラストバランス +HISTORY_MSG_365;W- 最終 デルタバランス +HISTORY_MSG_366;W- 残差 圧縮のガンマ +HISTORY_MSG_367;W- ES ローカルコントラストカーブ +HISTORY_MSG_368;W- 最終 コントラストバランス +HISTORY_MSG_369;W- 最終 バランスの方法 +HISTORY_MSG_370;W- 最終 ローカルコントラストカーブ +HISTORY_MSG_371;リサイズ後のシャープニング(PRS) HISTORY_MSG_372;PRS アンシャープマスク - 半径 HISTORY_MSG_373;PRS アンシャープマスク - 適用量 HISTORY_MSG_374;PRS アンシャープマスク - しきい値 @@ -640,7 +677,7 @@ HISTORY_MSG_388;W - 残差 - CB 中間のグリーン HISTORY_MSG_389;W - 残差 - CB 中間のブルー HISTORY_MSG_390;W - 残差 - CB シャドウのグリーン HISTORY_MSG_391;W - 残差 - CB シャドウのブルー -HISTORY_MSG_392;W - 残差 - CB リセット +HISTORY_MSG_392;W - 残差 - カラーバランス HISTORY_MSG_393;DCP - ルックテーブル HISTORY_MSG_394;DCP - 基本露出 HISTORY_MSG_395;DCP - ベーステーブル @@ -655,34 +692,223 @@ HISTORY_MSG_403;W - ES - エッジ検出の感度 HISTORY_MSG_404;W - ES - 基底値の増幅 HISTORY_MSG_405;W - ノイズ低減とリファイン レベル4 HISTORY_MSG_406;W - ES - 隣接するピクセルに対する効果 +HISTORY_MSG_407;レティネックス - 方式 +HISTORY_MSG_408;レティネックス - 半径 +HISTORY_MSG_409;レティネックス - コントラスト +HISTORY_MSG_410;レティネックス - 明るさ +HISTORY_MSG_411;レティネックス - 強さ +HISTORY_MSG_412;レティネックス - ガウス暈しのグラデーション +HISTORY_MSG_413;レティネックス - 差異 +HISTORY_MSG_414;レティネックス - ヒストグラム - Lab +HISTORY_MSG_415;レティネックス - 透過 +HISTORY_MSG_416;レティネックス +HISTORY_MSG_417;レティネックス - 透過メディアンフィルタ +HISTORY_MSG_418;レティネックス - しきい値 +HISTORY_MSG_419;レティネックス - 色空間 +HISTORY_MSG_420;レティネックス - ヒストグラム - HSL +HISTORY_MSG_421;レティネックス - ガンマ +HISTORY_MSG_422;レティネックス - ガンマ +HISTORY_MSG_423;レティネックス - 勾配 +HISTORY_MSG_424;レティネックス - HLしきい値 +HISTORY_MSG_425;レティネックス - 対数の基数 +HISTORY_MSG_426;レティネックス - 色相イコライザ +HISTORY_MSG_427;出力レンダリングの意図 +HISTORY_MSG_428;モニターレンダリングの意図 +HISTORY_MSG_429;レティネックス - 繰り返し +HISTORY_MSG_430;レティネックス - 透過のグラデーション +HISTORY_MSG_431;レティネックス - 強さのグラデーション +HISTORY_MSG_432;レティネックス - M - ハイライト +HISTORY_MSG_433;レティネックス - M - ハイライト TW +HISTORY_MSG_434;レティネックス - M - シャドウ +HISTORY_MSG_435;レティネックス - M - シャドウ TW +HISTORY_MSG_436;レティネックス - M - 半径 +HISTORY_MSG_437;レティネックス - M - 方式 +HISTORY_MSG_438;レティネックス - M - イコライザ +HISTORY_MSG_439;レティネックス - プロセス +HISTORY_MSG_440;詳細レベルコントラスト - 適用 +HISTORY_MSG_441;レティネックス - 透過率の増加 +HISTORY_MSG_442;レティネックス - スケール +HISTORY_MSG_443;出力のブラックポイント補正 +HISTORY_MSG_444;WB - 色温度のバイアス +HISTORY_MSG_445;Raw サブイメージ +HISTORY_MSG_449;PS - ISOへの適合 +HISTORY_MSG_452;PS - モーションを表示 +HISTORY_MSG_453;PS - マスクだけを表示 +HISTORY_MSG_457;PS - レッド/ブルーを確認 +HISTORY_MSG_462;PS - グリーンを確認 +HISTORY_MSG_464;PS - モーションマスクをぼかす +HISTORY_MSG_465;PS - ぼかしの半径 +HISTORY_MSG_468;PS - 穴を埋める +HISTORY_MSG_469;PS - メディアン +HISTORY_MSG_471;PS - 振れの補正 +HISTORY_MSG_472;PS - 境界を滑らかにする +HISTORY_MSG_473;PS - LMMSEを使う +HISTORY_MSG_474;PS - 均等化 +HISTORY_MSG_475;PS - 色チャンネルの均等化 +HISTORY_MSG_476;CAM02 - 観視環境の色温度 +HISTORY_MSG_477;CAM02 - 観視環境の色偏差 +HISTORY_MSG_478;CAM02 - 観視環境のYb +HISTORY_MSG_479;CAM02 - 観視環境のCAT02 +HISTORY_MSG_480;CAM02 - 観視環境のCAT02 自動 +HISTORY_MSG_481;CAM02 - 撮影環境の色温度 +HISTORY_MSG_482;CAM02 - 撮影環境の色偏差 +HISTORY_MSG_483;CAM02 - 撮影環境のYb +HISTORY_MSG_484;CAM02 - 撮影環境のYb 自動 +HISTORY_MSG_485;レンズ補正 +HISTORY_MSG_486;レンズ補正 - カメラ +HISTORY_MSG_487;レンズ補正 - レンズ +HISTORY_MSG_488;ダイナミックレンジ圧縮 +HISTORY_MSG_489;DRC - CbDL +HISTORY_MSG_490;DRC - 量 +HISTORY_MSG_491;ホワイトバランス +HISTORY_MSG_492;RGBカーブ +HISTORY_MSG_493;L*a*b*調整 +HISTORY_MSG_CLAMPOOG;色域外の色を切り取る +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - カラー補正 +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - 色の補正 +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - 色チャンネル +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - 色度のマスク +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - 色相のマスク +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - 明度 +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - 輝度のマスク +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - リスト +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - マスクぼかし +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - オフセット +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - 強化 +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - 彩度 +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - マスクの表示 +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - スロープ +HISTORY_MSG_DEHAZE_DEPTH;霞除去 - 深度 +HISTORY_MSG_DEHAZE_ENABLED;霞除去 +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;霞除去 - 深度マップの表示 +HISTORY_MSG_DEHAZE_STRENGTH;霞除去 - 強さ +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;デュアルデモザイク - 自動しきい値 +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - コントラストのしきい値 +HISTORY_MSG_HISTMATCHING;トーンカーブの自動調節 +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;出力 - プライマリ +HISTORY_MSG_ICM_OUTPUT_TEMP;出力 - ICC-v4 光源 D +HISTORY_MSG_ICM_OUTPUT_TYPE;出力 - タイプ +HISTORY_MSG_ICM_WORKING_GAMMA;作業色空間 - ガンマ +HISTORY_MSG_ICM_WORKING_SLOPE;作業色空間 - 勾配 +HISTORY_MSG_ICM_WORKING_TRC_METHOD;作業色空間 - TRCの方式 +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_MICROCONTRAST_CONTRAST;マイクロコントラスト - コントラストのしきい値 +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - 振れに対するデモザイクの方式 +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;ラインノイズフィルタの方向 +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - コントラストのしきい値 +HISTORY_MSG_RAWCACORR_AUTOIT;Rawの色収差補正 - 繰り返し +HISTORY_MSG_RAWCACORR_COLORSHIFT;Rawの色収差補正 - 色ずれを回避 +HISTORY_MSG_RAW_BORDER;Rawの境界 +HISTORY_MSG_RESIZE_ALLOWUPSCALING;リサイズ - アップスケーリングを可能にする +HISTORY_MSG_SHARPENING_BLUR;シャープニング - ぼかしの半径 +HISTORY_MSG_SHARPENING_CONTRAST;シャープニング - コントラストのしきい値 +HISTORY_MSG_SH_COLORSPACE;S/H - 色空間 +HISTORY_MSG_SOFTLIGHT_ENABLED;ソフトライト +HISTORY_MSG_SOFTLIGHT_STRENGTH;ソフトライト - 強さ +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - アンカー HISTORY_NEWSNAPSHOT;追加 HISTORY_NEWSNAPSHOT_TOOLTIP;ショートカット: Alt-s HISTORY_SNAPSHOT;スナップショット HISTORY_SNAPSHOTS;スナップショット +ICCPROFCREATOR_COPYRIGHT;著作権: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;デフォルトの著作権にリセットする、”RawTherapee CC0”を承諾する +ICCPROFCREATOR_CUSTOM;カスタム +ICCPROFCREATOR_DESCRIPTION;記述: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;ガンマと勾配の値を記述に加える +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;デフォルトの記述をセットするために空にしておく +ICCPROFCREATOR_GAMMA;ガンマ +ICCPROFCREATOR_ICCVERSION;ICCのバージョン: +ICCPROFCREATOR_ILL;光源: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;デフォルト +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;ICC v4プロファイルに関する光源だけを設定することができます +ICCPROFCREATOR_PRIMARIES;プライマリ: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;ブルー X +ICCPROFCREATOR_PRIM_BLUY;ブルー Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;グリーン X +ICCPROFCREATOR_PRIM_GREY;グリーン Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;レッド X +ICCPROFCREATOR_PRIM_REDY;レッド Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;ICC v4プロファイルに関するカスタムプライマリーを設定することが出来ます +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;...でICCプロファイルを保存 +ICCPROFCREATOR_SLOPE;勾配 +ICCPROFCREATOR_TRC_PRESET;トーン再現カーブ: IPTCPANEL_CATEGORY;カテゴリ +IPTCPANEL_CATEGORYHINT;画像の意図 IPTCPANEL_CITY;都市 +IPTCPANEL_CITYHINT;撮影地(市) IPTCPANEL_COPYHINT;IPTC設定をクリップボードにコピー +IPTCPANEL_COPYRIGHT;著作権 +IPTCPANEL_COPYRIGHTHINT;画像の著作権を入力、例 @2008 Jane Doe IPTCPANEL_COUNTRY;撮影国 +IPTCPANEL_COUNTRYHINT;撮影地(国) +IPTCPANEL_CREATOR;作成者 +IPTCPANEL_CREATORHINT;画像作成者の名前を入力 +IPTCPANEL_CREATORJOBTITLE;作成者の職業 +IPTCPANEL_CREATORJOBTITLEHINT;作成者の職業を入力 IPTCPANEL_CREDIT;クレジット IPTCPANEL_CREDITHINT;所有者/作成者に限らず、画像の提供元の識別 (クレジット). IPTCPANEL_DATECREATED;作成日 +IPTCPANEL_DATECREATEDHINT;撮影日 +IPTCPANEL_DESCRIPTION;画像の解説 +IPTCPANEL_DESCRIPTIONHINT;撮影されている人や物、撮影理由などの解説を入力 +IPTCPANEL_DESCRIPTIONWRITER;解説者 +IPTCPANEL_DESCRIPTIONWRITERHINT;解説の記入、編集、修正を行った人の名前を入力 IPTCPANEL_EMBEDDED;埋め込み IPTCPANEL_EMBEDDEDHINT;画像に埋め込まれたIPTCデータにリセット IPTCPANEL_HEADLINE;見出し +IPTCPANEL_HEADLINEHINT;公開できる撮影画像の概略、或いはコメントを入力 IPTCPANEL_INSTRUCTIONS;編集注記 +IPTCPANEL_INSTRUCTIONSHINT;著作権以外で禁止、或いは保護されている情報を入力 IPTCPANEL_KEYWORDS;キーワード +IPTCPANEL_KEYWORDSHINT;画像のテーマに関わる、キーワードや用語、フレーズを入力 IPTCPANEL_PASTEHINT;IPTC設定をクリップボードから貼り付け +IPTCPANEL_PROVINCE;県或いは州 +IPTCPANEL_PROVINCEHINT;撮影が行われた県或いは州の名前を入力 IPTCPANEL_RESET;リセット IPTCPANEL_RESETHINT;デフォルトのプロファイルにリセット IPTCPANEL_SOURCE;ソース +IPTCPANEL_SOURCEHINT;画像のサプライチェーンに関わっている、例えば、画像の送り主、人物或いは企業の名前を入力或いは編集 +IPTCPANEL_SUPPCATEGORIES;補足事項 +IPTCPANEL_SUPPCATEGORIESHINT;撮影の動機に関する更なる補足説明 IPTCPANEL_TITLE;タイトル +IPTCPANEL_TITLEHINT;画像を短く表す言葉や撮影者名、或いは画像のタイトルでもよい +IPTCPANEL_TRANSREFERENCE;作業のID +IPTCPANEL_TRANSREFERENCEHINT;作業工程の管理やトラッキングのための画像の数字或いは識別 +LENSPROFILE_LENS_WARNING;注意:レンズプロファイルに関する切り抜きの因数がカメラの因数より大きいと、誤った結果になるかもしれません MAIN_BUTTON_FULLSCREEN;フルスクリーン +MAIN_BUTTON_ICCPROFCREATOR;ICCプロファイルクリエーター MAIN_BUTTON_NAVNEXT_TOOLTIP;エディタで開いている画像に対応する次の画像に移動します\nショートカット: Shift-F4\n\nファイルブラウザで選択したサムネイルに対応する次の画像に移動するには\nショートカット: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;エディタで開いている画像に対応する前の画像に移動します\nショートカット: Shift-F3\n\nファイルブラウザで選択したサムネイルに対応する前の画像に移動するには\nショートカット: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;現在開いている画像のサムネイルを明示しエディタとファイルブラウザを同期させ、ファイルブラウザでのフィルタをクリアします \nショートカット: x\n\n上記と同じですが、ファイルブラウザでのフィルタをクリアしません\nショートカット: y\n(除外する場合、開いているファイルのサムネイルが表示されませんので注意してください). 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;フルスクリーン解除 @@ -708,16 +934,21 @@ MAIN_MSG_OPERATIONCANCELLED;操作キャンセル MAIN_MSG_PATHDOESNTEXIST;パス\n\n%1\n\がありません。設定ウィンドウで正しいパスを設定してください MAIN_MSG_QOVERWRITE;上書きしますか? MAIN_MSG_SETPATHFIRST;この関数を使用するには、最初に環境設定でターゲット・パスを設定する必要があります! +MAIN_MSG_TOOMANYOPENEDITORS;編集画面が多すぎます\n操作を続けるには何れかの画面を閉じてください MAIN_MSG_WRITEFAILED;書き込みに失敗しました\n\n"%1"\n\nフォルダが在るか書き込み権限を持っているか確認してください +MAIN_TAB_ADVANCED;高度な機能 +MAIN_TAB_ADVANCED_TOOLTIP;ショートカット: Alt-w MAIN_TAB_COLOR;カラー MAIN_TAB_COLOR_TOOLTIP;ショートカット: Alt-c -MAIN_TAB_DETAIL;ディテール +MAIN_TAB_DETAIL;CbDL MAIN_TAB_DETAIL_TOOLTIP;ショートカット: Alt-d -MAIN_TAB_DEVELOP;現像 +MAIN_TAB_DEVELOP;一括編集 MAIN_TAB_EXIF;Exif -MAIN_TAB_EXPORT; 書き出し +MAIN_TAB_EXPORT;高速書き出し MAIN_TAB_EXPOSURE;露光 MAIN_TAB_EXPOSURE_TOOLTIP;ショートカット: Alt-e +MAIN_TAB_FAVORITES;お気に入り +MAIN_TAB_FAVORITES_TOOLTIP;ショートカット: Alt-u MAIN_TAB_FILTER;絞り込み MAIN_TAB_INSPECT;カメラ出しJPEG MAIN_TAB_IPTC;IPTC @@ -727,11 +958,10 @@ MAIN_TAB_RAW;raw MAIN_TAB_RAW_TOOLTIP;ショートカット: Alt-r MAIN_TAB_TRANSFORM;変形 MAIN_TAB_TRANSFORM_TOOLTIP;ショートカット: Alt-t -MAIN_TAB_WAVELET;ウェーブレット -MAIN_TAB_WAVELET_TOOLTIP;ショートカット: Alt-w MAIN_TOOLTIP_BACKCOLOR0;プレビューの背景色を指定します: テーマに基づく\nショートカット: 9 MAIN_TOOLTIP_BACKCOLOR1;プレビューの背景色を指定します: \nショートカットt: 9 MAIN_TOOLTIP_BACKCOLOR2;プレビューの背景色を指定します: \nショートカット: 9 +MAIN_TOOLTIP_BACKCOLOR3;プレビューの背景色を指定します: 中間のグレー\nショートカット: 9 MAIN_TOOLTIP_BEFOREAFTERLOCK;固定 / 固定解除 - 補正前 の表示設定\n\n固定: 補正前をそのまま表示し変更されません\n複数のツールの累積効果を評価するのに役立ちます\nさらに、比較は履歴上のどこからでも行うことができます\n\n固定解除: 現在使用のツールの効果が 補正後 に表示され、その1段階前が 補正前 に表示されます MAIN_TOOLTIP_HIDEHP;左パネル 表示/非表示 (履歴含む)\nショートカット: l MAIN_TOOLTIP_INDCLIPPEDH;ハイライト・クリッピング領域の表示\nショートカット: < @@ -741,12 +971,14 @@ MAIN_TOOLTIP_PREVIEWFOCUSMASK;フォーカス・マスク表示\nショ 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_PREVIEWSHARPMASK;プレビューで見るシャープニング機能のコントラストマスク\nショートカット: p\n\nこの機能が使えるのはシャープニング機能が有効で、画像が100%以上に拡大されている場合だけ MAIN_TOOLTIP_QINFO;画像の情報\nショートカット: i MAIN_TOOLTIP_SHOWHIDELP1;表示/非表示 左パネル\nショートカット: l MAIN_TOOLTIP_SHOWHIDERP1;表示/非表示 右パネル\nショートカット: Alt-l MAIN_TOOLTIP_SHOWHIDETP1;表示/非表示 上パネル\nショートカット: Shift-L MAIN_TOOLTIP_THRESHOLD;しきい値 MAIN_TOOLTIP_TOGGLE;補正前/補正後 切り替え\nショートカット: Shift-b +MONITOR_PROFILE_SYSTEM;システムのデフォルト NAVIGATOR_B;B: NAVIGATOR_G;G: NAVIGATOR_H;H: @@ -758,9 +990,11 @@ NAVIGATOR_R;R: NAVIGATOR_S;S: NAVIGATOR_V;V: NAVIGATOR_XY_FULL;幅 = %1, 高さ = %2 -NAVIGATOR_XY_NA;x = n/a, y = n/a +NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;付属のプロファイル "%1"が見つかりません\n\nインストールされたプロファイルが損傷しているかもしれません\n\nその場合はデフォルトの値が使われます OPTIONS_DEFIMG_MISSING;rawではない画像のデフォルプロファイルが見つからないか、設定されていません\n\nプロファイル・ディレクトリを確認してください、存在しないか破損しているかもしれません\n\nデフォルト設定値が使用されます OPTIONS_DEFRAW_MISSING;raw画像のデフォル・プロファイルが見つからないか、設定されていません\n\nプロファイル・ディレクトリを確認してください、存在しないか破損しているかもしれません\n\nデフォルト設定値が使用されます +PARTIALPASTE_ADVANCEDGROUP;高度な設定 PARTIALPASTE_BASICGROUP;基本設定 PARTIALPASTE_CACORRECTION;色収差補正 PARTIALPASTE_CHANNELMIXER;チャンネル・ミキサー @@ -775,13 +1009,14 @@ PARTIALPASTE_CROP;切り抜き PARTIALPASTE_DARKFRAMEAUTOSELECT;ダークフレーム自動選択 PARTIALPASTE_DARKFRAMEFILE;ダークフレーム・ファイル PARTIALPASTE_DEFRINGE;フリンジ低減 +PARTIALPASTE_DEHAZE;霞除去 PARTIALPASTE_DETAILGROUP;ディテールの設定 PARTIALPASTE_DIALOGLABEL;処理プロファイルの部分ペースト PARTIALPASTE_DIRPYRDENOISE;ノイズ低減 -PARTIALPASTE_DIRPYREQUALIZER;ディテール・レベルのコントラスト +PARTIALPASTE_DIRPYREQUALIZER;詳細レベルによるコントラスト調整 PARTIALPASTE_DISTORTION;歪曲補正 PARTIALPASTE_EPD;トーンマッピング -PARTIALPASTE_EQUALIZER;ウェーブレットイコライザ +PARTIALPASTE_EQUALIZER;ウェーブレット PARTIALPASTE_EVERYTHING;すべて PARTIALPASTE_EXIFCHANGES;exifデータを変える PARTIALPASTE_EXPOSURE;露光量 @@ -799,6 +1034,8 @@ PARTIALPASTE_IPTCINFO;IPTC 情報 PARTIALPASTE_LABCURVE;L*a*b* 調整 PARTIALPASTE_LENSGROUP;レンズ設定 PARTIALPASTE_LENSPROFILE;レンズ補正プロファイル +PARTIALPASTE_LOCALCONTRAST;ローカルコントラスト +PARTIALPASTE_METADATA;メタデータモード PARTIALPASTE_METAGROUP;メタデータ PARTIALPASTE_PCVIGNETTE;ビネットフィルター PARTIALPASTE_PERSPECTIVE;パースペクティブの補正 @@ -806,36 +1043,45 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;デッドピクセルフィルターを適 PARTIALPASTE_PREPROCESS_GREENEQUIL;グリーン 平衡化 PARTIALPASTE_PREPROCESS_HOTPIXFILT;ホットピクセルフィルターを適用 PARTIALPASTE_PREPROCESS_LINEDENOISE;ラインノイズ フィルタ +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF ラインフィルタ +PARTIALPASTE_PRSHARPENING;リサイズ後のシャープニング PARTIALPASTE_RAWCACORR_AUTO;自動色収差補正 +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA 色ずれを回避 +PARTIALPASTE_RAWCACORR_CAREDBLUE;色収差 レッドとブルー PARTIALPASTE_RAWEXPOS_BLACK;黒レベル PARTIALPASTE_RAWEXPOS_LINEAR;raw ホワイトポイント リニア補正係数 -PARTIALPASTE_RAWEXPOS_PRESER;raw ホワイトポイント ハイライトを保持したまま補正 (EV) PARTIALPASTE_RAWGROUP;raw 設定 +PARTIALPASTE_RAW_BORDER;Rawの境界 PARTIALPASTE_RAW_DCBENHANCE;DCB 拡張処理適用 PARTIALPASTE_RAW_DCBITERATIONS;DCB反復の数 PARTIALPASTE_RAW_DMETHOD;デモザイクの方法 PARTIALPASTE_RAW_FALSECOLOR;デモザイク 偽色の +PARTIALPASTE_RAW_IMAGENUM;サブイメージ PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE 拡張処理 +PARTIALPASTE_RAW_PIXELSHIFT;ピクセルシフト PARTIALPASTE_RESIZE;リサイズ +PARTIALPASTE_RETINEX;レティネックス PARTIALPASTE_RGBCURVES;RGB カーブ PARTIALPASTE_ROTATION;回転 PARTIALPASTE_SHADOWSHIGHLIGHTS;シャドウ/ハイライト PARTIALPASTE_SHARPENEDGE;エッジ -PARTIALPASTE_SHARPENING;シャープ化 (USM/RL) +PARTIALPASTE_SHARPENING;シャープニング (USM/RL) PARTIALPASTE_SHARPENMICRO;マイクロコントラスト +PARTIALPASTE_SOFTLIGHT;ソフトな明るさ +PARTIALPASTE_TM_FATTAL;ダイナミックレンジ圧縮 PARTIALPASTE_VIBRANCE;自然な彩度 PARTIALPASTE_VIGNETTING;周辺光量補正 -PARTIALPASTE_WAVELETGROUP;ウェーブレット処理 PARTIALPASTE_WHITEBALANCE;ホワイトバランス PREFERENCES_ADD;追加 +PREFERENCES_APPEARANCE;外観 +PREFERENCES_APPEARANCE_COLORPICKERFONT;カラーピッカーのフォント +PREFERENCES_APPEARANCE_CROPMASKCOLOR;切り抜きのマスクカラー +PREFERENCES_APPEARANCE_MAINFONT;メインフォント +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;ナビゲーターのガイドカラー +PREFERENCES_APPEARANCE_THEME;テーマ PREFERENCES_APPLNEXTSTARTUP;要再起動 -PREFERENCES_AUTLISLOW;低 -PREFERENCES_AUTLISMAX;最大 - 全タイルの平均 -PREFERENCES_AUTLISSTD;高 -PREFERENCES_AUTLISVLOW;なし -PREFERENCES_AUTLOW;低 PREFERENCES_AUTOMONPROFILE;OSのメインモニター・プロファイルを使用 -PREFERENCES_AUTSTD;標準 +PREFERENCES_AUTOSAVE_TP_OPEN;プログラム終了時の機能パネルの開閉状態を保存 PREFERENCES_BATCH_PROCESSING;バッチ処理 PREFERENCES_BEHADDALL;すべて '追加' PREFERENCES_BEHADDALLHINT;すべてのパラメータを 追加モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に加算されます @@ -843,20 +1089,25 @@ PREFERENCES_BEHAVIOR;ビヘイビア PREFERENCES_BEHSETALL;すべて '設定' PREFERENCES_BEHSETALLHINT;すべてのパラメータを 設定モードにします\nバッチツールパネルで設定される調整値が、各画像の既定値に取って代わり同一になります PREFERENCES_BLACKBODY;タングステン -PREFERENCES_CACHECLEARALL;すべてクリア -PREFERENCES_CACHECLEARPROFILES;プロファイルのクリア -PREFERENCES_CACHECLEARTHUMBS;サムネイルのクリア -PREFERENCES_CACHEMAXENTRIES;キャッシュエントリーの最大数 +PREFERENCES_CACHECLEAR;クリア +PREFERENCES_CACHECLEAR_ALL;cacheに入れられたファイルを全てクリア: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;cacheに入れた処理プロファイル以外をクリア: +PREFERENCES_CACHECLEAR_ONLYPROFILES;cacheに入れた処理プロファイルだけをクリア: +PREFERENCES_CACHECLEAR_SAFETY;casheに入れたファイルだけをクリア。元画像に付随した処理プロファイルはそのまま +PREFERENCES_CACHEMAXENTRIES;cacheに入れるファイルの最大数 PREFERENCES_CACHEOPTS;cache オプション PREFERENCES_CACHETHUMBHEIGHT;サムネイル縦の最大値 -PREFERENCES_CIEART;CIECAM02 最適化 -PREFERENCES_CIEART_FRAME;CIECAM02-特定の設定 -PREFERENCES_CIEART_LABEL;倍精度の代わりに単精度浮動小数点を使用 -PREFERENCES_CIEART_TOOLTIP;有効にした場合、 CIECAM02は倍精度浮動小数点形式の代わりに単精度で実行されます。これは品質を少し犠牲にし、速度を少し増加させます PREFERENCES_CLIPPINGIND;クリッピング領域の表示 PREFERENCES_CLUTSCACHE;HaldCLUT cache -PREFERENCES_CLUTSCACHE_LABEL;cacheに置けるHaldCLUTの最大数 +PREFERENCES_CLUTSCACHE_LABEL;cacheに入れるHaldCLUTの最大数 PREFERENCES_CLUTSDIR;HaldCLUTのディレクトリー +PREFERENCES_CMMBPC;ブラックポイントの補正 +PREFERENCES_CROP;切り抜き画像の編集 +PREFERENCES_CROP_AUTO_FIT;切り抜き画像を自動的に拡大します +PREFERENCES_CROP_GUIDES;切り抜き画像が編集されていない時はガイドを表示します +PREFERENCES_CROP_GUIDES_FRAME;フレーム +PREFERENCES_CROP_GUIDES_FULL;元画像 +PREFERENCES_CROP_GUIDES_NONE;なし PREFERENCES_CURVEBBOXPOS;カーブのコピーペイストボタンの位置 PREFERENCES_CURVEBBOXPOS_ABOVE;上 PREFERENCES_CURVEBBOXPOS_BELOW;下 @@ -868,8 +1119,8 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;キーフォーマット PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;名前 PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;タグID PREFERENCES_CUSTPROFBUILDPATH;実行ファイルのパス -PREFERENCES_CUTOVERLAYBRUSH;切り抜きマスクカラー 不透明度 PREFERENCES_D50;5000K +PREFERENCES_D50_OLD;5000k PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K @@ -878,19 +1129,18 @@ PREFERENCES_DARKFRAMESHOTS;ショット PREFERENCES_DARKFRAMETEMPLATES;テンプレート PREFERENCES_DATEFORMAT;日付の形式 PREFERENCES_DATEFORMATHINT;次の書式を使用することができます:\n%y : 年\n%m : 月\n%d : 日\n\n例として, ハンガリアン記法の日付:\n%y/%m/%d -PREFERENCES_DAUB_LABEL;ドビッシー関数のタイプ D4の代わりにD6を使う -PREFERENCES_DAUB_TOOLTIP;ノイズ低減とウェーブレットのレベルツールはマザーウェーブレットにドビッシーを使っています。このタイプでD4の代わりにD6を選択すると、直交系であるドビッシーの係数が増えるので、恐らくスケールの小さいレベルは質が向上するでしょう。タイプを変えても処理時間やメモリー使用量に影響はありません。 PREFERENCES_DIRDARKFRAMES;ダークフレーム・ディレクトリ +PREFERENCES_DIRECTORIES;ディレクトリ PREFERENCES_DIRHOME;ホーム・ディレクトリ PREFERENCES_DIRLAST;最近参照したディレクトリ PREFERENCES_DIROTHER;他 PREFERENCES_DIRSELECTDLG;起動時の画像ディレクトリ選択... PREFERENCES_DIRSOFTWARE;インストール・ディレクトリ +PREFERENCES_EDITORCMDLINE;カスタムコマンドライン PREFERENCES_EDITORLAYOUT;編集 レイアウト -PREFERENCES_EXPAUT;高度 PREFERENCES_EXTERNALEDITOR;外部エディタ PREFERENCES_FBROWSEROPTS;ファイルブラウザ/サムネイルのオプション -PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;ファイルブラウザでの一行のツールバー (低解像度表示用に選択解除) +PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;ファイルブラウザのツールバーを圧縮 PREFERENCES_FILEFORMAT;ファイル形式 PREFERENCES_FLATFIELDFOUND;検出 PREFERENCES_FLATFIELDSDIR;フラットフィールド・ディレクトリ @@ -909,6 +1159,7 @@ 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_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 @@ -930,13 +1181,9 @@ PREFERENCES_INTENT_PERCEPTUAL;知覚的 PREFERENCES_INTENT_RELATIVE;相対的な色域を維持 PREFERENCES_INTENT_SATURATION;彩度 PREFERENCES_INTERNALTHUMBIFUNTOUCHED;rawファイルが未編集の場合 JPEGのサムネイルを表示 +PREFERENCES_LANG;言語 PREFERENCES_LANGAUTODETECT;OSの言語設定を使用 -PREFERENCES_LEVAUTDN;ノイズ低減のレベル -PREFERENCES_LEVDN;セルのサイズ -PREFERENCES_LISS;自動(多分割スムージング) -PREFERENCES_MAX;最大(タイル) PREFERENCES_MAXRECENTFOLDERS;直近のフォルダーの最大数 -PREFERENCES_MED;中 (タイルの半分) PREFERENCES_MENUGROUPEXTPROGS;"..で開く"のグループ PREFERENCES_MENUGROUPFILEOPERATIONS;"ファイル操作"のグループ PREFERENCES_MENUGROUPLABEL;"カラーラベル"のグループ @@ -944,12 +1191,13 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;"処理プロファイル操作"のグル PREFERENCES_MENUGROUPRANK;"ランキング"のグループ PREFERENCES_MENUOPTIONS;メニューオプションの状況 PREFERENCES_METADATA;メタデータ -PREFERENCES_MIN;最小 (100x115) +PREFERENCES_MONINTENT;デフォルトのモニターインテント +PREFERENCES_MONITOR;モニター +PREFERENCES_MONPROFILE;デフォルトのモニタープロファイル +PREFERENCES_MONPROFILE_WARNOSX;MacのOSの制約により、サポート出来るのはsRGBだけです PREFERENCES_MULTITAB;マルチ編集タブモード PREFERENCES_MULTITABDUALMON;独自のウィンドウモードによるマルチ編集タブ -PREFERENCES_NAVGUIDEBRUSH;ナビゲーターのガイドカラー PREFERENCES_NAVIGATIONFRAME;ナビゲーション -PREFERENCES_NOISE;ノイズ低減 PREFERENCES_OUTDIR;出力ディレクトリ PREFERENCES_OUTDIRFOLDER;フォルダに保存 PREFERENCES_OUTDIRFOLDERHINT;選択したフォルダに画像を保存します @@ -963,62 +1211,64 @@ PREFERENCES_PARSEDEXT;拡張子 PREFERENCES_PARSEDEXTADD;拡張子の追加 PREFERENCES_PARSEDEXTADDHINT;拡張子を記入し このボタンでリストに追加します PREFERENCES_PARSEDEXTDELHINT;選択した拡張子をリストから削除します +PREFERENCES_PARSEDEXTDOWNHINT;選択した拡張子をリストの下に移動 +PREFERENCES_PARSEDEXTUPHINT;選択した拡張子をリストの上に移動 +PREFERENCES_PERFORMANCE_THREADS;スレッド +PREFERENCES_PERFORMANCE_THREADS_LABEL;ノイズ低減とウェーブレットレベルに関するスレッドの最大数(0 = 自動) PREFERENCES_PREVDEMO;プレビューのデモザイク方式 PREFERENCES_PREVDEMO_FAST;Fast PREFERENCES_PREVDEMO_LABEL;プレビューのズームレベルが100%以下の場合に使うデモザイクアルゴリズム: PREFERENCES_PREVDEMO_SIDECAR;PP3の記述通り +PREFERENCES_PRINTER;プリンター(ソフトプルーフィング) PREFERENCES_PROFILEHANDLING;処理プロファイルの取扱い PREFERENCES_PROFILELOADPR;処理プロファイル読み込みの優先 PREFERENCES_PROFILEPRCACHE;cacheの中のプロファイル PREFERENCES_PROFILEPRFILE;入力ファイルに隣接するプロファイル +PREFERENCES_PROFILESAVEBOTH;処理プロファイルはcacheと入力ファイルの両方に関連付けて保存する PREFERENCES_PROFILESAVECACHE;処理プロファイルのパラメータをcacheに保存 PREFERENCES_PROFILESAVEINPUT;処理プロファイルのパラメータを入力ファイルと同じディレクトリに保存 +PREFERENCES_PROFILESAVELOCATION;処理プロファイルが保存されている場所 +PREFERENCES_PROFILE_NONE;なし PREFERENCES_PROPERTY;プロパティ +PREFERENCES_PRTINTENT;目標とするレンダリング +PREFERENCES_PRTPROFILE;カラープロファイル PREFERENCES_PSPATH;Adobe Photoshop のインストール・ディレクトリ PREFERENCES_REMEMBERZOOMPAN;ズームレベルとパン速度を記憶する PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;現在の画像のズームレベルとパン速度を記憶し、新しく開く画像に適用\n\nこのオプションが使えるのは、編集画面のモードが“シングル編集”で、“プレビューのズームレベルが100%以下の場合に使うデモザイク”が“pp3に従う”と設定されている場合だけです。 -PREFERENCES_RGBDTL_LABEL;ノイズ低減とウェーブレットのための最大スレッド数 -PREFERENCES_RGBDTL_TOOLTIP;ノイズ低減は、10メガピクセル画像では128MB程度、40メガピクセル画像では512MBを必要とします、そして更にスレッドごとに128MBが必要です。複数のスレッドを同時に実行すると演算が速くなります。自動的にできる限り多くのスレッドを使用するには"0"の設定のままにします -PREFERENCES_SELECTFONT;フォント選択 +PREFERENCES_SAVE_TP_OPEN_NOW;機能パネルの今の開閉状態を保存する PREFERENCES_SELECTLANG;言語選択 -PREFERENCES_SELECTTHEME;テーマの選択 PREFERENCES_SERIALIZE_TIFF_READ;TIFFファイルの読み込み設定 -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;TIFFファイルのシリアル化 +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;TIFFファイルの読み込みをシリアライズ PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;画像フォルダーが多数の非圧縮のTIFFファイルで閉められている場合、このオプションを有効にすることで、サムネイル画像生成の効率が上がります PREFERENCES_SET;設定 PREFERENCES_SHOWBASICEXIF;基本Exif情報を表示 PREFERENCES_SHOWDATETIME;日付表示 PREFERENCES_SHOWEXPOSURECOMPENSATION;露光補正追加 -PREFERENCES_SHOWFILMSTRIPTOOLBAR;画像スライドのツールバーを表示する +PREFERENCES_SHOWFILMSTRIPTOOLBAR;画像スライドにツールバーを表示する PREFERENCES_SHTHRESHOLD;シャドウ・クリッピング領域のしきい値 -PREFERENCES_SIMPLAUT;ツールのモード PREFERENCES_SINGLETAB;シングルタブモードモード PREFERENCES_SINGLETABVERTAB;シングル編集タブモード, 垂直タブ -PREFERENCES_SMA;小 (250x287) PREFERENCES_SND_BATCHQUEUEDONE;キュー処理 終了 PREFERENCES_SND_HELP;ファイルパスを入力 または空欄(無音).\nWindowsはシステムサウンドの "SystemDefault", "SystemAsterisk"など..\nLinuxはシステムサウンドの "complete", "window-attention"などを使用します PREFERENCES_SND_LNGEDITPROCDONE;編集処理 終了 -PREFERENCES_SND_TRESHOLDSECS;秒後 +PREFERENCES_SND_THRESHOLDSECS;秒後 PREFERENCES_STARTUPIMDIR;起動時の画像・ディレクトリ -PREFERENCES_STDAUT;標準 PREFERENCES_TAB_BROWSER;ファイルブラウザ PREFERENCES_TAB_COLORMGR;カラーマネジメント +PREFERENCES_TAB_DYNAMICPROFILE;ダイナミックプロファイルの規定 PREFERENCES_TAB_GENERAL;一般 PREFERENCES_TAB_IMPROC;画像処理 -PREFERENCES_TAB_PERFORMANCE;パフォーマンスとクォリティ +PREFERENCES_TAB_PERFORMANCE;パフォーマンス PREFERENCES_TAB_SOUND;サウンド -PREFERENCES_TIMAX;多数 -PREFERENCES_TINB;タイル数 -PREFERENCES_TISTD;標準 +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;埋め込まれているJPEGのプレビュー +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;表示する画像 +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;ニュートラルなrawレンダリング +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;埋め込まれているJPEGがフルサイズの場合、指定がなければニュートラルなrawレンダリングで表示 PREFERENCES_TP_LABEL;ツール パネル: -PREFERENCES_TP_USEICONORTEXT;テキストの代わりにタブアイコンを使用 PREFERENCES_TP_VSCROLLBAR;ツールパネルの垂直スクロールバーを隠す +PREFERENCES_TUNNELMETADATA;Exif/IPTC/XMPを変更を加えずに出力ファイルにコピー PREFERENCES_USEBUNDLEDPROFILES;付属のプロファイルを使用 PREFERENCES_VIEW;出力デバイスのホワイトバランス設定 (モニター, TV, プロジェクター,観視...) -PREFERENCES_WAVLEV;’高い’質の場合、ウェーブレット変換のレベルを上げる -PREFERENCES_WLONE;レベル1 -PREFERENCES_WLTWO;レベル2 -PREFERENCES_WLZER;上げない PREFERENCES_WORKFLOW;レイアウト PROFILEPANEL_COPYPPASTE;コピーするパラメータ PROFILEPANEL_GLOBALPROFILES;付属のプロファイル @@ -1029,6 +1279,7 @@ PROFILEPANEL_MODE_TIP;処理プロファイルの適用モードボタン\n\nボ PROFILEPANEL_MYPROFILES;自分のプロファイル PROFILEPANEL_PASTEPPASTE;貼り付けるパラメータ PROFILEPANEL_PCUSTOM;カスタム +PROFILEPANEL_PDYNAMIC;ダイナミック PROFILEPANEL_PFILE;ファイルから PROFILEPANEL_PINTERNAL;ニュートラル PROFILEPANEL_PLASTSAVED;更新済 @@ -1052,25 +1303,39 @@ PROGRESSBAR_SAVEPNG;PNGファイル保存中... PROGRESSBAR_SAVETIFF;TIFFファイル保存中... PROGRESSBAR_SNAPSHOT_ADDED;スナップショット追加 PROGRESSDLG_PROFILECHANGEDINBROWSER;ブラウザでプロファイルの変更 +QINFO_FRAMECOUNT;%2 フレーム +QINFO_HDR;HDR / %2 フレーム QINFO_ISO;ISO QINFO_NOEXIF;Exifデータがありません +QINFO_PIXELSHIFT;ピクセルシフト / %2 フレーム +SAMPLEFORMAT_0;データ形式不明 +SAMPLEFORMAT_1;符号なし8ビット +SAMPLEFORMAT_2;符号なし16ビット +SAMPLEFORMAT_4;LogLuv24ビット +SAMPLEFORMAT_8;LogLuv32ビット +SAMPLEFORMAT_16;16ビット浮動小数点 +SAMPLEFORMAT_32;24ビット浮動小数点 +SAMPLEFORMAT_64;32ビット浮動小数点 SAVEDLG_AUTOSUFFIX;ファイルが存在する場合、自動的に末尾に文字を加える SAVEDLG_FILEFORMAT;ファイル形式 +SAVEDLG_FILEFORMAT_FLOAT;浮動小数点 SAVEDLG_FORCEFORMATOPTS;強制保存オプション SAVEDLG_JPEGQUAL;JPEG 品質 -SAVEDLG_PNGCOMPR;PNG 圧縮 SAVEDLG_PUTTOQUEUE;キュー処理に追加 SAVEDLG_PUTTOQUEUEHEAD;キュー処理の最初に追加 SAVEDLG_PUTTOQUEUETAIL;キュー処理の最後に追加 SAVEDLG_SAVEIMMEDIATELY;すぐに保存 SAVEDLG_SAVESPP;設定値も保存する SAVEDLG_SUBSAMP;サブ・サンプリング -SAVEDLG_SUBSAMP_1;高圧縮 +SAVEDLG_SUBSAMP_1;最適な圧縮 SAVEDLG_SUBSAMP_2;バランス -SAVEDLG_SUBSAMP_3;高画質 +SAVEDLG_SUBSAMP_3;最適な画質 +SAVEDLG_SUBSAMP_TOOLTIP;最適な圧縮率:\nJ:a:b 4:2:0\nh/v 2/2\n色度は水平方向・垂直方向で半分になります\n\nバランスを重視した圧縮率:\nJ:a:b 4:2:2\nh/v 2/1\n色度は水平方向で半分になります\n\n質を重視した圧縮率:\nJ:a:b 4:4:4\nh/v 1/1\n色度のサブサンプリングはありません. SAVEDLG_TIFFUNCOMPRESSED;非圧縮 TIFF SAVEDLG_WARNFILENAME;ファイルに名前が付けられます SHCSELECTOR_TOOLTIP;この3つのスライダーの位置をリセットするには\nマウスの右ボタンをクリック +SOFTPROOF_GAMUTCHECK_TOOLTIP;有効にすると、出力プロファイルの色域から外れた色のピクセルをグレーで表示します +SOFTPROOF_TOOLTIP;ソフトプルーフィング\n有効にすると、ICMツールの出力プロファイルを使った疑似的なレンダリングを行います。印刷した場合などの画像の印象を掴むのに大変便利です。 THRESHOLDSELECTOR_B;下 THRESHOLDSELECTOR_BL;下-左 THRESHOLDSELECTOR_BR;下-右 @@ -1078,6 +1343,7 @@ THRESHOLDSELECTOR_HINT;個々のコントロールポイントを移動するに THRESHOLDSELECTOR_T;上 THRESHOLDSELECTOR_TL;上-左 THRESHOLDSELECTOR_TR;上-右 +TOOLBAR_TOOLTIP_COLORPICKER;ロック式カラーピッカー\n\n有効にすると:\nプレビュー画像上でマウスを左クリックするとカラーピッカーが追加されます。\n左のボタンを押しながらマウスを動かすとカラーピッカーも移動します\nカラーピッカーを削除する時はマウスを右クリックします\nカラーピッカー全てを削除する場合は、Shiftボタンを押しながらマウスを右クリックします\nカラーピッカーのマーク以外の部分でマウスを右クリックすれば、ハンドツールに戻ります TOOLBAR_TOOLTIP_CROP;切り抜き範囲選択\nショートカット: c TOOLBAR_TOOLTIP_HAND;手の平ツール\nショートカット: h TOOLBAR_TOOLTIP_STRAIGHTEN;直線選択 / 角度補正\nショートカット: s\nプレビュー画像上にガイド線を描画し、垂直または水平方向を指示します。回転角度は、ガイド線の隣に表示されます。回転の中心は、プレビュー画像の中心です @@ -1087,7 +1353,6 @@ TP_BWMIX_ALGO_LI;リニア TP_BWMIX_ALGO_SP;特殊効果 TP_BWMIX_ALGO_TOOLTIP;リニア: 通常の 線形的 な効果です\n特殊効果: チャンネルミキサーによる 非線形的な特殊効果です TP_BWMIX_AUTOCH;オート -TP_BWMIX_AUTOCH_TIP;チャンネルミキサーの最適値を計算します TP_BWMIX_CC_ENABLED;補色の調整 TP_BWMIX_CC_TOOLTIP;ROYGCBPMモードの中で補色の調整を自動で行います TP_BWMIX_CHANNEL;輝度イコライザ @@ -1114,9 +1379,8 @@ TP_BWMIX_MET;方法 TP_BWMIX_MET_CHANMIX;チャンネルミキサー TP_BWMIX_MET_DESAT;彩度低減 TP_BWMIX_MET_LUMEQUAL;輝度イコライザー -TP_BWMIX_MIXC;ミキサー -TP_BWMIX_NEUTRAL;ミキサーのリセット -TP_BWMIX_NEUTRAL_TIP;全ての値(フィルター、チャンネルミキサー)をデフォルトに戻します +TP_BWMIX_MIXC;チャンネルミキサー +TP_BWMIX_NEUTRAL;リセット TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% トータル: %4%% TP_BWMIX_RGBLABEL_HINT;ミキサーオプションの全てを考慮した最終のRGBファクター\nトータルは実際に適用されたRGBの合計を表示:\n- 常に100%相対モード\n- 絶対モード100%より高い(明るい)、或いは低い(暗い) TP_BWMIX_RGB_TOOLTIP;RGBチャンネルをミックス。ガイダンスとしてプリセットを使います。\nマイナス値はアーティファクトの発生や誤った作用を起こすかもしれないことに注意します @@ -1145,6 +1409,10 @@ TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;ブルー TP_CACORRECTION_LABEL;色収差補正 TP_CACORRECTION_RED;レッド +TP_CBDL_AFT;白黒適用の後 +TP_CBDL_BEF;白黒適用の前 +TP_CBDL_METHOD;処理の順番 +TP_CBDL_METHOD_TOOLTIP;詳細レベルによるコントラスト調整の処理を白黒処理の前に行うか、後に行うか選びます。前を選んだ場合は同機能の作業色空間はRGBとなり、後を選んだ場合はL*a*b*となります。 TP_CHMIXER_BLUE;ブルー TP_CHMIXER_GREEN;グリーン TP_CHMIXER_LABEL;チャンネルミキサー @@ -1154,11 +1422,7 @@ TP_COARSETRAF_TOOLTIP_HFLIP;左右反転 TP_COARSETRAF_TOOLTIP_ROTLEFT;90度左回転\nショートカット: [\n\nシングル・エディタ・タブのショートカット: Alt-[ TP_COARSETRAF_TOOLTIP_ROTRIGHT;90度右回転\nショートカット: ]\n\nシングル・エディタ・タブのショートカット: Alt-] TP_COARSETRAF_TOOLTIP_VFLIP;上下反転 -TP_COLORAPP_ADAPTSCENE;撮影輝度への適応 -TP_COLORAPP_ADAPTSCENE_TOOLTIP;撮影環境の絶対輝度(cd/m2)\n1)Exif情報から算出:\nシャッター速度、ISO、絞り、カメラの露出補正\n2)rawのホワイトポイントとRTの露光補正スライダー値から算出 -TP_COLORAPP_ADAPTVIEWING;観視輝度への適応 (cd/m2) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;観視環境の絶対輝度\n(通常 16cd/m2) -TP_COLORAPP_ADAP_AUTO_TOOLTIP;チェックボックッスが有効の場合(推奨)はRTがExif情報に基づいて最適値を計算します\n手動で行う場合はチェックボックスを無効にします +TP_COLORAPP_ABSOLUTELUMINANCE;絶対輝度 TP_COLORAPP_ALGO;アルゴリズム TP_COLORAPP_ALGO_ALL;すべて TP_COLORAPP_ALGO_JC;明度 + 色度 (JC) @@ -1169,6 +1433,7 @@ TP_COLORAPP_BADPIXSL;ホット/バッドピクセルフィルター TP_COLORAPP_BADPIXSL_TOOLTIP;明るい部分のホット/バッドピクセルを圧縮します\n 0は効果なし 1は中間 2はガウスほかし\n\nこれらアーティファクトはCIECAM02の限界に起因するものです。色域を抑制する代わりに、イメージに暗い影が現れるのを防ぎます TP_COLORAPP_BRIGHT;明るさ (Q) TP_COLORAPP_BRIGHT_TOOLTIP;CIECAM02の明るさは L*a*b*やRGBとは異なり、白の輝度を計算に入れます +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;設定を手動で行う場合、65以上の設定値を推奨 TP_COLORAPP_CHROMA;色度 (C) TP_COLORAPP_CHROMA_M;鮮やかさ (M) TP_COLORAPP_CHROMA_M_TOOLTIP;CIECAM02の鮮やかさは L*a*b*やRGBの鮮やかさとは異なります @@ -1188,8 +1453,7 @@ TP_COLORAPP_CURVEEDITOR3;カラーカーブ TP_COLORAPP_CURVEEDITOR3_TOOLTIP;色度、彩度、鮮やかさのいずれかを調整します\n\nCIECAM02調整前の色度(L*a*b*)のヒストグラムを表示します\nチェックボックスの"カーブにCIECAM02出力のヒストグラムを表示" が有効の場合、CIECAM02調整後のC,sまたはMのヒストグラムを表示します\n\nC, sとMは、メインのヒストグラム・パネルには表示されません\n最終出力は、メインのヒストグラム・パネルを参照してください TP_COLORAPP_DATACIE;カーブにCIECAM02出力のヒストグラムを表示 TP_COLORAPP_DATACIE_TOOLTIP;有効の場合、CIECAM02カーブのヒストグラムは、JかQ、CIECAM02調整後のCかs、またはMの値/範囲の近似値を表示します\nこの選択はメイン・ヒストグラムパネルには影響を与えません\n\n無効の場合、CIECAM02カーブのヒストグラムは、CIECAM調整前のL*a*b*値を表示します -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;チェックボックスが有効の場合 (推奨)\nRTは、CAT02で使用され、更にCIECAM02全体で使用する最適値を算出します\n手動で値を設定するには、チェックボックスを無効にします (65以上の値を推奨) -TP_COLORAPP_DEGREE_TOOLTIP;CIE色順応変換2002(CAT02)の量 +TP_COLORAPP_FREE;任意の色温度+グリーン + CAT02 + [出力] TP_COLORAPP_GAMUT;色域制御 (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;L*a*b*モードの色域制御を許可 TP_COLORAPP_HUE;色相 (h) @@ -1200,12 +1464,13 @@ TP_COLORAPP_LABEL_SCENE;撮影環境条件 TP_COLORAPP_LABEL_VIEWING;観視条件 TP_COLORAPP_LIGHT;明度 (J) TP_COLORAPP_LIGHT_TOOLTIP;CIECAM02の明度は L*a*b*やRGBの明度とは異なります +TP_COLORAPP_MEANLUMINANCE;中間輝度 (Yb%) TP_COLORAPP_MODEL;ホワイトポイント・モデル TP_COLORAPP_MODEL_TOOLTIP;WB [RT] + [出力]:\nRTのホワイトバランスは、撮影環境に使用されます。CIECAM02はD50の設定, 出力デバイスのホワイトバランスは「環境設定」の「カラーマネジメント」の設定\n\nWB [RT+CAT02] + [出力]:\nRTのホワイトバランス設定は、CAT02で使用され、出力デバイスのホワイトバランスは環境設定の値を使用します +TP_COLORAPP_NEUTRAL;リセット +TP_COLORAPP_NEUTRAL_TIP;全てのスライダーチェックボックスとカーブをデフォルトにリセットします TP_COLORAPP_RSTPRO;レッドと肌色トーンを保護 TP_COLORAPP_RSTPRO_TOOLTIP;レッドと肌色トーンを保護はスライダーとカーブの両方に影響します -TP_COLORAPP_SHARPCIE;Q/C で、シャープ化、ディテールレベルのコントラストとフリンジ低減 -TP_COLORAPP_SHARPCIE_TOOLTIP;有効にした場合、シャープ化、ディテールレベルのコントラストとフリンジ低減は、CIECAM02を使用します TP_COLORAPP_SURROUND;周囲環境 TP_COLORAPP_SURROUND_AVER;普通 TP_COLORAPP_SURROUND_DARK;暗い @@ -1222,8 +1487,10 @@ TP_COLORAPP_TCMODE_LABEL2;カーブ・モード2 TP_COLORAPP_TCMODE_LABEL3;カーブ・色度モード TP_COLORAPP_TCMODE_LIGHTNESS;明度 TP_COLORAPP_TCMODE_SATUR;彩度 +TP_COLORAPP_TEMP_TOOLTIP;選択した光源に関し色偏差は常に1が使われます\n\n色温度=2856\nD50 色温度=5003\nD55 色温度=5503\nD65 色温度=6504\nD75 色温度=7504 TP_COLORAPP_TONECIE;CIECAM02 明るさ(Q)を使用してトーンマッピング TP_COLORAPP_TONECIE_TOOLTIP;このオプションが無効になっている場合、トーンマッピングはL*a*b*空間を使用します\nこのオプションが有効になっている場合、トーンマッピングは、CIECAM02を使用します\nトーンマッピング(L*a*b*/CIECAM02)ツールを有効にするには、この設定を有効にする必要があります +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;観視環境の絶対輝度\n(通常 16cd/m2) TP_COLORAPP_WBCAM;WB [RT+CAT02] + [出力] TP_COLORAPP_WBRT;WB [RT] + [出力] TP_COLORTONING_AB;o C/L @@ -1237,6 +1504,27 @@ TP_COLORTONING_HIGHLIGHT;ハイライト TP_COLORTONING_HUE;色相 TP_COLORTONING_LAB;L*a*b*モデルでブレンド TP_COLORTONING_LABEL;カラートーン調整 +TP_COLORTONING_LABGRID;L*a*b*カラー補正グリッド +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LABREGIONS;L*a*b*の補正領域 +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;色チャンネル +TP_COLORTONING_LABREGION_CHANNEL_ALL;全ての色チャンネル +TP_COLORTONING_LABREGION_CHANNEL_B;ブルー +TP_COLORTONING_LABREGION_CHANNEL_G;グリーン +TP_COLORTONING_LABREGION_CHANNEL_R;レッド +TP_COLORTONING_LABREGION_CHROMATICITYMASK;色度 +TP_COLORTONING_LABREGION_HUEMASK;色相 +TP_COLORTONING_LABREGION_LIGHTNESS;明度 +TP_COLORTONING_LABREGION_LIGHTNESSMASK;明度 +TP_COLORTONING_LABREGION_LIST_TITLE;補正 +TP_COLORTONING_LABREGION_MASK;マスク +TP_COLORTONING_LABREGION_MASKBLUR;マスクぼかし +TP_COLORTONING_LABREGION_OFFSET;オフセット +TP_COLORTONING_LABREGION_POWER;強化 +TP_COLORTONING_LABREGION_SATURATION;彩度 +TP_COLORTONING_LABREGION_SHOWMASK;マスクの表示 +TP_COLORTONING_LABREGION_SLOPE;スロープ TP_COLORTONING_LUMA;明度 TP_COLORTONING_LUMAMODE;明度を維持 TP_COLORTONING_LUMAMODE_TOOLTIP;カラー(レッド、グリーン、シアン、ブルーなど)を変える際に、これを有効にすると、各ピクセルの明度は維持されます。 @@ -1276,7 +1564,8 @@ TP_CROP_GUIDETYPE;ガイドタイプ: TP_CROP_H;高さ TP_CROP_LABEL;切り抜き TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP; 選択範囲切り抜き +TP_CROP_RESETCROP;リセット +TP_CROP_SELECTCROP;セレクト TP_CROP_W;W 幅 TP_CROP_X;X TP_CROP_Y;Y @@ -1285,11 +1574,16 @@ TP_DARKFRAME_LABEL;ダークフレーム TP_DEFRINGE_LABEL;フリンジ低減 TP_DEFRINGE_RADIUS;半径 TP_DEFRINGE_THRESHOLD;しきい値 +TP_DEHAZE_DEPTH;深度 +TP_DEHAZE_LABEL;霞除去 +TP_DEHAZE_SHOW_DEPTH_MAP;深度マップの表示 +TP_DEHAZE_STRENGTH;強さ 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_CURVE_TOOLTIP;クロミナンススライダー全ての値を増幅します\n色度をベースにこのカーブで色ノイズ低減の強さを加減します。例えば彩度の低い部分で作用を強める、或いは色度の高い部分で作用を弱めるように使います TP_DIRPYRDENOISE_CHROMINANCE_FRAME;色ノイズ TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;手動 TP_DIRPYRDENOISE_CHROMINANCE_MASTER;色(マスター) @@ -1298,30 +1592,30 @@ TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;手動\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_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_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;色空間 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_MAIN_MODE;モード +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;積極的 +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;控えめ +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;”控えめ”モードは低周波の色度パターンが維持されますが、”積極的”モードではそれらも取り除かれます TP_DIRPYRDENOISE_MEDIAN_METHOD;方式 TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;色ノイズだけ TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* @@ -1331,14 +1625,22 @@ 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_PASSES_TOOLTIP;計算領域が3x3ピクセルのメディアンフィルタを3回繰り返し適用する方が、計算領域が7x7ピクセルのメディアンフィルタを1回適用するより結果が良くなることがままあります。 TP_DIRPYRDENOISE_MEDIAN_TYPE;フィルターの種類 +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;適用するメディアンフィルタのサイズを決めます。大きくするとその分処理時間が増えます。大きいサイズを使うとそれだけ処理時間が増えます。\n\n3×3 ソフト: 3x3ピクセルの計算領域で5ピクセルを処理します\n3×3:3x3ピクセルの計算領域で9ピクセルを処理します\n5×5 ソフト: 5x5ピクセルの計算領域で13ピクセルを処理します\n5×5: 5x5ピクセルの計算領域で25ピクセルを処理します\n7×7: 7x7ピクセルの計算領域で49ピクセルを処理します\n9×9: 9x9ピクセルの計算領域で81ピクセルを処理します\n\n場合によっては、小さいウィンドウで複数回適用を繰り返す方が、大きいウィンドウを1回適用するより結果が良いことがあります。 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_ALGO_TOOLTIP;ファイン:撮影の肌色に近い部分に働くアルゴリズム、他の色への影響を最小限に抑えます\n広範: アーティファクトの増加を避けるアルゴリズムです TP_DIRPYREQUALIZER_ARTIF;アーティファクトを軽減 TP_DIRPYREQUALIZER_HUESKIN;肌色の色相 TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;このカーブは上部ほど、アルゴリズムが効率良く働くことを示しています。\n下部ほど、色相の遷移が見られる部分です。\nコントロールポイントを左右に大きく動かす必要が生じたり、アーティファクトが生じたりする場合は、ホワイトバランスが妥当ではない時です。\n他の色への影響を避けるには、調整範囲を少し減らします -TP_DIRPYREQUALIZER_LABEL;ディテールレベルのコントラスト +TP_DIRPYREQUALIZER_LABEL;詳細レベルによるコントラスト調整 TP_DIRPYREQUALIZER_LUMACOARSEST;粗い TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;コントラスト- TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;コントラスト+ @@ -1349,6 +1651,7 @@ TP_DIRPYREQUALIZER_SKIN_TOOLTIP;-100 肌色トーンの調整が目的にな TP_DIRPYREQUALIZER_THRESHOLD;しきい値 TP_DIRPYREQUALIZER_TOOLTIP;肌色(色相、色度、明度)と他の色の間の遷移でアーティファクトが発生するのを軽減します TP_DISTORTION_AMOUNT;適用量 +TP_DISTORTION_AUTO_TIP;rawファイルの歪曲収差を、埋め込まれたJPEG画像とカメラによる自動歪曲収差補正と合わせることで自動的に補正します TP_DISTORTION_LABEL;歪曲収差補正 TP_EPD_EDGESTOPPING;エッジ停止 TP_EPD_GAMMA;ガンマ @@ -1356,11 +1659,11 @@ TP_EPD_LABEL;トーンマッピング TP_EPD_REWEIGHTINGITERATES;再加重反復 TP_EPD_SCALE;スケール TP_EPD_STRENGTH;強さ -TP_EPD_TOOLTIP;トーンマッピングは、L*a*b*モード(標準)またはCIECAM02モードを介して可能です\n\nL*a*b*モードの場合、トーンマッピングはウェーブレット機能の残差画像にも使えます\n\n CIECAM02トーンマッピングモードは以下の設定を有効にします:\n 1. CIECAM02\n 2. アルゴリズム="明るさ + 鮮やかさ (QM)"\n 3. "CIECAM02 明るさ(Q)でトーンマッピング" TP_EXPOSURE_AUTOLEVELS;自動露光補正 TP_EXPOSURE_AUTOLEVELS_TIP;画像を解析し露光補正を自動で設定します TP_EXPOSURE_BLACKLEVEL;黒レベル TP_EXPOSURE_BRIGHTNESS;明度 +TP_EXPOSURE_CLAMPOOG;色域から外れた色を切り取る TP_EXPOSURE_CLIP;クリップ % TP_EXPOSURE_CLIP_TIP;自動露光補正によるハイライトとシャドウ部分での飽和ピクセルの割合制限 TP_EXPOSURE_COMPRHIGHLIGHTS;ハイライト圧縮 @@ -1371,6 +1674,8 @@ TP_EXPOSURE_CURVEEDITOR1;トーンカーブ1 TP_EXPOSURE_CURVEEDITOR2;トーンカーブ2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;2つのトーンカーブで最良の結果を得るためには、RawPediaの“露光>トーンカーブ”を参照して下さい。 TP_EXPOSURE_EXPCOMP;露光量補正 +TP_EXPOSURE_HISTMATCHING;トーンカーブの自動調節 +TP_EXPOSURE_HISTMATCHING_TOOLTIP;埋め込まれているJPEGサムネイルに近い映りを表示するために、露光量補正を除くいたスライダーやカーブを自動的に調整します。 TP_EXPOSURE_LABEL;露光補正 TP_EXPOSURE_SATURATION;彩度 TP_EXPOSURE_TCMODE_FILMLIKE;フィルム調 @@ -1382,8 +1687,9 @@ TP_EXPOSURE_TCMODE_SATANDVALBLENDING;彩度と明度のブレンド TP_EXPOSURE_TCMODE_STANDARD;標準 TP_EXPOSURE_TCMODE_WEIGHTEDSTD;加重平均 TP_EXPOS_BLACKPOINT_LABEL;raw ブラック・ポイント -TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント +TP_EXPOS_WHITEPOINT_LABEL;raw ホワイト・ポイント TP_FILMSIMULATION_LABEL;フィルムシミュレーション +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapeeはフィルムシミュレーション機能に使う画像をHald CLUTフォルダーの中から探すよう設計されています(プログラムに組み込むにはフォルダーが大き過ぎるため)。\n変更するには、環境設定 > 画像処理 > フィルムシミュレーションと進み\nどのフォルダーが使われているか確認します。機能を利用する場合は、Hald CLUTだけが入っているフォルダーを指定するか、 この機能を使わない場合はそのフォルダーを空にしておきます。\n\n詳しくはRawPediaを参照して下さい。\n\nフィルム画像のスキャンを止めますか? TP_FILMSIMULATION_STRENGTH;強さ TP_FILMSIMULATION_ZEROCLUTSFOUND;HaldCLUTのディレクトリーを指定して下さい TP_FLATFIELD_AUTOSELECT;自動選択 @@ -1396,10 +1702,6 @@ TP_FLATFIELD_BT_VERTICAL;垂直 TP_FLATFIELD_CLIPCONTROL;クリップコントロール TP_FLATFIELD_CLIPCONTROL_TOOLTIP;クリップコントロールは、フラットフィールドを使った時に白飛びが発生するのを避けるために使います。適用する元画像に既に白飛びがある場合は、クリップコントロールの適用で色被りが起こる可能性があります。 TP_FLATFIELD_LABEL;フラットフィールド -TP_GAMMA_CURV;ガンマ -TP_GAMMA_FREE;フリーなガンマ -TP_GAMMA_OUTPUT;出力 ガンマ -TP_GAMMA_SLOP;勾配(リニア) TP_GENERAL_11SCALE_TOOLTIP;この機能の効果や、そのサブコンポーネントの確認には、プレビューで1:1以上のスケールが必要です。 TP_GRADIENT_CENTER;中央位置 TP_GRADIENT_CENTER_X;中央 X軸 @@ -1420,7 +1722,7 @@ TP_HLREC_ENA_TOOLTIP;自動露光でも動作可 TP_HLREC_LABEL;ハイライト復元 TP_HLREC_LUMINANCE;輝度復元 TP_HLREC_METHOD;方式: -TP_HSVEQUALIZER_CHANNEL;HSV チャンネル +TP_HSVEQUALIZER_CHANNEL;チャンネル TP_HSVEQUALIZER_HUE;H TP_HSVEQUALIZER_LABEL;HSV イコライザ TP_HSVEQUALIZER_SAT;S @@ -1433,6 +1735,7 @@ TP_ICM_APPLYLOOKTABLE;ルックテーブル TP_ICM_APPLYLOOKTABLE_TOOLTIP;DCPに埋め込まれているルックテーブルを用います。但し、適用するDCPにこのタグがある場合に限ります。 TP_ICM_BLENDCMSMATRIX;マトリクスとハイライト・ブレンド TP_ICM_BLENDCMSMATRIX_TOOLTIP;LUTベースのICCプロファイルを使用するときに白トビを修復 +TP_ICM_BPC;ブラックポイント補正 TP_ICM_DCPILLUMINANT;光源 TP_ICM_DCPILLUMINANT_INTERPOLATED;補間 TP_ICM_DCPILLUMINANT_TOOLTIP;埋め込まれているDCPの光源のどちらを使うか選択。デフォルトではホワイトバランスに基づいて二つの光源の中間に補間する。この設定は二つのDCPの光源が補間サポートされる、を選択している場合に有効。 @@ -1451,12 +1754,20 @@ TP_ICM_INPUTPROFILE;入力プロファイル TP_ICM_LABEL;カラー・マネジメント TP_ICM_NOICM;No ICM: sRGB 出力 TP_ICM_OUTPUTPROFILE;出力プロファイル +TP_ICM_PROFILEINTENT;目標とするレンダリング +TP_ICM_SAVEREFERENCE;参照画像を保存 TP_ICM_SAVEREFERENCE_APPLYWB;ホワイトバランスを適用 TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;一般的に、ICCプロファイルを作成するための画像を保存する際に適用するホワイトバランスです、DCPプロファイルを作成する時は適用しません。 TP_ICM_SAVEREFERENCE_TOOLTIP;入力プロファイルが適用される前のリニアなTIFF画像を保存します。キャリブレーション目的やカメラプロファイルの作成などに使います。 TP_ICM_TONECURVE;DCPトーンカーブ使用 TP_ICM_TONECURVE_TOOLTIP;DCPのプロファイルに含まれているトーンカーブを使用することができます TP_ICM_WORKINGPROFILE;作業プロファイル +TP_ICM_WORKING_TRC;トーン再現カーブ: +TP_ICM_WORKING_TRC_CUSTOM;カスタム +TP_ICM_WORKING_TRC_GAMMA;ガンマ +TP_ICM_WORKING_TRC_NONE;なし +TP_ICM_WORKING_TRC_SLOPE;勾配 +TP_ICM_WORKING_TRC_TOOLTIP;組み込まれたプロファイルだけ TP_IMPULSEDENOISE_LABEL;インパルスノイズ低減 TP_IMPULSEDENOISE_THRESH;しきい値 TP_LABCURVE_AVOIDCOLORSHIFT;色ずれを回避 @@ -1499,10 +1810,26 @@ TP_LABCURVE_RSTPRO_TOOLTIP;色度スライダーとCCカーブを使用するこ TP_LENSGEOM_AUTOCROP;自動的に切り抜き選択 TP_LENSGEOM_FILL;オートフィル TP_LENSGEOM_LABEL;レンズ / ジオメトリ +TP_LENSPROFILE_CORRECTION_AUTOMATCH;自動で +TP_LENSPROFILE_CORRECTION_LCPFILE;LCPファイル +TP_LENSPROFILE_CORRECTION_MANUAL;手動で TP_LENSPROFILE_LABEL;レンズ補正 プロファイル -TP_LENSPROFILE_USECA;色収差補正 -TP_LENSPROFILE_USEDIST;歪曲収差補正 -TP_LENSPROFILE_USEVIGN;周辺光量補正 +TP_LENSPROFILE_LENS_WARNING;注意:レンズプロファイルに使われるクロップファクターはカメラのクロップファクターより大きいので、誤った結果になる可能性があります。 +TP_LENSPROFILE_MODE_HEADER;レンズプロファイルを選択 +TP_LENSPROFILE_USE_CA;色収差 +TP_LENSPROFILE_USE_GEOMETRIC;歪曲収差 +TP_LENSPROFILE_USE_HEADER;補正する収差を選択: +TP_LENSPROFILE_USE_VIGNETTING;周辺光量 +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;露光量補正のスライダー値をニュートラルにリセットします。\n自動露光補正の調整値ついても同様にリセットされます TP_PCVIGNETTE_FEATHER;フェザー処理 TP_PCVIGNETTE_FEATHER_TOOLTIP;フェザー処理: 0=四隅だけ、50=中央までの半分、100=中央まで @@ -1523,12 +1850,23 @@ TP_PREPROCESS_HOTPIXFILT;ホットピクセル・フィルター TP_PREPROCESS_HOTPIXFILT_TOOLTIP;ホットピクセルの圧縮を試みます TP_PREPROCESS_LABEL;前処理 TP_PREPROCESS_LINEDENOISE;ラインノイズ フィルタ +TP_PREPROCESS_LINEDENOISE_DIRECTION;方向 +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;両方向 +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;水平方向 +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;PDAFの場合は水平方向だけ +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;垂直方向 TP_PREPROCESS_NO_FOUND;未検出 -TP_PRSHARPENING_LABEL;リサイズ後のシャープ化 -TP_PRSHARPENING_TOOLTIP;リサイズ後の画像をシャープ化します。但し、リサイズの方式がランチョスの場合に限ります。プレビュー画面でこの機能の効果を見ることは出来ません。使用法に関してはRawPediaを参照して下さい。 +TP_PREPROCESS_PDAFLINESFILTER;PDAFラインフィルタ +TP_PREPROCESS_PDAFLINESFILTER_TOOLTIP;Sonyのミラーレスカメラの一部では、PDAFイメージセンサが原因で、ゴーストが出るバックライトの画像でストライプノイズが発生することがあり、これを軽減します。 +TP_PRSHARPENING_LABEL;リサイズ後のシャープニング +TP_PRSHARPENING_TOOLTIP;リサイズ後の画像をシャープニングします。但し、リサイズの方式がランチョスの場合に限ります。プレビュー画面でこの機能の効果を見ることは出来ません。使用法に関してはRawPediaを参照して下さい。 TP_RAWCACORR_AUTO;自動補正 +TP_RAWCACORR_AUTOIT;繰り返し +TP_RAWCACORR_AUTOIT_TOOLTIP;”自動補正”が有効になっている場合にこの設定が可能です。\n自動補正の作用は控えめなため、全ての色収差が常に補正されるとは限りません。\n残りの色収差を補正するためには、自動色収差補正の繰り返しを最大5回行います。\n繰り返すたびに、直前の繰り返しで残った色収差を軽減しますが、その分処理時間は増えます。 +TP_RAWCACORR_AVOIDCOLORSHIFT;色ずれを回避 TP_RAWCACORR_CABLUE;ブルー TP_RAWCACORR_CARED;レッド +TP_RAWCACORR_CASTR;強さ TP_RAWEXPOS_BLACKS;黒レベル TP_RAWEXPOS_BLACK_0;グリーン1(先頭) TP_RAWEXPOS_BLACK_1;レッド @@ -1538,24 +1876,79 @@ TP_RAWEXPOS_BLACK_BLUE;ブルー TP_RAWEXPOS_BLACK_GREEN;グリーン TP_RAWEXPOS_BLACK_RED;レッド TP_RAWEXPOS_LINEAR;ホワイトポイント補正 -TP_RAWEXPOS_PRESER;ハイライトを保持 TP_RAWEXPOS_RGB;レッド、グリーン、ブルー TP_RAWEXPOS_TWOGREEN;2つのグリーンを連動 +TP_RAW_1PASSMEDIUM;1-パス (Markesteijn) +TP_RAW_2PASS;1-パス+fast +TP_RAW_3PASSBEST;3-Pass (Markesteijn) +TP_RAW_4PASS;3-パス+fast +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;境界 +TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;DCB 拡張処理 TP_RAW_DCBITERATIONS;DCB 反復の数 +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;方式 TP_RAW_DMETHOD_PROGRESSBAR;%1 デモザイク中... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;デモザイク・リファイン中... TP_RAW_DMETHOD_TOOLTIP;注: IGVとLMMSEは高ISO画像に適しています +TP_RAW_DUALDEMOSAICAUTOCONTRAST;自動しきい値 +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;チェックボックスを有効にすると(推奨), RawTherapeeは画像の滑らかな部分をベースに最適値を計算します。\n画像に滑らかな部分がない、或いはノイズが非常に多い画像の場合、最適値は0に設定されます。\n最適値を手動で設定する場合は、チェックボックスを無効にします(画像に次第で最適値は異なります)。 +TP_RAW_DUALDEMOSAICCONTRAST;コントラストのしきい値 +TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;偽色抑制処理の回数 +TP_RAW_FAST;Fast TP_RAW_HD;しきい値 TP_RAW_HD_TOOLTIP;設定値を低くすると、ホット/デッドピクセルの検出が強くなりますが、偽陽性によりアーティファクトが増えるかもしれません。ホット/デッドピクセルフィルターの使用で、アーティファクトの発生が認められた場合は、しきい値を少しずつアーティファクトが消えるまで増やします。 +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;サブイメージ +TP_RAW_IMAGENUM_TOOLTIP;rawファイルの中には複数のサブイメージで構成されているものがあります(Pentaxのピクセルシフト、Pentaxの3-in-1 HDR、Canonのデュアルピクセル)。\n\nここでピクセルシフト以外のデモザイク方式を選んだ場合は、どのサブイメージだけをデモザイクに使うか選択します。\n\nピクセルシフトのrawファイルでデモザイク方式にピクセルシフトを選ぶと、全てのサブイメージがデモザイクに使われます、そしてどのサブイメージを振れのあるイメージとして使うか選択します TP_RAW_LABEL;デモザイク +TP_RAW_LMMSE;LMMSE TP_RAW_LMMSEITERATIONS;LMMSE 拡張処理 TP_RAW_LMMSE_TOOLTIP;ガンマ追加 (step 1) - メディアン追加 (step 2,3,4), リファイン追加 (step 5,6) アーティファクトを低減しノイズ比を向上させます +TP_RAW_MONO;Mono +TP_RAW_NONE;なし (センサーのパターンを表示) +TP_RAW_PIXELSHIFT;ピクセルシフト +TP_RAW_PIXELSHIFTBLUR;振れマスクのぼかし +TP_RAW_PIXELSHIFTDMETHOD;振れに対するデモザイクの方式 +TP_RAW_PIXELSHIFTEPERISO;ISOの適合 +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;通常のISOに関してはデフォルトの0で十分だと思われます。\n高いISOの場合は、振れの検知を良くするために設定値を上げます。\n少しづつ増加させ、振れのマスクの変化を見ます。 +TP_RAW_PIXELSHIFTEQUALBRIGHT;構成画像の明るさを均等にする +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;チャンネルごとに均等化 +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;有効:RGBの色チャンネルごとに均等化を行います。\n無効:全ての色チャンネルで同じように均等化を行います。 +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;選択した構成画像の明るさを他の構成画像の明るさに適用し均等化します。\n露出オーバーがある画像が発生する場合は、マゼンタ被りが起こるのを避けるために最も明るい画像を選択しないようにるいか、或いは振れの補正を有効にします。 +TP_RAW_PIXELSHIFTGREEN;振れに関するグリーンチャンネルを確認 +TP_RAW_PIXELSHIFTHOLEFILL;振れマスクの穴を埋める +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;振れマスクの穴を埋める +TP_RAW_PIXELSHIFTLMMSE;振れのある領域にLMMSEを使用 +TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;振れのある領域にはAMaZEの代わりにLMMSEを使います。\nISO値が高い画像の処 +TP_RAW_PIXELSHIFTMEDIAN;振れのある領域にはメディアンを使用 +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;振れのある領域に関しては、選択した画像ではなく全ての構成画像にメディアンを使います。\n全ての構成画像で異なる位置にある被写体は除きます。\n動きの遅い被写体(オーバーラッピング)には振れの効果が出ます。 +TP_RAW_PIXELSHIFTMM_AUTO;自動 +TP_RAW_PIXELSHIFTMM_CUSTOM;カスタム +TP_RAW_PIXELSHIFTMM_OFF;オフ +TP_RAW_PIXELSHIFTMOTIONMETHOD;振れ補正 +TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0は振れの検知が行われないことを意味します\n1 - 99は振れを検知する強さを意味します。値を増やすと検知率が上がります。\n100に設定するとAMaZEでデモザイクされた画像が使われます +TP_RAW_PIXELSHIFTNONGREENCROSS;振れに関するレッド/ブルーのチャンネルを確認 +TP_RAW_PIXELSHIFTSHOWMOTION;振れマスクを含めて表示 +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;振れマスクだけを表示 +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;画像全体ではなく振れマスクだけを表示します。 +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;振れのある画像部分をグリーンマスクを被せて表示します。 +TP_RAW_PIXELSHIFTSIGMA;ぼかしの半径 +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;デフォルトで設定している値1.0で基本的なISO値の画像には十分です。\nISO値の高い画像ではスライダーの値を増やします。5.0から始めるのがいいでしょう。\n設定値を変えながら振れマスクを見極めます。 +TP_RAW_PIXELSHIFTSMOOTH;境界部分を滑らかにする +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;これは振れのある領域と振れがない領域の境を滑らかに補正するものです。\n0に設定すると機能の働きはありません。\n1に設定すると、選択された構成画像にAMaZEかLMMSEが使われた結果が得られます("LMMSEを使う"というオプション次第)、或いは"メディアンを使う"が選択されていれば全ての構成画像にメディアンが使われます。 +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 TP_RAW_SENSOR_BAYER_LABEL;ベイヤー配列を使ったセンサー TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-passが最適です(低ISO画像には奨められます)\n高ISO画像の場合、1-passと3-passの違いは殆どありません、処理速度は前者の方が速いです。 TP_RAW_SENSOR_XTRANS_LABEL;X-Transマトリクスを使ったセンサー +TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;アップスケーリングを可能にする TP_RESIZE_APPLIESTO;適用領域: TP_RESIZE_CROPPEDAREA;切り抜き画像 TP_RESIZE_FITBOX;バウンディング・ボックス @@ -1565,11 +1958,91 @@ TP_RESIZE_HEIGHT;高さ TP_RESIZE_LABEL;リサイズ TP_RESIZE_LANCZOS;ランチョス TP_RESIZE_METHOD;方式: -TP_RESIZE_NEAREST;ニアリスト +TP_RESIZE_NEAREST;ニアレスト TP_RESIZE_SCALE;スケール TP_RESIZE_SPECIFY;条件指定: TP_RESIZE_W;幅: TP_RESIZE_WIDTH;幅 +TP_RETINEX_CONTEDIT_HSL;ヒストグラムイコライザ HSL +TP_RETINEX_CONTEDIT_LAB;ヒストグラムイコライザ L*a*b* +TP_RETINEX_CONTEDIT_LH;色相イコライザ +TP_RETINEX_CONTEDIT_MAP;イコライザ +TP_RETINEX_CURVEEDITOR_CD;輝度=f(輝度) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;輝度に応じた輝度の関数 L=f(L)\nハロとアーティファクトを減らすためにrawデータを補正します +TP_RETINEX_CURVEEDITOR_LH;強さ=f(色相) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;色相に応じた強さの関数 強さ=f(色相)\nレティネックスの方式で”ハイライト”を使った場合、このカーブは色度にも作用します +TP_RETINEX_CURVEEDITOR_MAP;輝度=f(輝度) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;このカーブは単独で使うことも、ガウシアンマスクやウェーブレットマスクと併用して使うことも出来ます\n但し、アーティファクトの発生に注意 +TP_RETINEX_EQUAL;イコライザ +TP_RETINEX_FREEGAMMA;フリーガンマ +TP_RETINEX_GAIN;ゲイン +TP_RETINEX_GAINOFFS;ゲインとオフセット(明るさ) +TP_RETINEX_GAINTRANSMISSION;ゲインの透過 +TP_RETINEX_GAINTRANSMISSION_TOOLTIP;目標とする輝度を得るために、透過マップ増幅したり減衰させたりします。\n横軸:左から最小、平均、最大となります。\n縦軸:ゲイン +TP_RETINEX_GAIN_TOOLTIP;修復画像に作用します\n\nこれは他の設定とは大きく異なります。 ブラックピクセルやホワイトピクセルに対して使う設定で、ヒストグラムのバランスを補正します +TP_RETINEX_GAMMA;ガンマ +TP_RETINEX_GAMMA_FREE;フリー +TP_RETINEX_GAMMA_HIGH;高 +TP_RETINEX_GAMMA_LOW;低 +TP_RETINEX_GAMMA_MID;中間 +TP_RETINEX_GAMMA_NONE;なし +TP_RETINEX_GAMMA_TOOLTIP;レティネックス機能の前後のガンマで画像のトーンを修復します。レティネックスのカーブや他のカーブ(Lab調整、露光補正などのカーブ)とは異なるカーブです。 +TP_RETINEX_GRAD;透過のグラデーション +TP_RETINEX_GRADS;強さのグラデーション +TP_RETINEX_GRADS_TOOLTIP;スライダー値が0の場合、全ての繰り返しは同じになります\n0より大きい場合は、繰り返しが増加すると強さが減ります。0より小さい場合はその逆です +TP_RETINEX_GRAD_TOOLTIP;スライダー値が0の場合、全ての繰り返しが同じになります\n0より大きい場合は、繰り返しが増加すると差異としきい値が減ります。0より小さい場合はその逆です +TP_RETINEX_HIGH;高 +TP_RETINEX_HIGHLIG;ハイライト +TP_RETINEX_HIGHLIGHT;ハイライトのしきい値 +TP_RETINEX_HIGHLIGHT_TOOLTIP;”高”のアルゴリズムの作用を増加させます\nこの方式を使う場合は、”周辺ピクセル”の再調整やrawタブにある”ホワイトポイント補正”を増やす必要があるかもしれません +TP_RETINEX_HSLSPACE_LIN;HSL-線形 +TP_RETINEX_HSLSPACE_LOG;HSL-対数 +TP_RETINEX_ITER;繰り返し(トーンマッピング) +TP_RETINEX_ITERF;トーンマッピング +TP_RETINEX_ITER_TOOLTIP;トーンマッピングの動作を真似たものです\n値を高くすると処理時間が増えます +TP_RETINEX_LABEL;レティネックス +TP_RETINEX_LABEL_MASK;マスク +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;低 +TP_RETINEX_MAP;方式 +TP_RETINEX_MAP_GAUS;ガウシアンマスク +TP_RETINEX_MAP_MAPP;シャープマスク (一部ウェーブレット) +TP_RETINEX_MAP_MAPT;シャープマスク (全てウェーブレット) +TP_RETINEX_MAP_METHOD_TOOLTIP;ガウス関数を利用して生成したマスクをハロやアーティファクトを減らすために使う方法です\n\nカーブだけ:マスクにコントラストカーブを適用します\nアーティファクト発生に注意\n\nガウシアンマスク:元画像に対しガウス暈しでマスクを生成し、それを使います\n処理時間短い\n\nシャープマスク:元画像に対しウェーブレットでマスクを生成し、それを使います\n処理時間が長い +TP_RETINEX_MAP_NONE;なし +TP_RETINEX_MEDIAN;透過のメディアンフィルター +TP_RETINEX_METHOD;方法 +TP_RETINEX_METHOD_TOOLTIP;高=明瞭な部分のレンダリングを補正します\n均等=明瞭な部分と不明瞭な部分をバランスよく補正します\n低=不明瞭な部分を重点的に補正します\nハイライト=ハイライト部分のマゼンタ被りを補正します +TP_RETINEX_MLABEL;霞のない画像に修復 最小値=%1 最大値=%2 +TP_RETINEX_MLABEL_TOOLTIP;最小値=0 最大値=32768に近づける\nバランスの良い霞のない画像 +TP_RETINEX_NEIGHBOR;半径 +TP_RETINEX_NEUTRAL;リセット +TP_RETINEX_NEUTRAL_TIP;全てのスライダー値とカーブをデフォルトの状態に戻します +TP_RETINEX_OFFSET;オフセット(明るさ) +TP_RETINEX_SCALES;ガウス暈しのグラデーション +TP_RETINEX_SCALES_TOOLTIP;スライダー値が0の場合、同一の作業を繰り返します\n0より大きい値を設定すると、繰り返し作業を増やした時に、スケールと隣接するピクセルに対する作用は減ります。0より小さい場合は、その逆です +TP_RETINEX_SETTINGS;設定 +TP_RETINEX_SKAL;スケール +TP_RETINEX_SLOPE;フリーなガンマの勾配 +TP_RETINEX_STRENGTH;強さ +TP_RETINEX_THRESHOLD;しきい値 +TP_RETINEX_THRESHOLD_TOOLTIP;インとアウトの制限を意味します\nイン=原画像\nアウト=ガウス暈しを施した原画像 +TP_RETINEX_TLABEL;透過 差異の最小値=%1 最大値=%2 平均=%3 標準偏差=%4 +TP_RETINEX_TLABEL2;透過 最小値=%1 最大値=%2 +TP_RETINEX_TLABEL_TOOLTIP;透過マップの結果を表示しています\n差異の最小値と最大値です\n平均と標準偏差\n透過マップの最小値と最大値です +TP_RETINEX_TRANF;透過 +TP_RETINEX_TRANSMISSION;透過マップ +TP_RETINEX_TRANSMISSION_TOOLTIP;透過に応じて透過を調整します\n横軸:左からマイナス値(最小を含む)、平均、プラス値(最大を含む)\n縦軸:増幅或いは減衰 +TP_RETINEX_UNIFORM;均等 +TP_RETINEX_VARIANCE;コントラスト +TP_RETINEX_VARIANCE_TOOLTIP;差異の値を小さく取るとローカルコントラストと色度が増しますが、アーティファクトが発生するかもしれません +TP_RETINEX_VIEW;プロセス +TP_RETINEX_VIEW_MASK;マスク +TP_RETINEX_VIEW_METHOD_TOOLTIP;標準 - 通常の表示\nマスク - マスクを表示\nアンシャープマスク - 半径の大きいアンシャープマスクを施したような画像\n透過 - 自動/固定 - コントラストや明るさの調整を行う前の透過マップを表示\n\n注意:マスクの画像は現実の画像ではありません。目に見えるように増幅したものです +TP_RETINEX_VIEW_NONE;標準 +TP_RETINEX_VIEW_TRAN;透過図 - 自動 +TP_RETINEX_VIEW_TRAN2;透過図 - 固定 +TP_RETINEX_VIEW_UNSHARP;アンシャープマスク TP_RGBCURVES_BLUE;B TP_RGBCURVES_CHANNEL;チャンネル TP_RGBCURVES_GREEN;G @@ -1594,13 +2067,15 @@ TP_SHARPENEDGE_LABEL;エッジ TP_SHARPENEDGE_PASSES;反復 TP_SHARPENEDGE_THREE;輝度のみ TP_SHARPENING_AMOUNT;適用量 +TP_SHARPENING_BLUR;ぼかしの半径 +TP_SHARPENING_CONTRAST;コントラストのしきい値 TP_SHARPENING_EDRADIUS;半径 TP_SHARPENING_EDTOLERANCE;エッジ許容 TP_SHARPENING_HALOCONTROL;ハロ抑制 TP_SHARPENING_HCAMOUNT;適用量 -TP_SHARPENING_LABEL;シャープ化 +TP_SHARPENING_LABEL;シャープニング TP_SHARPENING_METHOD;方式 -TP_SHARPENING_ONLYEDGES;エッジのみシャープ化 +TP_SHARPENING_ONLYEDGES;エッジのみシャープニング TP_SHARPENING_RADIUS;半径 TP_SHARPENING_RLD;RL デコンボリューション TP_SHARPENING_RLD_AMOUNT;適用量 @@ -1609,9 +2084,16 @@ TP_SHARPENING_RLD_ITERATIONS;繰返し TP_SHARPENING_THRESHOLD;しきい値 TP_SHARPENING_USM;アンシャープマスク TP_SHARPENMICRO_AMOUNT;適用量 +TP_SHARPENMICRO_CONTRAST;コントラストのしきい値 TP_SHARPENMICRO_LABEL;マイクロコントラスト TP_SHARPENMICRO_MATRIX;3×3マトリクスの代わりに 5×5 TP_SHARPENMICRO_UNIFORMITY;均等 +TP_SOFTLIGHT_LABEL;ソフトライト +TP_SOFTLIGHT_STRENGTH;強さ +TP_TM_FATTAL_AMOUNT;量 +TP_TM_FATTAL_ANCHOR;アンカー +TP_TM_FATTAL_LABEL;ダイナミックレンジ圧縮 +TP_TM_FATTAL_THRESHOLD;ディテール TP_VIBRANCE_AVOIDCOLORSHIFT;色ずれを回避 TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;肌色トーン @@ -1717,7 +2199,7 @@ TP_WAVELET_EDGREINF_TOOLTIP;最初のレベルに対する作用を強めたり TP_WAVELET_EDGTHRESH;ディテール TP_WAVELET_EDGTHRESH_TOOLTIP;低いレベルと他のレベルの区分を変更します。しきい値を高くするほど、低いレベルに作用の重点が置かれます。注意:マイナス値の設定は高いレベルに重点が置かれ、アーティファクトが発生することがあります。 TP_WAVELET_EDRAD;半径 -TP_WAVELET_EDRAD_TOOLTIP;この機能の半径は、他のシャープ化機能の半径とは大きく異なります。複雑な関数を使って各レベルの値を比較します。そのため、半径がゼロでも何らかの効果があります +TP_WAVELET_EDRAD_TOOLTIP;この機能の半径は、他のシャープニング機能の半径とは大きく異なります。複雑な関数を使って各レベルの値を比較します。そのため、半径がゼロでも何らかの効果があります TP_WAVELET_EDSL;しきい値スライダー TP_WAVELET_EDTYPE;ローカルコントラストの方式 TP_WAVELET_EDVAL;強さ @@ -1833,6 +2315,7 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;モード +TP_WBALANCE_PICKER;ピック TP_WBALANCE_SHADE;日陰 TP_WBALANCE_SIZE;サイズ: TP_WBALANCE_SOLUX35;Solux 3500K @@ -1840,6 +2323,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) TP_WBALANCE_SPOTWB;スポットWB +TP_WBALANCE_TEMPBIAS;自動ホワイトバランス 色温度のバイアス +TP_WBALANCE_TEMPBIAS_TOOLTIP;”自動ホワイトバランスの計算に変更を加えます”\n色温度を変えることで画像の暖かみを増やしたり、冷たさを増やしたりします。\n偏向の度合いは色温度の割合で表示されます\n従って計算値は "算出した色温度 + 算出した色温度 * 偏向"で計算したものです TP_WBALANCE_TEMPERATURE;色温度 TP_WBALANCE_TUNGSTEN;タングステン TP_WBALANCE_WATER1;水中 1 @@ -1848,8 +2333,8 @@ TP_WBALANCE_WATER_HEADER;水中 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ショートカット: - @@ -1857,378 +2342,4 @@ ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: - ! 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 -!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 -!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 -!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 -!HISTORY_MSG_410;Retinex - Offset -!HISTORY_MSG_411;Retinex - Strength -!HISTORY_MSG_412;Retinex - Gaussian gradient -!HISTORY_MSG_413;Retinex - Contrast -!HISTORY_MSG_414;Retinex - Histogram - Lab -!HISTORY_MSG_415;Retinex - Transmission -!HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median -!HISTORY_MSG_418;Retinex - Threshold -!HISTORY_MSG_419;Retinex - Color space -!HISTORY_MSG_420;Retinex - Histogram - HSL -!HISTORY_MSG_421;Retinex - Gamma -!HISTORY_MSG_422;Retinex - Gamma -!HISTORY_MSG_423;Retinex - Gamma slope -!HISTORY_MSG_424;Retinex - HL threshold -!HISTORY_MSG_425;Retinex - Log base -!HISTORY_MSG_426;Retinex - Hue equalizer -!HISTORY_MSG_427;Output rendering intent -!HISTORY_MSG_428;Monitor rendering intent -!HISTORY_MSG_429;Retinex - Iterations -!HISTORY_MSG_430;Retinex - Transmission gradient -!HISTORY_MSG_431;Retinex - Strength gradient -!HISTORY_MSG_432;Retinex - M - Highlights -!HISTORY_MSG_433;Retinex - M - Highlights TW -!HISTORY_MSG_434;Retinex - M - Shadows -!HISTORY_MSG_435;Retinex - M - Shadows TW -!HISTORY_MSG_436;Retinex - M - Radius -!HISTORY_MSG_437;Retinex - M - Method -!HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Process -!HISTORY_MSG_440;CbDL - Method -!HISTORY_MSG_441;Retinex - Gain transmission -!HISTORY_MSG_442;Retinex - Scale -!HISTORY_MSG_443;Output black point compensation -!HISTORY_MSG_444;WB - Temp bias -!HISTORY_MSG_445;Raw sub-image -!HISTORY_MSG_449;PS - ISO adaption -!HISTORY_MSG_452;PS - Show motion -!HISTORY_MSG_453;PS - Show mask only -!HISTORY_MSG_457;PS - Check red/blue -!HISTORY_MSG_462;PS - Check green -!HISTORY_MSG_464;PS - Blur motion mask -!HISTORY_MSG_465;PS - Blur radius -!HISTORY_MSG_468;PS - Fill holes -!HISTORY_MSG_469;PS - Median -!HISTORY_MSG_471;PS - Motion correction -!HISTORY_MSG_472;PS - Smooth transitions -!HISTORY_MSG_473;PS - Use LMMSE -!HISTORY_MSG_474;PS - Equalize -!HISTORY_MSG_475;PS - Equalize channel -!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 -!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_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 -!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 -!IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. -!IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. -!IPTCPANEL_CREATOR;Creator -!IPTCPANEL_CREATORHINT;Enter the name of the person that created this image. -!IPTCPANEL_CREATORJOBTITLE;Creator's job title -!IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field. -!IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken. -!IPTCPANEL_DESCRIPTION;Description -!IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image. -!IPTCPANEL_DESCRIPTIONWRITER;Description writer -!IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image. -!IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image. -!IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field. -!IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image. -!IPTCPANEL_PROVINCE;Province or state -!IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image. -!IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from. -!IPTCPANEL_SUPPCATEGORIES;Supplemental categories -!IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image. -!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_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 -!MONITOR_PROFILE_SYSTEM;System default -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_PRSHARPENING;Post-resize sharpening -!PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue -!PARTIALPASTE_RAW_IMAGENUM;Sub-image -!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 -!PREFERENCES_MONITOR;Monitor -!PREFERENCES_MONPROFILE;Default color profile -!PREFERENCES_MONPROFILE_WARNOSX;Due to MacOS limitations, only sRGB is supported. -!PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. -!PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. -!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 -!PREFERENCES_PROFILE_NONE;None -!PREFERENCES_PRTINTENT;Rendering intent -!PREFERENCES_PRTPROFILE;Color profile -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!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 -!TP_CBDL_METHOD;Process located -!TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!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 is enabled, Yb is calculated from the mean value of the actual image's luminance -!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_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) -!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_HPHD;HPHD -!TP_RAW_IGV;IGV -!TP_RAW_IMAGENUM;Sub-image -!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) -!TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection -!TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. -!TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames -!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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental -!TP_RAW_PIXELSHIFTGREEN;Check green channel for motion -!TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask -!TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask -!TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts -!TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold -!TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 -!TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. -!TP_RAW_PIXELSHIFTMM_AUTO;Automatic -!TP_RAW_PIXELSHIFTMM_CUSTOM;Custom -!TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size -!TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction -!TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE -!TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 -!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask -!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. -!TP_RAW_PIXELSHIFTSIGMA;Blur radius -!TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. -!TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions -!TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!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* -!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 -!TP_RETINEX_GAIN;Gain -!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_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. -!TP_RETINEX_GAMMA;Gamma -!TP_RETINEX_GAMMA_FREE;Free -!TP_RETINEX_GAMMA_HIGH;High -!TP_RETINEX_GAMMA_LOW;Low -!TP_RETINEX_GAMMA_MID;Middle -!TP_RETINEX_GAMMA_NONE;None -!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). -!TP_RETINEX_GRAD;Transmission gradient -!TP_RETINEX_GRADS;Strength gradient -!TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. -!TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. -!TP_RETINEX_HIGH;High -!TP_RETINEX_HIGHLIG;Highlight -!TP_RETINEX_HIGHLIGHT;Highlight threshold -!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. -!TP_RETINEX_HSLSPACE_LIN;HSL-Linear -!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic -!TP_RETINEX_ITER;Iterations (Tone-mapping) -!TP_RETINEX_ITERF;Tone mapping -!TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. -!TP_RETINEX_LABEL;Retinex -!TP_RETINEX_LABEL_MASK;Mask -!TP_RETINEX_LABSPACE;L*a*b* -!TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method -!TP_RETINEX_MAP_GAUS;Gaussian mask -!TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) -!TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) -!TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. -!TP_RETINEX_MAP_NONE;None -!TP_RETINEX_MEDIAN;Transmission median filter -!TP_RETINEX_METHOD;Method -!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. -!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2 -!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture. -!TP_RETINEX_NEIGHBOR;Radius -!TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Offset (brightness) -!TP_RETINEX_SCALES;Gaussian gradient -!TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. -!TP_RETINEX_SETTINGS;Settings -!TP_RETINEX_SKAL;Scale -!TP_RETINEX_SLOPE;Free gamma slope -!TP_RETINEX_STRENGTH;Strength -!TP_RETINEX_THRESHOLD;Threshold -!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. -!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 -!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 -!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. -!TP_RETINEX_TRANF;Transmission -!TP_RETINEX_TRANSMISSION;Transmission map -!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_UNIFORM;Uniform -!TP_RETINEX_VARIANCE;Contrast -!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts. -!TP_RETINEX_VIEW;Process -!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_RETINEX_VIEW_NONE;Standard -!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_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". +!TP_RAW_IMAGENUM_SN;SN mode diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian index 50e1407a9..dd5b3ca46 100644 --- a/rtdata/languages/Latvian +++ b/rtdata/languages/Latvian @@ -1,6 +1,5 @@ #01 YYYY-MM-DD by nickname -ADJUSTER_RESET_TO_DEFAULT;Atmest uz noklusēto CURVEEDITOR_LINEAR;Lineāri CURVEEDITOR_LOADDLGLABEL;Ielādēt līkni... CURVEEDITOR_SAVEDLGLABEL;Saglabāt līkni... @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Asināšana PARTIALPASTE_VIGNETTING;Vinjetes labošana PARTIALPASTE_WHITEBALANCE;Baltā līdzsvarss PREFERENCES_APPLNEXTSTARTUP;lietos nākamā reizē -PREFERENCES_CACHECLEARALL;Attīrīt visu -PREFERENCES_CACHECLEARPROFILES;Attīrīt Profilus -PREFERENCES_CACHECLEARTHUMBS;Attīrīt sīktēlus PREFERENCES_CACHEMAXENTRIES;Maksimālais keša ierakstu skaits PREFERENCES_CACHEOPTS;Keša opcijas PREFERENCES_CACHETHUMBHEIGHT;Keša maksimālais sīktēla augstums @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Saglabāt apstrādes profilu kešā PREFERENCES_PROFILESAVEINPUT;Saglabāt apstrādes profilu pie ievades faila PREFERENCES_PSPATH;Adobe Photoshop instalācijas direktorijs PREFERENCES_SELECTLANG;Izvēlies valodu -PREFERENCES_SELECTTHEME;Izvēlieties tēmu PREFERENCES_SHOWBASICEXIF;Rādīt Exif pamatdatus PREFERENCES_SHOWDATETIME;Rādīt datumu un laiku PREFERENCES_SHTHRESHOLD;Cirpto ēnu slieksnis @@ -335,7 +330,6 @@ TP_CROP_GTRULETHIRDS;Trešdaļas TP_CROP_GUIDETYPE;Vadlīnijas: TP_CROP_H;A TP_CROP_LABEL;Kadrējums -TP_CROP_SELECTCROP; Norādīt kadrējumu TP_CROP_W;P TP_CROP_X;x TP_CROP_Y;y @@ -421,6 +415,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -430,9 +425,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -449,6 +445,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -459,6 +459,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -499,8 +500,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -557,7 +558,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -569,16 +570,19 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -623,12 +627,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -732,9 +735,9 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -770,7 +773,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -785,8 +788,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -889,7 +892,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -969,19 +972,103 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1007,16 +1094,13 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1032,27 +1116,30 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1071,8 +1158,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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 @@ -1081,6 +1170,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1099,19 +1189,22 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1123,18 +1216,18 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1142,16 +1235,17 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1167,7 +1261,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1176,14 +1269,11 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1215,12 +1305,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1228,22 +1313,21 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1257,43 +1341,31 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1313,12 +1385,15 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1328,8 +1403,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1337,13 +1412,12 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1370,9 +1444,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1403,11 +1476,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1418,8 +1487,9 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1437,8 +1507,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1450,14 +1518,13 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1477,11 +1544,9 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1493,6 +1558,27 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1525,11 +1611,17 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1609,13 +1701,15 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1641,10 +1735,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1691,6 +1781,12 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1733,10 +1829,16 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1767,10 +1869,19 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1783,19 +1894,26 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1803,7 +1921,8 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1811,58 +1930,42 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1871,10 +1974,10 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1886,7 +1989,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1912,7 +2015,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1964,13 +2067,19 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2060,7 +2169,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2071,7 +2180,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2183,6 +2292,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2197,7 +2307,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra !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 --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 9b4ae8097..8725d2789 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -5,7 +5,6 @@ ABOUT_TAB_CREDITS;Szerzők ABOUT_TAB_LICENSE;Licensz ABOUT_TAB_RELEASENOTES;Kiadási megjegyzések 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 @@ -83,8 +82,6 @@ FILEBROWSER_AUTOFLATFIELD;Auto Flat Field FILEBROWSER_BROWSEPATHBUTTONHINT;Kattints a kiválasztott útvonal böngészéséhez FILEBROWSER_BROWSEPATHHINT;Gépeld be az elérni kívánt útvonalat.\nCtrl-O-val tudod a fókuszt a beviteli mezőre vinni.\nEnter / Ctrl-Enter (az állományböngészőben) az ottani böngészéshez;\n\nÚtvonalrövidítések:\n ~ - felhasználói fiók (home) könyvtára\n - a felhasználó képkönyvtára FILEBROWSER_CACHE;Gyorsítótár -FILEBROWSER_CACHECLEARFROMFULL;Gyorsítótár ürítése - teljes -FILEBROWSER_CACHECLEARFROMPARTIAL;Gyorsítótár ürítése - részleges FILEBROWSER_CLEARPROFILE;Feldolgozási paraméter törlése FILEBROWSER_COPYPROFILE;Feldolgozási paraméterek másolása FILEBROWSER_CURRENT_NAME;Aktuális név: @@ -298,7 +295,6 @@ HISTORY_MSG_121;Auto CA HISTORY_MSG_122;Auto ref. feketekép (dark frame) HISTORY_MSG_123;Ref. feketekép állománya HISTORY_MSG_124;Lineáris exp. korrekció -HISTORY_MSG_125;Exp. korrekció csúcsfények megőrzésével HISTORY_MSG_126;Flat Field állomány HISTORY_MSG_127;Flat Field automatikus kivál. HISTORY_MSG_128;Flat Field elmosás sugara @@ -457,7 +453,6 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;Soronkénti zajszűrés PARTIALPASTE_RAWCACORR_AUTO;CA autokorrekció PARTIALPASTE_RAWEXPOS_BLACK;Feketeszint PARTIALPASTE_RAWEXPOS_LINEAR;Raw fehérszint lineáris korrekciós faktor (FÉ) -PARTIALPASTE_RAWEXPOS_PRESER;Raw fehérszint csúcsfény-megőrző faktor (FÉ) PARTIALPASTE_RAWGROUP;Raw beállítások PARTIALPASTE_RAW_DCBENHANCE;DCB javítási lépés alkalmazása PARTIALPASTE_RAW_DCBITERATIONS;DCB iterációk száma @@ -478,9 +473,6 @@ PREFERENCES_APPLNEXTSTARTUP;újraindítás után érvényes PREFERENCES_AUTOMONPROFILE;Oprendszerben beállított monitor-színprofil automatikus használata PREFERENCES_BATCH_PROCESSING;Kötegelt feldolgozás PREFERENCES_BEHAVIOR;Viselkedés -PREFERENCES_CACHECLEARALL;Teljes gyorsítótár törlése -PREFERENCES_CACHECLEARPROFILES;Feldolg. param. törlése -PREFERENCES_CACHECLEARTHUMBS;Előnézeti képek törlése PREFERENCES_CACHEMAXENTRIES;Gyorsítótárban tárolt képek max. száma PREFERENCES_CACHEOPTS;Gyorsítótár beállítások PREFERENCES_CACHETHUMBHEIGHT;Előnézeti kép maximális magassága @@ -488,7 +480,6 @@ PREFERENCES_CLIPPINGIND;Kiégett és bebukott részek jelzése PREFERENCES_CUSTPROFBUILD;Egyedi profil készítő 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_DARKFRAMEFOUND;Találat PREFERENCES_DARKFRAMESHOTS;kép PREFERENCES_DARKFRAMETEMPLATES;sablonok @@ -503,7 +494,6 @@ PREFERENCES_DIRSOFTWARE;Telepítés helye 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_FLATFIELDFOUND;Találat PREFERENCES_FLATFIELDSDIR;Flat Fields könyvtár @@ -550,9 +540,7 @@ PREFERENCES_PROFILESAVECACHE;Feldolgozási paraméterek mentése a gyorsítótá PREFERENCES_PROFILESAVEINPUT;Feldolgozási paraméterek mentése a kép mellé PREFERENCES_PROPERTY;Property PREFERENCES_PSPATH;Adobe Photoshop telepítési könyvtára -PREFERENCES_SELECTFONT;Betűtípus kiválasztása PREFERENCES_SELECTLANG;Nyelv kiválasztása -PREFERENCES_SELECTTHEME;Kinézet kiválasztása PREFERENCES_SET;Beállítás PREFERENCES_SHOWBASICEXIF;Fontosabb EXIF információk megjelenítése PREFERENCES_SHOWDATETIME;Felvétel dátumának és idejének megjelenítése @@ -563,7 +551,7 @@ PREFERENCES_SINGLETABVERTAB;Egyetlen fül mód, függőleges előnézeti képek PREFERENCES_SND_BATCHQUEUEDONE;Feldolgozási sor végén PREFERENCES_SND_HELP;Állomány elérése, vagy hagyd üresen (ekkor nincs hang). Windows-on használd a "SystemDefault", "SystemAsterisk", stb. stringeket a rendszerhangokhoz. PREFERENCES_SND_LNGEDITPROCDONE;Amikor a képszerkesztés végződik -PREFERENCES_SND_TRESHOLDSECS;másodperc után +PREFERENCES_SND_THRESHOLDSECS;másodperc után PREFERENCES_STARTUPIMDIR;Képek könyvtára induláskor PREFERENCES_TAB_BROWSER;Fájl böngésző PREFERENCES_TAB_COLORMGR;Színkezelés @@ -571,7 +559,6 @@ PREFERENCES_TAB_GENERAL;Általános PREFERENCES_TAB_IMPROC;Képfeldolgozás PREFERENCES_TAB_SOUND;Hangok PREFERENCES_TP_LABEL;Eszközök panel: -PREFERENCES_TP_USEICONORTEXT;Ikonok használata szöveg helyett a füleken PREFERENCES_TP_VSCROLLBAR;Függőleges görgetősáv elrejtése PREFERENCES_WORKFLOW;Munkamenet PROFILEPANEL_COPYPPASTE;Másolandó paraméterek @@ -637,7 +624,6 @@ TP_CROP_GUIDETYPE;Segédvonal típusa: TP_CROP_H;M TP_CROP_LABEL;Kivágás TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP; Kijelölés egérrel TP_CROP_W;Sz TP_CROP_X;x TP_CROP_Y;y @@ -741,7 +727,6 @@ TP_RAWCACORR_CABLUE;Kék TP_RAWCACORR_CARED;Vörös TP_RAWEXPOS_BLACKS;Feketeszintek TP_RAWEXPOS_LINEAR;Fehérszint: lineáris korrelációs faktor -TP_RAWEXPOS_PRESER;Fehérszint: csúcsfény-megőrző korrekció (FÉ) TP_RAWEXPOS_TWOGREEN;Zöldek együtt TP_RAW_DCBENHANCE;DCB helyesbítő lépés alkalmazása TP_RAW_DCBITERATIONS;DCB iterációk száma @@ -858,7 +843,7 @@ TP_WBALANCE_TUNGSTEN;Tungsten 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 - @@ -866,18 +851,24 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -885,6 +876,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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. +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels @@ -895,6 +887,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !EXPORT_USE_NORMAL_PIPELINE;Standard (bypass some steps, resize at the end) !EXTPROGTARGET_1;raw !EXTPROGTARGET_2;queue-processed +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_EXTPROGMENU;Open with !FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) @@ -921,7 +915,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !FILEBROWSER_SHOWORIGINALHINT;Show only original images.\n\nWhen several images exist with the same filename but different extensions, the one considered original is the one whose extension is nearest the top of the parsed extensions list in Preferences > File Browser > Parsed Extensions. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -931,12 +925,15 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_167;Demosaicing method !HISTORY_MSG_168;L*a*b* - CC curve @@ -1005,9 +1002,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -1043,7 +1040,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -1058,8 +1055,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -1162,7 +1159,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1242,19 +1239,103 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1280,10 +1361,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). @@ -1293,13 +1371,16 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -1312,50 +1393,58 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !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 +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BEHADDALL;All to 'Add' !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_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1373,11 +1462,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_D55;5500K !PREFERENCES_D60;6000K !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLUOF2;Fluorescent F2 !PREFERENCES_FLUOF7;Fluorescent F7 !PREFERENCES_FLUOF11;Fluorescent F11 @@ -1402,24 +1489,18 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" -!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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1432,30 +1513,20 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PROFILEPANEL_GLOBALPROFILES;Bundled profiles !PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. !PROFILEPANEL_MYPROFILES;My profiles @@ -1468,11 +1539,14 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1481,8 +1555,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1490,13 +1564,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1523,9 +1596,8 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1555,11 +1627,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1570,8 +1638,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1589,8 +1658,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1602,14 +1669,13 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1629,11 +1695,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1645,6 +1709,27 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1674,6 +1759,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1738,10 +1829,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_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_CLAMPOOG;Clip out-of-gamut colors !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 @@ -1789,6 +1882,12 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift !TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. !TP_LABCURVE_CHROMATICITY;Chromaticity @@ -1822,10 +1921,16 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1849,8 +1954,17 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength !TP_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1860,14 +1974,22 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1875,69 +1997,54 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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. !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !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_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1949,7 +2056,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1975,7 +2082,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2018,9 +2125,15 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !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_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones !TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple @@ -2099,7 +2212,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2110,7 +2223,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2196,9 +2309,10 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés - !TP_WAVELET_TON;Toning !TP_WBALANCE_EQBLUERED;Blue/Red equalizer !TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. +!TP_WBALANCE_PICKER;Pick !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". !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 --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index 9cf4cdf5d..7a7d4e6f6 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -20,7 +20,6 @@ ABOUT_TAB_CREDITS;Credits ABOUT_TAB_LICENSE;Licentie ABOUT_TAB_RELEASENOTES;Uitgave-opmerkingen 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 @@ -124,8 +123,6 @@ FILEBROWSER_AUTOFLATFIELD;Selecteer automatisch vlakveldopname FILEBROWSER_BROWSEPATHBUTTONHINT;Klik om te navigeren naar het gekozen pad FILEBROWSER_BROWSEPATHHINT;Typ het pad naar de doelmap.\nCtrl-O markeer het pad in het tekstveld.\nEnter / Ctrl-Enter open de map.\nEsc maak het tekstveld leeg.\nShift-Esc verwijder markering.\n\n\nSneltoetsen:\n ~ - gebruikers home directory\n ! - gebruikers afbeeldingen map FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Verwijder uit cache - volledig -FILEBROWSER_CACHECLEARFROMPARTIAL;Verwijder uit cache - gedeeltelijk FILEBROWSER_CLEARPROFILE;Verwijder profiel FILEBROWSER_COLORLABEL_TOOLTIP;Kleur label\n\nGebruik keuzemenu of nSneltoets:\nShift-Ctrl-0 Geen kleur\nShift-Ctrl-1 Rood\nShift-Ctrl-2 Geel\nShift-Ctrl-3 Groen\nShift-Ctrl-4 Blauw\nShift-Ctrl-5 Paars FILEBROWSER_COPYPROFILE;Kopieer profiel @@ -379,7 +376,6 @@ HISTORY_MSG_121;RAW CA-correctie - Auto HISTORY_MSG_122;Donkerframe - Autom. selectie HISTORY_MSG_123;Donkerframe - Bestand HISTORY_MSG_124;Witpunt correctie -HISTORY_MSG_125;Hoge lichten behouden HISTORY_MSG_126;Vlakveld - Bestand HISTORY_MSG_127;Vlakveld - Autom. selectie HISTORY_MSG_128;Vlakveld - Verzachten straal @@ -486,9 +482,7 @@ HISTORY_MSG_231;ZW - 'Voor' curve HISTORY_MSG_232;ZW - 'Voor' curve type HISTORY_MSG_233;ZW - 'Na' curve HISTORY_MSG_234;ZW - 'Na' curve type -HISTORY_MSG_235;ZW - Auto Kanaalmixer HISTORY_MSG_236;- -HISTORY_MSG_237;ZW Mixer HISTORY_MSG_238;GF - Straal HISTORY_MSG_239;GF - Sterkte HISTORY_MSG_240;GF - Centrum @@ -523,7 +517,6 @@ HISTORY_MSG_269;KT - Hoog - Rood HISTORY_MSG_270;KT - Hoog - Groen HISTORY_MSG_271;KT - Hoog - Blauw HISTORY_MSG_272;KT - Balans -HISTORY_MSG_273;KT - Beginwaarde HISTORY_MSG_274;KT - Verz. Schaduwen HISTORY_MSG_275;KT - Verz. Hoge lichten HISTORY_MSG_276;KT - Dekking @@ -641,7 +634,6 @@ HISTORY_MSG_388;W - Rest - KB groen midden HISTORY_MSG_389;W - Rest - KB blauw midden HISTORY_MSG_390;W - Rest - KB groen laag HISTORY_MSG_391;W - Rest - KB blauw laag -HISTORY_MSG_392;W - Rest - KB Beginwaarde HISTORY_MSG_393;DCP 'Look'tabel HISTORY_MSG_394;DCP Basis belichting HISTORY_MSG_395;DCP Basis tabel @@ -838,8 +830,6 @@ NAVIGATOR_S;S: 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 @@ -890,7 +880,6 @@ PARTIALPASTE_RAWCACORR_AUTO;Autom. C/A-correctie PARTIALPASTE_RAWCACORR_CAREDBLUE;CA rood & blauw PARTIALPASTE_RAWEXPOS_BLACK;Zwartniveau PARTIALPASTE_RAWEXPOS_LINEAR;Raw witpunt- lineaire corr. factor -PARTIALPASTE_RAWEXPOS_PRESER;Raw witpunt- herstel hoge lichten (EV) PARTIALPASTE_RAWGROUP;Raw-instellingen PARTIALPASTE_RAW_DCBENHANCE;Pas DCB-verbetering toe PARTIALPASTE_RAW_DCBITERATIONS;aantal DCB-herhalingen @@ -912,14 +901,9 @@ PARTIALPASTE_VIGNETTING;Vignetteringscorrectie PARTIALPASTE_WAVELETGROUP;Wavelet verwerking PARTIALPASTE_WHITEBALANCE;Witbalans PREFERENCES_ADD;Toevoegen +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator randkleur PREFERENCES_APPLNEXTSTARTUP;herstart vereist -PREFERENCES_AUTLISLOW;Laag -PREFERENCES_AUTLISMAX;Max - Gemiddelde van alle tegels -PREFERENCES_AUTLISSTD;Hoog -PREFERENCES_AUTLISVLOW;Geen -PREFERENCES_AUTLOW;Laag PREFERENCES_AUTOMONPROFILE;Gebruik automatisch het standaard monitorprofiel \nvan het besturingsysteem -PREFERENCES_AUTSTD;Standaard PREFERENCES_BATCH_PROCESSING;Batch-verwerking PREFERENCES_BEHADDALL;Alles op 'Toevoegen' PREFERENCES_BEHADDALLHINT;Zet alle parameters in de Toevoegen mode.\nWijzigingen van parameters in de batch tool zijn deltas op de opgeslagen waarden. @@ -927,16 +911,9 @@ PREFERENCES_BEHAVIOR;Gedrag PREFERENCES_BEHSETALL;Alles op 'Activeer' PREFERENCES_BEHSETALLHINT;Zet alle parameters in de Activeer mode.\nWijzigingen van parameters in de batch tool zijn absoluut. De actuele waarden worden gebruikt. PREFERENCES_BLACKBODY;Tungsten(wolfraam) -PREFERENCES_CACHECLEARALL;Wis alles -PREFERENCES_CACHECLEARPROFILES;Wis profielen -PREFERENCES_CACHECLEARTHUMBS;Wis miniaturen PREFERENCES_CACHEMAXENTRIES;Maximaal aantal elementen in cache PREFERENCES_CACHEOPTS;Cache-opties PREFERENCES_CACHETHUMBHEIGHT;Maximale hoogte miniaturen -PREFERENCES_CIEART;CIECAM02 optimalisatie -PREFERENCES_CIEART_FRAME;CIECAM02-Specifieke instellingen -PREFERENCES_CIEART_LABEL;Gebruik float precisie in plaats van double -PREFERENCES_CIEART_TOOLTIP;Indien aangezet worden CIECAM02 berekening uitgevoerd in het single-precision floating-point formaat in plaats van double-precision. Dit levert een iets hogere verwerkingssnelheid ten koste van een verwaarloosbaar verlies aan kwaliteit PREFERENCES_CLIPPINGIND;Indicatie over-/onderbelichting PREFERENCES_CLUTSCACHE;HaldCLUT cache PREFERENCES_CLUTSCACHE_LABEL;Maximum aantal cached Cluts @@ -953,7 +930,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys formaat PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Naam PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Pad naar programma of script -PREFERENCES_CUTOVERLAYBRUSH;Kleur uitsnedemasker PREFERENCES_D50;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K @@ -963,8 +939,6 @@ PREFERENCES_DARKFRAMESHOTS;foto's PREFERENCES_DARKFRAMETEMPLATES;sjablonen PREFERENCES_DATEFORMAT;Datumformaat PREFERENCES_DATEFORMATHINT;U kunt de volgende formaten gebruiken:\n%y : jaar\n%m : maand\n%d : dag\n\nHet Nederlandse datumformaat is bijvoorbeeld:\n%d/%m/%y -PREFERENCES_DAUB_LABEL;Gebruik Daubechies D6 wavelets in plaats van D4 -PREFERENCES_DAUB_TOOLTIP;De Ruisonderdrukking en Wavelet niveaus gebruiken de Debauchies moeder wavelet. Als je D6 gebruikt in plaats van D4 vergroot het aantal orthogonale Daubechies coëfficiënten en dit verbeterd waarschijnlijk de kwaliteit van de lage niveaus. PREFERENCES_DIRDARKFRAMES;Map met donkerframes PREFERENCES_DIRHOME;Standaardmap PREFERENCES_DIRLAST;Laatst bezochte map @@ -972,10 +946,8 @@ PREFERENCES_DIROTHER;Anders PREFERENCES_DIRSELECTDLG;Selecteer standaardmap bij opstarten... PREFERENCES_DIRSOFTWARE;Installatiemap 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_FLATFIELDFOUND;Gevonden PREFERENCES_FLATFIELDSDIR;Vlakveldmap @@ -1016,12 +988,7 @@ PREFERENCES_INTENT_RELATIVE;Relatieve colorimetrie PREFERENCES_INTENT_SATURATION;Verzadiging PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Toon interne JPEG-miniatuur indien onbewerkt PREFERENCES_LANGAUTODETECT;Gebruik taalinstellingen pc -PREFERENCES_LEVAUTDN;Ruisonderdrukking niveau -PREFERENCES_LEVDN;Cell grootte -PREFERENCES_LISS;Auto multi-zone verzachten -PREFERENCES_MAX;Maxi (Tegel) PREFERENCES_MAXRECENTFOLDERS;Maximum aantal recente mappen -PREFERENCES_MED;Gemiddeld (Tegel/2) PREFERENCES_MENUGROUPEXTPROGS;Groepeer open met PREFERENCES_MENUGROUPFILEOPERATIONS;Groepeer bestandsbewerkingen PREFERENCES_MENUGROUPLABEL;Groepeer labelen @@ -1029,16 +996,13 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Groepeer profielbewerkingen PREFERENCES_MENUGROUPRANK;Groepeer markering PREFERENCES_MENUOPTIONS;Menu-opties PREFERENCES_METADATA;Metadata -PREFERENCES_MIN;Mini (100x115) PREFERENCES_MONINTENT;Standaard monitor weergave PREFERENCES_MONITOR;Monitor PREFERENCES_MONPROFILE;Standaard kleurprofiel PREFERENCES_MONPROFILE_WARNOSX;Als gevolg van MacOS beperkingen wordt alleen sRGB ondersteund. PREFERENCES_MULTITAB;Multi-tab: elke foto opent in nieuw tabvenster PREFERENCES_MULTITABDUALMON;Multi-tab, indien beschikbaar op tweede monitor -PREFERENCES_NAVGUIDEBRUSH;Navigator randkleur PREFERENCES_NAVIGATIONFRAME;Navigatie -PREFERENCES_NOISE;Ruisonderdrukking PREFERENCES_OUTDIR;Uitvoermap PREFERENCES_OUTDIRFOLDER;Sla op in map PREFERENCES_OUTDIRFOLDERHINT;Sla foto's op in andere map @@ -1072,51 +1036,34 @@ PREFERENCES_PRTPROFILE;Kleurprofiel PREFERENCES_PSPATH;Installatiemap Adobe Photoshop PREFERENCES_REMEMBERZOOMPAN;Onthoud zoom % en pan startpunt PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Onthoud het zoom % en pan startpunt van de huidige afbeelding als er een nieuwe afbeelding wordt geopend.\n\nDeze optie werkt alleen in "Single Editor Tab Mode" en wanneer "Demozaïekmethode van het voorbeeld <100% zoom" hetzelfde is als "Gelijk aan PP3". -PREFERENCES_RGBDTL_LABEL;Maximum aantal 'threads' voor Ruisonderdrukking en Wavelet (gedeeld door 2) -PREFERENCES_RGBDTL_TOOLTIP;Ruisonderdrukking en Wavelet gebruiken ongeveer 128MB RAM voor een 10MPix afbeelding, of 512MB voor een 40MPix afbeelding en additioneel 128MB RAM per thread. Hoe meer threads parallel worden gebruikt, hoe sneller de bewerking. Laat de instelling op "0" staan om automatisch het maximale aantal threads te gebruiken dat mogelijk is. -PREFERENCES_SELECTFONT;Kies lettertype -PREFERENCES_SELECTFONT_COLPICKER;Font van de Kleurkiezer PREFERENCES_SELECTLANG;Selecteer taal -PREFERENCES_SELECTTHEME;Kies thema -PREFERENCES_SERIALIZE_TIFF_READ;Tiff Lees Instellingen -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serieel lezen van tiff bestanden -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Als een map veel ongecomprimeerde tiff bestanden bevat dan versnelt deze optie het genereren van de miniaturen. +PREFERENCES_SERIALIZE_TIFF_READ;TIFF Lees Instellingen +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serieel lezen van TIFF bestanden +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Als een map veel ongecomprimeerde TIFF bestanden bevat dan versnelt deze optie het genereren van de miniaturen. PREFERENCES_SET;Activeer PREFERENCES_SHOWBASICEXIF;Toon standaard Exif-info PREFERENCES_SHOWDATETIME;Toon datum en tijd PREFERENCES_SHOWEXPOSURECOMPENSATION;Toon belichtingscompensatie PREFERENCES_SHOWFILMSTRIPTOOLBAR;Toon filmstrip werkbalk PREFERENCES_SHTHRESHOLD;Grenswaarde onderbelichting -PREFERENCES_SIMPLAUT;Gereedschap PREFERENCES_SINGLETAB;Enkel-tab: foto's openen in zelfde tabvenster PREFERENCES_SINGLETABVERTAB;Enkel-tab ('filmstrip') modus met verticale tabs -PREFERENCES_SMA;Klein (250x287) PREFERENCES_SND_BATCHQUEUEDONE;Verwerkingsrij klaar PREFERENCES_SND_HELP;Typ bestandsnaam (of niets: geen geluid).\nWindows: gebruik 'SystemDefault', 'SystemAsterisk', etc. voor systeemgeluiden.\nLinux: gebruik "complete", "window-attention" etc. voor systeemgeluiden PREFERENCES_SND_LNGEDITPROCDONE;Bewerking klaar -PREFERENCES_SND_TRESHOLDSECS;na seconden +PREFERENCES_SND_THRESHOLDSECS;na seconden PREFERENCES_STARTUPIMDIR;Standaardmap bij opstarten -PREFERENCES_STDAUT;Standaard PREFERENCES_TAB_BROWSER;Bestandsnavigator PREFERENCES_TAB_COLORMGR;Kleurbeheer PREFERENCES_TAB_DYNAMICPROFILE;Dynamisch Profielregel PREFERENCES_TAB_GENERAL;Algemeen PREFERENCES_TAB_IMPROC;Beeldverwerking -PREFERENCES_TAB_PERFORMANCE;Prestaties en Kwaliteit PREFERENCES_TAB_SOUND;Geluiden -PREFERENCES_TIMAX;Hoog -PREFERENCES_TINB;Aantal tegles -PREFERENCES_TISTD;Standaard PREFERENCES_TP_LABEL;Gereedschapspaneel: -PREFERENCES_TP_USEICONORTEXT;Gebruik iconen ipv. tekst voor de tabbladen PREFERENCES_TP_VSCROLLBAR;Verberg de schuifbalk van het gereedschapspaneel PREFERENCES_TUNNELMETADATA;Kopieer Exif/IPTC/XMP-data onveranderd naar uitvoerbestand PREFERENCES_USEBUNDLEDPROFILES;Gebruik gebundelde profielen PREFERENCES_VIEW;Witbalans instelling van het uitvoerapparaat (monitor, TV, projector...) -PREFERENCES_WAVLEV;Vergroot wavelet ninveau voor kwaliteit 'hoog' -PREFERENCES_WLONE;Eén niveau -PREFERENCES_WLTWO;Twee niveaus -PREFERENCES_WLZER;Nee PREFERENCES_WORKFLOW;Layout PROFILEPANEL_COPYPPASTE;Te kopiëren parameters PROFILEPANEL_GLOBALPROFILES;Gebundelde profielen @@ -1172,8 +1119,6 @@ SAVEDLG_SUBSAMP_TOOLTIP;Beste Compressie:\nJ:a:b 4:2:0\nh/v 2/2\nChroma gehalvee 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 @@ -1191,7 +1136,6 @@ TP_BWMIX_ALGO_LI;Lineair TP_BWMIX_ALGO_SP;Speciale effecten TP_BWMIX_ALGO_TOOLTIP;Lineair: creëert een normale lineaire response.\n Speciale effecten: creëert speciale effecten door kanalen non-lineair te mixen.TP_BWMIX_AUTOCH;Auto TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Bereken optimale waardes voor de kanaalmixer. TP_BWMIX_CC_ENABLED;Wijzig complementaire kleur TP_BWMIX_CC_TOOLTIP;Automatische aanpassing van complementaire kleuren in ROYGCBPM mode. TP_BWMIX_CHANNEL;Luminantie Balans @@ -1218,9 +1162,6 @@ TP_BWMIX_MET;Methode TP_BWMIX_MET_CHANMIX;Kanaalmixer TP_BWMIX_MET_DESAT;Desatureren TP_BWMIX_MET_LUMEQUAL;Luminantie Balans -TP_BWMIX_MIXC;Mixer -TP_BWMIX_NEUTRAL;Terug naar beginwaarde -TP_BWMIX_NEUTRAL_TIP;Zet alle waardes - schuifbalken - filters - kanaalmixers terug naar de standaard waarde. TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Totaal: %4%% TP_BWMIX_RGBLABEL_HINT;RGB omrekeningsfactoren. Hierin zijn alle gekozen opties vewerkt.\nTotaal toont de som van de uit te voeren RGB factoren:\n- dit is altijd 100% in relatieve mode\n- hoger (lichter) of lager (donkerder) dan 100% in absolute mode. TP_BWMIX_RGB_TOOLTIP;Mix de RGB kanalen. Gebruik Voorinstellingen voor aanwijzingen.\nNegatieve waarden kunnen artefacten of onregelmatigheden veroorzaken. @@ -1262,11 +1203,6 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Horizontaal spiegelen TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nSneltoets:\n[ - Multi-tab Mode,\nAlt-[ - Enkel-tab Mode. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nSneltoets:\n] - Multi-tab Mode,\nAlt-] - Enkel-tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Verticaal spiegelen -TP_COLORAPP_ADAPTSCENE;Opnameomgeving luminositeit -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminantie van de opnameomgeving (cd/m²).\n1) Berekend op basis van de Exif data:\nSluitertijd - ISO-waarde - Diafragma - Camera belichtingscompensatie.\n2) Berekend op basis van het raw witpunt en RT's Belichtingscompensatie -TP_COLORAPP_ADAPTVIEWING;Weergaveomgeving luminositeit (cd/m2) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminantie van de weergaveomgeving \n(gebruikelijk 16cd/m²) -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Als het keuzevakje is aangezet (aanbevolen), dan berekent RT de optimale waarde op basis van de Exif data.\nOm de waarde handmatig in te stellen moet het keuzevakje worden uitgezet TP_COLORAPP_ALGO;Algoritme TP_COLORAPP_ALGO_ALL;Alle TP_COLORAPP_ALGO_JC;Lichtheid + Chroma (JC) @@ -1296,8 +1232,6 @@ TP_COLORAPP_CURVEEDITOR3;Chroma curve TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Wijzigt ofwel chroma, verzadiging of kleurrijkheid.\n Het Histogram toont chromaticiteit (Lab) voor CIECAM wijzigingen.\nHet Histogram toont C,s,M na toepassing van CIECAM indien het selectievakje 'Toon CIECAM uitvoer' is aangezet.\n(C,s,M) worden niet getoond in het Hoofd histogram paneel. \nRaadpleeg het Histogram paneel voor de definitieve uitvoer TP_COLORAPP_DATACIE;CIECAM02 uitvoer histogram in de curven TP_COLORAPP_DATACIE_TOOLTIP;Indien aangezet, tonen de histogrammen van de CIECAM02 curven bij benadering de waarden/reeksen voor J of Q, en C, s of M na de CIECAM02 aanpassingen.\nDit beïnvloed niet het hoofd histogram paneel.\n\nIndien uitgezet tonen de histogrammen van de CIECAM02 curven de Lab waarden zoals deze waren voor de CIECAM02 aanpassingen -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Als het keuzevakje is aangezet (aanbevolen), dan berekent RT een optimale waarde. Deze wordt gebruikt door CAT02 en door CIECAM02.\nOm de waarden handmatig in te stellen moet het keuzevakje worden uitgezet (waarden groter dan 65 worden aanbevolen) -TP_COLORAPP_DEGREE_TOOLTIP;Hoeveelheid van CIE Chromatic Adaptation Transform 2002 TP_COLORAPP_GAMUT;Gamut controle (Lab) TP_COLORAPP_GAMUT_TOOLTIP;Sta gamut controle toe in Lab mode TP_COLORAPP_HUE;Tint (h) @@ -1312,8 +1246,6 @@ TP_COLORAPP_MODEL;Witpunt Model TP_COLORAPP_MODEL_TOOLTIP;WB [RT] + [uitvoer]:\nRT's WB wordt gebruikt voor de opname, CIECAM02 wordt gezet op D50. Het uitvoerapparaat's wit gebruikt de instelling van Voorkeuren > Kleurbeheer\n\nWB [RT+CAT02] + [output]:\nRT's WB instellingen worden gebruikt door CAT02 en het uitvoerapparaat's wit gebruikt de waarde van de Voorkeuren. TP_COLORAPP_RSTPRO;Rode en Huidtinten bescherming TP_COLORAPP_RSTPRO_TOOLTIP;Rode en Huidtinten bescherming (schuifbalk en curven) -TP_COLORAPP_SHARPCIE;Verscherpen, Detailcontrast, Microcontrast & Randen met Q/C -TP_COLORAPP_SHARPCIE_TOOLTIP;Verscherpen, Detailcontrast, Microcontrast & Randen zullen CIECAM02 gebruiken wanneer dit is aangezet. TP_COLORAPP_SURROUND;Omgeving TP_COLORAPP_SURROUND_AVER;Gemmiddeld TP_COLORAPP_SURROUND_DARK;Donker @@ -1332,6 +1264,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;lichtheid TP_COLORAPP_TCMODE_SATUR;Verzadiging TP_COLORAPP_TONECIE;Tonemapping gebruik makend van CIECAM TP_COLORAPP_TONECIE_TOOLTIP;Indien uitgezet zal tonemapping plaats vinden in Lab.\nIndien aangezet zal tonemapping gebruik maken van CIECAM02.\nVoorwaarde is dat Tonemapping (Lab/CIECAM02) actief is. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminantie van de weergaveomgeving \n(gebruikelijk 16cd/m²) TP_COLORAPP_WBCAM;WB [RT+CAT02] + [uitvoer] TP_COLORAPP_WBRT;WB [RT] + [uitvoer] TP_COLORTONING_AB;o C/L @@ -1384,7 +1317,6 @@ TP_CROP_GUIDETYPE;Hulplijnen: TP_CROP_H;Hoogte TP_CROP_LABEL;Bijsnijden TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Selecteer gebied TP_CROP_W;Breedte TP_CROP_X;X TP_CROP_Y;Y @@ -1474,7 +1406,6 @@ TP_EPD_LABEL;Tonemapping (Lab/CIECAM02) TP_EPD_REWEIGHTINGITERATES;Herhaling TP_EPD_SCALE;Schaal TP_EPD_STRENGTH;Sterkte -TP_EPD_TOOLTIP;Tonemapping is mogelijk via Lab mode (standaard) of CIECAM02 mode.\n\nOm CIECAM02 Tonemapping mode te gebruiken moeten de volgende instellingen worden gekozen: \n1. CIECAM\n2. Algoritme="Helderheid + Kleurrijkheid (QM)"\n3. "Tonemapping gebruik makend van CIECAM02 helderheid (Q)" TP_EXPOSURE_AUTOLEVELS;Autom. niveaus TP_EXPOSURE_AUTOLEVELS_TIP;Activeer automatische niveaus\nActiveer Herstel Hoge lichten indien nodig. TP_EXPOSURE_BLACKLEVEL;Schaduwen @@ -1623,9 +1554,6 @@ TP_LENSGEOM_AUTOCROP;Automatisch bijsnijden TP_LENSGEOM_FILL;Automatisch uitvullen TP_LENSGEOM_LABEL;Objectief / Geometrie TP_LENSPROFILE_LABEL;Lenscorrectie Profielen -TP_LENSPROFILE_USECA;CA correctie -TP_LENSPROFILE_USEDIST;Lensvervorming correctie -TP_LENSPROFILE_USEVIGN;Vignettering correctie TP_NEUTRAL;Terugzetten TP_NEUTRAL_TIP;Alle belichtingsinstellingen naar 0 TP_PCVIGNETTE_FEATHER;Straal @@ -1663,7 +1591,6 @@ TP_RAWEXPOS_BLACK_BLUE;Blauw TP_RAWEXPOS_BLACK_GREEN;Groen TP_RAWEXPOS_BLACK_RED;Rood TP_RAWEXPOS_LINEAR;Witpunt Correctie -TP_RAWEXPOS_PRESER;Herstel hoge lichten TP_RAWEXPOS_RGB;Rood, Groen, Blauw TP_RAWEXPOS_TWOGREEN;Koppel Groen 1 en 2 TP_RAW_1PASSMEDIUM;1 keer (Gemiddeld) @@ -1694,8 +1621,6 @@ TP_RAW_NONE;Geen (Toont sensor patroon) TP_RAW_PIXELSHIFT;Pixel Verschuiven TP_RAW_PIXELSHIFTADAPTIVE;Adaptieve detectie TP_RAW_PIXELSHIFTBLUR;Vervaag bewegingsmasker -TP_RAW_PIXELSHIFTEPERISO;ISO toepassing -TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;De standaard waarde (0.0) werkt goed voor normale ISO.\nVergroot de waarde om de bewegingsdetectie te verbeteren voor hogere ISO.\nVergroot in kleine stappen en bekijk het bewegingsmasker tijdens het verhogen. TP_RAW_PIXELSHIFTEQUALBRIGHT;Balanseer de helderheid van de frames TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Balanseer de helderheid van de frames t.o.v. de helderheid van het geslecteerde frame.\nAls er overbelichte gebieden zijn in de frames, selecteer dan het helderste frame om een magenta kleurzweem te vermijden of selecteer bewegingsorrectie. TP_RAW_PIXELSHIFTEXP0;Experimenteel @@ -1727,7 +1652,6 @@ TP_RAW_PIXELSHIFTREDBLUEWEIGHT;Rood&Blauw gewicht TP_RAW_PIXELSHIFTSHOWMOTION;Toon beweging TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Toon alleen masker TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Toont het bewegingsmasker zonder de afbeelding -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Maakt een doorzichtig masker dat de gebieden toont met beweging TP_RAW_PIXELSHIFTSIGMA;Vervagen straal TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;De standaard straal van 1.0 is goed voor normale ISO. Verhoog de waarde voor hogere ISO.\n5.0 is een goed startpunt voor hoge ISO afbeeldingen.\nControleer het bewegingsmasker bij het veranderen van de waarde. TP_RAW_PIXELSHIFTSMOOTH;Zachte overgang @@ -1756,7 +1680,6 @@ TP_RESIZE_WIDTH;Breedte TP_RETINEX_CONTEDIT_HSL;Histogram balans HSL TP_RETINEX_CONTEDIT_LAB;Histogram balans L*a*b* TP_RETINEX_CONTEDIT_LH;Tint balans -TP_RETINEX_CONTEDIT_MAP;Masker mixer TP_RETINEX_CURVEEDITOR_CD;L=f(L) TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminantie volgens luminantie L=f(L)\nCorrigeert ruwe data om halo's and artefacte te verminderen. TP_RETINEX_CURVEEDITOR_LH;Sterkte=f(H) @@ -1791,7 +1714,6 @@ TP_RETINEX_LABEL;Retinex TP_RETINEX_LABEL_MASK;Masker TP_RETINEX_LABSPACE;L*a*b* TP_RETINEX_LOW;Laag -TP_RETINEX_MAP;Masker methode TP_RETINEX_MAP_GAUS;Gaussiaans masker TP_RETINEX_MAP_MAPP;Verscherp masker (wavelet gedeeltelijk) TP_RETINEX_MAP_MAPT;Verscherp masker (wavelet totaal) @@ -2112,8 +2034,8 @@ TP_WBALANCE_WATER_HEADER;Onderwater 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: - @@ -2121,15 +2043,32 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_STARTSTOPHINT;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s +!CURVEEDITOR_CATMULLROM;Flexible !DONT_SHOW_AGAIN;Don't show this message again. +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles +!GENERAL_CURRENT;Current +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_297;NR - Mode +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_475;PS - Equalize channel !HISTORY_MSG_476;CAM02 - Temp out @@ -2144,29 +2083,135 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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 -!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. +!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +!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_DEHAZE;Haze removal !PARTIALPASTE_LOCALCONTRAST;Local contrast -!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 +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift +!PARTIALPASTE_RAW_BORDER;Raw border +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +!PREFERENCES_CROP;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -2174,30 +2219,89 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_GREY18_OLD;Yb=18 CIE L#50 !PREFERENCES_LANG;Language +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !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 +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !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 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_COLORTONING_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -2207,16 +2311,47 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: - !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_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_4PASS;3-pass+fast +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold +!TP_RAW_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !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_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_MAP;Equalizer !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_MAP;Method +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !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_WBALANCE_PICKER;Pick diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM index fdb78ffc0..f9a53a15e 100644 --- a/rtdata/languages/Norsk BM +++ b/rtdata/languages/Norsk BM @@ -1,6 +1,5 @@ #01 2009-02-12 Esben L. Kristensen -ADJUSTER_RESET_TO_DEFAULT;Tilbake til standard CURVEEDITOR_LINEAR;Linjær CURVEEDITOR_LOADDLGLABEL;Åpne kurve... CURVEEDITOR_SAVEDLGLABEL;Lagre kurve... @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Oppskarping PARTIALPASTE_VIGNETTING;Vignetteringskorreksjon PARTIALPASTE_WHITEBALANCE;Hvitbalanse PREFERENCES_APPLNEXTSTARTUP;Endres ved neste oppstart -PREFERENCES_CACHECLEARALL;Slett alle -PREFERENCES_CACHECLEARPROFILES;Slett profiler -PREFERENCES_CACHECLEARTHUMBS;Slett thumbnails PREFERENCES_CACHEMAXENTRIES;Maksimalt antall cache oppføringer PREFERENCES_CACHEOPTS;Cache innstillinger PREFERENCES_CACHETHUMBHEIGHT;Maksimal Thumbnail Høyde @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Lagre prosesseringsparametre til cachen PREFERENCES_PROFILESAVEINPUT;Lagre prosesseringsparametre i innfilen PREFERENCES_PSPATH;Adobe Photoshop installasjonsfolder PREFERENCES_SELECTLANG;Velg språk -PREFERENCES_SELECTTHEME;Velg tema PREFERENCES_SHOWBASICEXIF;Vis utvidet Exif-informasjon PREFERENCES_SHOWDATETIME;Vis dato og tid PREFERENCES_SHTHRESHOLD;Terskelverdi for markerte skygger @@ -335,7 +330,6 @@ TP_CROP_GTRULETHIRDS;Tredjedelsreglen TP_CROP_GUIDETYPE;Guidetype: TP_CROP_H;H TP_CROP_LABEL;Beskjæring -TP_CROP_SELECTCROP;Velg beskjæringsområde TP_CROP_W;B TP_CROP_X;x TP_CROP_Y;y @@ -420,6 +414,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -429,9 +424,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -448,6 +444,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -458,6 +458,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -498,8 +499,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -556,7 +557,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -568,16 +569,19 @@ TP_WBALANCE_TEMPERATURE;Temperatur !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -622,12 +626,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -731,9 +734,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -769,7 +772,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -784,8 +787,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -888,7 +891,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -968,19 +971,103 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1006,16 +1093,13 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1031,27 +1115,30 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1070,8 +1157,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 @@ -1080,6 +1169,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1098,19 +1188,22 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1122,18 +1215,18 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1141,16 +1234,17 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1166,7 +1260,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1175,14 +1268,11 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1214,12 +1304,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1227,22 +1312,21 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1256,43 +1340,31 @@ TP_WBALANCE_TEMPERATURE;Temperatur !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1312,12 +1384,15 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1327,8 +1402,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1336,13 +1411,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1369,9 +1443,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1402,11 +1475,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1417,8 +1486,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1436,8 +1506,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1449,14 +1517,13 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1476,11 +1543,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1492,6 +1557,27 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1524,11 +1610,17 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1608,13 +1700,15 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1640,10 +1734,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1690,6 +1780,12 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1732,10 +1828,16 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1766,10 +1868,19 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1782,19 +1893,26 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1802,7 +1920,8 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1810,58 +1929,42 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1870,10 +1973,10 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1885,7 +1988,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1911,7 +2014,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1963,13 +2066,19 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2059,7 +2168,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2070,7 +2179,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2182,6 +2291,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2196,7 +2306,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur !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 --git a/rtdata/languages/Polish b/rtdata/languages/Polish index eda9251ce..68693adce 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -13,7 +13,6 @@ ABOUT_TAB_CREDITS;Zasługi ABOUT_TAB_LICENSE;Licencja ABOUT_TAB_RELEASENOTES;Notatki eksploatacyjne 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 @@ -97,8 +96,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatyczne użycie klatki typu puste pole FILEBROWSER_BROWSEPATHBUTTONHINT;Należy kliknąć, aby przeglądać wybraną ścieżkę FILEBROWSER_BROWSEPATHHINT;Umożliwia przeglądanie wprowadzonej ścieżki\nCtrl-o zaznaczenie\nEnter, Ctrl-Enter (w menedżerze plików) przeglądanie\nSkróty:\n ~ - katalog domowy użytkownika\n ! - katalog z obrazami użytkownia FILEBROWSER_CACHE;Pamięć podręczna -FILEBROWSER_CACHECLEARFROMFULL;Czyszczenie pamięci podręcznej - pełne -FILEBROWSER_CACHECLEARFROMPARTIAL;Czyszczenie pamięci podręcznej - częściowe FILEBROWSER_CLEARPROFILE;Wyczyść profil FILEBROWSER_COLORLABEL_TOOLTIP;Kolorowe etykiety\n\nUżyj za pomocą rozwijanej listy lub skrótów:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Czerwona\nShift-Ctrl-2 Żółta\nShift-Ctrl-3 Zielona\nShift-Ctrl-4 Niebieska\nShift-Ctrl-5 Purpurowa FILEBROWSER_COPYPROFILE;Kopiuj profil @@ -339,7 +336,6 @@ HISTORY_MSG_121;Autokorekcja aberracji chromatycznej HISTORY_MSG_122;Czarna klatka - Auto-wybór HISTORY_MSG_123;Czarna klatka - Wybór HISTORY_MSG_124;Korekcja punktu bieli -HISTORY_MSG_125;Zachowanie prześwietleń HISTORY_MSG_126;Puste pole - Wybór HISTORY_MSG_127;Puste pole - Auto-wybór HISTORY_MSG_128;Puste pole - Promień rozmycia @@ -445,9 +441,7 @@ HISTORY_MSG_231;B&W - Krzywa 'Przed' HISTORY_MSG_232;B&W - Rodzaj krzywej 'Przed' HISTORY_MSG_233;B&W - Krzywa 'Po' HISTORY_MSG_234;B&W - Rodzaj krzywej 'Po' -HISTORY_MSG_235;B&W - Auto-mieszanie kolorów HISTORY_MSG_236;- -HISTORY_MSG_237;B&W - Mieszacz HISTORY_MSG_238;FP - Wtapianie HISTORY_MSG_239;FP - Siła HISTORY_MSG_240;FP - Środek @@ -482,7 +476,6 @@ HISTORY_MSG_269;Koloryzacja - Podświetlenia - Czerwone HISTORY_MSG_270;Koloryzacja - Podświetlenia - Zielona HISTORY_MSG_271;Koloryzacja - Podświetlenia - Niebieskie HISTORY_MSG_272;Koloryzacja - Balans -HISTORY_MSG_273;Koloryzacja - Reset HISTORY_MSG_274;Koloryzacja - Nasycenie cieni HISTORY_MSG_275;Koloryzacja - Nasycenie jasnych HISTORY_MSG_276;Koloryzacja - Przezroczystość @@ -608,8 +601,6 @@ NAVIGATOR_S;S: 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 @@ -657,7 +648,6 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;Redukcja szumów liniowych PARTIALPASTE_RAWCACORR_AUTO;Autokorekcja aberracji chr. PARTIALPASTE_RAWEXPOS_BLACK;Poziomy czerni PARTIALPASTE_RAWEXPOS_LINEAR;Korekcja punktu bieli -PARTIALPASTE_RAWEXPOS_PRESER;Zachowanie prześwietleń PARTIALPASTE_RAWGROUP;Ustawienia raw PARTIALPASTE_RAW_DCBENHANCE;Zastosuj poprawę DCB PARTIALPASTE_RAW_DCBITERATIONS;Liczba powtórzeń DCB @@ -675,6 +665,7 @@ PARTIALPASTE_VIBRANCE;Jaskrawość PARTIALPASTE_VIGNETTING;Korekcja winietowania PARTIALPASTE_WHITEBALANCE;Balans bieli PREFERENCES_ADD;Dodaj +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Kolor ramki Nawigatora PREFERENCES_APPLNEXTSTARTUP;wymaga ponownego uruchomienia PREFERENCES_AUTOMONPROFILE;Automatycznie użyj systemowego profilu monitora PREFERENCES_BATCH_PROCESSING;Przetwarzanie wsadowe @@ -684,15 +675,9 @@ PREFERENCES_BEHAVIOR;Zachowanie PREFERENCES_BEHSETALL;'Ustaw' wszystkie PREFERENCES_BEHSETALLHINT;Ustaw wszystkie narzędzia w tryb Ustaw.\nZmiany parametrów w panelu edycji zbiorczej zostaną traktowane jako absolutne, nie biorąc pod uwagę poprzednich wartości. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Wyczyść wszystko -PREFERENCES_CACHECLEARPROFILES;Wyczyść profile -PREFERENCES_CACHECLEARTHUMBS;Wyczyść miniaturki PREFERENCES_CACHEMAXENTRIES;Maksymalna liczba wpisów w pamięci podręcznej PREFERENCES_CACHEOPTS;Opcje pamięci podręcznej PREFERENCES_CACHETHUMBHEIGHT;Maksymalna wysokość miniatury -PREFERENCES_CIEART;CIECAM02 optymalizacja -PREFERENCES_CIEART_LABEL;Użyj precyzję zmiennoprzecinkową zamiast podwójną. -PREFERENCES_CIEART_TOOLTIP;Gdy umożliwione, kalkulacje CIECAM02 są wykonywane w notacji zmiennoprzecinkowej o pojedyńczej precyzji zamiast podwójnej. Skraca to czas egzekucji kosztem nieistotnej zmiany w jakości. PREFERENCES_CLIPPINGIND;Pokazywanie obciętych prześwietleń/cieni PREFERENCES_CLUTSDIR;Folder obrazów HaldCLUT PREFERENCES_CUSTPROFBUILD;Zewnętrzny kreator profilów przetwarzania @@ -701,7 +686,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Rodzaj kluczy PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nazwa PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Ścieżka pliku wykonywalnego -PREFERENCES_CUTOVERLAYBRUSH;Kolor/przezroczystość maski kadrowania PREFERENCES_D50;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K @@ -720,7 +704,6 @@ PREFERENCES_DIRSOFTWARE;Katalog instalacyjny 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_FLATFIELDFOUND;Znaleziono PREFERENCES_FLATFIELDSDIR;Katalog z pustymi polami @@ -761,7 +744,6 @@ PREFERENCES_MENUOPTIONS;Opcje menu PREFERENCES_METADATA;Metadane PREFERENCES_MULTITAB;Tryb wielu zakładek PREFERENCES_MULTITABDUALMON;Tryb wielu zakładek (na drugim monitorze jeśli dostępny) -PREFERENCES_NAVGUIDEBRUSH;Kolor ramki Nawigatora PREFERENCES_OUTDIR;Katalog wyjściowy PREFERENCES_OUTDIRFOLDER;Zapisz do katalogu PREFERENCES_OUTDIRFOLDERHINT;Umieszcza zapisywane zdjęcia w wybranym katalogu @@ -782,11 +764,7 @@ PREFERENCES_PROFILESAVECACHE;Zapisz parametry przetwarzania w pamięci podręczn PREFERENCES_PROFILESAVEINPUT;Zapisz parametry przetwarzania obok pliku wejściowego PREFERENCES_PROPERTY;Własność PREFERENCES_PSPATH;Katalog w którym zainstalowany jest Adobe Photoshop -PREFERENCES_RGBDTL_LABEL;Maksymalna ilość wątków redukcji szumów -PREFERENCES_RGBDTL_TOOLTIP;Redukcja szumów potrzebuje około 128MB RAMu dla zdjęcia 10Mpix oraz 512MB dla zdjęcia 40Mpix, i dodatkowo 128MB dla każdego wątku. Im większa liczba równoległych wątków, tym krótszy czas egzekucji. Zostawienie ustawienia na "0" automatycznie użyje tyle wątków, ile możliwe. -PREFERENCES_SELECTFONT;Wybierz czcionkę PREFERENCES_SELECTLANG;Wybierz język -PREFERENCES_SELECTTHEME;Wybierz temat PREFERENCES_SET;Ustaw PREFERENCES_SHOWBASICEXIF;Pokaż podstawowe dane Exif PREFERENCES_SHOWDATETIME;Pokaż datę i czas @@ -797,16 +775,14 @@ PREFERENCES_SINGLETABVERTAB;Tryb pojedynczej zakładki, pionowy układ PREFERENCES_SND_BATCHQUEUEDONE;Zakończono przetwarzanie wsadowe PREFERENCES_SND_HELP;Należy wprowadzić ścieżkę do pliku, bądź pozostawić niewypełnione (brak dźwięków).\nW systemie Windows można stosować "SystemDefault", "SystemAsterisk" itp. dla dźwięków systemowych.\nW systemie Linux można stosować "complete", "window-attention" etc. dla dzwięków systemowych. PREFERENCES_SND_LNGEDITPROCDONE;Praca edytora wykonana -PREFERENCES_SND_TRESHOLDSECS;po sekundach +PREFERENCES_SND_THRESHOLDSECS;po sekundach PREFERENCES_STARTUPIMDIR;Katalog startowy PREFERENCES_TAB_BROWSER;Przeglądarka plików PREFERENCES_TAB_COLORMGR;Zarządzanie kolorami PREFERENCES_TAB_GENERAL;Ogólne PREFERENCES_TAB_IMPROC;Przetwarzanie obrazu -PREFERENCES_TAB_PERFORMANCE;Wydajność PREFERENCES_TAB_SOUND;Dźwięki PREFERENCES_TP_LABEL;Panel narzędzi: -PREFERENCES_TP_USEICONORTEXT;Uzyj ikon w zakładkach zamiast tekstowych etykiet PREFERENCES_TP_VSCROLLBAR;Ukry pionowy pasek przesuwania PREFERENCES_USEBUNDLEDPROFILES;Użyj załączone profile przetwarzania PREFERENCES_VIEW;Balans bieli urządzenia wyjściowego (monitora, TV, projektora, widowni, etc.) @@ -878,7 +854,6 @@ TP_BWMIX_ALGO_LI;Liniowy TP_BWMIX_ALGO_SP;Efekty specjalne TP_BWMIX_ALGO_TOOLTIP;Liniowy: mieszanie kanałów liniowo.\nEfekty specjalne: kanały zostaną mieszane nieliniowo. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Oblicza wartości optymalizacji mieszacza kanałów. TP_BWMIX_CC_ENABLED;Dopasuj barwy dopełniające TP_BWMIX_CC_TOOLTIP;Włącz aby umożliwić automatyczne dopasowanie barw dopełniających w trybie CPŻZCNPM. TP_BWMIX_CHANNEL;Ekwalizator luminancji @@ -905,9 +880,6 @@ TP_BWMIX_MET;Metoda TP_BWMIX_MET_CHANMIX;Mieszacz kanałów TP_BWMIX_MET_DESAT;Desaturacja TP_BWMIX_MET_LUMEQUAL;Ekwalizator luminancji -TP_BWMIX_MIXC;Mieszacz -TP_BWMIX_NEUTRAL;Zresetuj mieszacz -TP_BWMIX_NEUTRAL_TIP;Zresetuj wszystkie wartości (filtru barwnego, mieszacza kanałów) na domyślne. TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% TP_BWMIX_RGBLABEL_HINT;Ostateczne wartości RGB które uwzględniają wszystkie opcje mieszacza.\n"Total" wyświetla sumę wartości RGB:\n- zawsze 100% w trybie relatywnym,\n- ponad (jaśniej) lub poniżej (ciemniej) 100% w trybie absolutnym. TP_BWMIX_RGB_TOOLTIP;Miesza kanały RGB. Kieruj się gotowymi ustawieniami.\nNależy zwrócić uwagę na ujemne wartości ponieważ mogą pojawić się zniekształcenia sygnału w obrazie lub działać w sposób nieprzewidywalny. @@ -945,11 +917,6 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Odbij w poziomie TP_COARSETRAF_TOOLTIP_ROTLEFT;Obróć w lewo.\n\nSkróty:\n[ - Tryb wielu zakładek,\nAlt-[ - Tryb jednej zakładki. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Obróć w prawo.\n\nSkróty:\n] - Tryb wielu zakładek,\nAlt-] - Tryb jednej zakładki. TP_COARSETRAF_TOOLTIP_VFLIP;Odbij w pionie -TP_COLORAPP_ADAPTSCENE;Luminancji sceny -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Bezwzględna luminancja sceny (cd/m²).\n1)Obliczona za pomocą Exif:\nCzas naświetlania - ISO - Przysłona - Korekcja ekspozycji EV w aparacie.\n2)Obliczona również na podstawie punktu bieli raw oraz korekty ekspozycji w RawTherapee -TP_COLORAPP_ADAPTVIEWING;Luminancji widowni (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Bezwzględna luminancja widowni\n(zazwyczaj 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Jesli zaznaczone (polecamy), RawTherapee obliczy optymalną wartość na podstawie Exif.\nAby ustawic wartość ręcznie, należy wpierw odznaczyc pudło. TP_COLORAPP_ALGO;Algorytm TP_COLORAPP_ALGO_ALL;Wszystkie TP_COLORAPP_ALGO_JC;Światłość + Chroma (JC) @@ -979,8 +946,6 @@ TP_COLORAPP_CURVEEDITOR3;Krzywa koloru TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Ustawienie chromy, nasycenia bądź barwistości.\n\nPokazuje histogram chromatyczności (L*a*b*) przed CIECAM02.\nJeśli opcja "Pokaż histogramy wyjściowe CIECAM02 za krzywymi" jest włączona, pokazuje histogram C, s bądź M po CIECAM02.\n\nC, s oraz M nie są pokazywane w głównym histogramie.\nEfekt końcowy jest przedstawiony w głównym histogramie. TP_COLORAPP_DATACIE;Pokaż histogramy wyjściowe CIECAM02 za krzywymi TP_COLORAPP_DATACIE_TOOLTIP;Kiedy opcja jest włączona, histogramy za krzywymi CIECAM02 pokazują przybliżone wartości/zakresy J lub Q, oraz C, s lub M po korekcjach CIECAM02.\nTen wybór nie ma wpływu na główny histogram.\n\nKiedy opcja jest wyłączona, histogramy za krzywymi CIECAM02 pokazują wartości L*a*b* przed korekcjami CIECAM02. -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Jeśli opcja jest zaznaczona (zalecane), RawTherapee kalkuluje wartość optymalną, która jest potem użyta przez CAT02 oraz przez całość CIECAM02.\nAby ustawić wartość ręcznie, odznacz wpierw opcję (wartości powyżej 65 zalecane). -TP_COLORAPP_DEGREE_TOOLTIP;Siła CIE Chromatic Adaptation Transform 2002 TP_COLORAPP_GAMUT;Kontrola gamma (L*a*b*). TP_COLORAPP_GAMUT_TOOLTIP;Włącz kontrolę gamma w trybie L*a*b*. TP_COLORAPP_HUE;Odcień (hue, h) @@ -995,8 +960,6 @@ TP_COLORAPP_MODEL;Model PB TP_COLORAPP_MODEL_TOOLTIP;Model punktu bieli.\n\nBB [RT] + [wyjściowy]:\nBalans bieli RawTherapee jest użyty dla sceny, CIECAM02 jest ustawione na D50, i balans bieli urządzenia wyjściowego ustawiony jest w Ustawieniach > Zarządzanie Kolorami\n\nBB [RT+CAT02] + [wyjściowe]:\nUstawienia balansu bieli RawTherapee są używane przez CAT02, i balans bieli urządzenia wyjściowego jest ustawione w Ustawieniach > Zarządzanie Kolorami. TP_COLORAPP_RSTPRO;Ochrona odcieni skóry i czerwieni TP_COLORAPP_RSTPRO_TOOLTIP;Ochrona odcieni skóry i czerwieni (suwaki i krzywe) -TP_COLORAPP_SHARPCIE;- -TP_COLORAPP_SHARPCIE_TOOLTIP;- TP_COLORAPP_SURROUND;Otoczenie TP_COLORAPP_SURROUND_AVER;Średnie TP_COLORAPP_SURROUND_DARK;Ciemne @@ -1015,6 +978,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;Światłość TP_COLORAPP_TCMODE_SATUR;Nasycenie TP_COLORAPP_TONECIE;Tone mapping za pomocą jasności CIECAM02 (Q) TP_COLORAPP_TONECIE_TOOLTIP;Jeśli ta opcja jest wyłączona, tone mapping odbywa się w przestrzeni kolorów L*a*b*, zaś jeśli jest włączona, w przestrzeni kolorów CIECAM02.\nNarzędzie Tone Mapping musi być włączone aby to utawienie działało. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Bezwzględna luminancja widowni\n(zazwyczaj 16cd/m²). TP_COLORAPP_WBCAM;BB [RT+CAT02] + [wyjściowy] TP_COLORAPP_WBRT;BB [RT] + [wyjściowy] TP_COLORTONING_AB;o C/L @@ -1064,7 +1028,6 @@ TP_CROP_GUIDETYPE;Typ pomocy: TP_CROP_H;Wysokość TP_CROP_LABEL;Kadrowanie TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Wybierz kadr TP_CROP_W;Szerokość TP_CROP_X;X TP_CROP_Y;Y @@ -1120,7 +1083,6 @@ TP_EPD_LABEL;Tone Mapping TP_EPD_REWEIGHTINGITERATES;Powtarzanie rozważania TP_EPD_SCALE;Skala TP_EPD_STRENGTH;Siła -TP_EPD_TOOLTIP;Tone mapping może się odbyć w przestrzeni kolorów L*a*b* (domyślnie) oraz CIECAM02.\n\nAby wykonać tone mapping w przestrzeni CIECAM02 należy włączyć następujące ustawienia:\n1. CIECAM02\n2. Algorytm="Jasność + Barwistość (QM)"\n3. "Tone mapping za pomocą jasności CIECAM02 (Q)" TP_EXPOSURE_AUTOLEVELS;Wyrównaj poziomy TP_EXPOSURE_AUTOLEVELS_TIP;Dokonaj automatycznego ustawienia parametrów ekspozycji na podstawie analizy obrazu TP_EXPOSURE_BLACKLEVEL;Czerń @@ -1255,9 +1217,6 @@ TP_LENSGEOM_AUTOCROP;Auto-kadrowanie TP_LENSGEOM_FILL;Auto-wypełnienie TP_LENSGEOM_LABEL;Obiektyw / Geometria TP_LENSPROFILE_LABEL;Profil korekcji obiektywu LCP -TP_LENSPROFILE_USECA;Korekja aberacji chromatycznej -TP_LENSPROFILE_USEDIST;Korekcja dystorsji -TP_LENSPROFILE_USEVIGN;Korekcja winietowania TP_NEUTRAL_TIP;Zresetuj ustawienia do wartości neutralnych.\nDziała na tych samych suwakach na których funkcja "Wyrównaj poziomy" działa, niezależnie od tego czy funkcja ta była użyta czy nie. TP_PCVIGNETTE_FEATHER;Wtapianie TP_PCVIGNETTE_FEATHER_TOOLTIP;Wtapianie:\n0 = tylko brzegi,\n50 = w pół drogi do środka,\n100 = aż do środka. @@ -1291,7 +1250,6 @@ TP_RAWEXPOS_BLACK_BLUE;Niebieski TP_RAWEXPOS_BLACK_GREEN;Zielony TP_RAWEXPOS_BLACK_RED;Czerwony TP_RAWEXPOS_LINEAR;Liniowy współczynnik korekcji -TP_RAWEXPOS_PRESER;Zachowanie prześwietleń TP_RAWEXPOS_RGB;Czerwony, Zielony, Niebieski TP_RAWEXPOS_TWOGREEN;Połącz obie zielenie TP_RAW_DCBENHANCE;Zastosuj poprawę DCB @@ -1436,8 +1394,8 @@ TP_WBALANCE_WATER_HEADER;Pod wodą 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: - @@ -1445,22 +1403,29 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels @@ -1468,11 +1433,13 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !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_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -1480,13 +1447,20 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_CURRENT;Current !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1581,7 +1555,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1661,18 +1635,102 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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,39 +1756,51 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_ICCPROFCREATOR;ICC Profile Creator !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_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !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_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !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_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1741,11 +1811,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PREFERENCES_CURVEBBOXPOS_LEFT;Left !PREFERENCES_CURVEBBOXPOS_RIGHT;Right !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !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 @@ -1757,22 +1825,17 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1785,53 +1848,78 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!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 +!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 the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !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 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_COLORTONING_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1867,6 +1955,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_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? @@ -1881,6 +1972,21 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1891,14 +1997,31 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1906,64 +2029,49 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1975,7 +2083,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -2001,7 +2109,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2040,9 +2148,15 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2111,7 +2225,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2122,7 +2236,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2206,5 +2320,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - !TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WBALANCE_PICKER;Pick !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 --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters) index 1212ed840..f15870f2b 100644 --- a/rtdata/languages/Polish (Latin Characters) +++ b/rtdata/languages/Polish (Latin Characters) @@ -13,7 +13,6 @@ ABOUT_TAB_CREDITS;Zaslugi ABOUT_TAB_LICENSE;Licencja ABOUT_TAB_RELEASENOTES;Notatki eksploatacyjne 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 @@ -97,8 +96,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatyczne uzycie klatki typu puste pole FILEBROWSER_BROWSEPATHBUTTONHINT;Nalezy kliknac, aby przegladac wybrana sciezke FILEBROWSER_BROWSEPATHHINT;Umozliwia przegladanie wprowadzonej sciezki\nCtrl-o zaznaczenie\nEnter, Ctrl-Enter (w menedzerze plikow) przegladanie\nSkroty:\n ~ - katalog domowy uzytkownika\n ! - katalog z obrazami uzytkownia FILEBROWSER_CACHE;Pamiec podreczna -FILEBROWSER_CACHECLEARFROMFULL;Czyszczenie pamieci podrecznej - pelne -FILEBROWSER_CACHECLEARFROMPARTIAL;Czyszczenie pamieci podrecznej - czesciowe FILEBROWSER_CLEARPROFILE;Wyczysc profil FILEBROWSER_COLORLABEL_TOOLTIP;Kolorowe etykiety\n\nUzyj za pomoca rozwijanej listy lub skrotow:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Czerwona\nShift-Ctrl-2 Zolta\nShift-Ctrl-3 Zielona\nShift-Ctrl-4 Niebieska\nShift-Ctrl-5 Purpurowa FILEBROWSER_COPYPROFILE;Kopiuj profil @@ -339,7 +336,6 @@ HISTORY_MSG_121;Autokorekcja aberracji chromatycznej HISTORY_MSG_122;Czarna klatka - Auto-wybor HISTORY_MSG_123;Czarna klatka - Wybor HISTORY_MSG_124;Korekcja punktu bieli -HISTORY_MSG_125;Zachowanie przeswietlen HISTORY_MSG_126;Puste pole - Wybor HISTORY_MSG_127;Puste pole - Auto-wybor HISTORY_MSG_128;Puste pole - Promien rozmycia @@ -445,9 +441,7 @@ HISTORY_MSG_231;B&W - Krzywa 'Przed' HISTORY_MSG_232;B&W - Rodzaj krzywej 'Przed' HISTORY_MSG_233;B&W - Krzywa 'Po' HISTORY_MSG_234;B&W - Rodzaj krzywej 'Po' -HISTORY_MSG_235;B&W - Auto-mieszanie kolorow HISTORY_MSG_236;- -HISTORY_MSG_237;B&W - Mieszacz HISTORY_MSG_238;FP - Wtapianie HISTORY_MSG_239;FP - Sila HISTORY_MSG_240;FP - Srodek @@ -482,7 +476,6 @@ HISTORY_MSG_269;Koloryzacja - Podswietlenia - Czerwone HISTORY_MSG_270;Koloryzacja - Podswietlenia - Zielona HISTORY_MSG_271;Koloryzacja - Podswietlenia - Niebieskie HISTORY_MSG_272;Koloryzacja - Balans -HISTORY_MSG_273;Koloryzacja - Reset HISTORY_MSG_274;Koloryzacja - Nasycenie cieni HISTORY_MSG_275;Koloryzacja - Nasycenie jasnych HISTORY_MSG_276;Koloryzacja - Przezroczystosc @@ -608,8 +601,6 @@ NAVIGATOR_S;S: 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 @@ -657,7 +648,6 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;Redukcja szumow liniowych PARTIALPASTE_RAWCACORR_AUTO;Autokorekcja aberracji chr. PARTIALPASTE_RAWEXPOS_BLACK;Poziomy czerni PARTIALPASTE_RAWEXPOS_LINEAR;Korekcja punktu bieli -PARTIALPASTE_RAWEXPOS_PRESER;Zachowanie przeswietlen PARTIALPASTE_RAWGROUP;Ustawienia raw PARTIALPASTE_RAW_DCBENHANCE;Zastosuj poprawe DCB PARTIALPASTE_RAW_DCBITERATIONS;Liczba powtorzen DCB @@ -675,6 +665,7 @@ PARTIALPASTE_VIBRANCE;Jaskrawosc PARTIALPASTE_VIGNETTING;Korekcja winietowania PARTIALPASTE_WHITEBALANCE;Balans bieli PREFERENCES_ADD;Dodaj +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Kolor ramki Nawigatora PREFERENCES_APPLNEXTSTARTUP;wymaga ponownego uruchomienia PREFERENCES_AUTOMONPROFILE;Automatycznie uzyj systemowego profilu monitora PREFERENCES_BATCH_PROCESSING;Przetwarzanie wsadowe @@ -684,15 +675,9 @@ PREFERENCES_BEHAVIOR;Zachowanie PREFERENCES_BEHSETALL;'Ustaw' wszystkie PREFERENCES_BEHSETALLHINT;Ustaw wszystkie narzedzia w tryb Ustaw.\nZmiany parametrow w panelu edycji zbiorczej zostana traktowane jako absolutne, nie biorac pod uwage poprzednich wartosci. PREFERENCES_BLACKBODY;Wolfram -PREFERENCES_CACHECLEARALL;Wyczysc wszystko -PREFERENCES_CACHECLEARPROFILES;Wyczysc profile -PREFERENCES_CACHECLEARTHUMBS;Wyczysc miniaturki PREFERENCES_CACHEMAXENTRIES;Maksymalna liczba wpisow w pamieci podrecznej PREFERENCES_CACHEOPTS;Opcje pamieci podrecznej PREFERENCES_CACHETHUMBHEIGHT;Maksymalna wysokosc miniatury -PREFERENCES_CIEART;CIECAM02 optymalizacja -PREFERENCES_CIEART_LABEL;Uzyj precyzje zmiennoprzecinkowa zamiast podwojna. -PREFERENCES_CIEART_TOOLTIP;Gdy umozliwione, kalkulacje CIECAM02 sa wykonywane w notacji zmiennoprzecinkowej o pojedynczej precyzji zamiast podwojnej. Skraca to czas egzekucji kosztem nieistotnej zmiany w jakosci. PREFERENCES_CLIPPINGIND;Pokazywanie obcietych przeswietlen/cieni PREFERENCES_CLUTSDIR;Folder obrazow HaldCLUT PREFERENCES_CUSTPROFBUILD;Zewnetrzny kreator profilow przetwarzania @@ -701,7 +686,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Rodzaj kluczy PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nazwa PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Sciezka pliku wykonywalnego -PREFERENCES_CUTOVERLAYBRUSH;Kolor/przezroczystosc maski kadrowania PREFERENCES_D50;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K @@ -720,7 +704,6 @@ PREFERENCES_DIRSOFTWARE;Katalog instalacyjny 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_FLATFIELDFOUND;Znaleziono PREFERENCES_FLATFIELDSDIR;Katalog z pustymi polami @@ -761,7 +744,6 @@ PREFERENCES_MENUOPTIONS;Opcje menu PREFERENCES_METADATA;Metadane PREFERENCES_MULTITAB;Tryb wielu zakladek PREFERENCES_MULTITABDUALMON;Tryb wielu zakladek (na drugim monitorze jesli dostepny) -PREFERENCES_NAVGUIDEBRUSH;Kolor ramki Nawigatora PREFERENCES_OUTDIR;Katalog wyjsciowy PREFERENCES_OUTDIRFOLDER;Zapisz do katalogu PREFERENCES_OUTDIRFOLDERHINT;Umieszcza zapisywane zdjecia w wybranym katalogu @@ -782,11 +764,7 @@ PREFERENCES_PROFILESAVECACHE;Zapisz parametry przetwarzania w pamieci podrecznej PREFERENCES_PROFILESAVEINPUT;Zapisz parametry przetwarzania obok pliku wejsciowego PREFERENCES_PROPERTY;Wlasnosc PREFERENCES_PSPATH;Katalog w ktorym zainstalowany jest Adobe Photoshop -PREFERENCES_RGBDTL_LABEL;Maksymalna ilosc watkow redukcji szumow -PREFERENCES_RGBDTL_TOOLTIP;Redukcja szumow potrzebuje okolo 128MB RAMu dla zdjecia 10Mpix oraz 512MB dla zdjecia 40Mpix, i dodatkowo 128MB dla kazdego watku. Im wieksza liczba rownoleglych watkow, tym krotszy czas egzekucji. Zostawienie ustawienia na "0" automatycznie uzyje tyle watkow, ile mozliwe. -PREFERENCES_SELECTFONT;Wybierz czcionke PREFERENCES_SELECTLANG;Wybierz jezyk -PREFERENCES_SELECTTHEME;Wybierz temat PREFERENCES_SET;Ustaw PREFERENCES_SHOWBASICEXIF;Pokaz podstawowe dane Exif PREFERENCES_SHOWDATETIME;Pokaz date i czas @@ -797,16 +775,14 @@ PREFERENCES_SINGLETABVERTAB;Tryb pojedynczej zakladki, pionowy uklad PREFERENCES_SND_BATCHQUEUEDONE;Zakonczono przetwarzanie wsadowe PREFERENCES_SND_HELP;Nalezy wprowadzic sciezke do pliku, badz pozostawic niewypelnione (brak dzwiekow).\nW systemie Windows mozna stosowac "SystemDefault", "SystemAsterisk" itp. dla dzwiekow systemowych.\nW systemie Linux mozna stosowac "complete", "window-attention" etc. dla dzwiekow systemowych. PREFERENCES_SND_LNGEDITPROCDONE;Praca edytora wykonana -PREFERENCES_SND_TRESHOLDSECS;po sekundach +PREFERENCES_SND_THRESHOLDSECS;po sekundach PREFERENCES_STARTUPIMDIR;Katalog startowy PREFERENCES_TAB_BROWSER;Przegladarka plikow PREFERENCES_TAB_COLORMGR;Zarzadzanie kolorami PREFERENCES_TAB_GENERAL;Ogolne PREFERENCES_TAB_IMPROC;Przetwarzanie obrazu -PREFERENCES_TAB_PERFORMANCE;Wydajnosc PREFERENCES_TAB_SOUND;Dzwieki PREFERENCES_TP_LABEL;Panel narzedzi: -PREFERENCES_TP_USEICONORTEXT;Uzyj ikon w zakladkach zamiast tekstowych etykiet PREFERENCES_TP_VSCROLLBAR;Ukry pionowy pasek przesuwania PREFERENCES_USEBUNDLEDPROFILES;Uzyj zalaczone profile przetwarzania PREFERENCES_VIEW;Balans bieli urzadzenia wyjsciowego (monitora, TV, projektora, widowni, etc.) @@ -878,7 +854,6 @@ TP_BWMIX_ALGO_LI;Liniowy TP_BWMIX_ALGO_SP;Efekty specjalne TP_BWMIX_ALGO_TOOLTIP;Liniowy: mieszanie kanalow liniowo.\nEfekty specjalne: kanaly zostana mieszane nieliniowo. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Oblicza wartosci optymalizacji mieszacza kanalow. TP_BWMIX_CC_ENABLED;Dopasuj barwy dopelniajace TP_BWMIX_CC_TOOLTIP;Wlacz aby umozliwic automatyczne dopasowanie barw dopelniajacych w trybie CPZZCNPM. TP_BWMIX_CHANNEL;Ekwalizator luminancji @@ -905,9 +880,6 @@ TP_BWMIX_MET;Metoda TP_BWMIX_MET_CHANMIX;Mieszacz kanalow TP_BWMIX_MET_DESAT;Desaturacja TP_BWMIX_MET_LUMEQUAL;Ekwalizator luminancji -TP_BWMIX_MIXC;Mieszacz -TP_BWMIX_NEUTRAL;Zresetuj mieszacz -TP_BWMIX_NEUTRAL_TIP;Zresetuj wszystkie wartosci (filtru barwnego, mieszacza kanalow) na domyslne. TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% TP_BWMIX_RGBLABEL_HINT;Ostateczne wartosci RGB ktore uwzgledniaja wszystkie opcje mieszacza.\n"Total" wyswietla sume wartosci RGB:\n- zawsze 100% w trybie relatywnym,\n- ponad (jasniej) lub ponizej (ciemniej) 100% w trybie absolutnym. TP_BWMIX_RGB_TOOLTIP;Miesza kanaly RGB. Kieruj sie gotowymi ustawieniami.\nNalezy zwrocic uwage na ujemne wartosci poniewaz moga pojawic sie znieksztalcenia sygnalu w obrazie lub dzialac w sposob nieprzewidywalny. @@ -945,11 +917,6 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Odbij w poziomie TP_COARSETRAF_TOOLTIP_ROTLEFT;Obroc w lewo.\n\nSkroty:\n[ - Tryb wielu zakladek,\nAlt-[ - Tryb jednej zakladki. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Obroc w prawo.\n\nSkroty:\n] - Tryb wielu zakladek,\nAlt-] - Tryb jednej zakladki. TP_COARSETRAF_TOOLTIP_VFLIP;Odbij w pionie -TP_COLORAPP_ADAPTSCENE;Luminancji sceny -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Bezwzgledna luminancja sceny (cd/m²).\n1)Obliczona za pomoca Exif:\nCzas naswietlania - ISO - Przyslona - Korekcja ekspozycji EV w aparacie.\n2)Obliczona rowniez na podstawie punktu bieli raw oraz korekty ekspozycji w RawTherapee -TP_COLORAPP_ADAPTVIEWING;Luminancji widowni (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Bezwzgledna luminancja widowni\n(zazwyczaj 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Jesli zaznaczone (polecamy), RawTherapee obliczy optymalna wartosc na podstawie Exif.\nAby ustawic wartosc recznie, nalezy wpierw odznaczyc pudlo. TP_COLORAPP_ALGO;Algorytm TP_COLORAPP_ALGO_ALL;Wszystkie TP_COLORAPP_ALGO_JC;Swiatlosc + Chroma (JC) @@ -979,8 +946,6 @@ TP_COLORAPP_CURVEEDITOR3;Krzywa koloru TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Ustawienie chromy, nasycenia badz barwistosci.\n\nPokazuje histogram chromatycznosci (L*a*b*) przed CIECAM02.\nJesli opcja "Pokaz histogramy wyjsciowe CIECAM02 za krzywymi" jest wlaczona, pokazuje histogram C, s badz M po CIECAM02.\n\nC, s oraz M nie sa pokazywane w glownym histogramie.\nEfekt koncowy jest przedstawiony w glownym histogramie. TP_COLORAPP_DATACIE;Pokaz histogramy wyjsciowe CIECAM02 za krzywymi TP_COLORAPP_DATACIE_TOOLTIP;Kiedy opcja jest wlaczona, histogramy za krzywymi CIECAM02 pokazuja przyblizone wartosci/zakresy J lub Q, oraz C, s lub M po korekcjach CIECAM02.\nTen wybor nie ma wplywu na glowny histogram.\n\nKiedy opcja jest wylaczona, histogramy za krzywymi CIECAM02 pokazuja wartosci L*a*b* przed korekcjami CIECAM02. -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Jesli opcja jest zaznaczona (zalecane), RawTherapee kalkuluje wartosc optymalna, ktora jest potem uzyta przez CAT02 oraz przez calosc CIECAM02.\nAby ustawic wartosc recznie, odznacz wpierw opcje (wartosci powyzej 65 zalecane). -TP_COLORAPP_DEGREE_TOOLTIP;Sila CIE Chromatic Adaptation Transform 2002 TP_COLORAPP_GAMUT;Kontrola gamma (L*a*b*). TP_COLORAPP_GAMUT_TOOLTIP;Wlacz kontrole gamma w trybie L*a*b*. TP_COLORAPP_HUE;Odcien (hue, h) @@ -995,8 +960,6 @@ TP_COLORAPP_MODEL;Model PB TP_COLORAPP_MODEL_TOOLTIP;Model punktu bieli.\n\nBB [RT] + [wyjsciowy]:\nBalans bieli RawTherapee jest uzyty dla sceny, CIECAM02 jest ustawione na D50, i balans bieli urzadzenia wyjsciowego ustawiony jest w Ustawieniach > Zarzadzanie Kolorami\n\nBB [RT+CAT02] + [wyjsciowe]:\nUstawienia balansu bieli RawTherapee sa uzywane przez CAT02, i balans bieli urzadzenia wyjsciowego jest ustawione w Ustawieniach > Zarzadzanie Kolorami. TP_COLORAPP_RSTPRO;Ochrona odcieni skory i czerwieni TP_COLORAPP_RSTPRO_TOOLTIP;Ochrona odcieni skory i czerwieni (suwaki i krzywe) -TP_COLORAPP_SHARPCIE;- -TP_COLORAPP_SHARPCIE_TOOLTIP;- TP_COLORAPP_SURROUND;Otoczenie TP_COLORAPP_SURROUND_AVER;Srednie TP_COLORAPP_SURROUND_DARK;Ciemne @@ -1015,6 +978,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;Swiatlosc TP_COLORAPP_TCMODE_SATUR;Nasycenie TP_COLORAPP_TONECIE;Tone mapping za pomoca jasnosci CIECAM02 (Q) TP_COLORAPP_TONECIE_TOOLTIP;Jesli ta opcja jest wylaczona, tone mapping odbywa sie w przestrzeni kolorow L*a*b*, zas jesli jest wlaczona, w przestrzeni kolorow CIECAM02.\nNarzedzie Tone Mapping musi byc wlaczone aby to utawienie dzialalo. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Bezwzgledna luminancja widowni\n(zazwyczaj 16cd/m²). TP_COLORAPP_WBCAM;BB [RT+CAT02] + [wyjsciowy] TP_COLORAPP_WBRT;BB [RT] + [wyjsciowy] TP_COLORTONING_AB;o C/L @@ -1064,7 +1028,6 @@ TP_CROP_GUIDETYPE;Typ pomocy: TP_CROP_H;Wysokosc TP_CROP_LABEL;Kadrowanie TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Wybierz kadr TP_CROP_W;Szerokosc TP_CROP_X;X TP_CROP_Y;Y @@ -1120,7 +1083,6 @@ TP_EPD_LABEL;Tone Mapping TP_EPD_REWEIGHTINGITERATES;Powtarzanie rozwazania TP_EPD_SCALE;Skala TP_EPD_STRENGTH;Sila -TP_EPD_TOOLTIP;Tone mapping moze sie odbyc w przestrzeni kolorow L*a*b* (domyslnie) oraz CIECAM02.\n\nAby wykonac tone mapping w przestrzeni CIECAM02 nalezy wlaczyc nastepujace ustawienia:\n1. CIECAM02\n2. Algorytm="Jasnosc + Barwistosc (QM)"\n3. "Tone mapping za pomoca jasnosci CIECAM02 (Q)" TP_EXPOSURE_AUTOLEVELS;Wyrownaj poziomy TP_EXPOSURE_AUTOLEVELS_TIP;Dokonaj automatycznego ustawienia parametrow ekspozycji na podstawie analizy obrazu TP_EXPOSURE_BLACKLEVEL;Czern @@ -1255,9 +1217,6 @@ TP_LENSGEOM_AUTOCROP;Auto-kadrowanie TP_LENSGEOM_FILL;Auto-wypelnienie TP_LENSGEOM_LABEL;Obiektyw / Geometria TP_LENSPROFILE_LABEL;Profil korekcji obiektywu LCP -TP_LENSPROFILE_USECA;Korekja aberacji chromatycznej -TP_LENSPROFILE_USEDIST;Korekcja dystorsji -TP_LENSPROFILE_USEVIGN;Korekcja winietowania TP_NEUTRAL_TIP;Zresetuj ustawienia do wartosci neutralnych.\nDziala na tych samych suwakach na ktorych funkcja "Wyrownaj poziomy" dziala, niezaleznie od tego czy funkcja ta byla uzyta czy nie. TP_PCVIGNETTE_FEATHER;Wtapianie TP_PCVIGNETTE_FEATHER_TOOLTIP;Wtapianie:\n0 = tylko brzegi,\n50 = w pol drogi do srodka,\n100 = az do srodka. @@ -1291,7 +1250,6 @@ TP_RAWEXPOS_BLACK_BLUE;Niebieski TP_RAWEXPOS_BLACK_GREEN;Zielony TP_RAWEXPOS_BLACK_RED;Czerwony TP_RAWEXPOS_LINEAR;Liniowy wspolczynnik korekcji -TP_RAWEXPOS_PRESER;Zachowanie przeswietlen TP_RAWEXPOS_RGB;Czerwony, Zielony, Niebieski TP_RAWEXPOS_TWOGREEN;Polacz obie zielenie TP_RAW_DCBENHANCE;Zastosuj poprawe DCB @@ -1436,8 +1394,8 @@ TP_WBALANCE_WATER_HEADER;Pod woda 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: - @@ -1445,22 +1403,29 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels @@ -1468,11 +1433,13 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !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_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -1480,13 +1447,20 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_CURRENT;Current !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_166;Exposure - Reset !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_256;NR - Median - Type +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_297;NR - Mode !HISTORY_MSG_299;NR - Chrominance curve !HISTORY_MSG_300;- @@ -1581,7 +1555,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1661,18 +1635,102 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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,39 +1756,51 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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_ICCPROFCREATOR;ICC Profile Creator !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_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !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_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !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_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1741,11 +1811,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !PREFERENCES_CURVEBBOXPOS_LEFT;Left !PREFERENCES_CURVEBBOXPOS_RIGHT;Right !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !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 @@ -1757,22 +1825,17 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1785,53 +1848,78 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!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 +!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 the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !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 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_COLORTONING_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1867,6 +1955,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_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? @@ -1881,6 +1972,21 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1891,14 +1997,31 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_METADATA_STRIP;Strip all metadata !TP_METADATA_TUNNEL;Copy unchanged !TP_NEUTRAL;Reset +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1906,64 +2029,49 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1975,7 +2083,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -2001,7 +2109,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2040,9 +2148,15 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2111,7 +2225,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2122,7 +2236,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2206,5 +2320,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: - !TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WBALANCE_PICKER;Pick !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 --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index 42c1436bc..c3c4f43e3 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -1,2203 +1,2319 @@ -#01 2010-02-01 Vitor da Silva Gonçalves +#01 2018-07-25 Digitalpix58 -ADJUSTER_RESET_TO_DEFAULT;Restaurar para o padrão +ABOUT_TAB_BUILD;Versão +ABOUT_TAB_CREDITS;Créditos +ABOUT_TAB_LICENSE;Licença +ABOUT_TAB_RELEASENOTES;Nota de Lançamento +ABOUT_TAB_SPLASH;Splash +ADJUSTER_RESET_TO_DEFAULT;Clique - restaurar para o valor padrão.\nCtrl+clique - restaurar para o valor inicial. +BATCHQUEUE_AUTOSTART;Início automático +BATCHQUEUE_AUTOSTARTHINT;Começa a processar automaticamente um novo trabalho. +BATCHQUEUE_DESTFILENAME;Caminho e nome do arquivo +BATCHQUEUE_STARTSTOPHINT;Inicia ou para o processamento das imagens na fila.\n\nAtalho: Ctrl+s +BATCH_PROCESSING;Processamento em lote +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_LEFT_TAN;LT: +CURVEEDITOR_AXIS_OUT;O: +CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CURVE;Curva +CURVEEDITOR_CURVES;Curvas +CURVEEDITOR_CUSTOM;Personalizado +CURVEEDITOR_DARKS;Escuros +CURVEEDITOR_EDITPOINT_HINT;Ativar edição dos valores de entrada/saída do nó.\n\nClique com o btão direito do mouse num nó para selecioná-lo.\nClique com o botão direito do mouse no espaço vazio para desmarcar o nó. +CURVEEDITOR_HIGHLIGHTS;Realces +CURVEEDITOR_LIGHTS;Luzes CURVEEDITOR_LINEAR;Linear -CURVEEDITOR_LOADDLGLABEL;Carregar Curva... -CURVEEDITOR_SAVEDLGLABEL;Salvar Curva... -CURVEEDITOR_TOOLTIPLINEAR;Restaurar curva para linha -CURVEEDITOR_TOOLTIPLOAD;Carregar uma Curva a Partir de Arquivo -CURVEEDITOR_TOOLTIPSAVE;Salvar Arquivo Atual -DIRBROWSER_FOLDERS;Folders +CURVEEDITOR_LOADDLGLABEL;Carregar curva... +CURVEEDITOR_MINMAXCPOINTS;Equalizador +CURVEEDITOR_NURBS;Caixa de controle +CURVEEDITOR_PARAMETRIC;Paramétrico +CURVEEDITOR_SAVEDLGLABEL;Salvar curva... +CURVEEDITOR_SHADOWS;Sombras +CURVEEDITOR_TOOLTIPCOPY;Cópia da curva atual para a área de transfrência. +CURVEEDITOR_TOOLTIPLINEAR;Restaurar curva para linear. +CURVEEDITOR_TOOLTIPLOAD;Carregue uma curva do arquivo. +CURVEEDITOR_TOOLTIPPASTE;Cole a curva da área de transferência. +CURVEEDITOR_TOOLTIPSAVE;Salvar curva atual. +CURVEEDITOR_TYPE;Tipo: +DIRBROWSER_FOLDERS;Pastas +DONT_SHOW_AGAIN;Não mostre esta mensagem novamente. +DYNPROFILEEDITOR_DELETE;Excluir +DYNPROFILEEDITOR_EDIT;Editar +DYNPROFILEEDITOR_EDIT_RULE;Editar Regra de Perfil Dinâmico +DYNPROFILEEDITOR_ENTRY_TOOLTIP;A correspondência é insensível a maiúsculas e minúsculas.\nUse o prefixo "re:" para inserir\na expressão regular. +DYNPROFILEEDITOR_MOVE_DOWN;Mover para Baixo +DYNPROFILEEDITOR_MOVE_UP;Mover para Cima +DYNPROFILEEDITOR_NEW;Novo +DYNPROFILEEDITOR_NEW_RULE;Nva Regra de Perfil Dinâmico +DYNPROFILEEDITOR_PROFILE;Perfil de Processamento +EDITWINDOW_TITLE;Edição de Imagem +EDIT_OBJECT_TOOLTIP;Exibe um widget na janela de visualização que permite ajustar essa ferramenta. +EDIT_PIPETTE_TOOLTIP;Para adicionar um ponto de ajuste à curva, segure a tecla Ctrl enquanto clica com o botão esquerdo no ponto desejado na visualização da imagem.\nPara ajustar o ponto, Mantenha pressionada a tecla Ctrl enquanto clica com o botão esquerdo na área correspondente na visualização, então solte Ctrl (amenos que deseje um fino controle) e enquanto ainda mantém pressionado o botão esquerdo do mouse, mova o mouse para cima ou para baixo para mover esse ponto para cima ou para baixo na curva. EXIFFILTER_APERTURE;Abertura EXIFFILTER_CAMERA;Câmera -EXIFFILTER_FOCALLEN;Distância Focal +EXIFFILTER_EXPOSURECOMPENSATION;Compensação de exposição (EV) +EXIFFILTER_FILETYPE;Tipo de arquivo +EXIFFILTER_FOCALLEN;Comprimento focal +EXIFFILTER_IMAGETYPE;Tipo de imagem EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Lente +EXIFFILTER_METADATAFILTER;Ativar filtros de metadados EXIFFILTER_SHUTTER;Obturador EXIFPANEL_ADDEDIT;Adicionar/Editar -EXIFPANEL_ADDEDITHINT;Adicionar nova etiqueta ou editá-la -EXIFPANEL_ADDTAGDLG_ENTERVALUE;Entre um valor -EXIFPANEL_ADDTAGDLG_SELECTTAG;Selecione uma etiqueta -EXIFPANEL_ADDTAGDLG_TITLE;Adicionar/Editar etiqueta +EXIFPANEL_ADDEDITHINT;Adicionar nova tag ou editar tag. +EXIFPANEL_ADDTAGDLG_ENTERVALUE;Insira valor +EXIFPANEL_ADDTAGDLG_SELECTTAG;Selecionar tag +EXIFPANEL_ADDTAGDLG_TITLE;Adicionar/Editar Tag EXIFPANEL_KEEP;Manter -EXIFPANEL_KEEPHINT;Manter as etiquetas selecionadas ao escrever arquivo de saída +EXIFPANEL_KEEPHINT;Mantenha as tags selecionadas ao gravar o arquivo de saída. EXIFPANEL_REMOVE;Remover -EXIFPANEL_REMOVEHINT;Remover as etiquetas selecionadas ao escrever arquivo de saída +EXIFPANEL_REMOVEHINT;Remova as tags selecionadas ao gravar o arquivo de saída. EXIFPANEL_RESET;Restaurar EXIFPANEL_RESETALL;Restaurar Tudo -EXIFPANEL_RESETALLHINT;Restaurar todas as etiquetas a seus valores originais -EXIFPANEL_RESETHINT;Restaurar todas as etiquetas selecionadas a seus valores originais +EXIFPANEL_RESETALLHINT;Restaurar todas as tags aos seus valores originais. +EXIFPANEL_RESETHINT;Restaurar as tags selecionadas aos seus valores originais. +EXIFPANEL_SHOWALL;Mostrar tudo EXIFPANEL_SUBDIRECTORY;Subdiretório -FILEBROWSER_APPLYPROFILE;Aplicar Perfil -FILEBROWSER_CLEARPROFILE;Limpar Perfil -FILEBROWSER_COPYPROFILE;Copiar Perfil -FILEBROWSER_DELETEDLGLABEL;Confirmação para Apagar Arquivo -FILEBROWSER_DELETEDLGMSG;Tem certeza de que deseja apagar os %1 arquivos selecionados? -FILEBROWSER_EMPTYTRASH;Esvaziar Lixeira -FILEBROWSER_EMPTYTRASHHINT;Remove permanentemente os arquivos da lixeira -FILEBROWSER_PARTIALPASTEPROFILE;Colar parcialmente -FILEBROWSER_PASTEPROFILE;Colar Perfil +EXPORT_BYPASS;Etapas de processamento para ignorar +EXPORT_BYPASS_ALL;Selecionar / Desmarcar Tudo +EXPORT_BYPASS_DEFRINGE;Ignorar Defringe +EXPORT_BYPASS_DIRPYRDENOISE;Ignorar Redução de Ruído +EXPORT_BYPASS_DIRPYREQUALIZER;Ignorar Contraste por Níveis de Detalhe +EXPORT_BYPASS_EQUALIZER;Ignorar Níveis Wavelet +EXPORT_BYPASS_RAW_CA;Ignorar [raw] Correção de Aberração Cromática +EXPORT_BYPASS_RAW_CCSTEPS;Ignorar [raw] Supressão de Cor Falsa +EXPORT_BYPASS_RAW_DCB_ENHANCE;Ignorar [raw] DCB Etapas de Aprimoramento +EXPORT_BYPASS_RAW_DCB_ITERATIONS;Ignorar [raw] DCB Iterações +EXPORT_BYPASS_RAW_DF;Ignorar [raw] Quadro Escuro +EXPORT_BYPASS_RAW_FF;Ignorar [raw] Flat-Field +EXPORT_BYPASS_RAW_GREENTHRESH;Ignorar [raw] Equilíbrio Verde +EXPORT_BYPASS_RAW_LINENOISE;Ignorar [raw] Filtro de Ruído de Linha +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Ignorar [raw] LMMSE Etapas de Aprimoramento +EXPORT_BYPASS_SHARPENEDGE;Ignorar Nitidez de Borda +EXPORT_BYPASS_SHARPENING;Ignorar Nitidez +EXPORT_BYPASS_SHARPENMICRO;Ignorar Microcontraste +EXPORT_BYPASS_SH_HQ;Ignorar Sombras/Realces da Máscara de Nitidez +EXPORT_FASTEXPORTOPTIONS;Opções de Exportação Rápida +EXPORT_INSTRUCTIONS;As opções de exportação rápida fornecem substituições para ignorar tempo e recursos consumidos no desenvolvimento de configurações e na execução do processamento de filas. Este método é recomendado para geração rápida de imagens de baixa resolução, quando a velocidade é prioridade ou quando a saída redimensionada é desejada para uma ou mais imagens sem fazer modificações nos parâmetros de desenvolvimento salvos. +EXPORT_MAXHEIGHT;Altura máxima: +EXPORT_MAXWIDTH;Largura máxima: +EXPORT_PIPELINE;Processamento pipeline +EXPORT_PUTTOQUEUEFAST; Coloque na fila para exportação rápida +EXPORT_RAW_DMETHOD;Método Demosaico +EXPORT_USE_FAST_PIPELINE;Dedicado (processamento completo na imagem redimensionada) +EXPORT_USE_FAST_PIPELINE_TIP;Use um processamento dedicado pipeline para imagens no modo de Exportação Rápida, que troca velocidade por qualidade. O redimensionamento da imagem é feito o mais cedo possível, em vez de fazê-lo no final, como no pipeline normal. O aumento de velocidade pode ser significativo, mas esteja preparado para ver artefatos e uma degradação geral da qualidade de saída. +EXPORT_USE_NORMAL_PIPELINE;Padrão (ignorar algumas etapas, redimensionar no final) +EXTPROGTARGET_1;raw +EXTPROGTARGET_2;processado em fila +FILEBROWSER_ADDDELTEMPLATE;Adicionar/Excluir modelos... +FILEBROWSER_APPLYPROFILE;Aplicar +FILEBROWSER_APPLYPROFILE_PARTIAL;Aplicar - parcial +FILEBROWSER_AUTODARKFRAME;Quadro escuro automático +FILEBROWSER_AUTOFLATFIELD;Flat-field automático +FILEBROWSER_BROWSEPATHBUTTONHINT;Clique para navegar até o caminho escolhido. +FILEBROWSER_BROWSEPATHHINT;Digite um caminho para navegar até.\n\nAtalhos do teclado:\nCtrl-o para focar na caixa de texto do caminho.\nEnter / Ctrl-Enter para navegar lá;\nEsc para limpar as alterações.\nShift-Esc para remover o foco.\n\nAtalhos do caminho:\n~ - diretório home do usuário.\n! - diretório de fotos do usuário +FILEBROWSER_CACHE;Cache +FILEBROWSER_CLEARPROFILE;Perfil de limpeza +FILEBROWSER_COLORLABEL_TOOLTIP;Etiqueta de cor.\n\nUse o menu suspenso ou atalhos:\nShift-Ctrl-0 Sem Cor\nShift-Ctrl-1 Vermelho\nShift-Ctrl-2 Amarelo\nShift-Ctrl-3 Verde\nShift-Ctrl-4 Azul\nShift-Ctrl-5 Roxo +FILEBROWSER_COPYPROFILE;Copiar perfil +FILEBROWSER_CURRENT_NAME;Nome atual: +FILEBROWSER_DARKFRAME;Quadro escuro +FILEBROWSER_DELETEDLGLABEL;Confirmação de exclusão de arquivo +FILEBROWSER_DELETEDLGMSG;Tens certeza de que desejas excluir os %1 arquivos selecionados? +FILEBROWSER_DELETEDLGMSGINCLPROC;Tens certeza de que desejas excluir os %1 arquivos selecionados incluindo uma versão processada em fila? +FILEBROWSER_EMPTYTRASH;Lixeira vazia +FILEBROWSER_EMPTYTRASHHINT;Excluir permanentemente os arquivos da lixeira. +FILEBROWSER_EXTPROGMENU;Abrir com +FILEBROWSER_FLATFIELD;Flat-Field +FILEBROWSER_MOVETODARKFDIR;Mover para o diretório de quadros escuros +FILEBROWSER_MOVETOFLATFIELDDIR;Mover para o diretório flat-fields +FILEBROWSER_NEW_NAME;Novo nome: +FILEBROWSER_OPENDEFAULTVIEWER;Visualizador padrão do Windows (processado em fila) +FILEBROWSER_PARTIALPASTEPROFILE;Colar - parcial +FILEBROWSER_PASTEPROFILE;Colar FILEBROWSER_POPUPCANCELJOB;Cancelar trabalho -FILEBROWSER_POPUPMOVEEND;Mover para o fim da fila -FILEBROWSER_POPUPMOVEHEAD;Mover para o início da fila +FILEBROWSER_POPUPCOLORLABEL;Etiqueta de Cor +FILEBROWSER_POPUPCOLORLABEL0;Etiqueta: Nenhuma +FILEBROWSER_POPUPCOLORLABEL1;Etiqueta: Vermelha +FILEBROWSER_POPUPCOLORLABEL2;Etiqueta: Amarela +FILEBROWSER_POPUPCOLORLABEL3;Etiqueta: Verde +FILEBROWSER_POPUPCOLORLABEL4;Etiqueta: Azul +FILEBROWSER_POPUPCOLORLABEL5;Etiqueta: Roxa +FILEBROWSER_POPUPCOPYTO;Copiar para... +FILEBROWSER_POPUPFILEOPERATIONS;Operações de arquivo +FILEBROWSER_POPUPMOVEEND;Mover para o final da fila +FILEBROWSER_POPUPMOVEHEAD;Mover para a cabeça da fila +FILEBROWSER_POPUPMOVETO;Mover para... FILEBROWSER_POPUPOPEN;Abrir -FILEBROWSER_POPUPOPENINEDITOR;Abrir em Editor de -FILEBROWSER_POPUPPROCESS;Colocar na fila de processamento -FILEBROWSER_POPUPREMOVE;Remover do sistema de arquivos +FILEBROWSER_POPUPOPENINEDITOR;Abrir no Editor +FILEBROWSER_POPUPPROCESS;Coloque na fila +FILEBROWSER_POPUPPROCESSFAST;Coloque na fila (Exportação rápida) +FILEBROWSER_POPUPPROFILEOPERATIONS;Operações de perfil de processamento +FILEBROWSER_POPUPRANK;Classificar +FILEBROWSER_POPUPRANK0;Desclassificar +FILEBROWSER_POPUPRANK1;Rank 1 * +FILEBROWSER_POPUPRANK2;Rank 2 ** +FILEBROWSER_POPUPRANK3;Rank 3 *** +FILEBROWSER_POPUPRANK4;Rank 4 **** +FILEBROWSER_POPUPRANK5;Rank 5 ***** +FILEBROWSER_POPUPREMOVE;Excluir +FILEBROWSER_POPUPREMOVEINCLPROC;Excluir com saída da fila FILEBROWSER_POPUPRENAME;Renomear FILEBROWSER_POPUPSELECTALL;Selecionar tudo FILEBROWSER_POPUPTRASH;Mover para a lixeira FILEBROWSER_POPUPUNRANK;Desclassificar FILEBROWSER_POPUPUNTRASH;Remover da lixeira -FILEBROWSER_RENAMEDLGLABEL;Renomear arquivo -FILEBROWSER_SHOWDIRHINT;Exibir todas as imagens do diretório -FILEBROWSER_SHOWRANK1HINT;Exibir imagens classificadas como 1 estrela -FILEBROWSER_SHOWRANK2HINT;Exibir imagens classificadas como 2 estrelas -FILEBROWSER_SHOWRANK3HINT;Exibir imagens classificadas como 3 estrelas -FILEBROWSER_SHOWRANK4HINT;Exibir imagens classificadas como 4 estrelas -FILEBROWSER_SHOWRANK5HINT;Exibir imagens classificadas como 5 estrelas -FILEBROWSER_SHOWTRASHHINT;Exibir conteúdo da lixeira -FILEBROWSER_SHOWUNRANKHINT;Exibir imagens não classificadas -FILEBROWSER_THUMBSIZE;Tamanho das Miniaturas -FILEBROWSER_ZOOMINHINT;Aumentar Tamanho das Miniaturas -FILEBROWSER_ZOOMOUTHINT;Diminuir Tamanho das Miniaturas +FILEBROWSER_QUERYBUTTONHINT;Limpar a consulta Localizar +FILEBROWSER_QUERYHINT;Digite nomes de arquivos para procurar. Suporta nomes de arquivos parciais. Separe os termos de pesquisa usando vírgulas, por exemplo.\n1001,1004,1199\n\nExcluir termos de pesquisa prefixando-os com !=\ne.g.\n!=1001,1004,1199\n\nAtalhos:\nCtrl-f - foque a caixa Localizar,\nEnter - pesquisa,\nEsc - Limpe a caixa Localizar,\nShift-Esc - desfoque a caixa Localizar. +FILEBROWSER_QUERYLABEL; Localizar: +FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nAtalho: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nAtalho: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nAtalho: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nAtalho: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nAtalho: Shift-5 +FILEBROWSER_RENAMEDLGLABEL;Renomear arquivo +FILEBROWSER_RESETDEFAULTPROFILE;Restaurar para o padrão +FILEBROWSER_SELECTDARKFRAME;Selecionar quadro escuro... +FILEBROWSER_SELECTFLATFIELD;Selecionar flat-field... +FILEBROWSER_SHOWCOLORLABEL1HINT;Mostrar imagens marcadas com Vermelho.\nAtalho: Alt-1 +FILEBROWSER_SHOWCOLORLABEL2HINT;Mostrar imagens marcadas com Amarelo.\nAtalho: Alt-2 +FILEBROWSER_SHOWCOLORLABEL3HINT;Mostrar imagens marcadas com Verde.\nAtalho: Alt-3 +FILEBROWSER_SHOWCOLORLABEL4HINT;Mostrar imagens marcadas com Azul.\nAtalho: Alt-4 +FILEBROWSER_SHOWCOLORLABEL5HINT;Mostrar imagens marcadas com Roxo.\nAtalho: Alt-5 +FILEBROWSER_SHOWDIRHINT;Limpar todos os filtros.\nAtalho: d +FILEBROWSER_SHOWEDITEDHINT;Mostrar imagens editadas.\nAtalho: 7 +FILEBROWSER_SHOWEDITEDNOTHINT;Mostrar imagens não editadas.\nAtalho: 6 +FILEBROWSER_SHOWEXIFINFO;Mostrar informações Exif.\n\nAtalhos:\ni - Modo de Guias de Editores Mútiplos,\nAlt-i - Modo de Guia de Editor Único. +FILEBROWSER_SHOWNOTTRASHHINT;Mostre somente imagens não excluídas. +FILEBROWSER_SHOWORIGINALHINT;Mostre somente imagens originais.\n\nQuando existem várias imagens com o mesmo nome de arquivo, mas extensões diferentes, a única considerada original é aquela cuja extensão está mais próxima da parte superior da lista de extensões analisadas em Preferências > Navegador de Arquivos > Extenções Analisadas. +FILEBROWSER_SHOWRANK1HINT;Mostrar imagens classificadas como 1-estrela.\nAtalho: 1 +FILEBROWSER_SHOWRANK2HINT;Mostrar imagens classificadas como 2-estrelas.\nAtalho: 2 +FILEBROWSER_SHOWRANK3HINT;Mostrar imagens classificadas como 3-estrelas.\nAtalho: 3 +FILEBROWSER_SHOWRANK4HINT;Mostrar imagens classificadas como 4-estrelas.\nAtalho: 4 +FILEBROWSER_SHOWRANK5HINT;Mostrar imagens classificadas como 5-estrelas.\nAtalho: 5 +FILEBROWSER_SHOWRECENTLYSAVEDHINT;Mostrar imagens salvas.\nAtalho: Alt-7 +FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Mostrar imagens não salvas.\nAtalho: Alt-6 +FILEBROWSER_SHOWTRASHHINT;Mostrar conteúdo da lixeira.\nAtalho: Ctrl-t +FILEBROWSER_SHOWUNCOLORHINT;Mostrar imagens sem etiqueta colorida.\nAtalho: Alt-0 +FILEBROWSER_SHOWUNRANKHINT;Mostrar imagens desmarcadas.\nAtalho: 0 +FILEBROWSER_THUMBSIZE;Tamanho da miniatura +FILEBROWSER_UNRANK_TOOLTIP;Desmarcadas.\nAtalho: Shift-0 +FILEBROWSER_ZOOMINHINT;Aumentar tamanho da miniatura.\n\nAtalhos:\n+ - Modo de Guias de Editores Múltiplos,\nAlt-+ - Modo de Guia de Editor Único. +FILEBROWSER_ZOOMOUTHINT;Diminuir o tamanho da miniatura.\n\nAtalhos:\n- - Modo de Guias de Editores Múltiplos,\nAlt-- - Modo de Guia de Editor Único. +FILECHOOSER_FILTER_ANY;Todos os arquivos +FILECHOOSER_FILTER_COLPROF;Perfis de Cores +FILECHOOSER_FILTER_CURVE;Arquivos de curvas +FILECHOOSER_FILTER_LCP;Perfis de correção de lentes +FILECHOOSER_FILTER_PP;Perfis de processamento +FILECHOOSER_FILTER_SAME;Mesmo formato da foto atual +FILECHOOSER_FILTER_TIFF;Arquivos TIFF GENERAL_ABOUT;Sobre +GENERAL_AFTER;Depois de +GENERAL_APPLY;Aplicar +GENERAL_ASIMAGE;Como Imagem +GENERAL_AUTO;Automático +GENERAL_BEFORE;Antes GENERAL_CANCEL;Cancelar +GENERAL_CLOSE;Fechar GENERAL_DISABLE;Desabilitar GENERAL_DISABLED;Desabilitado GENERAL_ENABLE;Habilitar GENERAL_ENABLED;Habilitado +GENERAL_FILE;Arquivo GENERAL_LANDSCAPE;Paisagem GENERAL_NA;n/a GENERAL_NO;Não +GENERAL_NONE;None GENERAL_OK;OK +GENERAL_OPEN;Abrir GENERAL_PORTRAIT;Retrato +GENERAL_RESET;Restaurar GENERAL_SAVE;Salvar -HISTOGRAM_TOOLTIP_B;Mostrar/Esconder histograma AZUL -HISTOGRAM_TOOLTIP_G;Mostrar/Esconder histograma VERDE -HISTOGRAM_TOOLTIP_L;Mostrar/Esconder histograma CIELAB -HISTOGRAM_TOOLTIP_R;Mostrar/Esconder histograma VERMELHO +GENERAL_SAVE_AS;Salvar como... +GENERAL_SLIDER;Barra de volume +GENERAL_UNCHANGED;(Inalterado) +GENERAL_WARNING;Atenção +GIMP_PLUGIN_INFO;Bem-vindo ao plugin RawTherapee do GIMP!\nDepois de terminar de editar, feche a janela principal do RawTherapee e a imagem será importada automaticamente no GIMP. +HISTOGRAM_TOOLTIP_B;Mostrar/Ocultar histograma azul. +HISTOGRAM_TOOLTIP_BAR;Mostrar/ocultar barra do indicador RGB.\nClique com o botão direito do mouse na visualização da imagem para congelar/descongelar. +HISTOGRAM_TOOLTIP_CHRO;Mostrar/Ocultar histograma de cromaticidade. +HISTOGRAM_TOOLTIP_FULL;Alternar histograma completo (desligado) ou dimensionado (ligado). +HISTOGRAM_TOOLTIP_G;Mostrar/Ocultar histograma verde. +HISTOGRAM_TOOLTIP_L;Mostrar/Ocultar histograma de luminância CIELab. +HISTOGRAM_TOOLTIP_R;Mostrar/Ocultar histograma vermelho. +HISTOGRAM_TOOLTIP_RAW;Mostrar/Ocultar histograma raw. HISTORY_CHANGED;Alterado HISTORY_CUSTOMCURVE;Curva personalizada HISTORY_FROMCLIPBOARD;Da área de transferência HISTORY_LABEL;Histórico -HISTORY_MSG_1;Foto carregada -HISTORY_MSG_2;Perfil Carregado -HISTORY_MSG_3;Perfil Alterado -HISTORY_MSG_4;Navegador do histórico -HISTORY_MSG_5;Brilho -HISTORY_MSG_6;Contraste -HISTORY_MSG_7;Preto -HISTORY_MSG_8;Compensação de Exposição -HISTORY_MSG_9;Compressão da Luz -HISTORY_MSG_10;Compressão de Sombras -HISTORY_MSG_11;Curva de Tons -HISTORY_MSG_12;Exposição Automática -HISTORY_MSG_13;Clipping de Exposição -HISTORY_MSG_14;Brilho de Luminância -HISTORY_MSG_15;Contraste de Luminância -HISTORY_MSG_16;Luminância do Preto -HISTORY_MSG_17;Compressão do Foco de Luminância -HISTORY_MSG_18;Compressão das sombras de Luminância -HISTORY_MSG_19;Curva de Luminância -HISTORY_MSG_20;Tornar Nítido -HISTORY_MSG_21;Raio de Nitidez -HISTORY_MSG_22;Quantidade de Nitidez -HISTORY_MSG_23;Limiar de Nitidez -HISTORY_MSG_24;Tornar nítido apenas as bordas -HISTORY_MSG_25;Raio de Detecção de Bordas de Nitidez -HISTORY_MSG_26;Tolerância da nitidez das bordas -HISTORY_MSG_27;Controle de luz na nitidez -HISTORY_MSG_28;Quantidade do Controle de Luz -HISTORY_MSG_29;Método de Nitidez -HISTORY_MSG_30;Raio de Desconvolução -HISTORY_MSG_31;Quantidade de Desconvolução -HISTORY_MSG_32;Umedecimento de Desconvolução -HISTORY_MSG_33;Interações de Desconvolução -HISTORY_MSG_34;Evitar Clipping de Cor -HISTORY_MSG_35;Limitador de Saturação -HISTORY_MSG_36;limite de Saturação -HISTORY_MSG_37;Melhoria de Cor -HISTORY_MSG_38;Método do Balanço do Branco -HISTORY_MSG_39;Temperatura de Cor -HISTORY_MSG_40;Tonalidade do Balanço de Branco -HISTORY_MSG_41;Deslocamento da Cor "A" -HISTORY_MSG_42;Deslocamento da Cor "B" -HISTORY_MSG_43;Remoção de ruídos da luminância -HISTORY_MSG_44;Raio da remoção de ruídos da lum. -HISTORY_MSG_45;Tolerância de bordas da remoção de ruídos da lum. +HISTORY_MSG_1;Foto Carregada +HISTORY_MSG_2;PP3 Perfil carregado +HISTORY_MSG_3;PP3 Perfil alterado +HISTORY_MSG_4;Histórico de navegação +HISTORY_MSG_5;Exposição - Claridade +HISTORY_MSG_6;Exposição - Contraste +HISTORY_MSG_7;Exposição - Preto +HISTORY_MSG_8;Exposição - Compensação +HISTORY_MSG_9;Exposição - Compressão do realce +HISTORY_MSG_10;Exposição - Compressão de sombra +HISTORY_MSG_11;Exposição - Curva de tom 1 +HISTORY_MSG_12;Exposição - Níveis automáticos +HISTORY_MSG_13;Exposição - Clip +HISTORY_MSG_14;L*a*b* - Claridade +HISTORY_MSG_15;L*a*b* - Contraste +HISTORY_MSG_16;- +HISTORY_MSG_17;- +HISTORY_MSG_18;- +HISTORY_MSG_19;L*a*b* - L* curva +HISTORY_MSG_20;Nitidez +HISTORY_MSG_21;USM - Raio +HISTORY_MSG_22;USM - Montante +HISTORY_MSG_23;USM - Limite +HISTORY_MSG_24;USM - Nitidez somente nas bordas +HISTORY_MSG_25;USM - Raio de detecção de borda +HISTORY_MSG_26;USM - Tolerância de borda +HISTORY_MSG_27;USM - Controle de halo +HISTORY_MSG_28;USM - Montante de controle de halo +HISTORY_MSG_29;Nitidez - Método +HISTORY_MSG_30;RLD - Raio +HISTORY_MSG_31;RLD - Montante +HISTORY_MSG_32;RLD - Damping +HISTORY_MSG_33;RLD - Iterações +HISTORY_MSG_34;Lente Correção - Distorção +HISTORY_MSG_35;Lente Correção - Vinhetas +HISTORY_MSG_36;Lente Correção - CA +HISTORY_MSG_37;Exposição - Níveis automáticos +HISTORY_MSG_38;Balanço de Branco - Método +HISTORY_MSG_39;Balanço de Branco - Temperatura +HISTORY_MSG_40;Balanço de Branco - Matiz +HISTORY_MSG_41;Exposição - Modo de curva de tom 1 +HISTORY_MSG_42;Exposição - Curva de tom 2 +HISTORY_MSG_43;Exposição - Modo de curva de tom 2 +HISTORY_MSG_44;Raio de remoção de ruídos da Lum. +HISTORY_MSG_45;Tolerância de bordas da remoção de ruídos da Lum. HISTORY_MSG_46;Remoção de ruídos da cor -HISTORY_MSG_47;Raio da remoção de ruídos da cor -HISTORY_MSG_48;Tolerância de bordas da remoção de ruídos da cor -HISTORY_MSG_49;Remoção de ruidos da cor sensível a bordas -HISTORY_MSG_50;Ferramenta Sombra/Luz -HISTORY_MSG_51;Melhora de luz -HISTORY_MSG_52;Melhora de Sombras -HISTORY_MSG_53;Largura de Tons da Luz -HISTORY_MSG_54;Largura de Tons das Sombras -HISTORY_MSG_55;Contraste Local -HISTORY_MSG_56;Raio de Luz/Sombra -HISTORY_MSG_57;Coarse Rotation -HISTORY_MSG_58;Inversão Horizontal -HISTORY_MSG_59;Inversão Vertical +HISTORY_MSG_47;Misture os realces ICC com a matriz +HISTORY_MSG_48;DCP - Curva de tom +HISTORY_MSG_49;DCP illuminante +HISTORY_MSG_50;Sombras/Realces +HISTORY_MSG_51;S/H - Realces +HISTORY_MSG_52;S/H - Sombras +HISTORY_MSG_53;S/H - Largura tonal dos realces +HISTORY_MSG_54;S/H - Largura tonal das sombras +HISTORY_MSG_55;S/H - Contraste local +HISTORY_MSG_56;S/H - Raio +HISTORY_MSG_57;Rotação grosseira +HISTORY_MSG_58;Giro Horizontal +HISTORY_MSG_59;Giro Vertical HISTORY_MSG_60;Rotação -HISTORY_MSG_61;Rotação -HISTORY_MSG_62;Correção de Distorção de Lente -HISTORY_MSG_63;Snapshot Selecionado -HISTORY_MSG_64;Cortar Foto -HISTORY_MSG_65;Correção de C/A -HISTORY_MSG_66;Recuperação de Luz -HISTORY_MSG_67;Quantidade de Recuperação -HISTORY_MSG_68;Método de Recuperação -HISTORY_MSG_69;Espaço de atuação da cor -HISTORY_MSG_70;Espaço de Cor de Saída -HISTORY_MSG_71;Espaço de Cor de Entrada -HISTORY_MSG_72;Correção de Vinheta -HISTORY_MSG_73;Misturador de Canais -HISTORY_MSG_74;Escala de Redimensionamento -HISTORY_MSG_75;Método de Redimensionamento -HISTORY_MSG_76;Metadados Exif -HISTORY_MSG_77;Metadados IPTC -HISTORY_MSG_78;Dados especificados para redimensionamento -HISTORY_MSG_79;Largura do redimensionamento -HISTORY_MSG_80;Altura do redimensionamento -HISTORY_MSG_81;Redimensionamento habilitado +HISTORY_MSG_61;Preenchimento automático +HISTORY_MSG_62;Correção de distorção +HISTORY_MSG_63;Instantâneo selecionado +HISTORY_MSG_64;Cortar +HISTORY_MSG_65;Correção CA +HISTORY_MSG_66;Exposição - Reconstrução do realce +HISTORY_MSG_67;Exposição - Montante HLR +HISTORY_MSG_68;Exposição - Método HLR +HISTORY_MSG_69;Espaço de cor de trabalho +HISTORY_MSG_70;Espaço de cor de saída +HISTORY_MSG_71;Espaço de cor de entrada +HISTORY_MSG_72;VC - Montante +HISTORY_MSG_73;Misturador de canais +HISTORY_MSG_74;Redimensionar - Escala +HISTORY_MSG_75;Redimensionar - Método +HISTORY_MSG_76;Metadados Exif +HISTORY_MSG_77;Metadados IPTC +HISTORY_MSG_78;- +HISTORY_MSG_79;Redimensionar - Largura +HISTORY_MSG_80;Redimensionar - Altura +HISTORY_MSG_81;Redimensionar +HISTORY_MSG_82;Perfil alterado +HISTORY_MSG_83;S/H - Máscara de nitidez +HISTORY_MSG_84;Correção de perspectiva +HISTORY_MSG_85;Correção de Lente - Arquivo LCP +HISTORY_MSG_86;RGB Curvas - Modo de lLuminosidade +HISTORY_MSG_87;Redução de Ruído por Impulso +HISTORY_MSG_88;Limite de Impulso NR +HISTORY_MSG_89;Redução de Ruído +HISTORY_MSG_90;NR - Luminância +HISTORY_MSG_91;NR - Crominância mestre +HISTORY_MSG_92;NR - Gamma +HISTORY_MSG_93;CbDL - Valor +HISTORY_MSG_94;Contraste por Níveis de Detalhes +HISTORY_MSG_95;L*a*b* - Cromaticidade +HISTORY_MSG_96;L*a*b* - a* curva +HISTORY_MSG_97;L*a*b* - b* curva +HISTORY_MSG_98;Método Demosaicing +HISTORY_MSG_99;Filtro Hot pixel +HISTORY_MSG_100;Exposição - Saturação +HISTORY_MSG_101;HSV - Matiz +HISTORY_MSG_102;HSV - Saturação +HISTORY_MSG_103;HSV - Valor +HISTORY_MSG_104;HSV Equalizador +HISTORY_MSG_105;Defringe +HISTORY_MSG_106;Defringe - Raio +HISTORY_MSG_107;Defringe - Limite +HISTORY_MSG_108;Exposição - Limite HLC +HISTORY_MSG_109;Redimensionar - Caixa delimitadora +HISTORY_MSG_110;Redimensionar - Aplica-se a +HISTORY_MSG_111;L*a*b* - Evite mudança de cor +HISTORY_MSG_112;--sem uso-- +HISTORY_MSG_113;L*a*b* - Vermelho/película prot. +HISTORY_MSG_114;DCB iterações +HISTORY_MSG_115;Supressão de cores falsas +HISTORY_MSG_116;DCB aprimoramento +HISTORY_MSG_117;Raw CA correção - Vermelho +HISTORY_MSG_118;Raw CA correção - Azul +HISTORY_MSG_119;Filtro de ruído de linha +HISTORY_MSG_120;Equilíbrio Verde +HISTORY_MSG_121;Raw CA Correção - Automática +HISTORY_MSG_122;Quadro Escuro - Seleção Automática +HISTORY_MSG_123;Quadro Escuro - Arquivo +HISTORY_MSG_124;Correção de ponto branco +HISTORY_MSG_126;Flat-Field - Arquivo +HISTORY_MSG_127;Flat-Field - Seleção automática +HISTORY_MSG_128;Flat-Field - Raio de desfoque +HISTORY_MSG_129;Flat-Field - Tipo de desfoque +HISTORY_MSG_130;Correção automática de distorção +HISTORY_MSG_131;NR - Luma +HISTORY_MSG_132;NR - Croma +HISTORY_MSG_133;Gamma de saída +HISTORY_MSG_134;Gamma livre +HISTORY_MSG_135;Gamma livre +HISTORY_MSG_136;Declive gamma livre +HISTORY_MSG_137;Nível preto - Verde 1 +HISTORY_MSG_138;Nível preto - Vermelho +HISTORY_MSG_139;Nível preto - Azul +HISTORY_MSG_140;Nível preto - Verde 2 +HISTORY_MSG_141;Nível preto - Links verdes +HISTORY_MSG_142;ES - Iterações +HISTORY_MSG_143;ES - Quantidade +HISTORY_MSG_144;Microcontraste - Quantidade +HISTORY_MSG_145;Microcontraste - Uniformidade +HISTORY_MSG_146;Nitidez de borda +HISTORY_MSG_147;ES - Apenas luminância +HISTORY_MSG_148;Microcontraste +HISTORY_MSG_149;Microcontraste - matriz 3×3 +HISTORY_MSG_150;Artefato pós-demosaico/redução de ruído +HISTORY_MSG_151;Vibração +HISTORY_MSG_152;Vibração - Tons pastel +HISTORY_MSG_153;Vibração - Tons saturados +HISTORY_MSG_154;Vibração - Protege os tons da película +HISTORY_MSG_155;Vibração - Evita mudança de cor +HISTORY_MSG_156;Vibração - Link pastel/saturado +HISTORY_MSG_157;Vibração - Limite P/S +HISTORY_MSG_158;TM - Intensidade +HISTORY_MSG_159;TM - Borda parando +HISTORY_MSG_160;TM - Escala +HISTORY_MSG_161;TM - Reponderar iteração +HISTORY_MSG_162;Mapeamento de Tom +HISTORY_MSG_163;RGB Curvas - Vermelho +HISTORY_MSG_164;RGB Curvas - Verde +HISTORY_MSG_165;RGB Curvas - Azul +HISTORY_MSG_166;Exposição - Restaurar +HISTORY_MSG_167;Método Demosaicing +HISTORY_MSG_168;L*a*b* - Curva CC +HISTORY_MSG_169;L*a*b* - Curva CH +HISTORY_MSG_170;Vibração - Curva HH +HISTORY_MSG_171;L*a*b* - Curva LC +HISTORY_MSG_172;L*a*b* - Restringir LC +HISTORY_MSG_173;NR - Recuperação de detalhes +HISTORY_MSG_174;CIECAM02 +HISTORY_MSG_175;CAM02 - Adaptação CAT02 +HISTORY_MSG_176;CAM02 - Visualizando surround +HISTORY_MSG_177;CAM02 - Luminosidade de cena +HISTORY_MSG_178;CAM02 - Visualizando luminosidade +HISTORY_MSG_179;CAM02 - Modelo de ponto branco +HISTORY_MSG_180;CAM02 - Claridade (J) +HISTORY_MSG_181;CAM02 - Croma (C) +HISTORY_MSG_182;CAM02 - Automático CAT02 +HISTORY_MSG_183;CAM02 - Contraste (J) +HISTORY_MSG_184;CAM02 - Cena surround +HISTORY_MSG_185;CAM02 - Controle Gamut +HISTORY_MSG_186;CAM02 - Algorítimo +HISTORY_MSG_187;CAM02 - Vermelho/película prot. +HISTORY_MSG_188;CAM02 - Brilho (Q) +HISTORY_MSG_189;CAM02 - Contraste (Q) +HISTORY_MSG_190;CAM02 - Saturação (S) +HISTORY_MSG_191;CAM02 - Colorido (M) +HISTORY_MSG_192;CAM02 - Matiz (h) +HISTORY_MSG_193;CAM02 - Curva de tom 1 +HISTORY_MSG_194;CAM02 - Curva de tom 2 +HISTORY_MSG_195;CAM02 - Curva de tom 1 +HISTORY_MSG_196;CAM02 - Curva de tom 2 +HISTORY_MSG_197;CAM02 - Curva de cor +HISTORY_MSG_198;CAM02 - Curva de cor +HISTORY_MSG_199;CAM02 - Histogramas de saída +HISTORY_MSG_200;CAM02 - Mapeamento de tom +HISTORY_MSG_201;NR - Crominância - R&G +HISTORY_MSG_202;NR - Crominância - B&Y +HISTORY_MSG_203;NR - Espaço colorido +HISTORY_MSG_204;LMMSE etapas de aprimoramento +HISTORY_MSG_205;CAM02 - Filtro de pixel Hot/bad +HISTORY_MSG_206;CAT02 - Luminosidade de cena automático +HISTORY_MSG_207;Defringe - Curva de matiz +HISTORY_MSG_208;Equalizador WB - B/R +HISTORY_MSG_210;GF - Ângulo +HISTORY_MSG_211;Filtro Graduado +HISTORY_MSG_212;VF - Intensidade +HISTORY_MSG_213;Filtro de Vinheta +HISTORY_MSG_214;Preto-e-Branco +HISTORY_MSG_215;P&B - CM - Vermelho +HISTORY_MSG_216;P&B - CM - Verde +HISTORY_MSG_217;P&B - CM - Azul +HISTORY_MSG_218;P&B - Gamma - Vermelho +HISTORY_MSG_219;P&B - Gamma - Verde +HISTORY_MSG_220;P&B - Gamma - Azul +HISTORY_MSG_221;P&B - Filtro de cor +HISTORY_MSG_222;P&B - Predefinições +HISTORY_MSG_223;P&B - CM - Laranja +HISTORY_MSG_224;P&B - CM - Amarelo +HISTORY_MSG_225;P&B - CM - Ciano +HISTORY_MSG_226;P&B - CM - Magenta +HISTORY_MSG_227;P&B - CM - Roxo +HISTORY_MSG_228;P&B - Equalizador de luminância +HISTORY_MSG_229;P&B - Equalizador de luminância +HISTORY_MSG_230;P&B - Modo +HISTORY_MSG_231;P&B - Curva 'anterior' +HISTORY_MSG_232;P&B - Tipo de curva 'anterior' +HISTORY_MSG_233;P&B - Curva 'posterior' +HISTORY_MSG_234;P&B - Tipo de curva 'posterior' +HISTORY_MSG_235;P&B - Misturador de canal automático +HISTORY_MSG_236;--sem uso-- +HISTORY_MSG_237;P&B - Misturador +HISTORY_MSG_238;GF - Difusão +HISTORY_MSG_239;GF - Intensidade +HISTORY_MSG_240;GF - Centro +HISTORY_MSG_241;VF - Difusão +HISTORY_MSG_242;VF - Arredondamento +HISTORY_MSG_243;VC - Raio +HISTORY_MSG_244;VC - Intensidade +HISTORY_MSG_245;VC - Centro +HISTORY_MSG_246;L*a*b* - Curva CL +HISTORY_MSG_247;L*a*b* - Curva LH +HISTORY_MSG_248;L*a*b* - Curva HH +HISTORY_MSG_249;CbDL - Limite +HISTORY_MSG_250;NR - Aprimorada +HISTORY_MSG_251;P&B - Algorítimo +HISTORY_MSG_252;CbDL - Película tar/prot +HISTORY_MSG_253;CbDL - Reduzir artefatos +HISTORY_MSG_254;CbDL - Matiz da película +HISTORY_MSG_255;NR - Filtro mediano +HISTORY_MSG_256;NR - Mediano - Tipo +HISTORY_MSG_257;Tonificação de Cor +HISTORY_MSG_258;CT - Curva de cor +HISTORY_MSG_259;CT - Curva de opacidade +HISTORY_MSG_260;CT - a*[b*] opacidade +HISTORY_MSG_261;CT - Método +HISTORY_MSG_262;CT - b* opacidade +HISTORY_MSG_263;CT - Sombra - Vermelho +HISTORY_MSG_264;CT - Sombra - Verde +HISTORY_MSG_265;CT - Sombra - Azul +HISTORY_MSG_266;CT - Médio - Vermelho +HISTORY_MSG_267;CT - Médio - Verde +HISTORY_MSG_268;CT - Médio - Azul +HISTORY_MSG_269;CT - Alto - Vermelho +HISTORY_MSG_270;CT - Alto - Verde +HISTORY_MSG_271;CT - Alto - Azul +HISTORY_MSG_272;CT - Balanço +HISTORY_MSG_273;CT - Restaurar +HISTORY_MSG_274;CT - Sat. Sombras +HISTORY_MSG_275;CT - Sat. Realces +HISTORY_MSG_276;CT - Opacidade +HISTORY_MSG_277;--sem uso-- +HISTORY_MSG_278;CT - Preserve luminância +HISTORY_MSG_279;CT - Sombras +HISTORY_MSG_280;CT - Realces +HISTORY_MSG_281;CT - Sat. intensidade +HISTORY_MSG_282;CT - Sat. limite +HISTORY_MSG_283;CT - Intensidade +HISTORY_MSG_284;CT - Proteção automática sat. +HISTORY_MSG_285;NR - Mediano - Método +HISTORY_MSG_286;NR - Mediano - Tipo +HISTORY_MSG_287;NR - Mediano - Iterações +HISTORY_MSG_288;Flat Field - Controle de clipe +HISTORY_MSG_289;Flat Field - Controle de clipe - Automático +HISTORY_MSG_290;Nível de Preto - Vermelho +HISTORY_MSG_291;Nível de Preto - Verde +HISTORY_MSG_292;Nível de Preto - Azul +HISTORY_MSG_293;Simulação de Filme +HISTORY_MSG_294;Simulação de Filme - Intensidade +HISTORY_MSG_295;Simulação de Filme - Filme +HISTORY_MSG_296;NR - Curva de luminância +HISTORY_MSG_297;NR - Modo +HISTORY_MSG_298;Filtro de pixel morto +HISTORY_MSG_299;NR - Curva de crominância +HISTORY_MSG_300;- +HISTORY_MSG_301;NR - Controle luma +HISTORY_MSG_302;NR - Método croma +HISTORY_MSG_303;NR - Método croma +HISTORY_MSG_304;W - Níveis de contraste +HISTORY_MSG_305;Níveis de Wavelet +HISTORY_MSG_306;W - Processo +HISTORY_MSG_307;W - Processo +HISTORY_MSG_308;W - Direção do processo +HISTORY_MSG_309;W - ES - Detalhe +HISTORY_MSG_310;W - Residual - Céu tar/prot +HISTORY_MSG_311;W - Níveis de Wavelet +HISTORY_MSG_312;W - Residual - Limite de sombras +HISTORY_MSG_313;W - Croma - Sat/past +HISTORY_MSG_314;W - Gamut - Reduzir artefatos +HISTORY_MSG_315;W - Residual - Contraste +HISTORY_MSG_316;W - Gamut - Película tar/prot +HISTORY_MSG_317;W - Gamut - Matiz da película +HISTORY_MSG_318;W - Contraste - Níveis de realce +HISTORY_MSG_319;W - Contraste - Faixa de realce +HISTORY_MSG_320;W - Contraste - Faixa de sombra +HISTORY_MSG_321;W - Contraste - Níveis de sombra +HISTORY_MSG_322;W - Gamut - Evite mudança de cor +HISTORY_MSG_323;W - ES - Contraste local +HISTORY_MSG_324;W - Croma - Pastel +HISTORY_MSG_325;W - Croma - Saturado +HISTORY_MSG_326;W - Croma - Método +HISTORY_MSG_327;W - Contraste - Aplicar para +HISTORY_MSG_328;W - Croma - Intensidade do link +HISTORY_MSG_329;W - Tonificação - Opacidade RG +HISTORY_MSG_330;W - Tonificação - Opacidade BY +HISTORY_MSG_331;W - Níveis de contraste - Extra +HISTORY_MSG_332;W - Método de ladrilhos +HISTORY_MSG_333;W - Residual - Sombras +HISTORY_MSG_334;W - Residual - Croma +HISTORY_MSG_335;W - Residual - Realces +HISTORY_MSG_336;W - Residual - Limite de realces +HISTORY_MSG_337;W - Residual - Tonalidade do céu +HISTORY_MSG_338;W - ES - Raio +HISTORY_MSG_339;W - ES - Intensidade +HISTORY_MSG_340;W - Intensidade +HISTORY_MSG_341;W - Performance de borda +HISTORY_MSG_342;W - ES - Primeiro nível +HISTORY_MSG_343;W - Níveis cromáticos +HISTORY_MSG_344;W - Método croma sl/cur +HISTORY_MSG_345;W - ES - Contraste local +HISTORY_MSG_346;W - ES - Método de contraste local +HISTORY_MSG_347;W - Remoção de ruído - Nível 1 +HISTORY_MSG_348;W - Remoção de ruído - Nível 2 +HISTORY_MSG_349;W - Remoção de ruído - Nível 3 +HISTORY_MSG_350;W - ES - Detecção de borda +HISTORY_MSG_351;W - Residual - Curva HH +HISTORY_MSG_352;W - Fundo +HISTORY_MSG_353;W - ES - Sensibilidade Gradiente +HISTORY_MSG_354;W - ES - Aprimorada +HISTORY_MSG_355;W - ES - Limite baixo +HISTORY_MSG_356;W - ES - Limite alto +HISTORY_MSG_357;W - Remoção de ruído - Link com ES +HISTORY_MSG_358;W - Gamut - CH +HISTORY_MSG_359;Hot/Dead - Limite +HISTORY_MSG_360;TM - Gamma +HISTORY_MSG_361;W - Final - Balanço cromático +HISTORY_MSG_362;W - Residual - Método de compressão +HISTORY_MSG_363;W - Residual - Intensidade da compressão +HISTORY_MSG_364;W - Final - Balanço de Contraste +HISTORY_MSG_365;W - Final - Balanço Delta +HISTORY_MSG_366;W - Residual - Gamma de compressão +HISTORY_MSG_367;W - Final - Curva de contraste 'posterior' +HISTORY_MSG_368;W - Final - Balanço de contraste +HISTORY_MSG_369;W - Final - Método de balanço +HISTORY_MSG_370;W - Final - Curva de contraste local +HISTORY_MSG_371;Pós Redimensionamento de Nitidez +HISTORY_MSG_372;PRS USM - Raio +HISTORY_MSG_373;PRS USM - Montante +HISTORY_MSG_374;PRS USM - Limite +HISTORY_MSG_375;PRS USM - Nitidez apenas nas bordas +HISTORY_MSG_376;PRS USM - Raio de detecção de borda +HISTORY_MSG_377;PRS USM - Tolerância de borda +HISTORY_MSG_378;PRS USM - Controle de halo +HISTORY_MSG_379;PRS USM - Monten de controle de halo +HISTORY_MSG_380;PRS - Método +HISTORY_MSG_381;PRS RLD - Raio +HISTORY_MSG_382;PRS RLD - Montante +HISTORY_MSG_383;PRS RLD - Damping +HISTORY_MSG_384;PRS RLD - Iterações +HISTORY_MSG_385;W - Residual - Balanço de Cor +HISTORY_MSG_386;W - Residual - CB verde alto +HISTORY_MSG_387;W - Residual - CB azul alto +HISTORY_MSG_388;W - Residual - CB verde médio +HISTORY_MSG_389;W - Residual - CB azul médio +HISTORY_MSG_390;W - Residual - CB verde baixo +HISTORY_MSG_391;W - Residual - CB azul baixo +HISTORY_MSG_392;W - Residual - CB Restaurar +HISTORY_MSG_393;DCP - Mesa de Olhar +HISTORY_MSG_394;DCP - Exposição linha de base +HISTORY_MSG_395;DCP - Mesa base +HISTORY_MSG_396;W - Sub-ferramenta de contraste +HISTORY_MSG_397;W - Sub-ferramenta de croma +HISTORY_MSG_398;W - Sub-ferramenta ES +HISTORY_MSG_399;W - Sub-ferramenta residual +HISTORY_MSG_400;W - Sub-ferramenta final +HISTORY_MSG_401;W - Sub-ferramenta de tonificação +HISTORY_MSG_402;W - Sub-ferramenta de remoção de ruído +HISTORY_MSG_403;W - ES - Sensibilidade de borda +HISTORY_MSG_404;W - ES - Amplificação de base +HISTORY_MSG_405;W - Remoção de ruído - Nível 4 +HISTORY_MSG_406;W - ES - Pixels vizinhos +HISTORY_MSG_407;Retinex - Método +HISTORY_MSG_408;Retinex - Raio +HISTORY_MSG_409;Retinex - Contraste +HISTORY_MSG_410;Retinex - Compensação +HISTORY_MSG_411;Retinex - Intensidade +HISTORY_MSG_412;Retinex - Gradiente de Gaussian +HISTORY_MSG_413;Retinex - Contraste +HISTORY_MSG_414;Retinex - Histograma - Laboratório +HISTORY_MSG_415;Retinex - Transmissão +HISTORY_MSG_416;Retinex +HISTORY_MSG_417;Retinex - Mediana de transmissão +HISTORY_MSG_418;Retinex - Limite +HISTORY_MSG_419;Retinex - Espaço colorido +HISTORY_MSG_420;Retinex - Histograma - HSL +HISTORY_MSG_421;Retinex - Gamma +HISTORY_MSG_422;Retinex - Gamma +HISTORY_MSG_423;Retinex - Declive gamma +HISTORY_MSG_424;Retinex - Limite HL +HISTORY_MSG_425;Retinex - Base de registro +HISTORY_MSG_426;Retinex - Equalizador de matiz +HISTORY_MSG_427;Intenção de renderização de saída +HISTORY_MSG_428;Intenção de renderização do monitor +HISTORY_MSG_429;Retinex - Iterações +HISTORY_MSG_430;Retinex - Gradiente de transmissão +HISTORY_MSG_431;Retinex - Gradiente de intensidade +HISTORY_MSG_432;Retinex - M - Realces +HISTORY_MSG_433;Retinex - M - Realces TW +HISTORY_MSG_434;Retinex - M - Sombras +HISTORY_MSG_435;Retinex - M - Sombras TW +HISTORY_MSG_436;Retinex - M - Raio +HISTORY_MSG_437;Retinex - M - Método +HISTORY_MSG_438;Retinex - M - Equalizador +HISTORY_MSG_439;Retinex - Processo +HISTORY_MSG_440;CbDL - Método +HISTORY_MSG_441;Retinex - Transmissão de ganho +HISTORY_MSG_442;Retinex - escala +HISTORY_MSG_443;Compensação do ponto preto de saída +HISTORY_MSG_444;Balanço de Branco - viés Temp +HISTORY_MSG_445;Sub-imagem Raw +HISTORY_MSG_449;PS - adaptação ISO +HISTORY_MSG_452;PS - Mostrar movimento +HISTORY_MSG_453;PS - Mostrar apenas a máscara +HISTORY_MSG_457;PS - Verificar vermelho/azul +HISTORY_MSG_462;PS - Verificar verde +HISTORY_MSG_464;PS - Máscara de movimento de desfoque +HISTORY_MSG_465;PS - Raio de desfoque +HISTORY_MSG_468;PS - Preencher buracos +HISTORY_MSG_469;PS - Mediano +HISTORY_MSG_471;PS - Correção de movimento +HISTORY_MSG_472;PS - Transições suaves +HISTORY_MSG_473;PS - Usar LMMSE +HISTORY_MSG_474;PS - Equalizar +HISTORY_MSG_475;PS - Equalizar canal +HISTORY_MSG_476;CAM02 - Saída Temp +HISTORY_MSG_477;CAM02 - Saída Verde +HISTORY_MSG_478;CAM02 - Saída Yb +HISTORY_MSG_479;CAM02 - Saída da adaptação CAT02 +HISTORY_MSG_480;CAM02 - Saída automática CAT02 +HISTORY_MSG_481;CAM02 - Cena Temp +HISTORY_MSG_482;CAM02 - Cena verde +HISTORY_MSG_483;CAM02 - Cena Yb +HISTORY_MSG_484;CAM02 - Cena automática Yb +HISTORY_MSG_485;Correção de Lente +HISTORY_MSG_486;Correção de Lente - Câmera +HISTORY_MSG_487;Correção de Lente - Lente +HISTORY_MSG_488;Compressão de Amplitude Dinâmica(DRC) +HISTORY_MSG_490;DRC - Montante +HISTORY_MSG_491;Balanço de Branco +HISTORY_MSG_492;Curvas RGB +HISTORY_MSG_493;L*a*b* Ajustes +HISTORY_MSG_CLAMPOOG;Recorte de cor fora do gamut +HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Correção de cor +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;AMaZE+VNG4 - Limite de contraste +HISTORY_MSG_HISTMATCHING;Curva de Tom Auto-compatível +HISTORY_MSG_ICM_OUTPUT_PRIMARIESPrimárias do perfil de saída +HISTORY_MSG_ICM_OUTPUT_TEMP;Saída IccV4 D iluminante +HISTORY_MSG_ICM_OUTPUT_TYPE;Tipo de perfil de saída +HISTORY_MSG_ICM_WORKING_GAMMA;Gamma de trabalho +HISTORY_MSG_ICM_WORKING_SLOPE;Declive de trabalho +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Método de trabalho TRC +HISTORY_MSG_LOCALCONTRAST_AMOUNT;Contraste Local - Montante +HISTORY_MSG_LOCALCONTRAST_DARKNESS;Contraste Local - Escuridão +HISTORY_MSG_LOCALCONTRAST_ENABLED;Contraste Local +HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Contraste Local - Claridade +HISTORY_MSG_LOCALCONTRAST_RADIUS;Contraste Local - Raio +HISTORY_MSG_METADATA_MODE;Modo de cópia de metadados +HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontraste - Limite de contraste +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Método Demosaico para Movimento +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Direção do filtro de ruído de linha +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtros de linha PDAF +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Limite de contraste +HISTORY_MSG_RAW_BORDER;Borda raw +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Redimensionar - Permitir escalonamento +HISTORY_MSG_SHARPENING_CONTRAST;Nitidez - Limite de contraste +HISTORY_MSG_SOFTLIGHT_ENABLED;Luz suave +HISTORY_MSG_SOFTLIGHT_STRENGTH;Luz suave - Intensidade +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Âncora HISTORY_NEWSNAPSHOT;Adicionar -HISTORY_SNAPSHOT;Snapshot -HISTORY_SNAPSHOTS;Snapshots +HISTORY_NEWSNAPSHOT_TOOLTIP;Atalho: Alt-s +HISTORY_SNAPSHOT;Instantâneo +HISTORY_SNAPSHOTS;Instantâneos +ICCPROFCREATOR_ADD_PARAM_IN_DESC;Anexar os valores Gamma e Declive para a descrição +ICCPROFCREATOR_COPYRIGHT;Direito Autoral: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Restaurar para o direito autoral padrão, concedido a "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Personalizado +ICCPROFCREATOR_DESCRIPTION;Descrição: +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Deixe em branco para configurar a descrição padrão +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;Versão do perfil gerado: +ICCPROFCREATOR_ILL;Iluminante: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Padrão +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;Só podes configurar o iluminante com perfis ICC v4 +ICCPROFCREATOR_PRIMARIES;Primárias: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;RGB superior +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Azul X +ICCPROFCREATOR_PRIM_BLUY;Azul Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Verde X +ICCPROFCREATOR_PRIM_GREY;Verde Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Vermelho X +ICCPROFCREATOR_PRIM_REDY;Vermelho Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;Só podes configurar Primárias Personalizadas com perfis ICC v4 +ICCPROFCREATOR_PRIM_WIDEG;Gamut ampla +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Salvar o perfil ICC como... +ICCPROFCREATOR_SLOPE;Declive +ICCPROFCREATOR_TRC_PRESET;Curva de resposta do tom: IPTCPANEL_CATEGORY;Categoria +IPTCPANEL_CATEGORYHINT;Identifica o assunto da imagem na opinião do provedor. IPTCPANEL_CITY;Cidade -IPTCPANEL_COPYHINT;Copiar configurações IPTC da área de transferência +IPTCPANEL_CITYHINT;Digite o nome da cidade ilustrada nesta imagem. +IPTCPANEL_COPYHINT;Copie as configurações do IPTC para a área de transferência. +IPTCPANEL_COPYRIGHT;Aviso de Direitos Autorais +IPTCPANEL_COPYRIGHTHINT;Insira um Aviso sobre o proprietário atual dos Direitos Autorais desta imagem, como © 2008 Jane Doe. IPTCPANEL_COUNTRY;País -IPTCPANEL_CREDIT;Créditos -IPTCPANEL_CREDITHINT;Identifica o provedor da imagem, nçao necessariamente o proprietário/criador. -IPTCPANEL_DATECREATED;Data de criação -IPTCPANEL_EMBEDDED;Embedded -IPTCPANEL_EMBEDDEDHINT;Restaura para IPTC os dados encaixados na imagem +IPTCPANEL_COUNTRYHINT;Digite o nome do país ilustrado nesta imagem. +IPTCPANEL_CREATOR;Criador +IPTCPANEL_CREATORHINT;Digite o nome da pessoa que criou esta imagem. +IPTCPANEL_CREATORJOBTITLE;Cargo do criador +IPTCPANEL_CREATORJOBTITLEHINT;Digite o cargo da pessoa listada no campo Criador. +IPTCPANEL_CREDIT;Linha de crédito +IPTCPANEL_CREDITHINT;Digite quem deve ser creditado quando esta imagem for publicada. +IPTCPANEL_DATECREATED;Data criada +IPTCPANEL_DATECREATEDHINT;Digite a data em que a imagem foi tirada. +IPTCPANEL_DESCRIPTION;Descrição +IPTCPANEL_DESCRIPTIONHINT;Digite "legenda" descrevendo quem, o que e o que está acontecendo nessa imagem, isso pode incluir nomes de pessoas e/ou seu papel na ação que está ocorrendo na imagem. +IPTCPANEL_DESCRIPTIONWRITER;Descrição do autor +IPTCPANEL_DESCRIPTIONWRITERHINT;Digite o nome do redator, editor ou corretor da descrição da imagem. +IPTCPANEL_EMBEDDED;Incorporado +IPTCPANEL_EMBEDDEDHINT;Restaurar para dados IPTC incorporados no arquivo de imagem IPTCPANEL_HEADLINE;Título +IPTCPANEL_HEADLINEHINT;Digite uma breve sinopse publicável ou resumo do conteúdo da imagem. IPTCPANEL_INSTRUCTIONS;Instruções +IPTCPANEL_INSTRUCTIONSHINT;Insira informações sobre embargos ou outras restrições não cobertas pelo campo Direitos Autorais. IPTCPANEL_KEYWORDS;Palavras-chave -IPTCPANEL_PASTEHINT;colar configurações IPTC da área de transferência +IPTCPANEL_KEYWORDSHINT;Insira qualquer número de palavras-chave, termos ou frases usados para expressar o assunto na imagem. +IPTCPANEL_PASTEHINT;Colar configurações IPTC da área de transferência. +IPTCPANEL_PROVINCE;Província ou estado +IPTCPANEL_PROVINCEHINT;Digite o nome da província ou estado retratado nesta imagem. IPTCPANEL_RESET;Restaurar -IPTCPANEL_RESETHINT;Restaurar paara o padrão do perfil +IPTCPANEL_RESETHINT;Restaurar para o perfil padrão. IPTCPANEL_SOURCE;Fonte +IPTCPANEL_SOURCEHINT;Digite ou edite o nome da pessoa que colaborou com o conteúdo, ou pessoa ou entidade da qual você recebeu esta imagem. +IPTCPANEL_SUPPCATEGORIES;Categorias suplementares +IPTCPANEL_SUPPCATEGORIESHINT;Refine mais o assunto da imagem. IPTCPANEL_TITLE;Título +IPTCPANEL_TITLEHINT;Digite um nome curto e legível para a imagem, pode ser o nome do arquivo. +IPTCPANEL_TRANSREFERENCE;Job ID +IPTCPANEL_TRANSREFERENCEHINT;Digite um número ou identificador necessário para controle ou rastreamento do fluxo de trabalho. +LENSPROFILE_LENS_WARNING;Aviso: o fator de corte usado para o perfil da lente é maior que o fator de corte da câmera, os resultados podem estar errados. +MAIN_BUTTON_FULLSCREEN;Tela cheia +MAIN_BUTTON_ICCPROFCREATOR;Criador de Perfil ICC +MAIN_BUTTON_NAVNEXT_TOOLTIP;Navegue até a próxima imagem relativa à imagem aberta no Editor.\nAtalho: Shift-F4\n\nPara navegar até a próxima imagem relativa à miniatura selecionada no Navegador de Arquivos ou no Diapositivo:\nAtalho: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Navegue até a imagem anterior relativa à imagem aberta no Editor.\nAtalho: Shift-F3\n\nPara navegar até a imagem anterior relativa à miniatura selecionada no Navegador de Arquivos ou no Diapositivo:\nAtalho: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Sincronize o Navegador de Arquivos ou o Diapositivo com o Editor para revelar a miniatura da imagem aberta no momento e limpe os filtros ativos.\nAtalho: x\n\nComo acima, mas sem limpar os filtros ativos:\nAtalho: y\n(Observe que a miniatura da imagem aberta não será mostrada se estiver filtrada). MAIN_BUTTON_PREFERENCES;Preferências -MAIN_BUTTON_SAVE;Salvar Imagem -MAIN_BUTTON_SENDTOEDITOR;Enviar ao Editor -MAIN_FRAME_BATCHQUEUE;Batch Queue -MAIN_FRAME_FILEBROWSER;File Browser -MAIN_FRAME_PLACES;Places -MAIN_FRAME_PLACES_ADD;Add -MAIN_FRAME_PLACES_DEL;Del -MAIN_FRAME_RECENT;Recent Folders -MAIN_MSG_ALREADYEXISTS;Arquivo Já Existe. -MAIN_MSG_CANNOTLOAD;Não foi possível carregar a imagem +MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Coloque a imagem atual na fila de processamento.\nAtalho: Ctrl+b +MAIN_BUTTON_SAVE_TOOLTIP;Salvar imagem atual.\nAtalho: Ctrl+s +MAIN_BUTTON_SENDTOEDITOR;Editar imagem no editor externo +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Editar imagem atual no editor externo.\nAtalho: Ctrl+e +MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Mostrar/ocultar todos os painéis laterais.\nAtalho: m +MAIN_BUTTON_UNFULLSCREEN;Sair da tela cheia +MAIN_FRAME_BATCHQUEUE;Fila +MAIN_FRAME_BATCHQUEUE_TOOLTIP;Processando fila.\nAtalho: Ctrl-F3 +MAIN_FRAME_EDITOR;Editor +MAIN_FRAME_EDITOR_TOOLTIP;Editor.\nAtalho: Ctrl-F4 +MAIN_FRAME_FILEBROWSER;Navegador de Arquivos +MAIN_FRAME_FILEBROWSER_TOOLTIP;Navegador de arquivos.\nAtalho: Ctrl-F2 +MAIN_FRAME_PLACES;Locais +MAIN_FRAME_PLACES_ADD;Adicionar +MAIN_FRAME_PLACES_DEL;Excluir +MAIN_FRAME_RECENT;Pastas Recentes +MAIN_MSG_ALREADYEXISTS;O arquivo já existe. +MAIN_MSG_CANNOTLOAD;Não é possível carregar a imagem MAIN_MSG_CANNOTSAVE;Erro ao salvar arquivo -MAIN_MSG_CANNOTSTARTEDITOR;Não foi possível iniciar o editor. -MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;por favor ajuste corretamente o caminho no diálogo "Preferências". -MAIN_MSG_QOVERWRITE;Deseja sobreescrever? +MAIN_MSG_CANNOTSTARTEDITOR;Não é possível iniciar o editor. +MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Por favor, defina o caminho correto em Preferências. +MAIN_MSG_EMPTYFILENAME;Nome de arquivo não especificado! +MAIN_MSG_IMAGEUNPROCESSED;Este comando requer que todas as imagens selecionadas sejam processadas em fila primeiro. +MAIN_MSG_NAVIGATOR;Navegador +MAIN_MSG_OPERATIONCANCELLED;Operação cancelada +MAIN_MSG_PATHDOESNTEXIST;O caminho\n\n%1\n\nnão existe. Por favor, defina um caminho correto em Preferências. +MAIN_MSG_QOVERWRITE;Desejas sobrescrever isso? +MAIN_MSG_SETPATHFIRST;Para usar esta função primeiro defina um objetivo em Preferências! +MAIN_MSG_TOOMANYOPENEDITORS;Muitos editores abertos.\nPor favor, feche um editor para continuar. +MAIN_MSG_WRITEFAILED;Falha ao escrever\n"%1"\n\nVerifique se a pasta existe e se tens permissão para gravar nela. +MAIN_TAB_ADVANCED;Avançado +MAIN_TAB_ADVANCED_TOOLTIP;Atalho: Alt-w MAIN_TAB_COLOR;Cor -MAIN_TAB_DETAIL;Detalhes -MAIN_TAB_DEVELOP;Develop +MAIN_TAB_COLOR_TOOLTIP;Atalho: Alt-c +MAIN_TAB_DETAIL;Detalhe +MAIN_TAB_DETAIL_TOOLTIP;Atalho: Alt-d +MAIN_TAB_DEVELOP; Edição em Lote MAIN_TAB_EXIF;Exif +MAIN_TAB_EXPORT; Exportação Rápida MAIN_TAB_EXPOSURE;Exposição -MAIN_TAB_FILTER;Filter +MAIN_TAB_EXPOSURE_TOOLTIP;Atalho: Alt-e +MAIN_TAB_FILTER; Filtro +MAIN_TAB_INSPECT; Inspecionar MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;Metadados +MAIN_TAB_METADATA_TOOLTIP;Atalho: Alt-m +MAIN_TAB_RAW;Raw +MAIN_TAB_RAW_TOOLTIP;Atalho: Alt-r MAIN_TAB_TRANSFORM;Transformar -MAIN_TOOLTIP_HIDEHP;Mostrar/esconder o painel à esquerda (incluindo o histórico, tecla de atallho: H) -MAIN_TOOLTIP_INDCLIPPEDH;Indicação de luz recortada -MAIN_TOOLTIP_INDCLIPPEDS;Indicação de sombra recortada -MAIN_TOOLTIP_QINFO;Informações rápidas da imagem -PARTIALPASTE_BASICGROUP;Configurações básicas -PARTIALPASTE_CACORRECTION;Correção C/A -PARTIALPASTE_COARSETRANS;Rotação de 90 graus -PARTIALPASTE_COLORGROUP;Configurações relacionadas à cor +MAIN_TAB_TRANSFORM_TOOLTIP;Atalho: Alt-t +MAIN_TOOLTIP_BACKCOLOR0;Cor de fundo da pré-visualização: Baseado no tema\nAtalho: 9 +MAIN_TOOLTIP_BACKCOLOR1;Cor de fundo da pré-visualização: Preto\nAtalho: 9 +MAIN_TOOLTIP_BACKCOLOR2;Cor de fundo da pré-visualização: Branco\nAtalho: 9 +MAIN_TOOLTIP_BACKCOLOR3;Cor de fundo da pré-visualização: Cinza médio\nAtalho: 9 +MAIN_TOOLTIP_BEFOREAFTERLOCK;Travar / Destravar a Antes visualização\n\nTravar: mantenha o Antes visualização inalterada.\nÚtil para avaliar o efeito cumulativo de várias ferramentas.\nAlém disso, comparações podem ser feitas a qualquer momento.\n\nDestravar: o Antes visualização seguinte Depois visualização anterior, mostrando a imagem antes do efeito da ferramenta atualmente utilizada. +MAIN_TOOLTIP_HIDEHP;Mostrar/Ocultar o painel esquerdo (incluindo o histórico).\nAtalho: l +MAIN_TOOLTIP_INDCLIPPEDH;Indicação de realce recortado.\nAtalho: < +MAIN_TOOLTIP_INDCLIPPEDS;Indicação de sombra recortada.\nAtalho: > +MAIN_TOOLTIP_PREVIEWB;Pré-visualize o Canal Azul.\nAtalho: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Pré-visualize a Máscara de Foco.\nAtalho: Shift-f\n\nMais preciso em imagens com pouca profundidade de campo, baixo ruído e níveis de zoom mais altos.\n\nPara melhorar a precisão da detecção de imagens ruidosas, avalie com zoom menor, cerca de 10-30%. +MAIN_TOOLTIP_PREVIEWG;Pré-visualize o Canal verde.\nAtalho: g +MAIN_TOOLTIP_PREVIEWL;Pré-visualize a Luminosidade.\nAtalho: v\n\n0.299*R + 0.587*G + 0.114*B +MAIN_TOOLTIP_PREVIEWR;Pré-visualize o Canal vermelho.\nAtalho: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Pré-visualize a Máscara de Contraste de Nitidez.\nAtalho: p\n\nSó funciona quando a nitidez e o zoom estão ativados >= 100%. +MAIN_TOOLTIP_QINFO;Informação rápida na imagem.\nAtalho: i +MAIN_TOOLTIP_SHOWHIDELP1;Mostrar/Ocultar o painel esquerdo.\nShortcut: l +MAIN_TOOLTIP_SHOWHIDERP1;Mostrar/Ocultar o painel direito.\nAtalho: Alt-l +MAIN_TOOLTIP_SHOWHIDETP1;Mostrar/Ocultar o painel superior.\nAtalho: Shift-l +MAIN_TOOLTIP_THRESHOLD;Limite +MAIN_TOOLTIP_TOGGLE;Alternar o Antes/Depois visualização.\nAtalho: Shift-b +MONITOR_PROFILE_SYSTEM;Sistema padrão +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;Largura: %1, Altura: %2 +NAVIGATOR_XY_NA;x: --, y: -- +OPTIONS_BUNDLED_MISSING;O perfil empacotado "%1" Não pode ser achado!\n\nSua instalação pode ser danificada.\n\nValores internos padrões serão usados. +OPTIONS_DEFIMG_MISSING;O perfil padrão para fotos não-raw não foi encontrado ou não está configurado.\n\nPor favor, verifique o diretório dos seus perfis, pode estar faltando ou danificado.\n\n"%1" será usado em vez disso. +OPTIONS_DEFRAW_MISSING;O perfil padrão para fotos raw não foi encontrado ou não está configurado.\n\nPor favor, verifique o diretório dos seus perfis, pode estar faltando ou danificado.\n\n"%1" será usado em vez disso. +PARTIALPASTE_ADVANCEDGROUP;Configurações Avançadas +PARTIALPASTE_BASICGROUP;Configurações Básicas +PARTIALPASTE_CACORRECTION;Correção da aberração cromática +PARTIALPASTE_CHANNELMIXER;Misturador de canal +PARTIALPASTE_CHANNELMIXERBW;Preto-e-branco +PARTIALPASTE_COARSETRANS;Rotação/inversão grosseira +PARTIALPASTE_COLORAPP;CIECAM02 +PARTIALPASTE_COLORGROUP;Configuração de cor +PARTIALPASTE_COLORTONING;Tonificação de cores +PARTIALPASTE_COMMONTRANSFORMPARAMS;Preenchimento automático PARTIALPASTE_COMPOSITIONGROUP;Configurações de composição PARTIALPASTE_CROP;Cortar -PARTIALPASTE_DIALOGLABEL;Perfil de processamento de colagem parcial -PARTIALPASTE_DISTORTION;Correção de Distorção -PARTIALPASTE_EXIFCHANGES;alterações dos dados exif +PARTIALPASTE_DARKFRAMEAUTOSELECT;Auto-seleção de quadro escuro +PARTIALPASTE_DARKFRAMEFILE;Arquivo de quadro escuro +PARTIALPASTE_DEFRINGE;Defringe +PARTIALPASTE_DETAILGROUP;Configurações de detalhes +PARTIALPASTE_DIALOGLABEL;Perfil de processamento colar parcial +PARTIALPASTE_DIRPYRDENOISE;Redução de ruído +PARTIALPASTE_DIRPYREQUALIZER;Contraste pelos níveis de detalhe +PARTIALPASTE_DISTORTION;Correção de distorção +PARTIALPASTE_EPD;Mapeamento de tom +PARTIALPASTE_EQUALIZER;Níveis de wavelet +PARTIALPASTE_EVERYTHING;Tudo +PARTIALPASTE_EXIFCHANGES;Exif PARTIALPASTE_EXPOSURE;Exposição -PARTIALPASTE_ICMSETTINGS;Configurações ICM -PARTIALPASTE_IPTCINFO;informações IPTC -PARTIALPASTE_LENSGROUP;Configurações relacionadas à Lente -PARTIALPASTE_METAGROUP;Metadados +PARTIALPASTE_FILMSIMULATION;Simulação de filme +PARTIALPASTE_FLATFIELDAUTOSELECT;Seleção automática de campo plano +PARTIALPASTE_FLATFIELDBLURRADIUS;Raio de desfoque de campo plano +PARTIALPASTE_FLATFIELDBLURTYPE;Tipo de desfoque de campo plano +PARTIALPASTE_FLATFIELDCLIPCONTROL;Controle de clipe de campo plano +PARTIALPASTE_FLATFIELDFILE;Arquivo de campo plano +PARTIALPASTE_GRADIENT;Filtro graduado +PARTIALPASTE_HSVEQUALIZER;Equalizador HSV +PARTIALPASTE_ICMSETTINGS;Configurações de gerenciamento de cores +PARTIALPASTE_IMPULSEDENOISE;Redução de ruído de impulso +PARTIALPASTE_IPTCINFO;IPTC +PARTIALPASTE_LABCURVE;L*a*b* ajustes +PARTIALPASTE_LENSGROUP;Configurações de Lente +PARTIALPASTE_LENSPROFILE;Correção de lentes perfiladas +PARTIALPASTE_LOCALCONTRAST;Contraste local +PARTIALPASTE_METADATA;Modo de metadados +PARTIALPASTE_METAGROUP;Configurações de metadados +PARTIALPASTE_PCVIGNETTE;Filtro vignette +PARTIALPASTE_PERSPECTIVE;Perspectiva +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Filtro de pixels mortos +PARTIALPASTE_PREPROCESS_GREENEQUIL;Equilíbrio verde +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtro de pixel quente +PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtro de ruído de linha +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtro de linhas PDAF +PARTIALPASTE_PRSHARPENING;Nitidez pós-redimensionamento +PARTIALPASTE_RAWCACORR_AUTO;Auto correção CA +PARTIALPASTE_RAWCACORR_CAREDBLUE;vermelho & azul CA +PARTIALPASTE_RAWEXPOS_BLACK;Níveis de preto +PARTIALPASTE_RAWEXPOS_LINEAR;Correção de ponto branco +PARTIALPASTE_RAWGROUP;Configurações Raw +PARTIALPASTE_RAW_BORDER;Borda raw +PARTIALPASTE_RAW_DCBENHANCE;Aprimoramento DCB +PARTIALPASTE_RAW_DCBITERATIONS;Iterações DCB +PARTIALPASTE_RAW_DMETHOD;Método demosaico +PARTIALPASTE_RAW_FALSECOLOR;Supressão de cores falsas +PARTIALPASTE_RAW_IMAGENUM;Sub-imagem +PARTIALPASTE_RAW_LMMSEITERATIONS;Etapas de aprimoramento LMMSE +PARTIALPASTE_RAW_PIXELSHIFT;Mudança de Pixel PARTIALPASTE_RESIZE;Redimensionar +PARTIALPASTE_RETINEX;Retinex +PARTIALPASTE_RGBCURVES;Curvas RGB PARTIALPASTE_ROTATION;Rotação -PARTIALPASTE_SHADOWSHIGHLIGHTS;Sombra/Luz -PARTIALPASTE_SHARPENING;Nitidez +PARTIALPASTE_SHADOWSHIGHLIGHTS;Sombras/realces +PARTIALPASTE_SHARPENEDGE;Bordas +PARTIALPASTE_SHARPENING;Nitidez (USM/RL) +PARTIALPASTE_SHARPENMICRO;Microcontraste +PARTIALPASTE_SOFTLIGHT;Luz suave +PARTIALPASTE_TM_FATTAL;Compressão de Amplitude Dinâmica(DRC) +PARTIALPASTE_VIBRANCE;Vibração PARTIALPASTE_VIGNETTING;Correção de vinheta -PARTIALPASTE_WHITEBALANCE;Balanço do branco -PREFERENCES_APPLNEXTSTARTUP;Aplicadas na próxima inicialização -PREFERENCES_CACHECLEARALL;Limpar Tudo -PREFERENCES_CACHECLEARPROFILES;Limpar perfis -PREFERENCES_CACHECLEARTHUMBS;Limpar Miniaturas -PREFERENCES_CACHEMAXENTRIES;Número máximo de entradas no cache +PARTIALPASTE_WHITEBALANCE;Balanço de branco +PREFERENCES_ADD;Adicionar +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Cor do guia do navegador +PREFERENCES_APPLNEXTSTARTUP;é necessário reiniciar +PREFERENCES_AUTOMONPROFILE;Usar o perfil de cores do monitor principal do sistema operacional +PREFERENCES_BATCH_PROCESSING;Processamento em Lote +PREFERENCES_BEHADDALL;Tudo para 'Adicionar' +PREFERENCES_BEHADDALLHINT;Definir todos os parâmetros para o Adicionar modo.\nAjustes de parâmetros no painel de ferramentas de lote serão deltas para os valores armazenados. +PREFERENCES_BEHAVIOR;Comportamento +PREFERENCES_BEHSETALL;Tudo para 'Configurar' +PREFERENCES_BEHSETALLHINT;Definir todos os parâmetros para o Configurar modo.\nAjustes de parâmetros no painel de ferramentas de lote serão absoluto, os valores reais serão exibidos. +PREFERENCES_BLACKBODY;Tungstênio +PREFERENCES_CACHEMAXENTRIES;Número máximo de entradas de cache PREFERENCES_CACHEOPTS;Opções de Cache -PREFERENCES_CACHETHUMBHEIGHT;Tamanho máximo das miniaturas -PREFERENCES_CLIPPINGIND;Recortando indicação +PREFERENCES_CACHETHUMBHEIGHT;Altura máxima da miniatura +PREFERENCES_CLIPPINGIND;Indicação de Recorte +PREFERENCES_CLUTSCACHE;Cache HaldCLUT +PREFERENCES_CLUTSCACHE_LABEL;Número máximo de CLUTs em cache +PREFERENCES_CLUTSDIR;Diretório HaldCLUT +PREFERENCES_CMMBPC;Compensação de ponto preto +PREFERENCES_CROP;Edição de corte +PREFERENCES_CROP_AUTO_FIT;Zoom automático para ajustar a área de corte +PREFERENCES_CROP_GUIDES;Guias mostrados quando não estão editando o corte +PREFERENCES_CROP_GUIDES_FRAME;Quadro +PREFERENCES_CROP_GUIDES_FULL;Original +PREFERENCES_CROP_GUIDES_NONE;Nenhum +PREFERENCES_CURVEBBOXPOS;Posição dos botões de copiar e colar curvas +PREFERENCES_CURVEBBOXPOS_ABOVE;Acima +PREFERENCES_CURVEBBOXPOS_BELOW;Abaixo +PREFERENCES_CURVEBBOXPOS_LEFT;Esquerda +PREFERENCES_CURVEBBOXPOS_RIGHT;Direita +PREFERENCES_CUSTPROFBUILD;Construtor de Perfis de Processamento Personalizado +PREFERENCES_CUSTPROFBUILDHINT;Arquivo executável (ou script) chamado quando um novo perfil de processamento inicial deve ser gerado para uma imagem.\n\nO caminho do arquivo de comunicação (*.ini estilo, a.k.a. "Arquivo chave") é adicionado como um parâmetro de linha de comando. Ele contém vários parâmetros necessários para os scripts e a imagem Exif para permitir uma geração de perfil de processamento baseada em regras.\n\nATENÇÃO: Precisas usar aspas duplas quando estiver usando caminhos que contenham espaços. +PREFERENCES_CUSTPROFBUILDKEYFORMAT;Formato de chaves +PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Nome +PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;ID da Tag +PREFERENCES_CUSTPROFBUILDPATH;Caminho executável +PREFERENCES_D50;Configurações no menu principal +PREFERENCES_D50_OLD;5000K +PREFERENCES_D55;5500K +PREFERENCES_D60;6000K +PREFERENCES_D65;6500K +PREFERENCES_DARKFRAMEFOUND;Encontrado +PREFERENCES_DARKFRAMESHOTS;tiros +PREFERENCES_DARKFRAMETEMPLATES;modelos PREFERENCES_DATEFORMAT;Formato de data -PREFERENCES_DATEFORMATHINT;Você pode usar as seguintes formatações:\n%a : ano\n%m : mês\n%d : dia\n\nPor exemplo, o formato de data húngaro é:\n%a/%m/%d -PREFERENCES_DIRHOME;Directory inicial -PREFERENCES_DIRLAST;Último directory visitado +PREFERENCES_DATEFORMATHINT;Podes usar as seguintes sequências de formatação:\n%y - ano\n%m - mês\n%d - dia\n\nPor exemplo, o padrão ISO 8601 dita o formato de data da seguinte forma:\n%y-%m-%d +PREFERENCES_DIRDARKFRAMES;Diretório de quadros escuros +PREFERENCES_DIRECTORIES;Diretórios +PREFERENCES_DIRHOME;Diretório inicial +PREFERENCES_DIRLAST;Último diretório visitado PREFERENCES_DIROTHER;Outro -PREFERENCES_DIRSELECTDLG;selecionar diretório de imagem na inicialização... +PREFERENCES_DIRSELECTDLG;Selecione Diretório de Imagens na Inicialização... PREFERENCES_DIRSOFTWARE;Diretório de instalação -PREFERENCES_EXTERNALEDITOR;Editor externo -PREFERENCES_FBROWSEROPTS;Opções do navegador de arquivos +PREFERENCES_EDITORCMDLINE;Linha de comando personalizada +PREFERENCES_EDITORLAYOUT;Layout do Editor +PREFERENCES_EXTERNALEDITOR;Editor Externo +PREFERENCES_FBROWSEROPTS;Navegador de Arquivos / Opções de Miniaturas PREFERENCES_FILEFORMAT;Formato de arquivo -PREFERENCES_FORIMAGE;Para arquivos de imagem -PREFERENCES_FORRAW;Para arquivos RAW -PREFERENCES_GIMPPATH;Diretório de Instalação do GIMP -PREFERENCES_HLTHRESHOLD;ponto inicial para luzes recortadas -PREFERENCES_ICCDIR;Diretório de perfis ICC -PREFERENCES_IMPROCPARAMS;Parâmetros padrões de processamento de imagem +PREFERENCES_FLATFIELDFOUND;Encontrado +PREFERENCES_FLATFIELDSDIR;Diretório de campos planos +PREFERENCES_FLATFIELDSHOTS;tiros +PREFERENCES_FLATFIELDTEMPLATES;modelos +PREFERENCES_FLUOF2;Fluorescente F2 +PREFERENCES_FLUOF7;Fluorescente F7 +PREFERENCES_FLUOF11;Fluorescente F11 +PREFERENCES_FORIMAGE;Para fotos não-raw +PREFERENCES_FORRAW;Para fotos raw +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT;Mesma altura da miniatura do Diapositivo e do Navegador de Arquivos +PREFERENCES_FSTRIP_SAME_THUMB_HEIGHT_HINT;Tamanho de miniatura separado exigirá mais tempo de processamento toda vez que alternar entre a guia do Editor e o Navegador de Arquivos. +PREFERENCES_GIMPPATH;Diretório de instalação do GIMP +PREFERENCES_GREY;Luminância Yb do dispositivo de saída (%) +PREFERENCES_GREY05;Yb=05 CIE L#30 +PREFERENCES_GREY10;Yb=10 CIE L#40 +PREFERENCES_GREY15;Yb=15 CIE L#45 +PREFERENCES_GREY18;Configurações no menu principal +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 +PREFERENCES_GREYSC;Luminância Yb da cena (%) +PREFERENCES_GREYSC18;Yb=18 CIE L#50 +PREFERENCES_GREYSCA;Automático +PREFERENCES_HISTOGRAMPOSITIONLEFT;Histograma no painel esquerdo +PREFERENCES_HISTOGRAMWORKING;Use o perfil de trabalho para o histograma principal e o Navegador +PREFERENCES_HISTOGRAM_TOOLTIP;Se ativado, o perfil de trabalho é usado para renderizar o histograma principal e o painel Navegador, caso contrário, o perfil de saída corrigido por gamma é usado. +PREFERENCES_HLTHRESHOLD;Limite para realces recortados +PREFERENCES_ICCDIR;Diretório contendo perfis de cores +PREFERENCES_IMG_RELOAD_NEEDED;Essas alterações requerem que a imagem seja recarregada (ou que uma nova imagem seja aberta) para terem efeito. +PREFERENCES_IMPROCPARAMS;Perfil de Processamento Padrão +PREFERENCES_INSPECT_LABEL;Inspecionar +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Número máximo de imagens em cache +PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Defina o número máximo de imagens armazenadas em cache ao passar o mouse sobre elas no Navegador de Arquivos; sistemas com pouca RAM (2GB) devem manter este valor configurado para 1 ou 2. PREFERENCES_INTENT_ABSOLUTE;Colorimétrico Absoluto -PREFERENCES_INTENT_PERCEPTUAL;Perceptual +PREFERENCES_INTENT_PERCEPTUAL;Perceptivo PREFERENCES_INTENT_RELATIVE;Colorimétrico Relativo PREFERENCES_INTENT_SATURATION;Saturação +PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Mostrar miniatura JPEG incorporada se raw não estiver editada +PREFERENCES_LANG;Linguagem +PREFERENCES_LANGAUTODETECT;Use a linguagem do sistema +PREFERENCES_MAXRECENTFOLDERS;Número máximo de pastas recentes +PREFERENCES_MENUGROUPEXTPROGS;Grupo "Abrir com" +PREFERENCES_MENUGROUPFILEOPERATIONS;Grupo "operações de Arquivo" +PREFERENCES_MENUGROUPLABEL;Grupo "Etiqueta de cor" +PREFERENCES_MENUGROUPPROFILEOPERATIONS;Grupo "Operações de perfil de processamento" +PREFERENCES_MENUGROUPRANK;Grupo "Rank" +PREFERENCES_MENUOPTIONS;Opções do Menu de Contexto +PREFERENCES_METADATA;Metadados +PREFERENCES_MONINTENT;Intenção de renderização padrão +PREFERENCES_MONITOR;Monitor +PREFERENCES_MONPROFILE;Perfil de cor padrão +PREFERENCES_MONPROFILE_WARNOSX;Devido às limitações do MacOS, apenas o sRGB é suportado. +PREFERENCES_MULTITAB;Modo de Mútiplas Abas do Editor +PREFERENCES_MULTITABDUALMON;Múltiplas Abas do Editor no Modo de Janela Própria +PREFERENCES_NAVIGATIONFRAME;Navegação PREFERENCES_OUTDIR;Diretório de Saída -PREFERENCES_OUTDIRFOLDER;Salvar em folder -PREFERENCES_OUTDIRFOLDERHINT;Colocar as imagens salvas na pasta selecionada -PREFERENCES_OUTDIRTEMPLATE;Usar Template -PREFERENCES_OUTDIRTEMPLATEHINT;Você pode utilizar a seguinte formatação:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nEsta formatação se refere aos diretórios e subdiretórios do caminho do arquivo raw.\n\npor exemplo, se /home/tom/image/02-09-2006/dsc0012.neffoi aberto, significa que a formatação é:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\nSe você deseja salvar a imagem de saída onde está a original, escreva:\n%p1/%f\n\nSe você deseja salvar a imagem de saída em um diretório 'convertido' localizado no mesmo diretório que a original, escreva:\n%p1/converted/%f\n\nSe você deseja salvar a imagem de saída no diretório '/home/tom/converted' mantendo o mesmo subdiretório de datas, escreva:\n%p2/converted/%d1/%f -PREFERENCES_PARSEDEXT;Extensões analisadas gramaticalmente -PREFERENCES_PARSEDEXTADD;Adicionar Extensão -PREFERENCES_PARSEDEXTADDHINT;escreva uma extensão e pressione este botão para adicionar à lista -PREFERENCES_PARSEDEXTDELHINT;Apagar extensão selecionada da lista -PREFERENCES_PROFILEHANDLING;Manipulação de processamento de perfil -PREFERENCES_PROFILELOADPR;Prioridade de carregamento de perfil -PREFERENCES_PROFILEPRCACHE;Perfil no Cache +PREFERENCES_OUTDIRFOLDER;Salvar na pasta +PREFERENCES_OUTDIRFOLDERHINT;Salvar imagens na pasta selecionada. +PREFERENCES_OUTDIRTEMPLATE;Use modelo +PREFERENCES_OUTDIRTEMPLATEHINT;Podes usar as seguintes sequências de formatação:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r, %s1, %s2, ...\n\nEssas cadeias de formatação referem-se às diferentes partes do endereço do nome da foto, alguns atributos da foto ou um índice de seqüência arbitrário no trabalho em lotes.\n\nPor exemplo, se a foto que está sendo processada tiver o seguinte endereço do nome:\n/home/tom/photos/2010-10-31/dsc0042.nef\no significado das cadeias de formatação são:\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 será substituído pela classificação da foto. Se a foto estiver desmarcada, %r será substituído por '0'. Se a foto estiver na lixeira, %r será substituído por 'x'.\n\n%s1, %s2, etc. será substituído por um índice de sequência que é preenchido entre 1 e 9 dígitos. O índice de sequência iniciará em 1 sempre que o processamento da fila for iniciado e será incrementado em 1 para cada imagem processada.\n\nSe quiseres salvar a imagem de saída no original, escreva:\n%p1/%f\n\nSe quiseres salvar a imagem de saída num diretório chamado "convertido" localizado no diretório da imagem aberta, escreva:\n%p1/convertido/%f\n\nSe quiseres salvar a imagem de saída num diretório chamado\n"/home/tom/photos/convertido/2010-10-31", escreva:\n%p2/convertido/%d1/%f +PREFERENCES_OVERLAY_FILENAMES;Sobreposição de nomes de arquivos em miniaturas no navegador de arquivos +PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Sobreposição de nomes de arquivos em miniaturas no painel do editor +PREFERENCES_OVERWRITEOUTPUTFILE;Sobrescrever arquivos de saída existentes +PREFERENCES_PANFACTORLABEL;Amplificação da taxa de Pan +PREFERENCES_PARSEDEXT;Extensões Analisadas +PREFERENCES_PARSEDEXTADD;Extensão Adicionada +PREFERENCES_PARSEDEXTADDHINT;Adicione a extensão inserida à lista. +PREFERENCES_PARSEDEXTDELHINT;Exclua a extensão selecionada da lista. +PREFERENCES_PARSEDEXTDOWNHINT;Mova a extensão selecionada para baixo na lista. +PREFERENCES_PARSEDEXTUPHINT;Mova a extensão selecionada para cima na lista. +PREFERENCES_PREVDEMO;Visualizar o Método Demosaico +PREFERENCES_PREVDEMO_FAST;Rápido +PREFERENCES_PREVDEMO_LABEL;Método Demosaicing usado para a visualização em <100% zoom: +PREFERENCES_PREVDEMO_SIDECAR;Como no PP3 +PREFERENCES_PRINTER;Impressora (Soft-Proofing) +PREFERENCES_PROFILEHANDLING;Manuseio de Perfil de Processamento +PREFERENCES_PROFILELOADPR;Prioridade de carregamento do perfil de processamento +PREFERENCES_PROFILEPRCACHE;Perfil no cache PREFERENCES_PROFILEPRFILE;Perfil próximo ao arquivo de entrada -PREFERENCES_PROFILESAVECACHE;Salvar parâmetros de processamento no cache -PREFERENCES_PROFILESAVEINPUT;Salvar parâmetros de processamento próximo ao arquivo de entrada -PREFERENCES_PSPATH;Diretório de instalação do Adobe Photoshop -PREFERENCES_SELECTLANG;Selecionar idioma -PREFERENCES_SELECTTHEME;Selecionar tema +PREFERENCES_PROFILESAVEBOTH;Salvar o perfil de processamento no cache e próximo ao arquivo de entrada +PREFERENCES_PROFILESAVECACHE;Salvar o perfil de processamento no cache +PREFERENCES_PROFILESAVEINPUT;Salvar o perfil de processamento próximo ao arquivo de entrada +PREFERENCES_PROFILESAVELOCATION;Local de salvamento do perfil de processamento +PREFERENCES_PROFILE_NONE;Nenhum +PREFERENCES_PROPERTY;Propriedade +PREFERENCES_PRTINTENT;Intenção de renderização +PREFERENCES_PRTPROFILE;Perfil de cor +PREFERENCES_PSPATH;Diretório de instalação do Adobe Photoshop +PREFERENCES_REMEMBERZOOMPAN;Lembre-se de zoom % e compensar pan +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Lembre-se do zoom % e de compensar o pan da imagem atual ao abrir uma nova imagem.\n\nEsta opção só funciona em "Modo da Aba do Editor Único" e quando "o método Demosaicing utilizado para a pré-visualização em <100% zoom" está definido como "Como no PP3". +PREFERENCES_SAVE_TP_OPEN_NOW;Salvar ferramentas no estado recolhidas/expandididas agora +PREFERENCES_SELECTLANG;Selecione linguagem +PREFERENCES_SERIALIZE_TIFF_READ;Configurações de leitura TIFF +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize a leitura de arquivos TIFF +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Ao trabalhar com pastas cheias de arquivos TIFF não compactados, ativar essa opção pode aumentar o desempenho da geração de miniaturas. +PREFERENCES_SET;Configuração PREFERENCES_SHOWBASICEXIF;Mostrar informações Exif básicas PREFERENCES_SHOWDATETIME;Mostrar data e hora -PREFERENCES_SHTHRESHOLD;Limiar para sombras recortadas -PREFERENCES_STARTUPIMDIR;Diretório de Imagens ao Iniciar -PREFERENCES_TAB_BROWSER;Navegador de Arquivos -PREFERENCES_TAB_COLORMGR;Gerenciamento de Cores +PREFERENCES_SHOWEXPOSURECOMPENSATION;Acrescentar compensação de exposição +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Mostrar barra de ferramentas de diapositivos +PREFERENCES_SHTHRESHOLD;Limite para sombras recortadas +PREFERENCES_SINGLETAB;Modo de Aba de Editor Único +PREFERENCES_SINGLETABVERTAB;Editor de Aba Única, Abas verticais +PREFERENCES_SND_BATCHQUEUEDONE;Processamento de fila concluído +PREFERENCES_SND_HELP;Digite um endereço de arquivo completo para definir um som ou deixe em branco para não ter som.\nPara sons do sistema no Windows, use "SystemDefault", "SystemAsterisk" etc., e no Linux use "complete", "window-attention" etc. +PREFERENCES_SND_LNGEDITPROCDONE;Processamento de Editor concluído +PREFERENCES_SND_THRESHOLDSECS;Depois de segundos +PREFERENCES_STARTUPIMDIR;Diretório de imagens na inicialização +PREFERENCES_TAB_BROWSER;Navegador de Arquivo +PREFERENCES_TAB_COLORMGR;Gerenciamento de Cor +PREFERENCES_TAB_DYNAMICPROFILE;Regras de Perfil Dinâmico PREFERENCES_TAB_GENERAL;Geral PREFERENCES_TAB_IMPROC;Processamento de Imagem -PROFILEPANEL_LABEL;Perfis de pós-processamento -PROFILEPANEL_LOADDLGLABEL;Carregar parâmetros de pós-processamento... +PREFERENCES_TAB_SOUND;Sons +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Visualização JPEG incorporada +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Imagem para mostrar +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Renderização raw neutra +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;JPEG incorporado se tamanho completo, raw neutro caso contrário +PREFERENCES_TP_LABEL;Painel de ferramentas: +PREFERENCES_TP_VSCROLLBAR;Ocultar barra de rolagem vertical +PREFERENCES_TUNNELMETADATA;Copiar Exif/IPTC/XMP inalterado para o arquivo de saída +PREFERENCES_USEBUNDLEDPROFILES;Use perfis agrupados +PREFERENCES_VIEW;Balanço de branco do dispositivo de saída (monitor, TV, projetor, visualização, etc.) +PREFERENCES_WORKFLOW;Layout +PROFILEPANEL_COPYPPASTE;Parâmetros para copiar +PROFILEPANEL_GLOBALPROFILES;Perfis agrupados +PROFILEPANEL_LABEL;Perfis de Processamento +PROFILEPANEL_LOADDLGLABEL;Carregar Parâmetros de Processamento... +PROFILEPANEL_LOADPPASTE;Parâmetros para carregar +PROFILEPANEL_MODE_TIP;Modo de preenchimento do perfil de procesamento.\n\nBotão pressionado: perfis parciais serão convertidos em perfis completos; os valores ausentes serão substituídos por padrões codificados.\n\nBotão liberado: os perfis serão aplicados como estão, alterando apenas os valores que eles contêm. +PROFILEPANEL_MYPROFILES;Meus perfis +PROFILEPANEL_PASTEPPASTE;Parâmetros para colar PROFILEPANEL_PCUSTOM;Personalizado -PROFILEPANEL_PFILE;do Arquivo -PROFILEPANEL_PLASTSAVED;Último Salvo -PROFILEPANEL_SAVEDLGLABEL;Save parâmetros de pós-processamento... -PROFILEPANEL_TOOLTIPCOPY;Copiar perfil atual para a área de transferência -PROFILEPANEL_TOOLTIPLOAD;carregar perfil a partir de um arquivo -PROFILEPANEL_TOOLTIPPASTE; Colar perfil da área de transferência -PROFILEPANEL_TOOLTIPSAVE;Salvar perfil atual -PROGRESSBAR_LOADING;Carregando Imagem... +PROFILEPANEL_PDYNAMIC;Dinâmico +PROFILEPANEL_PFILE;De arquivo +PROFILEPANEL_PINTERNAL;Neutro +PROFILEPANEL_PLASTSAVED;Último salvo +PROFILEPANEL_SAVEDLGLABEL;Salvar Parâmetros de Processamento... +PROFILEPANEL_SAVEPPASTE;Parâmetros para salvar +PROFILEPANEL_TOOLTIPCOPY;Copie o perfil de processamento atual para a área de transferência.\nCtrl-click para selecionar os parâmetros a serem copiados. +PROFILEPANEL_TOOLTIPLOAD;Carregue um perfil do arquivo.\nCtrl-click para selecionar os parâmetros a serem carregados. +PROFILEPANEL_TOOLTIPPASTE;Cole o perfil da área de transferência.\nCtrl-click para selecionar os parâmetros a serem colados. +PROFILEPANEL_TOOLTIPSAVE;Salvar o perfil atual.\nCtrl-click para selecionar os parâmetros a serem salvos. +PROGRESSBAR_LOADING;Carregando imagem... +PROGRESSBAR_LOADINGTHUMBS;Carregando miniaturas... PROGRESSBAR_LOADJPEG;Carregando arquivo JPEG... PROGRESSBAR_LOADPNG;Carregando arquivo PNG... PROGRESSBAR_LOADTIFF;Carregando arquivo TIFF... +PROGRESSBAR_NOIMAGES;Nenhuma imagem encontrada PROGRESSBAR_PROCESSING;Processando imagem... +PROGRESSBAR_PROCESSING_PROFILESAVED;Perfil de processamento salvo PROGRESSBAR_READY;Pronto -PROGRESSBAR_SAVEJPEG;Salvando Arquivo JPEG... -PROGRESSBAR_SAVEPNG;Salvando Arquivo PNG... -PROGRESSBAR_SAVETIFF;Salvando Arquivo TIFF... +PROGRESSBAR_SAVEJPEG;Salvando arquivo JPEG... +PROGRESSBAR_SAVEPNG;Salvando arquivo PNG... +PROGRESSBAR_SAVETIFF;Salvando arquivo TIFF... +PROGRESSBAR_SNAPSHOT_ADDED;Instantâneo adicionado +PROGRESSDLG_PROFILECHANGEDINBROWSER;Perfil de processamento alterado no navegador +QINFO_FRAMECOUNT;%2 quadros +QINFO_HDR;HDR / %2 quadro(s) QINFO_ISO;ISO -QINFO_NOEXIF;Dados Exif não disponíveis. -SAVEDLG_FILEFORMAT;Formato do Arquivo -SAVEDLG_JPEGQUAL;Qualidade do JPEG -SAVEDLG_PNGCOMPR;Compressão PNG -SAVEDLG_PUTTOQUEUE;Colocar na fila de processamento -SAVEDLG_PUTTOQUEUEHEAD;Colocar no topo da fila de processamento -SAVEDLG_PUTTOQUEUETAIL;Colocar no final da fila de processamento -SAVEDLG_SAVEIMMEDIATELY;Salvar Imediatamente -SAVEDLG_SAVESPP;Salvar parâmetros de processamento com a imagem -TOOLBAR_TOOLTIP_CROP;Seleção de Corte (Tecla de Atalho: C) -TOOLBAR_TOOLTIP_HAND;Ferramenta Mão (Tecla de Atalho: N) -TOOLBAR_TOOLTIP_STRAIGHTEN;Seleção de linha reta (Tecla de atalho: S) -TOOLBAR_TOOLTIP_WB;Balanço de branco em área (Tecla de atalho: W) +QINFO_NOEXIF;Dados exif não disponíveis. +QINFO_PIXELSHIFT;Mudança de Pixel / %2 quadro(s) +SAMPLEFORMAT_0;Formato de dados desconhecido +SAMPLEFORMAT_1;8 bits sem assinatura +SAMPLEFORMAT_2;16-bits sem assinatura +SAMPLEFORMAT_4;24-bits LogLuv +SAMPLEFORMAT_8;32-bits LogLuv +SAMPLEFORMAT_16;16-bits ponto flutante +SAMPLEFORMAT_32;24-bits ponto flutuante +SAMPLEFORMAT_64;32-bits ponto flutuante +SAVEDLG_AUTOSUFFIX;Adicionar automaticamente um sufixo se o arquivo já existir +SAVEDLG_FILEFORMAT;Formato de arquivo +SAVEDLG_FORCEFORMATOPTS;Forçar opções de salvar +SAVEDLG_JPEGQUAL;Qualidade JPEG +SAVEDLG_PUTTOQUEUE;Coloque na fila de processamento +SAVEDLG_PUTTOQUEUEHEAD;Coloque na cabeça da fila de processamento +SAVEDLG_PUTTOQUEUETAIL;Coloque no final da fila de processamento +SAVEDLG_SAVEIMMEDIATELY;Salvar imediatamente +SAVEDLG_SAVESPP;Salvar parâmetros de processamento com imagem +SAVEDLG_SUBSAMP;Subamostragem +SAVEDLG_SUBSAMP_1;Compressão superior +SAVEDLG_SUBSAMP_2;Balanceado +SAVEDLG_SUBSAMP_3;Qualidade superior +SAVEDLG_SUBSAMP_TOOLTIP;Compressão superior:\nJ:a:b 4:2:0\nh/v 2/2\nCroma reduzido pela metade na horizontal e na vertical.\n\nBalanceado:\nJ:a:b 4:2:2\nh/v 2/1\nCroma reduzido pela metade na horizontal.\n\nQualidade superior:\nJ:a:b 4:4:4\nh/v 1/1\nSem subamostragem de croma. +SAVEDLG_TIFFUNCOMPRESSED;TIFF não comprimido +SAVEDLG_WARNFILENAME;Arquivo será nomeado +SHCSELECTOR_TOOLTIP;Clique com o botão direito do mouse para restaurar a posição desses 3 controles deslizantes. +SOFTPROOF_GAMUTCHECK_TOOLTIP;Realce pixels com cores fora do gamut em relação a:\n- o perfil da impressora, se um estiver definido e soft-proofing estiver ativado,\n- o perfil de saída, se um perfil de impressora não estiver definido e soft-proofing estiver ativado,\n- o perfil do monitor, se o soft-proofing estiver desativado. +SOFTPROOF_TOOLTIP;Soft-proofing simula a aparência da imagem:\n- quando impresso, se um perfil de impressora estiver definido em Preferências > Gerenciamento de Cor,\n- quando visualizado num monitor que usa o perfil de saída atual, se um perfil de impressora não estiver definido. +THRESHOLDSELECTOR_B;Inferior +THRESHOLDSELECTOR_BL;Inferior esquerdo +THRESHOLDSELECTOR_BR;Inferior direito +THRESHOLDSELECTOR_HINT;Segure a Shift tecla para mover pontos de controle individual. +THRESHOLDSELECTOR_T;Superior +THRESHOLDSELECTOR_TL;Superior esquerdo +THRESHOLDSELECTOR_TR;Superior direito +TOOLBAR_TOOLTIP_COLORPICKER;Seletor de Cores com Trava\n\nQuando ativado:\nClique na pré-visualização com o botão esquerdo do mouse para adicionar um seletor de cores\nArraste-o enquanto pressiona o botão esquerdo do mouse\nExclua o seletor de cores com um clique com o botão direito do mouse\nExclua todos os seletores de cores com Shift + clique com o botão direito do mouse\nClique com o botão direito do mouse em qualquer seletor de cores para voltar para a ferramenta de Mão +TOOLBAR_TOOLTIP_CROP;Cortar seleção.\nAtalho: c\nMover a área de corte usando Shift-arrastar mouse +TOOLBAR_TOOLTIP_HAND;Ferramenta de mão.\nAtalho: h +TOOLBAR_TOOLTIP_STRAIGHTEN;Endireitar / rotação fina.\nAtalho: s\n\nIndique a vertical ou horizontal, desenhando uma linha guia sobre a visualização da imagem. O ângulo de rotação será mostrado ao lado da linha da guia. O centro de rotação é o centro geométrico da imagem. +TOOLBAR_TOOLTIP_WB;Balanço de branco no local.\nAtalho: w +TP_BWMIX_ALGO;Algorítimo OYCPM +TP_BWMIX_ALGO_LI;Linear +TP_BWMIX_ALGO_SP;Efeitos especiais +TP_BWMIX_ALGO_TOOLTIP;Linear: irá produzir uma normal linear reação.\nproduzirá efeitos especiais misturando canais não linearmente. +TP_BWMIX_AUTOCH;Automático +TP_BWMIX_AUTOCH_TIP;Calcular valores otimizando o Misturador de Canais. +TP_BWMIX_CC_ENABLED;Ajustar cor complementar +TP_BWMIX_CC_TOOLTIP;Ative para permitir o ajuste automático de cores complementares no modo ROYGCBPM. +TP_BWMIX_CHANNEL;Equalizador de Luminância +TP_BWMIX_CURVEEDITOR1;Curva 'antes' +TP_BWMIX_CURVEEDITOR2;Curva 'depois' +TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Curva de tom, depois B&W conversão, no final do tratamento. +TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Curva de tom, pouco antes B&W conversão.\nPode levar em conta os componentes de cor. +TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminância de acordo com a matiz L=f(H).\nPreste atenção aos valores extremos, pois eles podem causar artefatos. +TP_BWMIX_FILTER;Filtro de Cores +TP_BWMIX_FILTER_BLUE;Azul +TP_BWMIX_FILTER_BLUEGREEN;Azul-Verde +TP_BWMIX_FILTER_GREEN;Verde +TP_BWMIX_FILTER_GREENYELLOW;Verde-Amarelo +TP_BWMIX_FILTER_NONE;Nenhum +TP_BWMIX_FILTER_PURPLE;Roxa +TP_BWMIX_FILTER_RED;Vermelho +TP_BWMIX_FILTER_REDYELLOW;Vermelho-Amarelo +TP_BWMIX_FILTER_TOOLTIP;O filtro de cores simula fotos tiradas com um filtro colorido colocado na frente da lente. Filtros coloridos reduzem a transmissão de faixas de cores específicas e, portanto, afetam sua claridade. Por exemplo, um filtro vermelho escurece o céu azul. +TP_BWMIX_FILTER_YELLOW;Amarelo +TP_BWMIX_GAMMA;Correção de Gamma +TP_BWMIX_GAM_TOOLTIP;Corrigir gamma para cada canal RGB. +TP_BWMIX_LABEL;Preto e Branco +TP_BWMIX_MET;Método +TP_BWMIX_MET_CHANMIX;Misturador de Canais +TP_BWMIX_MET_DESAT;Dessaturação +TP_BWMIX_MET_LUMEQUAL;Equalizador de Luminância +TP_BWMIX_MIXC;Misturador +TP_BWMIX_NEUTRAL;Restabelecer misturador +TP_BWMIX_NEUTRAL_TIP;Restaurar todos os valores (Filtro de Cores, Misturador de Canais) para o padrão. +TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% +TP_BWMIX_RGBLABEL_HINT;Fatores finais do RGB que cuidam de todas as opções do misturador.\n"Total" exibe a soma dos valores RGB:\n- sempre 100% no modo relativo\n- mais alto (mais claro) ou mais baixo (mais escuro) que 100% no modo absoluto. +TP_BWMIX_RGB_TOOLTIP;Misture os canais RGB. Use predefinições para orientação.\nPreste atenção aos valores negativos que podem causar artefatos ou comportamento errático. +TP_BWMIX_SETTING;Predefinições +TP_BWMIX_SETTING_TOOLTIP;Predefinições diferentes (filme, paisagem, etc.) ou configurações manuais do Misturador de Canais. +TP_BWMIX_SET_HIGHCONTAST;Alto contraste +TP_BWMIX_SET_HIGHSENSIT;Alta sensibilidade +TP_BWMIX_SET_HYPERPANCHRO;Hiper Pancromático +TP_BWMIX_SET_INFRARED;Infravermelho +TP_BWMIX_SET_LANDSCAPE;Paisagem +TP_BWMIX_SET_LOWSENSIT;Baixa sensibilidade +TP_BWMIX_SET_LUMINANCE;Luminância +TP_BWMIX_SET_NORMCONTAST;Contraste Normal +TP_BWMIX_SET_ORTHOCHRO;Ortocromático +TP_BWMIX_SET_PANCHRO;Pancromático +TP_BWMIX_SET_PORTRAIT;Retrato +TP_BWMIX_SET_RGBABS;RGB Aboluto +TP_BWMIX_SET_RGBREL;RGB Relativo +TP_BWMIX_SET_ROYGCBPMABS;ROYGCBPM Aboluto +TP_BWMIX_SET_ROYGCBPMREL;ROYGCBPM Relativo +TP_BWMIX_TCMODE_FILMLIKE;B&W Gostar Filme +TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturação e mistura de valores +TP_BWMIX_TCMODE_STANDARD;B&W Padrão +TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Padrão Ponderado +TP_BWMIX_VAL;L TP_CACORRECTION_BLUE;Azul -TP_CACORRECTION_LABEL;Correção C/A +TP_CACORRECTION_LABEL;Correção de Aberração Cromática TP_CACORRECTION_RED;Vermelho -TP_CHMIXER_BLUE;Azul -TP_CHMIXER_GREEN;Verde -TP_CHMIXER_LABEL;Misturador de Canais -TP_CHMIXER_RED;Vermelho -TP_COARSETRAF_TOOLTIP_HFLIP;Inverter horizontalmente -TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotacionar à esquerda -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotacionar à direita -TP_COARSETRAF_TOOLTIP_VFLIP;Inverter verticalmente -TP_CROP_FIXRATIO;Relação Fixa: -TP_CROP_GTDIAGONALS;Regra das diagonais +TP_CBDL_AFT;Preto-e-Branco Depois +TP_CBDL_BEF;Preto-e-Branco Antes +TP_CBDL_METHOD;Processo localizado +TP_CBDL_METHOD_TOOLTIP;Escolha se a ferramenta de Contraste por Níveis de Detalhe deve ser posicionada após a ferramenta de Preto-e-Branco, que funciona no espaço L*a*b*, ou antes dele, que funciona no espaço RGB. +TP_CHMIXER_BLUE;Canal azul +TP_CHMIXER_GREEN;Canal verde +TP_CHMIXER_LABEL;Misturador de canais +TP_CHMIXER_RED;Canal vermelho +TP_CHROMATABERR_LABEL;Aberração Cromática +TP_COARSETRAF_TOOLTIP_HFLIP;Girar horizontalmente. +TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotacione à esquerda.\n\nAtalhos:\n[ - Modo de Guias do Editor Múltiplo,\nAlt-[ - Modo de Guia do Editor Único. +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotacione à direita.\n\nAtalhos:\n] - Modo de Guias do Editor Múltiplo,\nAlt-] - Modo de Guia do Editor Único. +TP_COARSETRAF_TOOLTIP_VFLIP;Girar verticalmente. +TP_COLORAPP_ALGO;Algorimo +TP_COLORAPP_ALGO_ALL;Tudo +TP_COLORAPP_ALGO_JC;Claridade + Croma (JC) +TP_COLORAPP_ALGO_JS;Claridade + Saturação (JS) +TP_COLORAPP_ALGO_QM;Brilho + Colorido (QM) +TP_COLORAPP_ALGO_TOOLTIP;Permite escolher entre subconjuntos de parâmetros ou todos os parâmetros. +TP_COLORAPP_BADPIXSL;Filtro de pixel quente/ruim +TP_COLORAPP_BADPIXSL_TOOLTIP;Supressão de pixels quentes/ruins (cores vivas).\n0 = Sem efeito\n1 = Mediano\n2 = Gaussian.\nAlternativamente, ajuste a imagem para evitar sombras muito escuras.\n\nEsses artefatos são devido a limitações do CIECAM02. +TP_COLORAPP_BRIGHT;Brilho (Q) +TP_COLORAPP_BRIGHT_TOOLTIP;O brilho no CIECAM02 leva em consideração a luminosidade do branco e difere do L*a*b* e do brilho RGB. +TP_COLORAPP_CHROMA;Croma (C) +TP_COLORAPP_CHROMA_M;Colorido (M) +TP_COLORAPP_CHROMA_M_TOOLTIP;O colorido no CIECAM02 difere de L*a*b* e do colorido do RGB. +TP_COLORAPP_CHROMA_S;Saturação (S) +TP_COLORAPP_CHROMA_S_TOOLTIP;A saturação no CIECAM02 difere de L*a*b* e da saturação do RGB. +TP_COLORAPP_CHROMA_TOOLTIP;Croma no CIECAM02 difere de L*a*b* e da croma no RGB. +TP_COLORAPP_CIECAT_DEGREE;Adaptação CAT02 +TP_COLORAPP_CONTRAST;Contraste (J) +TP_COLORAPP_CONTRAST_Q;Contraste (Q) +TP_COLORAPP_CONTRAST_Q_TOOLTIP;Difere de L*a*b* e do contraste no RGB. +TP_COLORAPP_CONTRAST_TOOLTIP;Difere de L*a*b* e do contraste no RGB. +TP_COLORAPP_CURVEEDITOR1;Curva de tom 1 +TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Mostra o histograma de L* (L*a*b*) antes de CIECAM02.\nSe a caixa de seleção "Mostrar histogramas de saída do CIECAM02 em curvas" estiver ativada, mostra o histograma de J ou Q depois de CIECAM02.\n\nJ e Q não são mostrados no painel principal do histograma.\n\nPara a saída final, consulte o painel principal do histograma. +TP_COLORAPP_CURVEEDITOR2;Curva de tom 2 +TP_COLORAPP_CURVEEDITOR2_TOOLTIP;O mesmo uso da segunda curva de tons de exposição. +TP_COLORAPP_CURVEEDITOR3;Curva de cor +TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Ajustar croma, saturação ou colorido.\n\nMostra o histograma da cromaticidade (L*a*b*) antes de CIECAM02.\nSe a caixa de seleção "Mostrar histogramas de saída do CIECAM02 em curvas" estiver ativada, mostra o histograma de C, s ou M depois de CIECAM02.\n\nC, s e M não são mostrados no painel principal do histograma.\nPara a saída final, consulte o painel principal do histograma. +TP_COLORAPP_DATACIE;Histogramas de saída em curvas do CIECAM02 +TP_COLORAPP_DATACIE_TOOLTIP;Quando ativado, os histogramas em curvas do CIECAM02 mostram valores/intervalos aproximados para J ou Q, e C, s ou M após os ajustes do CIECAM02.\nEsta seleção não afeta o painel principal do histograma.\n\nQuando desativado, os histogramas em curvas do CIECAM02 mostram L*a*b* valores antes dos ajustes do CIECAM02. +TP_COLORAPP_FREE;Temp+verde livre + CAT02 + [saída] +TP_COLORAPP_GAMUT;Controle Gamut (L*a*b*) +TP_COLORAPP_GAMUT_TOOLTIP;Permitir controle gamut no modo L*a*b*. +TP_COLORAPP_HUE;Matiz (h) +TP_COLORAPP_HUE_TOOLTIP;Matiz (h) - ângulo entre 0° e 360°. +TP_COLORAPP_LABEL;Modelo de Aparência de Cor CIE 2002 +TP_COLORAPP_LABEL_CAM02;Ajustes de Imagem +TP_COLORAPP_LABEL_SCENE;Condições de Cena +TP_COLORAPP_LABEL_VIEWING;Condições de Visualização +TP_COLORAPP_LIGHT;Claridade (J) +TP_COLORAPP_LIGHT_TOOLTIP;Claridade no CIECAM02 difere de L*a*b* e da claridade em RGB. +TP_COLORAPP_MODEL;Modelo de Ponto Branco +TP_COLORAPP_MODEL_TOOLTIP;Modelo de Ponto Branco.\n\nWB [RT] + [saída]: O balanço de branco do RT é usado para a cena, CIECAM02 está definido para D50, e o balanço de branco do dispositivo de saída é definido em Condições de Visualização.\n\nWB [RT+CAT02] + [saída]: As configurações de balanço de branco do RT são usadas pelo CAT02 e o balanço de branco do dispositivo de saída é definido em Condições de Visualização.\n\nTemp+verde livre + CAT02 + [saída]: temp e verde são selecionados pelo usuário, o balanço de branco do dispositivo de saída é definido em Condições de Visualização. +TP_COLORAPP_NEUTRAL;Restaurar +TP_COLORAPP_NEUTRAL_TIP;Restaurar todas as caixas de seleção e curvas dos controles deslizantes para seus valores padrão +TP_COLORAPP_RSTPRO;Proteção vermelho e de tons de pele +TP_COLORAPP_RSTPRO_TOOLTIP;Vermelho & proteção de tons de pele afeta os controles deslizantes e as curvas. +TP_COLORAPP_SURROUND;Borda +TP_COLORAPP_SURROUND_AVER;Média +TP_COLORAPP_SURROUND_DARK;Escuro +TP_COLORAPP_SURROUND_DIM;Sombrio +TP_COLORAPP_SURROUND_EXDARK;Extremamente Escuro (Camada de corte) +TP_COLORAPP_SURROUND_TOOLTIP;Altera tons e cores de acordo com as condições de visualização do dispositivo de saída.\n\nMédia: Ambiente de luz médio (padrão). A imagem não vai mudar.\n\nSombrio: Ambiente sombrio (TV). A imagem ficará ligeiramente escura.\n\nEscuro: Ambiente escuro (projetor). A imagem ficará mais escura.\n\nExtremamente Escuro: Ambiente extremamente escuro (camada de corte). A imagem ficará muito escura. +TP_COLORAPP_SURSOURCE;Borda escura +TP_COLORAPP_SURSOURCE_TOOLTIP;Pode ser usado se a imagem tiver uma borda escura. +TP_COLORAPP_TCMODE_BRIGHTNESS;Brilho +TP_COLORAPP_TCMODE_CHROMA;Croma +TP_COLORAPP_TCMODE_COLORF;Colorido +TP_COLORAPP_TCMODE_LABEL1;Modo de curva 1 +TP_COLORAPP_TCMODE_LABEL2;Modo de curva 2 +TP_COLORAPP_TCMODE_LABEL3;Modo de croma da curva +TP_COLORAPP_TCMODE_LIGHTNESS;Claridade +TP_COLORAPP_TCMODE_SATUR;Saturação +TP_COLORAPP_TEMP_TOOLTIP;Para selecionar um iluminante, defina sempre Matiz=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504 +TP_COLORAPP_TONECIE;Mapeamento de tom usando CIECAM02 +TP_COLORAPP_TONECIE_TOOLTIP;Se esta opção estiver desativada, o mapeamento de tom é feito no espaço L*a*b*.\nSe esta opção estiver habilitada, o mapeamento de tom é feito usando CIECAM02.\nA ferramenta de Mapeamento de Tom deve estar ativada para que esta configuração tenha efeito. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Luminância absoluta do ambiente de visualização\n(usualmente 16cd/m²). +TP_COLORAPP_WBCAM;WB [RT+CAT02] + [saída] +TP_COLORAPP_WBRT;WB [RT] + [saída] +TP_COLORTONING_AB;o C/L +TP_COLORTONING_AUTOSAT;Automático +TP_COLORTONING_BALANCE;Balanço +TP_COLORTONING_BY;o C/L +TP_COLORTONING_CHROMAC;Opacidade +TP_COLORTONING_COLOR;Cor +TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Opacidade de croma em função da luminância oC=f(L) +TP_COLORTONING_HIGHLIGHT;Realces +TP_COLORTONING_HUE;Matiz +TP_COLORTONING_LAB;Mistura L*a*b* +TP_COLORTONING_LABEL;Tonificação de Cor +TP_COLORTONING_LABGRID;L*a*b* grade de correção de cores +TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4 +TP_COLORTONING_LUMA;Luminância +TP_COLORTONING_LUMAMODE;Preserve a luminância +TP_COLORTONING_LUMAMODE_TOOLTIP;Se ativado, quando você mudar de cor (vermelho, verde, ciano, azul, etc.) a luminância de cada pixel é preservada. +TP_COLORTONING_METHOD;Método +TP_COLORTONING_METHOD_TOOLTIP;"L*a*b* mistura", "Controles deslizantes RGB" e "Curvas RGB" usar mistura de cores interpoladas.\n"Balanço de Cor (Sombras/Meio-tons/Realces)" e "Saturação 2 cores" use cores diretas.\n\nA ferramenta Preto-e-Branco pode ser ativada ao usar qualquer método, que permita a tonificação de cores. +TP_COLORTONING_MIDTONES;Meio-tons +TP_COLORTONING_NEUTRAL;Restaurar controles deslizantes +TP_COLORTONING_NEUTRAL_TIP;Restaurar todos os valores (Sombras, Meio-tons, Realces) para o padrão. +TP_COLORTONING_OPACITY;Opacidade +TP_COLORTONING_RGBCURVES;RGB - Curvas +TP_COLORTONING_RGBSLIDERS;RGB - Controles deslizantes +TP_COLORTONING_SA;Proteção da Saturação +TP_COLORTONING_SATURATEDOPACITY;Intensidade +TP_COLORTONING_SATURATIONTHRESHOLD;Limite +TP_COLORTONING_SHADOWS;Sombras +TP_COLORTONING_SPLITCO;Sombras/Meio-tons/Realces +TP_COLORTONING_SPLITCOCO;Balanço de Cor Sombras/Meio-tons/Realces +TP_COLORTONING_SPLITLR;Saturação 2 cores +TP_COLORTONING_STR;Intensidade +TP_COLORTONING_STRENGTH;Intensidade +TP_COLORTONING_TWO2;Croma especial '2 cores' +TP_COLORTONING_TWOALL;Croma especial +TP_COLORTONING_TWOBY;Especial a* e b* +TP_COLORTONING_TWOCOLOR_TOOLTIP;Croma padrão:\nResposta linear, a* = b*.\n\nCroma especial:\nResposta linear, a* = b*, mas não ligado - tente sob a diagonal.\n\nEspecial a* e b*:\nResposta linear não ligada com curvas separadas para a* e b*. Destinado a efeitos especiais.\n\nCroma espcial 2 cores:\nMais previsível. +TP_COLORTONING_TWOSTD;Croma padrão +TP_CROP_FIXRATIO;Taxa de bloqueio +TP_CROP_GTDIAGONALS;Regra das Diagonais +TP_CROP_GTEPASSPORT;Passaporte Biométrico +TP_CROP_GTFRAME;Quadro +TP_CROP_GTGRID;Grade +TP_CROP_GTHARMMEANS;Meios Harmônicos TP_CROP_GTNONE;Nenhum -TP_CROP_GTRULETHIRDS;Regra de Terceiros +TP_CROP_GTRULETHIRDS;Regra dos Terços +TP_CROP_GTTRIANGLE1;Triângulos Dourados 1 +TP_CROP_GTTRIANGLE2;Triângulos Dourados 2 TP_CROP_GUIDETYPE;Tipo de guia: -TP_CROP_H;H +TP_CROP_H;Altura TP_CROP_LABEL;Cortar -TP_CROP_SELECTCROP; Selecione o Corte -TP_CROP_W;W -TP_CROP_X;x -TP_CROP_Y;y -TP_DISTORTION_AMOUNT;Quantidade -TP_DISTORTION_LABEL;Distorção +TP_CROP_PPI;PPI= +TP_CROP_W;Largura +TP_CROP_X;X +TP_CROP_Y;Y +TP_DARKFRAME_AUTOSELECT;Auto-seleção +TP_DARKFRAME_LABEL;Quadro Escuro +TP_DEFRINGE_LABEL;Defringe +TP_DEFRINGE_RADIUS;Raio +TP_DEFRINGE_THRESHOLD;Limite +TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Auto multi-zonas +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL;Global automático +TP_DIRPYRDENOISE_CHROMINANCE_AUTOGLOBAL_TOOLTIP;Tente avaliar o ruído de croma\nTenha cuidado, esse cálculo é mediano e é bastante subjetivo ! +TP_DIRPYRDENOISE_CHROMINANCE_BLUEYELLOW;Crominância - Azul-Amarelo +TP_DIRPYRDENOISE_CHROMINANCE_CURVE;Curva de crominância +TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Aumentar (multiplicar) o valor de todos os controles deslizantes de crominância.\nEsta curva permite ajustar a intensidade da redução de ruído cromático em função da cromaticidade, por exemplo, para aumentar a ação em áreas de baixa saturação e diminuí-la nas de alta saturação. +TP_DIRPYRDENOISE_CHROMINANCE_FRAME;Crominância +TP_DIRPYRDENOISE_CHROMINANCE_MANUAL;Manual +TP_DIRPYRDENOISE_CHROMINANCE_MASTER;Crominância - Mestre +TP_DIRPYRDENOISE_CHROMINANCE_METHOD;Método +TP_DIRPYRDENOISE_CHROMINANCE_METHODADVANCED_TOOLTIP;Manual\nAtua na imagem completa.\nControlas as configurações de redução de ruído manualmente.\n\nGlobal automático\nAtua na imagem completa.\n9 zonas são usadas para calcular uma configuração global de redução de ruído de crominância.\n\nVisualização\nAtua em toda a imagem.\nA parte da imagem visível na visualização é usada para calcular as configurações globais de redução de ruído de crominância. +TP_DIRPYRDENOISE_CHROMINANCE_METHOD_TOOLTIP;Manual\nAtua na imagem completa.\nControlas as configurações de redução de ruído manualmente.\n\nGlobal automático\nAtua na imagem completa.\n9 zonas são usadas para calcular uma configuração global de redução de ruído de crominância.\n\nMulti-zonas automáticas\nSem pré-visualização - funciona apenas durante a gravação, usando o método "Pré-visualização" para ajustar o tamanho do mosaico e o centro com o tamanho da visualização e o centro, podes ter uma idéia dos resultados esperados.\nA imagem é dividida em mosaicos (cerca de 10 a 70, dependendo do tamanho da imagem) e cada mosaico recebe suas próprias configurações de redução de ruído de crominância.\n\nPré-visualização\nAtua em toda a imagem.\nA parte da imagem visível na visualização é usada para calcular as configurações globais de redução de ruído de crominância. +TP_DIRPYRDENOISE_CHROMINANCE_PMZ;Pré-visualização multi-zonas +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW;Pré-visualização +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP;Exibe os níveis de ruído remanescentes da parte da imagem visível na visualização após wavelet.\n\n>300 Muito ruidoso\n100-300 Ruidoso\n50-100 Pouco ruidoso\n<50 Ruído muito baixo\n\nCuidado, os valores serão diferentes entre RGB e o modo L*a*b*. Os valores RGB são menos precisos porque o modo RGB não separa completamente luminância e crominância. +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_INFO;Pré-visualização tamanho=%1, Centro: Px=%2 Py=%3 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO;Pré-visualização ruído: Médio=%1 Alto=%2 +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_NOISEINFO_EMPTY;Pré-visualização ruído: Médio= - Alto= - +TP_DIRPYRDENOISE_CHROMINANCE_PREVIEW_TILEINFO;Mosaico tamanho=%1, Centro: Tx=%2 Ty=%3 +TP_DIRPYRDENOISE_CHROMINANCE_REDGREEN;Crominância - Vermelho-Verde +TP_DIRPYRDENOISE_ENH;Modo avançado +TP_DIRPYRDENOISE_ENH_TOOLTIP;Aumenta a qualidade da redução de ruído em detrimento de um aumento de 20% no tempo de processamento. +TP_DIRPYRDENOISE_LABEL;Redução de Ruído +TP_DIRPYRDENOISE_LUMINANCE_CONTROL;Controle de luminância +TP_DIRPYRDENOISE_LUMINANCE_CURVE;Curva de luminância +TP_DIRPYRDENOISE_LUMINANCE_DETAIL;Recuperação de detalhes +TP_DIRPYRDENOISE_LUMINANCE_FRAME;Luminância +TP_DIRPYRDENOISE_LUMINANCE_SMOOTHING;Luminância +TP_DIRPYRDENOISE_MAIN_COLORSPACE;Espaço de cor +TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB;L*a*b* +TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB;RGB +TP_DIRPYRDENOISE_MAIN_COLORSPACE_TOOLTIP;Para imagens raw, os métodos RGB ou L*a*b* podem ser usados.\n\nPara imagens não-raw, o método L*a*b* será usado, independentemente da seleção. +TP_DIRPYRDENOISE_MAIN_GAMMA;Gamma +TP_DIRPYRDENOISE_MAIN_GAMMA_TOOLTIP;Gamma varia a intensidade da redução de ruído em toda a gama de tons. Valores menores atuam sobre sombras, enquanto valores maiores tem efeito sobre tons mais claros. +TP_DIRPYRDENOISE_MAIN_MODE;Modo +TP_DIRPYRDENOISE_MAIN_MODE_AGGRESSIVE;Aggressivo +TP_DIRPYRDENOISE_MAIN_MODE_CONSERVATIVE;Conservador +TP_DIRPYRDENOISE_MAIN_MODE_TOOLTIP;"Conservador" preserva padrões de croma de baixa frequência, enquanto "agressivo" os oblitera. +TP_DIRPYRDENOISE_MEDIAN_METHOD;Método mediano +TP_DIRPYRDENOISE_MEDIAN_METHOD_CHROMINANCE;Apenas Croma +TP_DIRPYRDENOISE_MEDIAN_METHOD_LAB;L*a*b* +TP_DIRPYRDENOISE_MEDIAN_METHOD_LABEL;Filtro Mediano +TP_DIRPYRDENOISE_MEDIAN_METHOD_LUMINANCE;Apenas Luminância +TP_DIRPYRDENOISE_MEDIAN_METHOD_RGB;RGB +TP_DIRPYRDENOISE_MEDIAN_METHOD_TOOLTIP;Ao usar os métodos "Apenas Luminância" e "L*a*b*", a filtragem mediana será realizada logo após a etapa wavelet no pipeline de redução de ruído.\nAo usar o modo "RGB", ele será executado no final do pipeline de redução de ruído. +TP_DIRPYRDENOISE_MEDIAN_METHOD_WEIGHTED;Pesada L* (pequeno) + a*b* (normal) +TP_DIRPYRDENOISE_MEDIAN_PASSES;Iterações medianas +TP_DIRPYRDENOISE_MEDIAN_PASSES_TOOLTIP;A aplicação de três iterações de filtro mediano com tamanho de janela 3×3 frequentemente dá resultados melhores do que usar uma iteração de filtro mediano com tamanho de janela 7×7. +TP_DIRPYRDENOISE_MEDIAN_TYPE;Tipo mediano +TP_DIRPYRDENOISE_MEDIAN_TYPE_TOOLTIP;Aplique um filtro mediano do tamanho da janela. Quanto maior o tamanho da janela, mais tempo demora.\n\n3×3 suave: trata 5 pixels numa janela de 3×3 pixels.\n3×3: trata 9 pixels numa janela de 3×3 pixels.\n5×5 suave: trata 13 pixels nuam janela de 5×5 pixels.\n5×5: trata 25 pixels nuam janela de 5×5 pixels.\n7×7: trata 49 pixels nuam janelas de 7×7 pixels.\n9×9: trata 81 pixels numa janela de 9×9 pixels.\n\nÀs vezes é possível obter uma qualidade mais alta executando várias iterações com um tamanho de janela menor do que uma iteração com uma maior. +TP_DIRPYRDENOISE_SLI;Controle deslizante +TP_DIRPYRDENOISE_TYPE_3X3;3×3 +TP_DIRPYRDENOISE_TYPE_3X3SOFT;3×3 suave +TP_DIRPYRDENOISE_TYPE_5X5;5×5 +TP_DIRPYRDENOISE_TYPE_5X5SOFT;5×5 suave +TP_DIRPYRDENOISE_TYPE_7X7;7×7 +TP_DIRPYRDENOISE_TYPE_9X9;9×9 +TP_DIRPYREQUALIZER_ALGO;Faixa de Cor da Pele +TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fino: mais próximo das cores da pele, minimizando a ação em outras cores\nLarga: evitar mais artefatos. +TP_DIRPYREQUALIZER_ARTIF;Reduzir artefatos +TP_DIRPYREQUALIZER_HUESKIN;Matiz da pele +TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;Esta pirâmide é para a parte superior, na medida do algoritmo em sua máxima eficiência.\nPara a parte inferior, as zonas de transição.\nSe precisares mover a área significativamente para a esquerda ou para a direita - ou se houver artefatos: o Balanço de branco está incorreto\nPodes reduzir um pouco a zona para prevenirr que o resto da imagem seja afetado. +TP_DIRPYREQUALIZER_LABEL;Contraste pelos Níveis de Detalhe +TP_DIRPYREQUALIZER_LUMACOARSEST;Grosseiro +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contraste - +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contraste + +TP_DIRPYREQUALIZER_LUMAFINEST;Refinado +TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutro +TP_DIRPYREQUALIZER_SKIN;Pele segmentação/proteção +TP_DIRPYREQUALIZER_SKIN_TOOLTIP;São segmentados em -100 tons de pele.\nEm 0 todos os tons são tratados igualmente.\nEm +100 tons de pele são protegidos enquanto todos os outros tons são afetados. +TP_DIRPYREQUALIZER_THRESHOLD;Limite +TP_DIRPYREQUALIZER_TOOLTIP;Tenta reduzir artefatos nas transições entre as cores da pele (matiz, croma, luma) e o restante da imagem. +TP_DISTORTION_AMOUNT;Montante +TP_DISTORTION_AUTO_TIP;Corrige automaticamente a distorção da lente em arquivos RAW, combinando-a com a imagem JPEG incorporada, caso exista, e tenha sua distorção de lente corrigida automaticamente pela câmera. +TP_DISTORTION_LABEL;Correção de Distorção +TP_EPD_EDGESTOPPING;Borda parando +TP_EPD_GAMMA;Gamma +TP_EPD_LABEL;Mapeamento de Tom +TP_EPD_REWEIGHTINGITERATES;Reponderando iterações +TP_EPD_SCALE;Escala +TP_EPD_STRENGTH;Intensidade TP_EXPOSURE_AUTOLEVELS;Níveis Automáticos +TP_EXPOSURE_AUTOLEVELS_TIP;Alterna a execução dos Níveis Automáticos para definir automaticamente os valores do controle deslizante de Exposição baseado numa análise de imagem.\nHabilita a Reconstrução de Realce se necessário. TP_EXPOSURE_BLACKLEVEL;Preto -TP_EXPOSURE_BRIGHTNESS;Brilho -TP_EXPOSURE_CLIP;Clip -TP_EXPOSURE_COMPRHIGHLIGHTS;Compressão de Luz -TP_EXPOSURE_COMPRSHADOWS;Compressão de Sombras +TP_EXPOSURE_BRIGHTNESS;Claridade +TP_EXPOSURE_CLAMPOOG;Recortar cores fora da gama +TP_EXPOSURE_CLIP;Recortar % +TP_EXPOSURE_CLIP_TIP;A fração de pixels a ser recortada na operação Níveis Automáticos. +TP_EXPOSURE_COMPRHIGHLIGHTS;Compressão de realce +TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Limite de compressão de realce +TP_EXPOSURE_COMPRSHADOWS;Compressão de sombra TP_EXPOSURE_CONTRAST;Contraste -TP_EXPOSURE_CURVEEDITOR;Curva de Tons -TP_EXPOSURE_EXPCOMP;Exp. Comp. +TP_EXPOSURE_CURVEEDITOR1;Curva de tom 1 +TP_EXPOSURE_CURVEEDITOR2;Curva de tom 2 +TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Por favor, consulte o artigo no RawPedia "Exposição > Curvas de Tom" para aprender como obter os melhores resultados usando duas curvas de tom. +TP_EXPOSURE_EXPCOMP;Compensação de exposição +TP_EXPOSURE_HISTMATCHING;Curva de Tom Auto-Combinada +TP_EXPOSURE_HISTMATCHING_TOOLTIP;Ajusta automaticamente controles deslizantes e curvas (exceto compensação de exposição) para corresponder à aparência da miniatura JPEG incorporada. TP_EXPOSURE_LABEL;Exposição -TP_HLREC_CIELAB;Mistura CIELab -TP_HLREC_COLOR;Propagação de Cores -TP_HLREC_LABEL;Recuperação de Luz +TP_EXPOSURE_SATURATION;Saturação +TP_EXPOSURE_TCMODE_FILMLIKE;Gostar filme +TP_EXPOSURE_TCMODE_LABEL1;Modo de curva 1 +TP_EXPOSURE_TCMODE_LABEL2;Modo de curva 2 +TP_EXPOSURE_TCMODE_LUMINANCE;Luminância +TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptivo +TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturação e Mistura de Valor +TP_EXPOSURE_TCMODE_STANDARD;Padrão +TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Padrão Ponderado +TP_EXPOS_BLACKPOINT_LABEL;Pontos Pretos Raw +TP_EXPOS_WHITEPOINT_LABEL;Pontos Brancos Raw +TP_FILMSIMULATION_LABEL;Simulação de Filme +TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee está configurado para procurar por imagens Hald CLUT, que são usadas para a ferramenta Simulação de Filme, numa pasta que está demorando para carregar.\nVá para Preferências > Processamento de Imagem > Simulação de Filme\npara ver qual pasta está sendo usada. Deves apontar RawTherapee para uma pasta que contenha apenas imagens Hald CLUT e nada mais, ou para uma pasta vazia, se não quiseres usar a ferramenta Simulação de Filme.\n\nLeia o artigo sobre Simulação de Filme na RawPedia para mais informações.\n\nDesejas cancelar a verificação agora? +TP_FILMSIMULATION_STRENGTH;Intensidade +TP_FILMSIMULATION_ZEROCLUTSFOUND;Definir diretório HaldCLUT em Preferências +TP_FLATFIELD_AUTOSELECT;Seleção automática +TP_FLATFIELD_BLURRADIUS;Raio de desfoque +TP_FLATFIELD_BLURTYPE;Tipo de desfoque +TP_FLATFIELD_BT_AREA;Área +TP_FLATFIELD_BT_HORIZONTAL;Horizontal +TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal +TP_FLATFIELD_BT_VERTICAL;Vertical +TP_FLATFIELD_CLIPCONTROL;Controle de recorte +TP_FLATFIELD_CLIPCONTROL_TOOLTIP;O controle de recorte evita realces recortados provocados pela aplicação do campo plano. Se já houver realces recortados antes da aplicação do campo plano, o controle de recorte pode levar à conversão de cores. +TP_FLATFIELD_LABEL;Campo Plano +TP_GAMMA_CURV;Gamma +TP_GAMMA_FREE;Gamma livre +TP_GAMMA_OUTPUT;Gamma de saída +TP_GAMMA_SLOP;Declive (linear) +TP_GENERAL_11SCALE_TOOLTIP;Os efeitos dessa ferramenta só são visíveis ou são precisos numa escala prévia de 1:1. +TP_GRADIENT_CENTER;Centro +TP_GRADIENT_CENTER_X;Centro X +TP_GRADIENT_CENTER_X_TOOLTIP;Deslocar gradiente para a esquerda (valores negativos) ou para a direita (valores positivos). +TP_GRADIENT_CENTER_Y;Centro Y +TP_GRADIENT_CENTER_Y_TOOLTIP;Deslocar gradiente para cima (valores negativos) ou para baixo (valores positivos). +TP_GRADIENT_DEGREE;ângulo +TP_GRADIENT_DEGREE_TOOLTIP;Ângulo de rotação em graus. +TP_GRADIENT_FEATHER;Difusão +TP_GRADIENT_FEATHER_TOOLTIP;Largura do gradiente em porcentagem da diagonal da imagem. +TP_GRADIENT_LABEL;Filtro Graduado +TP_GRADIENT_STRENGTH;Intensidade +TP_GRADIENT_STRENGTH_TOOLTIP;Intensidade do filtro nas paradas. +TP_HLREC_BLEND;Mistura +TP_HLREC_CIELAB;Misturando CIELab +TP_HLREC_COLOR;Propagação de Cor +TP_HLREC_ENA_TOOLTIP;Pode ser ativado para Níveis Automáticos. +TP_HLREC_LABEL;Reconstrução de realce TP_HLREC_LUMINANCE;Recuperação de Luminância -TP_HLREC_METHOD;Método: -TP_ICM_INPUTCAMERA;Padrão de Câmera +TP_HLREC_METHOD;Método: +TP_HSVEQUALIZER_CHANNEL;Canal +TP_HSVEQUALIZER_HUE;H +TP_HSVEQUALIZER_LABEL;Equalizador HSV +TP_HSVEQUALIZER_SAT;S +TP_HSVEQUALIZER_VAL;V +TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Exposição de linha de base +TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Empregue a compensação de exposição da linha de base do DCP incorporado. A configuração só estará disponível se o DCP estiver selecionado como um. +TP_ICM_APPLYHUESATMAP;Tabela básica +TP_ICM_APPLYHUESATMAP_TOOLTIP;Empregue a tabela básica DCP incorporada (MatizSatMap). A configuração só estará disponível se o DCP estiver selecionado como um. +TP_ICM_APPLYLOOKTABLE;Tabela de aparência +TP_ICM_APPLYLOOKTABLE_TOOLTIP;Empregue a tabela de aparência DCP incorporada. A configuração só estará disponível se o DCP estiver selecionado como um. +TP_ICM_BLENDCMSMATRIX;Misture os realces do ICC com a matriz +TP_ICM_BLENDCMSMATRIX_TOOLTIP;Ativar para recuperar realces recortados ao usar perfis ICC baseados em LUT. +TP_ICM_BPC;Compensação de Ponto Preto +TP_ICM_DCPILLUMINANT;Iluminante +TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolado +TP_ICM_DCPILLUMINANT_TOOLTIP;Selecione qual iluminante DCP incorporado deve ser usado. O padrão é "interpolado", que é uma mistura entre os dois baseado no balanço de branco. A configuração só estará disponível se um DCP de iluminação dupla com suporte de interpolação estiver selecionado. +TP_ICM_INPUTCAMERA;Câmera padrão +TP_ICM_INPUTCAMERAICC;Perfil de câmera auto-combinado +TP_ICM_INPUTCAMERAICC_TOOLTIP;Use os perfis de cores de entrada DCP ou ICC específicos da câmera do RawTherapee. Esses perfis são mais precisos que os matriciais mais simples. Eles não estão disponíveis para todas as câmeras. Esses perfis são armazenados nas pastas /iccperfis/entrada e /dcpperfis e são recuperados automaticamente com base no nome do arquivo correspondente ao nome do modelo da câmera. +TP_ICM_INPUTCAMERA_TOOLTIP;Use uma matriz de cores simples do dcraw, uma versão aprimorada do RawTherapee (a que estiver disponível baseada no modelo da câmera) ou uma incorporada no DNG. TP_ICM_INPUTCUSTOM;Personalizado -TP_ICM_INPUTDLGLABEL;Selecione perfil de entrada ICC... -TP_ICM_INPUTEMBEDDED;Use Embedded, se possível -TP_ICM_INPUTPROFILE;Perfil de entrada -TP_ICM_LABEL;ICM -TP_ICM_NOICM;Sem ICM: Saída sRGB +TP_ICM_INPUTCUSTOM_TOOLTIP;Selecione seu próprio arquivo de perfil de cores DCP/ICC para a câmera. +TP_ICM_INPUTDLGLABEL;Selecione o Perfil de entrada DCP/ICC... +TP_ICM_INPUTEMBEDDED;Use incorporado, se possível +TP_ICM_INPUTEMBEDDED_TOOLTIP;Use o perfil de cores incorporado em arquivos não-raw. +TP_ICM_INPUTNONE;Sem perfil +TP_ICM_INPUTNONE_TOOLTIP;Não use nenhum perfil de cor de entrada.\nUse somente em casos especiais. +TP_ICM_INPUTPROFILE;Perfil de Entrada +TP_ICM_LABEL;Gerenciamento de Cor +TP_ICM_NOICM;No ICM: Saída sRGB TP_ICM_OUTPUTPROFILE;Perfil de Saída -TP_ICM_WORKINGPROFILE;Perfil Utilizado +TP_ICM_PROFILEINTENT;Intenção de Renderização +TP_ICM_SAVEREFERENCE;Salvar Imagem de Referência +TP_ICM_SAVEREFERENCE_APPLYWB;Aplicar balanço de branco +TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP;Geralmente, aplique o balanço de branco ao salvar imagens para criar perfis ICC e não aplique o balanço de branco para criar perfis DCP. +TP_ICM_SAVEREFERENCE_TOOLTIP;Salve a imagem TIFF linear antes que o perfil de entrada seja aplicado. O resultado pode ser usado para fins de calibração e geração de um perfil de câmera. +TP_ICM_TONECURVE;Curva de tom +TP_ICM_TONECURVE_TOOLTIP;Empregue a curva de tom DCP incorporada. A configuração só estará disponível se o DCP selecionado tiver uma curva de tom. +TP_ICM_WORKINGPROFILE;Perfil de Trabalho +TP_ICM_WORKING_TRC;Curva de resposta do tom: +TP_ICM_WORKING_TRC_CUSTOM;Personalizado +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;Nenhum +TP_ICM_WORKING_TRC_SLOPE;Declive +TP_ICM_WORKING_TRC_TOOLTIP;Apenas para perfis internos +TP_IMPULSEDENOISE_LABEL;Redução de Ruído por Impulso +TP_IMPULSEDENOISE_THRESH;Limite +TP_LABCURVE_AVOIDCOLORSHIFT;Evite mudança de cor +TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Ajuste as cores no gamut do espaço de cores de trabalho e aplique a correção Munsell. +TP_LABCURVE_BRIGHTNESS;Claridade +TP_LABCURVE_CHROMATICITY;Cromaticidade +TP_LABCURVE_CHROMA_TOOLTIP;Para aplicar tonificação B&W, configure Cromaticidade para -100. +TP_LABCURVE_CONTRAST;Contraste +TP_LABCURVE_CURVEEDITOR;Curva de Luminância +TP_LABCURVE_CURVEEDITOR_A_RANGE1;Verde Saturado +TP_LABCURVE_CURVEEDITOR_A_RANGE2;Verde Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE3;Vermelho Pastel +TP_LABCURVE_CURVEEDITOR_A_RANGE4;Vermelho Saturado +TP_LABCURVE_CURVEEDITOR_B_RANGE1;Azul Saturado +TP_LABCURVE_CURVEEDITOR_B_RANGE2;Azul Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE3;Amarelo Pastel +TP_LABCURVE_CURVEEDITOR_B_RANGE4;Amarelo Saturado +TP_LABCURVE_CURVEEDITOR_CC;CC +TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutro +TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Fosco +TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel +TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturado +TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Cromaticidade de acordo com a cromaticidade C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CH +TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Cromaticidade de acordo com a matiz C=f(H) +TP_LABCURVE_CURVEEDITOR_CL;CL +TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Cromaticidade de acordo com a luminância C=f(L) +TP_LABCURVE_CURVEEDITOR_HH;HH +TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Matiza de acordo com a matiz H=f(H) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminância de acordo com a cromaticidade L=f(C) +TP_LABCURVE_CURVEEDITOR_LH;LH +TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminância de acrodo com a matiz L=f(H) +TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminância de acorodo com a luminância L=f(L) +TP_LABCURVE_LABEL;L*a*b* Ajustes +TP_LABCURVE_LCREDSK;Restringir o LC aos tons vermelho e cor de pele +TP_LABCURVE_LCREDSK_TIP;Se ativada, a curva LC afeta somente tons vermelhos e cor de pele.\nSe desativado, aplica-se a todos os tons. +TP_LABCURVE_RSTPROTECTION;Proteção para tons verrmelho e cor de pele +TP_LABCURVE_RSTPRO_TOOLTIP;Funciona no controle deslizante de cromaticidade e na curva CC. +TP_LENSGEOM_AUTOCROP;Corte automático +TP_LENSGEOM_FILL;Preenchimento automático +TP_LENSGEOM_LABEL;Lente / Geometria +TP_LENSPROFILE_LABEL;Correção de lente perfilada +TP_LOCALCONTRAST_AMOUNT;Montante +TP_LOCALCONTRAST_DARKNESS;Nível de escuridão +TP_LOCALCONTRAST_LABEL;Contraste Local +TP_LOCALCONTRAST_LIGHTNESS;Nível de claridade +TP_LOCALCONTRAST_RADIUS;Raio +TP_METADATA_EDIT;Aplicar modificações +TP_METADATA_MODE;Modo de cópia de metadados +TP_METADATA_STRIP;Remover todos os metadados +TP_METADATA_TUNNEL;Copiar inalterado +TP_NEUTRAL;Restaurar +TP_NEUTRAL_TIP;Restaurar os controles deslizantes de exposição para valores neutros.\nAplica-se aos mesmos controles aplicados aos Níveis Automáticos, independentemente da utilização dos Níveis Automáticos. +TP_PCVIGNETTE_FEATHER;Difusão +TP_PCVIGNETTE_FEATHER_TOOLTIP;Difundindo:\n0 = apenas cantos,\n50 = a meio caminho do centro,\n100 = para centrar. +TP_PCVIGNETTE_LABEL;Filtro de Vinheta +TP_PCVIGNETTE_ROUNDNESS;Arredondamento +TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Arredondamento:\n0 = retângulo,\n50 = elipse ajustada,\n100 = círculo. +TP_PCVIGNETTE_STRENGTH;Intensidade +TP_PCVIGNETTE_STRENGTH_TOOLTIP;Intensidade do filtro nas paradas (alcançada nos cantos). +TP_PERSPECTIVE_HORIZONTAL;Horizontal +TP_PERSPECTIVE_LABEL;Perspectiva +TP_PERSPECTIVE_VERTICAL;Vertical +TP_PFCURVE_CURVEEDITOR_CH;Matiz +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controla a Intensidade defringe por cor.\nHigher = more,\nInferior = menos. +TP_PREPROCESS_DEADPIXFILT;Filtro de pixels mortos +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tenta suprimir os pixels mortos. +TP_PREPROCESS_GREENEQUIL;Equilíbrio verde +TP_PREPROCESS_HOTPIXFILT;Filtro de pixel quente +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tenta suprimir os pixels quentes. +TP_PREPROCESS_LABEL;Pré-processando +TP_PREPROCESS_LINEDENOISE;Filtro de ruído de linha +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direção +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Ambos +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal apenas em linhas PDAF +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +TP_PREPROCESS_NO_FOUND;Nenhum encontrado +TP_PREPROCESS_PDAFLINESFILTER;Filtro de linhas PDAF +TP_PRSHARPENING_LABEL;Pós-Redimensionamento de Nitidez +TP_PRSHARPENING_TOOLTIP;Focaliza a imagem após o redimensionamento. Funciona somente quando o método de redimensionamento "Lanczos" é usado. É impossível visualizar os efeitos dessa ferramenta. Veja RawPedia para instruções de uso. +TP_RAWCACORR_AUTO;Auto correção +TP_RAWCACORR_CABLUE;Azul +TP_RAWCACORR_CARED;Vermelho +TP_RAWCACORR_CASTR;Intensidade +TP_RAWEXPOS_BLACKS;Níveis de Preto +TP_RAWEXPOS_BLACK_0;Verde 1 (guia) +TP_RAWEXPOS_BLACK_1;Vermelho +TP_RAWEXPOS_BLACK_2;Azul +TP_RAWEXPOS_BLACK_3;Verde 2 +TP_RAWEXPOS_BLACK_BLUE;Azul +TP_RAWEXPOS_BLACK_GREEN;Verde +TP_RAWEXPOS_BLACK_RED;Vermelho +TP_RAWEXPOS_LINEAR;Correção de ponto branco +TP_RAWEXPOS_RGB;Vermelho, Verde, Azul +TP_RAWEXPOS_TWOGREEN;Ligações verdes +TP_RAW_1PASSMEDIUM;1-Passar (Medio) +TP_RAW_2PASS;1-passar+rápido +TP_RAW_3PASSBEST;3-Passar (Superior) +TP_RAW_4PASS;4-Passar +TP_RAW_AHD;AHD +TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Borda +TP_RAW_DCB;DCB +TP_RAW_DCBENHANCE;Aprimoramento DCB +TP_RAW_DCBITERATIONS;Número de iterações DCB +TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DMETHOD;Método -TP_RAW_FALSECOLOR;Supressão de cor falsa -TP_RESIZE_H;H: +TP_RAW_DMETHOD_PROGRESSBAR;%1 demosaicing... +TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Refinamento Demosaicing... +TP_RAW_DMETHOD_TOOLTIP;Nota: IGV e LMMSE são dedicados a imagens de ISO alto para auxiliar na redução de ruído sem levar a padrões de confusão, posterização ou aparência desbotada.\nPixel Shift é para arquivos Pentax/Sony Pixel Shift. Ele retorna ao AMaZE para arquivos não Pixel Shift. +TP_RAW_DUALDEMOSAICCONTRAST;Limite de contraste +TP_RAW_EAHD;EAHD +TP_RAW_FALSECOLOR;Etapas de supressão de cores falsas +TP_RAW_FAST;Rápido +TP_RAW_HD;Limite +TP_RAW_HD_TOOLTIP;Valores mais baixos tornam a detecção de pixels quentes/mortos mais agressiva, mas os falsos positivos podem levar a artefatos. Se perceberes algum artefato aparecendo ao habilitar os Filtros de Pixels Quentes/Morto, aumente gradualmente o valor limite até eles desaparecerem. +TP_RAW_HPHD;HPHD +TP_RAW_IGV;IGV +TP_RAW_IMAGENUM;Sub-imagem +TP_RAW_IMAGENUM_TOOLTIP;Alguns arquivos raw consistem em várias sub-imagens (Pentax/Sony Pixel Shift, Pentax 3-em-1 HDR, Canon Dual Pixel).\n\nUsando qualquer método demosaicing diferente de Pixel Shift, isto seleciona qual sub-imagem é usada.\n\nUsando o método demosaicing do Pixel Shift num Pixel Shift raw, todas as sub-imagens são usadas e isso seleciona qual sub-imagem deve ser usada para as partes móveis. +TP_RAW_LABEL;Demosaicing +TP_RAW_LMMSE;LMMSE +TP_RAW_LMMSEITERATIONS;Etapas de aprimoramento LMMSE +TP_RAW_LMMSE_TOOLTIP;Adiciona gamma (etapa 1), mediana (etapas 2-4) e refinamento (etapas 5-6) para reduzir artefatos e melhorar a relação sinal-ruído. +TP_RAW_MONO;Mono +TP_RAW_NONE;Nenhum (Mostra o padrão do sensor) +TP_RAW_PIXELSHIFT;Pixel Shift +TP_RAW_PIXELSHIFTBLUR;Máscara de movimento de desfoque +TP_RAW_PIXELSHIFTDMETHOD;Método Demosaico para movimento +TP_RAW_PIXELSHIFTEPERISO;Sensibilidade +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;O valor padrão de 0 deve funcionar bem para a base ISO.\nValores mais altos aumentam a sensibilidade da detecção de movimento.\nAltere em pequenas etapas e observe a máscara de movimento enquanto muda.\nAumentar a sensibilidade para imagens subexpostas ou de ISO alto. +TP_RAW_PIXELSHIFTEQUALBRIGHT;Equaliza o brilho dos quadros +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equaliza por canal +TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Ativado: Equaliza os canais RGB individualmente.\nDesativado: usa o mesmo fator de equalização para todos os canais. +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equaliza o brilho dos quadros para o brilho do quadro selecionado.\nSe houver áreas superexpostas nos quadros, selecione o quadro mais claro para evitar que a cor magenta seja exposta em áreas superexpostas ou ative a correção de movimento. +TP_RAW_PIXELSHIFTGREEN;Verifica o canal verde para movimento +TP_RAW_PIXELSHIFTHOLEFILL;Preenche buracos na máscara de movimento +TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Preenche buracos na máscara de movimento +TP_RAW_PIXELSHIFTLMMSE;Usa LMMSE para partes móveis +TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Usa LMMSE em vez de AMaZE para áreas de movimento.\nÚtil para imagens com ISO alto. +TP_RAW_PIXELSHIFTMEDIAN;Usa mediana para partes móveis +TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use a mediana de todos os quadros em vez do quadro selecionado para regiões com movimento.\nRemove objetos que estão em lugares diferentes em todos os quadros.\nDá efeito de movimento em objetos em movimento lento (sobreposição). +TP_RAW_PIXELSHIFTMM_AUTO;Automático +TP_RAW_PIXELSHIFTMM_CUSTOM;Personalizado +TP_RAW_PIXELSHIFTMM_OFF;Desligado +TP_RAW_PIXELSHIFTMOTIONMETHOD;Correção de Movimento +TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 não há detecção de movimento.\n1 - 99 o movimento será detectado de acordo com este valor. Aumentar o valor para aumentar a taxa de detecção.\n100 o quadro demosaico AMaZE será usado. +TP_RAW_PIXELSHIFTNONGREENCROSS;Checa os canais vermelho/azul para movimento +TP_RAW_PIXELSHIFTSHOWMOTION;Mostra máscara de movimento +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Mostra somente máscara de movimento +TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Mostra a máscara de movimento sem a imagem. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Sobrepõe a imagem com uma máscara verde mostrando as regiões com movimento. +TP_RAW_PIXELSHIFTSIGMA;Raio de desfoque +TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;TO raio padrão de 1.0 geralmente se encaixa bem para a base ISO.\nAumente o valor para fotos de ISO alto, 5.0 é um bom ponto de partida.\nObserve a máscara de movimento enquanto altera o valor. +TP_RAW_PIXELSHIFTSMOOTH;Transições suaves +TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Transições suaves entre áreas com movimento e áreas sem.\nDefina 0 para desabilitar a transição suave.\nDefina 1 para obter o resultado AMaZE/LMMSE do quadro selecionado (dependendo se "Usar LMMSE" estiver selecionado) ou a mediana de todos os quatro quadros se "Usar mediana" estiver selecionado. +TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Sensor com Matriz Bayer +TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-passe dá os melhores resultados (recomendado para imagens com ISO baixo).\n1-passe é quase indistinguível do 3-passe para imagens com ISO alto e é mais rápido. +TP_RAW_SENSOR_XTRANS_LABEL;Sensor com Matriz X-Trans +TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Permitir Escalonamento +TP_RESIZE_APPLIESTO;Aplica-se a: +TP_RESIZE_CROPPEDAREA;Área Recortada +TP_RESIZE_FITBOX;Caixa Delimitadora +TP_RESIZE_FULLIMAGE;Imagem Cheia +TP_RESIZE_H;Altura: +TP_RESIZE_HEIGHT;Altura TP_RESIZE_LABEL;Redimensionar -TP_RESIZE_METHOD;Método: -TP_RESIZE_NEAREST;Mais Próximo +TP_RESIZE_LANCZOS;Lanczos +TP_RESIZE_METHOD;Método: +TP_RESIZE_NEAREST;Mais próximo TP_RESIZE_SCALE;Escala -TP_RESIZE_W;W: -TP_ROTATE_DEGREE;Graus -TP_ROTATE_LABEL;Rotacionar -TP_ROTATE_SELECTLINE; Selecionar Linha Reta -TP_SHADOWSHLIGHTS_HIGHLIGHTS;Luzes -TP_SHADOWSHLIGHTS_HLTONALW;Largura de Tons -TP_SHADOWSHLIGHTS_LABEL;Sombras/Luzes -TP_SHADOWSHLIGHTS_LOCALCONTR;Contraste Local +TP_RESIZE_SPECIFY;Especificar: +TP_RESIZE_W;Largura: +TP_RESIZE_WIDTH;Largura +TP_RETINEX_CONTEDIT_HSL;Equalizador de histograma HSL +TP_RETINEX_CONTEDIT_LAB;Equalizador de histograma L*a*b* +TP_RETINEX_CONTEDIT_LH;Equalizador de matiz +TP_RETINEX_CURVEEDITOR_CD;L=f(L) +TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminância de acordo com a luminância L=f(L)\nCorrija dados raw para reduzir halos e artefatos. +TP_RETINEX_CURVEEDITOR_LH;Intensidade=f(M) +TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Intensidade de acordo com a Intensidade da matiz=f(M)\nEsta curva também atua no croma ao usar o método retinex "Realce". +TP_RETINEX_CURVEEDITOR_MAP;L=f(L) +TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;Esta curva pode ser aplicada sozinha ou com uma máscara Gaussiana ou uma máscara wavelet.\nCuidado com os artefatos! +TP_RETINEX_EQUAL;Equalizador +TP_RETINEX_FREEGAMMA;Gamma livre +TP_RETINEX_GAIN;Ganho +TP_RETINEX_GAINOFFS;Ganho e Compensação (brilho) +TP_RETINEX_GAINTRANSMISSION;Transmissão de ganho +TP_RETINEX_GAIN_TOOLTIP;Atua na imagem restaurada.\n\nIsso é muito diferente das outras configurações. Usado para pixels pretos ou brancos e para ajudar a equilibrar o histograma. +TP_RETINEX_GAMMA;Gamma +TP_RETINEX_GAMMA_FREE;Livre +TP_RETINEX_GAMMA_HIGH;Alto +TP_RETINEX_GAMMA_LOW;Baixo +TP_RETINEX_GAMMA_MID;Médio +TP_RETINEX_GAMMA_NONE;Nenhum +TP_RETINEX_GAMMA_TOOLTIP;Restaura tons aplicando gamma antes e depois do Retinex. Diferente das curvas Retinex ou outras curvas (Lab, Exposição, etc.). +TP_RETINEX_GRAD;Gradiente de transmissão +TP_RETINEX_GRADS;Gradiente de intensidade +TP_RETINEX_GRADS_TOOLTIP;Se o controle deslizante for 0, todas as iterações serão idênticas.\nSe > 0 a Intensidade é reduzida quando as iterações aumentam e, inversamente. +TP_RETINEX_GRAD_TOOLTIP;Se o controle deslizante for 0, todas as iterações serão idênticas.\nSe > 0 Variância e Limite são reduzidos quando as iterações aumentam e, inversamente. +TP_RETINEX_HIGH;Alto +TP_RETINEX_HIGHLIG;Realce +TP_RETINEX_HIGHLIGHT;Limite de realce +TP_RETINEX_HIGHLIGHT_TOOLTIP;Aumenta a ação do algoritmo alto.\nPode exigir que reajustes "pixels vizinhos" e aumente a "Correção de ponto branco" na guia Raw -> ferramenta de Pontos Brancos Raw. +TP_RETINEX_HSLSPACE_LIN;HSL-Linear +TP_RETINEX_HSLSPACE_LOG;HSL-Logarítmica +TP_RETINEX_ITER;Iterações (Mapeamento de tom) +TP_RETINEX_ITERF;Mapeamento de tom +TP_RETINEX_ITER_TOOLTIP;Simula um operador de mapeamento de tom.\nValores altos aumentam o tempo de processamento. +TP_RETINEX_LABEL;Retinex +TP_RETINEX_LABEL_MASK;Máscara +TP_RETINEX_LABSPACE;L*a*b* +TP_RETINEX_LOW;Baixo +TP_RETINEX_MAP_GAUS;Máscara gaussiana +TP_RETINEX_MAP_MAPP;Máscara de nitidez (wavelet parcial) +TP_RETINEX_MAP_MAPT;Máscara de nitidez (wavelet total) +TP_RETINEX_MAP_METHOD_TOOLTIP;Usa a máscara gerada pela função Gaussiana acima (Raio, Método) para reduzir halos e artefatos.\n\nApenas curva: aplique uma curva de contraste diagonal na máscara.\nCuidado com os artefatos!\n\nMáscara gaussiana: gera e usa um desfoque gaussiano da máscara original.\nRápido.\n\nMáscara de nitidez: gera e usa uma wavelet na máscara original.\nLento. +TP_RETINEX_MAP_NONE;Nenhum +TP_RETINEX_MEDIAN;Filtro mediano de transmissão +TP_RETINEX_METHOD;Método +TP_RETINEX_METHOD_TOOLTIP;Baixo = Reforça a luz baixa.\nUniforme = Equaliza a ação.\nAlto = Reforça a luz alta.\nRealces = Remove magenta nos realces. +TP_RETINEX_MLABEL;Restaurado sem névoa Min=%1 Max=%2 +TP_RETINEX_MLABEL_TOOLTIP;Deve estar perto min=0 max=32768\nImagem restaurada sem mistura. +TP_RETINEX_NEIGHBOR;Raio +TP_RETINEX_NEUTRAL;Restaurar +TP_RETINEX_NEUTRAL_TIP;Restaura todos os controles deslizantes e curvas para seus valores padrão. +TP_RETINEX_OFFSET;Compensação (brilho) +TP_RETINEX_SCALES;Gradiente gaussiano +TP_RETINEX_SCALES_TOOLTIP;Se o controle deslizante for 0, todas as iterações serão idênticas.\nSe > 0 Escala e raio são reduzidos quando as iterações aumentam e inversamente. +TP_RETINEX_SETTINGS;Configurações +TP_RETINEX_SKAL;Escala +TP_RETINEX_SLOPE;Declive gamma livre +TP_RETINEX_STRENGTH;Intensidade +TP_RETINEX_THRESHOLD;Limite +TP_RETINEX_THRESHOLD_TOOLTIP;Limites de entrada/saída.\nEntrada = fonte de imagem,\nSaída = imagem gaussiana. +TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Média=%3 Sigma=%4 +TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 +TP_RETINEX_TLABEL_TOOLTIP;Resultado do mapa de transmissão.\nMin e Max são usados pela Variância.\nMédia e Sigma.\nTm=Min TM=Max do mapa de transmissão. +TP_RETINEX_TRANF;Transmissão +TP_RETINEX_TRANSMISSION;Mapa de transmissão +TP_RETINEX_TRANSMISSION_TOOLTIP;Transmissão de acordo com transmissão.\nAbscissa: transmissão de valores negativos (min), média e valores positivos (max).\nOrdenado: amplificação ou redução. +TP_RETINEX_UNIFORM;Uniforme +TP_RETINEX_VARIANCE;Contraste +TP_RETINEX_VARIANCE_TOOLTIP;Baixa variância aumenta o contraste e a saturação local, mas pode levar a artefatos. +TP_RETINEX_VIEW;Processo +TP_RETINEX_VIEW_MASK;Máscara +TP_RETINEX_VIEW_METHOD_TOOLTIP;Padrão - Exibição normal.\nMáscara - Exibe a máscara.\nMáscara de nitidez - Exibe a imagem com uma máscara de nitidez de raio alto.\nTransmissão - Auto/Fixo - Exibe o mapa de transmissão do arquivo, antes de qualquer ação de contraste e brilho.\n\nAtenção: a máscara não corresponde à realidade, mas é amplificada para torná-la mais visível. +TP_RETINEX_VIEW_NONE;Padrão +TP_RETINEX_VIEW_TRAN;Transmissão - Auto +TP_RETINEX_VIEW_TRAN2;Transmissão - Fixo +TP_RETINEX_VIEW_UNSHARP;Máscara de nitidez +TP_RGBCURVES_BLUE;B +TP_RGBCURVES_CHANNEL;Canal +TP_RGBCURVES_GREEN;G +TP_RGBCURVES_LABEL;Curvas RGB +TP_RGBCURVES_LUMAMODE;Modo de luminosidade +TP_RGBCURVES_LUMAMODE_TOOLTIP;Modo de luminosidade permite variar a contribuição dos canais R, G e B para a luminosidade da imagem, sem alterar a cor da imagem. +TP_RGBCURVES_RED;R +TP_ROTATE_DEGREE;Grau +TP_ROTATE_LABEL;Girar +TP_ROTATE_SELECTLINE;Selecione Linha Reta +TP_SAVEDIALOG_OK_TIP;Atalho: Ctrl-Enter +TP_SHADOWSHLIGHTS_HIGHLIGHTS;Realces +TP_SHADOWSHLIGHTS_HLTONALW;Largura tonal dos realces +TP_SHADOWSHLIGHTS_LABEL;Sombras/Realces +TP_SHADOWSHLIGHTS_LOCALCONTR;Contraste local TP_SHADOWSHLIGHTS_RADIUS;Raio TP_SHADOWSHLIGHTS_SHADOWS;Sombras -TP_SHADOWSHLIGHTS_SHTONALW;largura de tons -TP_SHARPENING_AMOUNT;Quantidade +TP_SHADOWSHLIGHTS_SHARPMASK;Máscara de nitidez +TP_SHADOWSHLIGHTS_SHTONALW;Largura tonal das sombras +TP_SHARPENEDGE_AMOUNT;Quantidade +TP_SHARPENEDGE_LABEL;Bordas +TP_SHARPENEDGE_PASSES;Iterações +TP_SHARPENEDGE_THREE;Somente luminância +TP_SHARPENING_AMOUNT;Montante +TP_SHARPENING_CONTRAST;Limite de contraste TP_SHARPENING_EDRADIUS;Raio -TP_SHARPENING_EDTOLERANCE;Tolerância de bordas -TP_SHARPENING_HALOCONTROL;Controle de luz -TP_SHARPENING_HCAMOUNT;Quantidade +TP_SHARPENING_EDTOLERANCE;Tolerância de borda +TP_SHARPENING_HALOCONTROL;Controle de halo +TP_SHARPENING_HCAMOUNT;Montante TP_SHARPENING_LABEL;Nitidez TP_SHARPENING_METHOD;Método -TP_SHARPENING_ONLYEDGES;tornar nítido somente as bordas +TP_SHARPENING_ONLYEDGES;Nitidez apenas nas bordas TP_SHARPENING_RADIUS;Raio -TP_SHARPENING_RLD;RL Desconvolução -TP_SHARPENING_RLD_AMOUNT;Quantidade -TP_SHARPENING_RLD_DAMPING;Umedecimento +TP_SHARPENING_RLD;Deconvolução RL +TP_SHARPENING_RLD_AMOUNT;Montante +TP_SHARPENING_RLD_DAMPING;Amortecimento TP_SHARPENING_RLD_ITERATIONS;Iterações -TP_SHARPENING_THRESHOLD;Limiar +TP_SHARPENING_THRESHOLD;Limite TP_SHARPENING_USM;Máscara de Nitidez -TP_VIGNETTING_AMOUNT;Quantidade -TP_VIGNETTING_LABEL;Correção de vinheta +TP_SHARPENMICRO_AMOUNT;Quantidade +TP_SHARPENMICRO_CONTRAST;Limite de contraste +TP_SHARPENMICRO_LABEL;Microcontraste +TP_SHARPENMICRO_MATRIX;3×3 matriz em vez de 5×5 +TP_SHARPENMICRO_UNIFORMITY;Uniformidade +TP_SOFTLIGHT_LABEL;Luz Suave +TP_SOFTLIGHT_STRENGTH;Intensidade +TP_TM_FATTAL_AMOUNT;Montante +TP_TM_FATTAL_ANCHOR;Âncora +TP_TM_FATTAL_LABEL;Compressão de Amplitude Dinâmica(DRC) +TP_VIBRANCE_AVOIDCOLORSHIFT;Evite mudança de cor +TP_VIBRANCE_CURVEEDITOR_SKINTONES;MM +TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Tons cor de pele +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Vermelho/Roxo +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Vermelho +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Vermelho/Amarelo +TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Amarelo +TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Matiz de acordo com matiz M=f(M) +TP_VIBRANCE_LABEL;Vibração +TP_VIBRANCE_PASTELS;Tons Pastéis +TP_VIBRANCE_PASTSATTOG;Ligue tons pastéis e saturados +TP_VIBRANCE_PROTECTSKINS;Protege os tons cor de pele +TP_VIBRANCE_PSTHRESHOLD;Limite de tons pastel/saturado +TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Limite de saturação +TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;O eixo vertical representa tons pastel na base e tons saturados no topo.\nO eixo horizontal representa a faixa de saturação. +TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Ponderação da transição pastel/saturada +TP_VIBRANCE_SATURATED;Tons Saturados +TP_VIGNETTING_AMOUNT;Montante +TP_VIGNETTING_CENTER;Centro +TP_VIGNETTING_CENTER_X;Centro X +TP_VIGNETTING_CENTER_Y;Centro Y +TP_VIGNETTING_LABEL;Correção de Vinheta TP_VIGNETTING_RADIUS;Raio -TP_WBALANCE_AUTO;Auto +TP_VIGNETTING_STRENGTH;Intensidade +TP_WAVELET_1;Nível 1 +TP_WAVELET_2;Nível 2 +TP_WAVELET_3;Nível 3 +TP_WAVELET_4;Nível 4 +TP_WAVELET_5;Nível 5 +TP_WAVELET_6;Nível 6 +TP_WAVELET_7;Nível 7 +TP_WAVELET_8;Nível 8 +TP_WAVELET_9;Nível 9 +TP_WAVELET_APPLYTO;Aplicar a +TP_WAVELET_AVOID;Evite mudança de cor +TP_WAVELET_B0;Preto +TP_WAVELET_B1;Cinza +TP_WAVELET_B2;Residual +TP_WAVELET_BACKGROUND;Fundo +TP_WAVELET_BACUR;Curva +TP_WAVELET_BALANCE;Balanço de contraste d/v-h +TP_WAVELET_BALANCE_TOOLTIP;Altera o equilíbrio entre as direções wavelet: vertical-horizontal e diagonal.\nSe o contraste, croma ou mapeamento de tom residual são ativados, o efeito devido ao equilíbrio é amplificado. +TP_WAVELET_BALCHRO;Balanço cromático +TP_WAVELET_BALCHRO_TOOLTIP;Se ativada, a curva ou o controle deslizante 'Balanço de contraste' também modifica o balanço cromático. +TP_WAVELET_BANONE;Nenhum +TP_WAVELET_BASLI;Controle deslizante +TP_WAVELET_BATYPE;Método de balanço de contraste +TP_WAVELET_CBENAB;Tonificação e Balanço de Cores +TP_WAVELET_CB_TOOLTIP;Para valores fortes, tonalização de cores do produto, combinando ou não com níveis de decomposição 'tonificação'\nPara valores baixos, podes alterar o balanço de branco do plano de fundo (céu, ...) sem alterar o plano frontal, geralmente mais contrastado +TP_WAVELET_CCURVE;Contraste local +TP_WAVELET_CH1;Toda a gama de croma +TP_WAVELET_CH2;Saturado/pastel +TP_WAVELET_CH3;Ligue os níveis de contraste +TP_WAVELET_CHCU;Curva +TP_WAVELET_CHR;Intensidade de ligação do contraste cromático +TP_WAVELET_CHRO;Limite saturado/pastel +TP_WAVELET_CHRO_TOOLTIP;Define o nível de wavelet que será o limite entre as cores saturadas e pastel.\n1-x: saturada\nx-9: pastel\n\nSe o valor exceder o montante de níveis de wavelet que estiveres usando, ele será ignorado. +TP_WAVELET_CHR_TOOLTIP;Ajusta o croma como uma função dos "níveis de contraste" e "intensidade de ligação do contraste cromático" +TP_WAVELET_CHSL;Controles deslizantes +TP_WAVELET_CHTYPE;Método de crominância +TP_WAVELET_COLORT;Opacidade Vermelho-Verde +TP_WAVELET_COMPCONT;Contraste +TP_WAVELET_COMPGAMMA;Compressão gamma +TP_WAVELET_COMPGAMMA_TOOLTIP;Ajustar o gamma da imagem residual permite equilibrar os dados e o histograma. +TP_WAVELET_COMPTM;Mapeamento de tom +TP_WAVELET_CONTEDIT;Curva de contraste 'depois' +TP_WAVELET_CONTR;Gamut +TP_WAVELET_CONTRA;Contraste +TP_WAVELET_CONTRAST_MINUS;Contraste - +TP_WAVELET_CONTRAST_PLUS;Contraste + +TP_WAVELET_CONTRA_TOOLTIP;Altera o contraste da imagem residual. +TP_WAVELET_CTYPE;Controle de crominância +TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifica o contraste local como uma função do contraste local original (abscissa).\nValores baixos de abscissa representam pequeno contraste local (valores reais de 10..20).\n50% abscissa representa contraste local médio (valores reais de 100..300).\n66% abscissa representa desvio padrão do contraste local (valores reais de 300..800).\n100% abscissa representa contraste local máximo (valores reais de 3000..8000). +TP_WAVELET_CURVEEDITOR_CH;Níveis de contraste=f(Matiz) +TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifica cada nível de contraste como uma função da matiz.\nTome cuidado para não sobrescrever as alterações feitas com os controles de matiz da sub-ferramenta Gamut.\nA curva só terá efeito quando os controles deslizantes do nível de contraste da wavelet forem diferentes de zero. +TP_WAVELET_CURVEEDITOR_CL;L +TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Aplica uma curva de luminância de contraste final no fim do tratamento wavelet. +TP_WAVELET_CURVEEDITOR_HH;MM +TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifica a matiz da imagem residual como uma função de matiz. +TP_WAVELET_DALL;Todas as direções +TP_WAVELET_DAUB;Performance de borda +TP_WAVELET_DAUB2;D2 - baixo +TP_WAVELET_DAUB4;D4 - padrão +TP_WAVELET_DAUB6;D6 - padrão plus +TP_WAVELET_DAUB10;D10 - médio +TP_WAVELET_DAUB14;D14 - alto +TP_WAVELET_DAUB_TOOLTIP;Altera coeficientes Daubechies:\nD4 = Padrão,\nD14 = Frequentemente melhor desempenho, 10% mais tempo-intensivo.\n\nAfeta a detecção de bordas, bem como a qualidade geral dos primeiros níveis. No entanto, a qualidade não está estritamente relacionada a esse coeficiente e pode variar com imagens e usos. +TP_WAVELET_DONE;Vertical +TP_WAVELET_DTHR;Diagonal +TP_WAVELET_DTWO;Horizontal +TP_WAVELET_EDCU;Curva +TP_WAVELET_EDGCONT;Contraste local +TP_WAVELET_EDGCONT_TOOLTIP;Ajustar os pontos para a esquerda diminui o contraste, e para a direita aumenta.\nInferior esquerdo, Superior esquerdo, Superior direito, Inferior direito representam respectivamente contraste local para valores baixos, médio, médio + stdev, máximos +TP_WAVELET_EDGE;Nitidez de borda +TP_WAVELET_EDGEAMPLI;Amplificação de base +TP_WAVELET_EDGEDETECT;Sensibilidade ao gradiente +TP_WAVELET_EDGEDETECTTHR;Limite baixo (ruído) +TP_WAVELET_EDGEDETECTTHR2;Limite alto (detecção) +TP_WAVELET_EDGEDETECTTHR_TOOLTIP;Esse ajustador permite que segmentes a detecção de bordas, por exemplo, para evitar a aplicação de nitidez de borda a detalhes finos, como ruído no céu. +TP_WAVELET_EDGEDETECT_TOOLTIP;Mover o controle deslizante para a direita aumenta a sensibilidade da borda. Isso afeta o contraste local, as configurações de borda e o ruído. +TP_WAVELET_EDGESENSI;Sensibilidade de borda +TP_WAVELET_EDGREINF_TOOLTIP;Reforce ou reduza a ação do primeiro nível, faça o oposto ao segundo nível e deixe o restante inalterado. +TP_WAVELET_EDGTHRESH;Detalhe +TP_WAVELET_EDGTHRESH_TOOLTIP;Altere a repartição entre os primeiros níveis e os outros. Quanto maior o limite, mais a ação é centrada nos primeiros níveis. Cuidado com valores negativos, eles aumentam a ação de níveis altos e podem introduzir artefatos. +TP_WAVELET_EDRAD;Raio +TP_WAVELET_EDRAD_TOOLTIP;Este ajuste de raio é muito diferente daqueles em outras ferramentas de nitidez. Seu valor é comparado a cada nível através de uma função complexa. Nesse sentido, um valor de zero ainda tem efeito. +TP_WAVELET_EDSL;Controles Deslizantes do Limite +TP_WAVELET_EDTYPE;Método de contraste local +TP_WAVELET_EDVAL;Intensidade +TP_WAVELET_FINAL;Retoque Final +TP_WAVELET_FINEST;Melhor +TP_WAVELET_HIGHLIGHT;Faixa de luminância do realce +TP_WAVELET_HS1;Toda faixa de luminância +TP_WAVELET_HS2;Sombras/Relces +TP_WAVELET_HUESKIN;Matiz da pele +TP_WAVELET_HUESKIN_TOOLTIP;Os pontos inferiores definem o início da zona de transição, e os pontos superiores o final, onde o efeito está no seu máximo.\n\nSe precisares mover a área significativamente, ou se houver artefatos, então o balanço de branco está incorreto. +TP_WAVELET_HUESKY;Matiz do céu +TP_WAVELET_HUESKY_TOOLTIP;Os pontos inferiores definem o início da zona de transição, e os pontos superiores o final, onde o efeito está no seu máximo.\n\nSe precisares mover a área significativamente, ou se houver artefatos, então o balanço de branco está incorreto. +TP_WAVELET_ITER;Níveis de balanço delta +TP_WAVELET_ITER_TOOLTIP;Esquerda: aumenta os níveis baixos e reduz os níveis altos,\nDireita: reduz os níveis baixos e aumenta os níveis altos. +TP_WAVELET_LABEL;Níveis Wavelet +TP_WAVELET_LARGEST;Grosseiro +TP_WAVELET_LEVCH;Croma +TP_WAVELET_LEVDIR_ALL;Todos os níveis em todas as direções +TP_WAVELET_LEVDIR_INF;Abaixo ou igual ao nível +TP_WAVELET_LEVDIR_ONE;Um nível +TP_WAVELET_LEVDIR_SUP;Acima do nível +TP_WAVELET_LEVELS;Níveis Wavelet +TP_WAVELET_LEVELS_TOOLTIP;Escolha o número de níveis de detalhes para os quais a imagem será decomposta. Mais níveis requerem mais RAM e requerem um longo tempo de processamento. +TP_WAVELET_LEVF;Contraste +TP_WAVELET_LEVLABEL;Visualizar níveis máximos possíveis = %1 +TP_WAVELET_LEVONE;Nível 2 +TP_WAVELET_LEVTHRE;Nível 4 +TP_WAVELET_LEVTWO;Nível 3 +TP_WAVELET_LEVZERO;Nível 1 +TP_WAVELET_LINKEDG;Ligar com a Intensidade da Nitidez de Borda +TP_WAVELET_LIPST;Algoritmo aprimorado +TP_WAVELET_LOWLIGHT;Faixa de luminância da sombra +TP_WAVELET_MEDGREINF;Primeiro nível +TP_WAVELET_MEDI;Reduzir artefatos no céu azul +TP_WAVELET_MEDILEV;Detecção de borda +TP_WAVELET_MEDILEV_TOOLTIP;Quando habilitas a detecção de borda, é recomendado:\n- desativar níveis baixos de contraste para evitar artefatos,\n- usar valores altos de sensibilidade ao gradiente.\n\nPodes modular a intensidade com 'refinar' de Remoção de Ruído e Refinar. +TP_WAVELET_NEUTRAL;Neutro +TP_WAVELET_NOIS;Remoção de Ruído +TP_WAVELET_NOISE;Remoção de Ruído e Refinar +TP_WAVELET_NPHIGH;Alto +TP_WAVELET_NPLOW;Baixo +TP_WAVELET_NPNONE;Nenhum +TP_WAVELET_NPTYPE;Pixels vizinhos +TP_WAVELET_NPTYPE_TOOLTIP;Este algoritmo usa a proximidade de um pixel e oito de seus vizinhos. Se diferença for menor, bordas serão reforçadas. +TP_WAVELET_OPACITY;Opacidade Azul-Amarela +TP_WAVELET_OPACITYW;Curva do balanço de contraste d/v-h +TP_WAVELET_OPACITYWL;Contraste local final +TP_WAVELET_OPACITYWL_TOOLTIP;Modifica o contraste local final no fim do tratamento wavelet.\n\nÀ Esquerda representa o menor contraste local, progredindo para o maior contraste local à direita. +TP_WAVELET_PASTEL;Croma pastel +TP_WAVELET_PROC;Processo +TP_WAVELET_RE1;Reforçado +TP_WAVELET_RE2;Inalterado +TP_WAVELET_RE3;Reduzido +TP_WAVELET_RESCHRO;Croma +TP_WAVELET_RESCON;Sombras +TP_WAVELET_RESCONH;Realces +TP_WAVELET_RESID;Imagem Residual +TP_WAVELET_SAT;Croma saturado +TP_WAVELET_SETTINGS;Configurações Wavelet +TP_WAVELET_SKIN;Segmentação/proteção cor da pele +TP_WAVELET_SKIN_TOOLTIP;Em -100 tons de pele são direcionados.\nEm 0 todos os tons são tratados igualmente.\nEm +100 tons de pele são protegidos enquanto todos os outros tons são afetados. +TP_WAVELET_SKY;Segmentação/proteção cor do céu +TP_WAVELET_SKY_TOOLTIP;Em -100 tons de pele são direcionados.\nEm 0 todos os tons são tratados igualmente.\nEm +100 tons de pele são protegidos enquanto todos os outros tons são afetados. +TP_WAVELET_STREN;Intensidade +TP_WAVELET_STRENGTH;Intensidade +TP_WAVELET_SUPE;Extra +TP_WAVELET_THR;Limite de sombras +TP_WAVELET_THRESHOLD;Níveis de realces +TP_WAVELET_THRESHOLD2;Níveis de sombras +TP_WAVELET_THRESHOLD2_TOOLTIP;Apenas níveis entre 9 e menos 9 terão valores afetados pela faixa de luminância da sombra. Outros níveis serão totalmente tratados. O nível mais alto possível é limitado pelo valor do nível de realce (menos 9 valor do nível de realce). +TP_WAVELET_THRESHOLD_TOOLTIP;Apenas níveis além do valor escolhido serão afetados pela faixa de luminância do realce. Outros níveis serão totalmente tratados. O valor escolhido aqui limita o maior valor possível dos níveis de sombra. +TP_WAVELET_THRH;Limite de realces +TP_WAVELET_TILESBIG;Mosaicos grandes +TP_WAVELET_TILESFULL;Imagem cheia +TP_WAVELET_TILESIZE;Método de mosaicos +TP_WAVELET_TILESLIT;Mosaicos pequenos +TP_WAVELET_TILES_TOOLTIP;O processamento da imagem cheia leva a uma melhor qualidade e é a opção recomendada, enquanto o uso de mosaicos é uma solução de retorno para usuários com pouca RAM. Consulte o RawPedia para requisitos de memória. +TP_WAVELET_TMSTRENGTH;Intensidade de compressão +TP_WAVELET_TMSTRENGTH_TOOLTIP;Controla a intensidade do mapeamento de tom ou a compressaõ de contraste da imagem residua. Quando o valor for diferente de 0, os controles deslizantes Intensidade e Gamma da ferramenta Mapeamento de Tom na guia Exposição ficarão esmaecidos. +TP_WAVELET_TMTYPE;Método de compressão +TP_WAVELET_TON;Tonificação +TP_WBALANCE_AUTO;Automático TP_WBALANCE_CAMERA;Câmera +TP_WBALANCE_CLOUDY;Nublado TP_WBALANCE_CUSTOM;Personalizado -TP_WBALANCE_GREEN;Tonalidade -TP_WBALANCE_LABEL;Balanço do Branco +TP_WBALANCE_DAYLIGHT;Luz do dia (sol) +TP_WBALANCE_EQBLUERED;Equalizador Azul/Vermelho +TP_WBALANCE_EQBLUERED_TOOLTIP;Permite desviar do comportamento normal do "balanço de branco", modulando o balanço azul/vermelho.\nIsso pode ser útil ao fotografar condições:\na) estão longe do iluminante padrão (por exemplo, embaixo d'água),\nb) estão longe das condições em que as calibrações foram realizadas,\nc) onde as matrizes ou perfis ICC são inadequados. +TP_WBALANCE_FLASH55;Leica +TP_WBALANCE_FLASH60;Padrão, Canon, Pentax, Olympus +TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta +TP_WBALANCE_FLASH_HEADER;Flash +TP_WBALANCE_FLUO1;F1 - Luz do Dia +TP_WBALANCE_FLUO2;F2 - Branco Frio +TP_WBALANCE_FLUO3;F3 - Branco +TP_WBALANCE_FLUO4;F4 - Branco Quente +TP_WBALANCE_FLUO5;F5 - Luz do Dia +TP_WBALANCE_FLUO6;F6 - Branco Suave +TP_WBALANCE_FLUO7;F7 - Simulador de Luz do Dia D65 +TP_WBALANCE_FLUO8;F8 - Modelo D50 / Sylvania F40 +TP_WBALANCE_FLUO9;F9 - Branco Frio de luxo +TP_WBALANCE_FLUO10;F10 - Philips TL85 +TP_WBALANCE_FLUO11;F11 - Philips TL84 +TP_WBALANCE_FLUO12;F12 - Philips TL83 +TP_WBALANCE_FLUO_HEADER;Fluorescente +TP_WBALANCE_GREEN;Tinto +TP_WBALANCE_GTI;GTI +TP_WBALANCE_HMI;HMI +TP_WBALANCE_JUDGEIII;Juiz III +TP_WBALANCE_LABEL;Balanço de Branco +TP_WBALANCE_LAMP_HEADER;Lâmpada +TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 +TP_WBALANCE_LED_HEADER;LED +TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Método +TP_WBALANCE_SHADE;Penumbra TP_WBALANCE_SIZE;Tamanho: -TP_WBALANCE_SPOTWB;Balanço de Branco de área +TP_WBALANCE_SOLUX35;Solux 3500K +TP_WBALANCE_SOLUX41;Solux 4100K +TP_WBALANCE_SOLUX47;Solux 4700K (vendor) +TP_WBALANCE_SOLUX47_NG;Solux 4700K (Galeria Nat.) +TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. +TP_WBALANCE_TEMPBIAS;Viés de temperatura AWB +TP_WBALANCE_TEMPBIAS_TOOLTIP;Permite alterar o cálculo do "balanço de branco automático"\ninclinando-o para temperaturas mais quentes ou mais frias. O viés\né expresso como uma porcentagem da temperatura calculada,\npara que o resultado seja dado por "Temperatura calculada + Temperatura calculada * viés". TP_WBALANCE_TEMPERATURE;Temperatura -# +TP_WBALANCE_TUNGSTEN;Tungstênio +TP_WBALANCE_WATER1;Embaixo da Água 1 +TP_WBALANCE_WATER2;Embaixo da Água 2 +TP_WBALANCE_WATER_HEADER;Embaixo da Água +ZOOMPANEL_100;(100%) +ZOOMPANEL_NEWCROPWINDOW;Janela de detalhe aberta (nova) +ZOOMPANEL_ZOOM100;Zoom para 100%\nAtalho: z +ZOOMPANEL_ZOOMFITCROPSCREEN;Ajustar o corte à tela\nAtalho: f +ZOOMPANEL_ZOOMFITSCREEN;Ajustar toda a imagem à tela\nAtalho: Alt-f +ZOOMPANEL_ZOOMIN;Mais Zoom\nAtalho: + +ZOOMPANEL_ZOOMOUT;Menos Zoom\nAtalho: - !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ABOUT_TAB_BUILD;Version -!ABOUT_TAB_CREDITS;Credits -!ABOUT_TAB_LICENSE;License -!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: -!CURVEEDITOR_AXIS_OUT;O: -!CURVEEDITOR_AXIS_RIGHT_TAN;RT: -!CURVEEDITOR_CURVE;Curve -!CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom -!CURVEEDITOR_DARKS;Darks -!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. -!CURVEEDITOR_HIGHLIGHTS;Highlights -!CURVEEDITOR_LIGHTS;Lights -!CURVEEDITOR_MINMAXCPOINTS;Equalizer -!CURVEEDITOR_NURBS;Control cage -!CURVEEDITOR_PARAMETRIC;Parametric -!CURVEEDITOR_SHADOWS;Shadows -!CURVEEDITOR_TOOLTIPCOPY;Copy current curve to clipboard. -!CURVEEDITOR_TOOLTIPPASTE;Paste curve from clipboard. -!CURVEEDITOR_TYPE;Type: -!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 -!EDITWINDOW_TITLE;Image Edit -!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. -!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 -!EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction -!EXPORT_BYPASS_DIRPYREQUALIZER;Bypass Contrast by Detail Levels -!EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels -!EXPORT_BYPASS_RAW_CA;Bypass [raw] Chromatic Aberration Correction -!EXPORT_BYPASS_RAW_CCSTEPS;Bypass [raw] False Color Suppression -!EXPORT_BYPASS_RAW_DCB_ENHANCE;Bypass [raw] DCB Enhancement Steps -!EXPORT_BYPASS_RAW_DCB_ITERATIONS;Bypass [raw] DCB Iterations -!EXPORT_BYPASS_RAW_DF;Bypass [raw] Dark-Frame -!EXPORT_BYPASS_RAW_FF;Bypass [raw] Flat-Field -!EXPORT_BYPASS_RAW_GREENTHRESH;Bypass [raw] Green Equilibration -!EXPORT_BYPASS_RAW_LINENOISE;Bypass [raw] Line Noise Filter -!EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Bypass [raw] LMMSE Enhancement Steps -!EXPORT_BYPASS_SHARPENEDGE;Bypass Edge Sharpening -!EXPORT_BYPASS_SHARPENING;Bypass Sharpening -!EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast -!EXPORT_BYPASS_SH_HQ;Bypass Sharp Mask Shadows/Highlights -!EXPORT_FASTEXPORTOPTIONS;Fast Export Options -!EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. -!EXPORT_MAXHEIGHT;Maximum height: -!EXPORT_MAXWIDTH;Maximum width: -!EXPORT_PIPELINE;Processing pipeline -!EXPORT_PUTTOQUEUEFAST; Put to queue for fast export -!EXPORT_RAW_DMETHOD;Demosaic method -!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) -!EXTPROGTARGET_1;raw -!EXTPROGTARGET_2;queue-processed -!FILEBROWSER_ADDDELTEMPLATE;Add/Del templates... -!FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial -!FILEBROWSER_AUTODARKFRAME;Auto dark-frame -!FILEBROWSER_AUTOFLATFIELD;Auto flat-field -!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. -!FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory -!FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial -!FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -!FILEBROWSER_CURRENT_NAME;Current name: -!FILEBROWSER_DARKFRAME;Dark-frame -!FILEBROWSER_DELETEDLGMSGINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? -!FILEBROWSER_EXTPROGMENU;Open with -!FILEBROWSER_FLATFIELD;Flat-Field -!FILEBROWSER_MOVETODARKFDIR;Move to dark-frames directory -!FILEBROWSER_MOVETOFLATFIELDDIR;Move to flat-fields directory -!FILEBROWSER_NEW_NAME;New name: -!FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) -!FILEBROWSER_POPUPCOLORLABEL;Color label -!FILEBROWSER_POPUPCOLORLABEL0;Label: None -!FILEBROWSER_POPUPCOLORLABEL1;Label: Red -!FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow -!FILEBROWSER_POPUPCOLORLABEL3;Label: Green -!FILEBROWSER_POPUPCOLORLABEL4;Label: Blue -!FILEBROWSER_POPUPCOLORLABEL5;Label: Purple -!FILEBROWSER_POPUPCOPYTO;Copy to... -!FILEBROWSER_POPUPFILEOPERATIONS;File operations -!FILEBROWSER_POPUPMOVETO;Move to... -!FILEBROWSER_POPUPPROCESSFAST;Put to queue (Fast export) -!FILEBROWSER_POPUPPROFILEOPERATIONS;Processing profile operations -!FILEBROWSER_POPUPRANK;Rank -!FILEBROWSER_POPUPRANK0;Unrank -!FILEBROWSER_POPUPRANK1;Rank 1 * -!FILEBROWSER_POPUPRANK2;Rank 2 ** -!FILEBROWSER_POPUPRANK3;Rank 3 *** -!FILEBROWSER_POPUPRANK4;Rank 4 **** -!FILEBROWSER_POPUPRANK5;Rank 5 ***** -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete with output from queue -!FILEBROWSER_QUERYBUTTONHINT;Clear the Find query -!FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. -!FILEBROWSER_QUERYLABEL; Find: -!FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 -!FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 -!FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 -!FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 -!FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 -!FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SELECTDARKFRAME;Select dark-frame... -!FILEBROWSER_SELECTFLATFIELD;Select flat-field... -!FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 -!FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2 -!FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green.\nShortcut: Alt-3 -!FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue.\nShortcut: Alt-4 -!FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple.\nShortcut: Alt-5 -!FILEBROWSER_SHOWEDITEDHINT;Show edited images.\nShortcut: 7 -!FILEBROWSER_SHOWEDITEDNOTHINT;Show not edited images.\nShortcut: 6 -!FILEBROWSER_SHOWEXIFINFO;Show Exif info.\n\nShortcuts:\ni - Multiple Editor Tabs Mode,\nAlt-i - Single Editor Tab Mode. -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. -!FILEBROWSER_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_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_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 -!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_AFTER;After -!GENERAL_APPLY;Apply -!GENERAL_ASIMAGE;As Image -!GENERAL_AUTO;Automatic -!GENERAL_BEFORE;Before -!GENERAL_CLOSE;Close -!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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. -!HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. -!HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. -!HISTORY_MSG_82;Profile changed -!HISTORY_MSG_83;S/H - Sharp mask -!HISTORY_MSG_84;Perspective correction -!HISTORY_MSG_85;Lens Correction - LCP file -!HISTORY_MSG_86;RGB Curves - Luminosity mode -!HISTORY_MSG_87;Impulse Noise Reduction -!HISTORY_MSG_88;Impulse NR threshold -!HISTORY_MSG_89;Noise Reduction -!HISTORY_MSG_90;NR - Luminance -!HISTORY_MSG_91;NR - Chrominance master -!HISTORY_MSG_92;NR - Gamma -!HISTORY_MSG_93;CbDL - Value -!HISTORY_MSG_94;Contrast by Detail Levels -!HISTORY_MSG_95;L*a*b* - Chromaticity -!HISTORY_MSG_96;L*a*b* - a* curve -!HISTORY_MSG_97;L*a*b* - b* curve -!HISTORY_MSG_98;Demosaicing method -!HISTORY_MSG_99;Hot pixel filter -!HISTORY_MSG_100;Exposure - Saturation -!HISTORY_MSG_101;HSV - Hue -!HISTORY_MSG_102;HSV - Saturation -!HISTORY_MSG_103;HSV - Value -!HISTORY_MSG_104;HSV Equalizer -!HISTORY_MSG_105;Defringe -!HISTORY_MSG_106;Defringe - Radius -!HISTORY_MSG_107;Defringe - Threshold -!HISTORY_MSG_108;Exposure - HLC threshold -!HISTORY_MSG_109;Resize - Bounding box -!HISTORY_MSG_110;Resize - Applies to -!HISTORY_MSG_111;L*a*b* - Avoid color shift -!HISTORY_MSG_112;--unused-- -!HISTORY_MSG_113;L*a*b* - Red/skin prot. -!HISTORY_MSG_114;DCB iterations -!HISTORY_MSG_115;False color suppression -!HISTORY_MSG_116;DCB enhancement -!HISTORY_MSG_117;Raw CA correction - Red -!HISTORY_MSG_118;Raw CA correction - Blue -!HISTORY_MSG_119;Line noise filter -!HISTORY_MSG_120;Green equilibration -!HISTORY_MSG_121;Raw CA Correction - Auto -!HISTORY_MSG_122;Dark-Frame - Auto-selection -!HISTORY_MSG_123;Dark-Frame - File -!HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation -!HISTORY_MSG_126;Flat-Field - File -!HISTORY_MSG_127;Flat-Field - Auto-selection -!HISTORY_MSG_128;Flat-Field - Blur radius -!HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction -!HISTORY_MSG_131;NR - Luma -!HISTORY_MSG_132;NR - Chroma -!HISTORY_MSG_133;Output gamma -!HISTORY_MSG_134;Free gamma -!HISTORY_MSG_135;Free gamma -!HISTORY_MSG_136;Free gamma slope -!HISTORY_MSG_137;Black level - Green 1 -!HISTORY_MSG_138;Black level - Red -!HISTORY_MSG_139;Black level - Blue -!HISTORY_MSG_140;Black level - Green 2 -!HISTORY_MSG_141;Black level - Link greens -!HISTORY_MSG_142;ES - Iterations -!HISTORY_MSG_143;ES - Quantity -!HISTORY_MSG_144;Microcontrast - Quantity -!HISTORY_MSG_145;Microcontrast - Uniformity -!HISTORY_MSG_146;Edge sharpening -!HISTORY_MSG_147;ES - Luminance only -!HISTORY_MSG_148;Microcontrast -!HISTORY_MSG_149;Microcontrast - 3×3 matrix -!HISTORY_MSG_150;Post-demosaic artifact/noise red. -!HISTORY_MSG_151;Vibrance -!HISTORY_MSG_152;Vib - Pastel tones -!HISTORY_MSG_153;Vib - Saturated tones -!HISTORY_MSG_154;Vib - Protect skin-tones -!HISTORY_MSG_155;Vib - Avoid color shift -!HISTORY_MSG_156;Vib - Link pastel/saturated -!HISTORY_MSG_157;Vib - P/S threshold -!HISTORY_MSG_158;TM - Strength -!HISTORY_MSG_159;TM - Edge stopping -!HISTORY_MSG_160;TM - Scale -!HISTORY_MSG_161;TM - Reweighting iterates -!HISTORY_MSG_162;Tone Mapping -!HISTORY_MSG_163;RGB Curves - Red -!HISTORY_MSG_164;RGB Curves - Green -!HISTORY_MSG_165;RGB Curves - Blue -!HISTORY_MSG_166;Exposure - Reset -!HISTORY_MSG_167;Demosaicing method -!HISTORY_MSG_168;L*a*b* - CC curve -!HISTORY_MSG_169;L*a*b* - CH curve -!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_174;CIECAM02 -!HISTORY_MSG_175;CAM02 - CAT02 adaptation -!HISTORY_MSG_176;CAM02 - Viewing surround -!HISTORY_MSG_177;CAM02 - Scene luminosity -!HISTORY_MSG_178;CAM02 - Viewing luminosity -!HISTORY_MSG_179;CAM02 - White-point model -!HISTORY_MSG_180;CAM02 - Lightness (J) -!HISTORY_MSG_181;CAM02 - Chroma (C) -!HISTORY_MSG_182;CAM02 - Automatic CAT02 -!HISTORY_MSG_183;CAM02 - Contrast (J) -!HISTORY_MSG_184;CAM02 - Scene surround -!HISTORY_MSG_185;CAM02 - Gamut control -!HISTORY_MSG_186;CAM02 - Algorithm -!HISTORY_MSG_187;CAM02 - Red/skin prot. -!HISTORY_MSG_188;CAM02 - Brightness (Q) -!HISTORY_MSG_189;CAM02 - Contrast (Q) -!HISTORY_MSG_190;CAM02 - Saturation (S) -!HISTORY_MSG_191;CAM02 - Colorfulness (M) -!HISTORY_MSG_192;CAM02 - Hue (h) -!HISTORY_MSG_193;CAM02 - Tone curve 1 -!HISTORY_MSG_194;CAM02 - Tone curve 2 -!HISTORY_MSG_195;CAM02 - Tone curve 1 -!HISTORY_MSG_196;CAM02 - Tone curve 2 -!HISTORY_MSG_197;CAM02 - Color curve -!HISTORY_MSG_198;CAM02 - Color curve -!HISTORY_MSG_199;CAM02 - Output histograms -!HISTORY_MSG_200;CAM02 - Tone mapping -!HISTORY_MSG_201;NR - Chrominance - R&G -!HISTORY_MSG_202;NR - Chrominance - B&Y -!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 -!HISTORY_MSG_207;Defringe - Hue curve -!HISTORY_MSG_208;WB - B/R equalizer -!HISTORY_MSG_210;GF - Angle -!HISTORY_MSG_211;Graduated Filter -!HISTORY_MSG_212;VF - Strength -!HISTORY_MSG_213;Vignette Filter -!HISTORY_MSG_214;Black-and-White -!HISTORY_MSG_215;B&W - CM - Red -!HISTORY_MSG_216;B&W - CM - Green -!HISTORY_MSG_217;B&W - CM - Blue -!HISTORY_MSG_218;B&W - Gamma - Red -!HISTORY_MSG_219;B&W - Gamma - Green -!HISTORY_MSG_220;B&W - Gamma - Blue -!HISTORY_MSG_221;B&W - Color filter -!HISTORY_MSG_222;B&W - Presets -!HISTORY_MSG_223;B&W - CM - Orange -!HISTORY_MSG_224;B&W - CM - Yellow -!HISTORY_MSG_225;B&W - CM - Cyan -!HISTORY_MSG_226;B&W - CM - Magenta -!HISTORY_MSG_227;B&W - CM - Purple -!HISTORY_MSG_228;B&W - Luminance equalizer -!HISTORY_MSG_229;B&W - Luminance equalizer -!HISTORY_MSG_230;B&W - Mode -!HISTORY_MSG_231;B&W - 'Before' curve -!HISTORY_MSG_232;B&W - 'Before' curve type -!HISTORY_MSG_233;B&W - 'After' curve -!HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer -!HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer -!HISTORY_MSG_238;GF - Feather -!HISTORY_MSG_239;GF - Strength -!HISTORY_MSG_240;GF - Center -!HISTORY_MSG_241;VF - Feather -!HISTORY_MSG_242;VF - Roundness -!HISTORY_MSG_243;VC - Radius -!HISTORY_MSG_244;VC - Strength -!HISTORY_MSG_245;VC - Center -!HISTORY_MSG_246;L*a*b* - CL curve -!HISTORY_MSG_247;L*a*b* - LH curve -!HISTORY_MSG_248;L*a*b* - HH curve -!HISTORY_MSG_249;CbDL - Threshold -!HISTORY_MSG_250;NR - Enhanced -!HISTORY_MSG_251;B&W - Algorithm -!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_257;Color Toning -!HISTORY_MSG_258;CT - Color curve -!HISTORY_MSG_259;CT - Opacity curve -!HISTORY_MSG_260;CT - a*[b*] opacity -!HISTORY_MSG_261;CT - Method -!HISTORY_MSG_262;CT - b* opacity -!HISTORY_MSG_263;CT - Shadows - Red -!HISTORY_MSG_264;CT - Shadows - Green -!HISTORY_MSG_265;CT - Shadows - Blue -!HISTORY_MSG_266;CT - Mid - Red -!HISTORY_MSG_267;CT - Mid - Green -!HISTORY_MSG_268;CT - Mid - Blue -!HISTORY_MSG_269;CT - High - Red -!HISTORY_MSG_270;CT - High - Green -!HISTORY_MSG_271;CT - High - Blue -!HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset -!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 -!HISTORY_MSG_281;CT - Sat. strength -!HISTORY_MSG_282;CT - Sat. threshold -!HISTORY_MSG_283;CT - Strength -!HISTORY_MSG_284;CT - Auto sat. protection -!HISTORY_MSG_285;NR - Median - Method -!HISTORY_MSG_286;NR - Median - Type -!HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto -!HISTORY_MSG_290;Black Level - Red -!HISTORY_MSG_291;Black Level - Green -!HISTORY_MSG_292;Black Level - Blue -!HISTORY_MSG_293;Film Simulation -!HISTORY_MSG_294;Film Simulation - Strength -!HISTORY_MSG_295;Film Simulation - Film -!HISTORY_MSG_296;NR - Luminance curve -!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 -!HISTORY_MSG_304;W - Contrast levels -!HISTORY_MSG_305;Wavelet Levels -!HISTORY_MSG_306;W - Process -!HISTORY_MSG_307;W - Process -!HISTORY_MSG_308;W - Process direction -!HISTORY_MSG_309;W - ES - Detail -!HISTORY_MSG_310;W - Residual - Sky tar/prot -!HISTORY_MSG_311;W - Wavelet levels -!HISTORY_MSG_312;W - Residual - Shadows threshold -!HISTORY_MSG_313;W - Chroma - Sat/past -!HISTORY_MSG_314;W - Gamut - Reduce artifacts -!HISTORY_MSG_315;W - Residual - Contrast -!HISTORY_MSG_316;W - Gamut - Skin tar/prot -!HISTORY_MSG_317;W - Gamut - Skin hue -!HISTORY_MSG_318;W - Contrast - Highlight levels -!HISTORY_MSG_319;W - Contrast - Highlight range -!HISTORY_MSG_320;W - Contrast - Shadow range -!HISTORY_MSG_321;W - Contrast - Shadow levels -!HISTORY_MSG_322;W - Gamut - Avoid color shift -!HISTORY_MSG_323;W - ES - Local contrast -!HISTORY_MSG_324;W - Chroma - Pastel -!HISTORY_MSG_325;W - Chroma - Saturated -!HISTORY_MSG_326;W - Chroma - Method -!HISTORY_MSG_327;W - Contrast - Apply to -!HISTORY_MSG_328;W - Chroma - Link strength -!HISTORY_MSG_329;W - Toning - Opacity RG -!HISTORY_MSG_330;W - Toning - Opacity BY -!HISTORY_MSG_331;W - Contrast levels - Extra -!HISTORY_MSG_332;W - Tiling method -!HISTORY_MSG_333;W - Residual - Shadows -!HISTORY_MSG_334;W - Residual - Chroma -!HISTORY_MSG_335;W - Residual - Highlights -!HISTORY_MSG_336;W - Residual - Highlights threshold -!HISTORY_MSG_337;W - Residual - Sky hue -!HISTORY_MSG_338;W - ES - Radius -!HISTORY_MSG_339;W - ES - Strength -!HISTORY_MSG_340;W - Strength -!HISTORY_MSG_341;W - Edge performance -!HISTORY_MSG_342;W - ES - First level -!HISTORY_MSG_343;W - Chroma levels -!HISTORY_MSG_344;W - Meth chroma sl/cur -!HISTORY_MSG_345;W - ES - Local contrast -!HISTORY_MSG_346;W - ES - Local contrast method -!HISTORY_MSG_347;W - Denoise - Level 1 -!HISTORY_MSG_348;W - Denoise - Level 2 -!HISTORY_MSG_349;W - Denoise - Level 3 -!HISTORY_MSG_350;W - ES - Edge detection -!HISTORY_MSG_351;W - Residual - HH curve -!HISTORY_MSG_352;W - Background -!HISTORY_MSG_353;W - ES - Gradient sensitivity -!HISTORY_MSG_354;W - ES - Enhanced -!HISTORY_MSG_355;W - ES - Threshold low -!HISTORY_MSG_356;W - ES - Threshold high -!HISTORY_MSG_357;W - Denoise - Link with ES -!HISTORY_MSG_358;W - Gamut - CH -!HISTORY_MSG_359;Hot/Dead - Threshold -!HISTORY_MSG_360;TM - Gamma -!HISTORY_MSG_361;W - Final - Chroma balance -!HISTORY_MSG_362;W - Residual - Compression method -!HISTORY_MSG_363;W - Residual - Compression strength -!HISTORY_MSG_364;W - Final - Contrast balance -!HISTORY_MSG_365;W - Final - Delta balance -!HISTORY_MSG_366;W - Residual - Compression gamma -!HISTORY_MSG_367;W - Final - 'After' contrast curve -!HISTORY_MSG_368;W - Final - Contrast balance -!HISTORY_MSG_369;W - Final - Balance method -!HISTORY_MSG_370;W - Final - Local contrast curve -!HISTORY_MSG_371;Post-Resize Sharpening -!HISTORY_MSG_372;PRS USM - Radius -!HISTORY_MSG_373;PRS USM - Amount -!HISTORY_MSG_374;PRS USM - Threshold -!HISTORY_MSG_375;PRS USM - Sharpen only edges -!HISTORY_MSG_376;PRS USM - Edge detection radius -!HISTORY_MSG_377;PRS USM - Edge tolerance -!HISTORY_MSG_378;PRS USM - Halo control -!HISTORY_MSG_379;PRS USM - Halo control amount -!HISTORY_MSG_380;PRS - Method -!HISTORY_MSG_381;PRS RLD - Radius -!HISTORY_MSG_382;PRS RLD - Amount -!HISTORY_MSG_383;PRS RLD - Damping -!HISTORY_MSG_384;PRS RLD - Iterations -!HISTORY_MSG_385;W - Residual - Color Balance -!HISTORY_MSG_386;W - Residual - CB green high -!HISTORY_MSG_387;W - Residual - CB blue high -!HISTORY_MSG_388;W - Residual - CB green mid -!HISTORY_MSG_389;W - Residual - CB blue mid -!HISTORY_MSG_390;W - Residual - CB green low -!HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset -!HISTORY_MSG_393;DCP - Look table -!HISTORY_MSG_394;DCP - Baseline exposure -!HISTORY_MSG_395;DCP - Base table -!HISTORY_MSG_396;W - Contrast sub-tool -!HISTORY_MSG_397;W - Chroma sub-tool -!HISTORY_MSG_398;W - ES sub-tool -!HISTORY_MSG_399;W - Residual sub-tool -!HISTORY_MSG_400;W - Final sub-tool -!HISTORY_MSG_401;W - Toning sub-tool -!HISTORY_MSG_402;W - Denoise sub-tool -!HISTORY_MSG_403;W - ES - Edge sensitivity -!HISTORY_MSG_404;W - ES - Base amplification -!HISTORY_MSG_405;W - Denoise - Level 4 -!HISTORY_MSG_406;W - ES - Neighboring pixels -!HISTORY_MSG_407;Retinex - Method -!HISTORY_MSG_408;Retinex - Radius -!HISTORY_MSG_409;Retinex - Contrast -!HISTORY_MSG_410;Retinex - Offset -!HISTORY_MSG_411;Retinex - Strength -!HISTORY_MSG_412;Retinex - Gaussian gradient -!HISTORY_MSG_413;Retinex - Contrast -!HISTORY_MSG_414;Retinex - Histogram - Lab -!HISTORY_MSG_415;Retinex - Transmission -!HISTORY_MSG_416;Retinex -!HISTORY_MSG_417;Retinex - Transmission median -!HISTORY_MSG_418;Retinex - Threshold -!HISTORY_MSG_419;Retinex - Color space -!HISTORY_MSG_420;Retinex - Histogram - HSL -!HISTORY_MSG_421;Retinex - Gamma -!HISTORY_MSG_422;Retinex - Gamma -!HISTORY_MSG_423;Retinex - Gamma slope -!HISTORY_MSG_424;Retinex - HL threshold -!HISTORY_MSG_425;Retinex - Log base -!HISTORY_MSG_426;Retinex - Hue equalizer -!HISTORY_MSG_427;Output rendering intent -!HISTORY_MSG_428;Monitor rendering intent -!HISTORY_MSG_429;Retinex - Iterations -!HISTORY_MSG_430;Retinex - Transmission gradient -!HISTORY_MSG_431;Retinex - Strength gradient -!HISTORY_MSG_432;Retinex - M - Highlights -!HISTORY_MSG_433;Retinex - M - Highlights TW -!HISTORY_MSG_434;Retinex - M - Shadows -!HISTORY_MSG_435;Retinex - M - Shadows TW -!HISTORY_MSG_436;Retinex - M - Radius -!HISTORY_MSG_437;Retinex - M - Method -!HISTORY_MSG_438;Retinex - M - Equalizer -!HISTORY_MSG_439;Retinex - Process -!HISTORY_MSG_440;CbDL - Method -!HISTORY_MSG_441;Retinex - Gain transmission -!HISTORY_MSG_442;Retinex - Scale -!HISTORY_MSG_443;Output black point compensation -!HISTORY_MSG_444;WB - Temp bias -!HISTORY_MSG_445;Raw sub-image -!HISTORY_MSG_449;PS - ISO adaption -!HISTORY_MSG_452;PS - Show motion -!HISTORY_MSG_453;PS - Show mask only -!HISTORY_MSG_457;PS - Check red/blue -!HISTORY_MSG_462;PS - Check green -!HISTORY_MSG_464;PS - Blur motion mask -!HISTORY_MSG_465;PS - Blur radius -!HISTORY_MSG_468;PS - Fill holes -!HISTORY_MSG_469;PS - Median -!HISTORY_MSG_471;PS - Motion correction -!HISTORY_MSG_472;PS - Smooth transitions -!HISTORY_MSG_473;PS - Use LMMSE -!HISTORY_MSG_474;PS - Equalize -!HISTORY_MSG_475;PS - Equalize channel -!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 -!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_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_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. -!IPTCPANEL_COPYRIGHT;Copyright notice -!IPTCPANEL_COPYRIGHTHINT;Enter a Notice on the current owner of the Copyright for this image, such as ©2008 Jane Doe. -!IPTCPANEL_COUNTRYHINT;Enter the name of the country pictured in this image. -!IPTCPANEL_CREATOR;Creator -!IPTCPANEL_CREATORHINT;Enter the name of the person that created this image. -!IPTCPANEL_CREATORJOBTITLE;Creator's job title -!IPTCPANEL_CREATORJOBTITLEHINT;Enter the Job Title of the person listed in the Creator field. -!IPTCPANEL_DATECREATEDHINT;Enter the Date the image was taken. -!IPTCPANEL_DESCRIPTION;Description -!IPTCPANEL_DESCRIPTIONHINT;Enter a "caption" describing the who, what, and why of what is happening in this image, this might include names of people, and/or their role in the action that is taking place within the image. -!IPTCPANEL_DESCRIPTIONWRITER;Description writer -!IPTCPANEL_DESCRIPTIONWRITERHINT;Enter the name of the person involved in writing, editing or correcting the description of the image. -!IPTCPANEL_HEADLINEHINT;Enter a brief publishable synopsis or summary of the contents of the image. -!IPTCPANEL_INSTRUCTIONSHINT;Enter information about embargoes, or other restrictions not covered by the Copyright field. -!IPTCPANEL_KEYWORDSHINT;Enter any number of keywords, terms or phrases used to express the subject matter in the image. -!IPTCPANEL_PROVINCE;Province or state -!IPTCPANEL_PROVINCEHINT;Enter the name of the province or state pictured in this image. -!IPTCPANEL_SOURCEHINT;Enter or edit the name of a person or party who has a role in the content supply chain, such as a person or entity from whom you received this image from. -!IPTCPANEL_SUPPCATEGORIES;Supplemental categories -!IPTCPANEL_SUPPCATEGORIESHINT;Further refines the subject of the image. -!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_FULLSCREEN;Fullscreen -!MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 -!MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 -!MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). -!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s -!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e -!MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m -!MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen -!MAIN_FRAME_BATCHQUEUE_TOOLTIP;Processing queue.\nShortcut: Ctrl-F3 -!MAIN_FRAME_EDITOR;Editor -!MAIN_FRAME_EDITOR_TOOLTIP;Editor.\nShortcut: Ctrl-F4 -!MAIN_FRAME_FILEBROWSER_TOOLTIP;File browser.\nShortcut: Ctrl-F2 -!MAIN_MSG_EMPTYFILENAME;Filename unspecified! -!MAIN_MSG_IMAGEUNPROCESSED;This command requires all selected images to be queue-processed first. -!MAIN_MSG_NAVIGATOR;Navigator -!MAIN_MSG_OPERATIONCANCELLED;Operation cancelled -!MAIN_MSG_PATHDOESNTEXIST;The path\n\n%1\n\ndoes not exist. Please set a correct path in Preferences. -!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_COLOR_TOOLTIP;Shortcut: Alt-c -!MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d -!MAIN_TAB_EXPORT; Fast Export -!MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e -!MAIN_TAB_INSPECT; Inspect -!MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m -!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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 -!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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r -!MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l -!MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l -!MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l -!MAIN_TOOLTIP_THRESHOLD;Threshold -!MAIN_TOOLTIP_TOGGLE;Toggle the Before/After view.\nShortcut: Shift-b -!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: -!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. -!PARTIALPASTE_CHANNELMIXER;Channel mixer -!PARTIALPASTE_CHANNELMIXERBW;Black-and-white -!PARTIALPASTE_COLORAPP;CIECAM02 -!PARTIALPASTE_COLORTONING;Color toning -!PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto-fill -!PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection -!PARTIALPASTE_DARKFRAMEFILE;Dark-frame file -!PARTIALPASTE_DEFRINGE;Defringe -!PARTIALPASTE_DETAILGROUP;Detail Settings -!PARTIALPASTE_DIRPYRDENOISE;Noise reduction -!PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels -!PARTIALPASTE_EPD;Tone mapping -!PARTIALPASTE_EQUALIZER;Wavelet levels -!PARTIALPASTE_EVERYTHING;Everything -!PARTIALPASTE_FILMSIMULATION;Film simulation -!PARTIALPASTE_FLATFIELDAUTOSELECT;Flat-field auto-selection -!PARTIALPASTE_FLATFIELDBLURRADIUS;Flat-field blur radius -!PARTIALPASTE_FLATFIELDBLURTYPE;Flat-field blur type -!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_FLATFIELDFILE;Flat-field file -!PARTIALPASTE_GRADIENT;Graduated filter -!PARTIALPASTE_HSVEQUALIZER;HSV equalizer -!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction -!PARTIALPASTE_LABCURVE;L*a*b* adjustments -!PARTIALPASTE_LENSPROFILE;Profiled lens correction -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_PCVIGNETTE;Vignette filter -!PARTIALPASTE_PERSPECTIVE;Perspective -!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter -!PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration -!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter -!PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter -!PARTIALPASTE_PRSHARPENING;Post-resize sharpening -!PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction -!PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue -!PARTIALPASTE_RAWEXPOS_BLACK;Black levels -!PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation -!PARTIALPASTE_RAWGROUP;Raw Settings -!PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement -!PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations -!PARTIALPASTE_RAW_DMETHOD;Demosaic method -!PARTIALPASTE_RAW_FALSECOLOR;False color suppression -!PARTIALPASTE_RAW_IMAGENUM;Sub-image -!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps -!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 -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_BATCH_PROCESSING;Batch Processing -!PREFERENCES_BEHADDALL;All to 'Add' -!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_BEHAVIOR;Behavior -!PREFERENCES_BEHSETALL;All to 'Set' -!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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. -!PREFERENCES_CLUTSCACHE;HaldCLUT Cache -!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 -!PREFERENCES_CURVEBBOXPOS_LEFT;Left -!PREFERENCES_CURVEBBOXPOS_RIGHT;Right -!PREFERENCES_CUSTPROFBUILD;Custom Processing Profile Builder -!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_CUSTPROFBUILDKEYFORMAT;Keys format -!PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name -!PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID -!PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency -!PREFERENCES_D50;Settings in main menu -!PREFERENCES_D50_OLD;5000K -!PREFERENCES_D55;5500K -!PREFERENCES_D60;6000K -!PREFERENCES_D65;6500K -!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_FLATFIELDFOUND;Found -!PREFERENCES_FLATFIELDSDIR;Flat-fields directory -!PREFERENCES_FLATFIELDSHOTS;shots -!PREFERENCES_FLATFIELDTEMPLATES;templates -!PREFERENCES_FLUOF2;Fluorescent F2 -!PREFERENCES_FLUOF7;Fluorescent F7 -!PREFERENCES_FLUOF11;Fluorescent F11 -!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_GREY;Output device's Yb luminance (%) -!PREFERENCES_GREY05;Yb=05 CIE L#30 -!PREFERENCES_GREY10;Yb=10 CIE L#40 -!PREFERENCES_GREY15;Yb=15 CIE L#45 -!PREFERENCES_GREY18;Settings in main menu -!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 -!PREFERENCES_GREYSC;Scene Yb luminance (%) -!PREFERENCES_GREYSC18;Yb=18 CIE L#50 -!PREFERENCES_GREYSCA;Automatic -!PREFERENCES_HISTOGRAMPOSITIONLEFT;Histogram in left panel -!PREFERENCES_HISTOGRAMWORKING;Use working profile for main histogram and Navigator -!PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for rendering the main histogram and the Navigator panel, otherwise the gamma-corrected output profile is used. -!PREFERENCES_IMG_RELOAD_NEEDED;These changes require the image to be reloaded (or a new image to be opened) to take effect. -!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_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited -!PREFERENCES_LANG;Language -!PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) -!PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) -!PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" -!PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" -!PREFERENCES_MENUGROUPLABEL;Group "Color label" -!PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" -!PREFERENCES_MENUGROUPRANK;Group "Rank" -!PREFERENCES_MENUOPTIONS;Context Menu Options -!PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode -!PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color -!PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction -!PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser -!PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel -!PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files -!PREFERENCES_PANFACTORLABEL;Pan rate amplification -!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 -!PREFERENCES_PROFILE_NONE;None -!PREFERENCES_PROPERTY;Property -!PREFERENCES_PRTINTENT;Rendering intent -!PREFERENCES_PRTPROFILE;Color profile -!PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset -!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SET;Set -!PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SINGLETAB;Single Editor Tab Mode -!PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done -!PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. -!PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard -!PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality -!PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard -!PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text -!PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar -!PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles -!PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No -!PREFERENCES_WORKFLOW;Layout -!PROFILEPANEL_COPYPPASTE;Parameters to copy -!PROFILEPANEL_GLOBALPROFILES;Bundled profiles -!PROFILEPANEL_LOADPPASTE;Parameters to load -!PROFILEPANEL_MODE_TIP;Processing profile fill mode.\n\nButton pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. -!PROFILEPANEL_MYPROFILES;My profiles -!PROFILEPANEL_PASTEPPASTE;Parameters to paste -!PROFILEPANEL_PDYNAMIC;Dynamic -!PROFILEPANEL_PINTERNAL;Neutral -!PROFILEPANEL_SAVEPPASTE;Parameters to save -!PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... -!PROGRESSBAR_NOIMAGES;No images found -!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 -!SAVEDLG_SUBSAMP_1;Best compression -!SAVEDLG_SUBSAMP_2;Balanced -!SAVEDLG_SUBSAMP_3;Best quality -!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_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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!THRESHOLDSELECTOR_B;Bottom -!THRESHOLDSELECTOR_BL;Bottom-left -!THRESHOLDSELECTOR_BR;Bottom-right -!THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control points. -!THRESHOLDSELECTOR_T;Top -!THRESHOLDSELECTOR_TL;Top-left -!THRESHOLDSELECTOR_TR;Top-right -!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 -!TP_BWMIX_ALGO_SP;Special effects -!TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. -!TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. -!TP_BWMIX_CC_ENABLED;Adjust complementary color -!TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. -!TP_BWMIX_CHANNEL;Luminance equalizer -!TP_BWMIX_CURVEEDITOR1;'Before' curve -!TP_BWMIX_CURVEEDITOR2;'After' curve -!TP_BWMIX_CURVEEDITOR_AFTER_TOOLTIP;Tone curve, after B&W conversion, at the end of treatment. -!TP_BWMIX_CURVEEDITOR_BEFORE_TOOLTIP;Tone curve, just before B&W conversion.\nMay take into account the color components. -!TP_BWMIX_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H).\nPay attention to extreme values as they may cause artifacts. -!TP_BWMIX_FILTER;Color Filter -!TP_BWMIX_FILTER_BLUE;Blue -!TP_BWMIX_FILTER_BLUEGREEN;Blue-Green -!TP_BWMIX_FILTER_GREEN;Green -!TP_BWMIX_FILTER_GREENYELLOW;Green-Yellow -!TP_BWMIX_FILTER_NONE;None -!TP_BWMIX_FILTER_PURPLE;Purple -!TP_BWMIX_FILTER_RED;Red -!TP_BWMIX_FILTER_REDYELLOW;Red-Yellow -!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. -!TP_BWMIX_FILTER_YELLOW;Yellow -!TP_BWMIX_GAMMA;Gamma Correction -!TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. -!TP_BWMIX_LABEL;Black-and-White -!TP_BWMIX_MET;Method -!TP_BWMIX_MET_CHANMIX;Channel Mixer -!TP_BWMIX_MET_DESAT;Desaturation -!TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. -!TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% -!TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. -!TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. -!TP_BWMIX_SETTING;Presets -!TP_BWMIX_SETTING_TOOLTIP;Different presets (film, landscape, etc.) or manual Channel Mixer settings. -!TP_BWMIX_SET_HIGHCONTAST;High contrast -!TP_BWMIX_SET_HIGHSENSIT;High Sensitivity -!TP_BWMIX_SET_HYPERPANCHRO;Hyper Panchromatic -!TP_BWMIX_SET_INFRARED;Infrared -!TP_BWMIX_SET_LANDSCAPE;Landscape -!TP_BWMIX_SET_LOWSENSIT;Low Sensitivity -!TP_BWMIX_SET_LUMINANCE;Luminance -!TP_BWMIX_SET_NORMCONTAST;Normal Contrast -!TP_BWMIX_SET_ORTHOCHRO;Orthochromatic -!TP_BWMIX_SET_PANCHRO;Panchromatic -!TP_BWMIX_SET_PORTRAIT;Portrait -!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_BWMIX_TCMODE_FILMLIKE;B&W Film-like -!TP_BWMIX_TCMODE_SATANDVALBLENDING;B&W Saturation and Value Blending -!TP_BWMIX_TCMODE_STANDARD;B&W Standard -!TP_BWMIX_TCMODE_WEIGHTEDSTD;B&W Weighted Standard -!TP_BWMIX_VAL;L -!TP_CBDL_AFT;After Black-and-White -!TP_CBDL_BEF;Before Black-and-White -!TP_CBDL_METHOD;Process located -!TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. -!TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. -!TP_COLORAPP_ALGO;Algorithm -!TP_COLORAPP_ALGO_ALL;All -!TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) -!TP_COLORAPP_ALGO_JS;Lightness + Saturation (JS) -!TP_COLORAPP_ALGO_QM;Brightness + Colorfulness (QM) -!TP_COLORAPP_ALGO_TOOLTIP;Lets you choose between parameter subsets or all parameters. -!TP_COLORAPP_BADPIXSL;Hot/bad pixel filter -!TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. -!TP_COLORAPP_BRIGHT;Brightness (Q) -!TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. -!TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) -!TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. -!TP_COLORAPP_CHROMA_S;Saturation (S) -!TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. -!TP_COLORAPP_CHROMA_TOOLTIP;Chroma in CIECAM02 differs from L*a*b* and RGB chroma. -!TP_COLORAPP_CIECAT_DEGREE;CAT02 adaptation -!TP_COLORAPP_CONTRAST;Contrast (J) -!TP_COLORAPP_CONTRAST_Q;Contrast (Q) -!TP_COLORAPP_CONTRAST_Q_TOOLTIP;Differs from L*a*b* and RGB contrast. -!TP_COLORAPP_CONTRAST_TOOLTIP;Differs from L*a*b* and RGB contrast. -!TP_COLORAPP_CURVEEDITOR1;Tone curve 1 -!TP_COLORAPP_CURVEEDITOR1_TOOLTIP;Shows the histogram of L* (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of J or Q after CIECAM02.\n\nJ and Q are not shown in the main histogram panel.\n\nFor final output refer to the main histogram panel. -!TP_COLORAPP_CURVEEDITOR2;Tone curve 2 -!TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Same usage as with the second exposure tone curve. -!TP_COLORAPP_CURVEEDITOR3;Color curve -!TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. -!TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves -!TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. -!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] -!TP_COLORAPP_GAMUT;Gamut control (L*a*b*) -!TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. -!TP_COLORAPP_HUE;Hue (h) -!TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. -!TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 -!TP_COLORAPP_LABEL_CAM02;Image Adjustments -!TP_COLORAPP_LABEL_SCENE;Scene Conditions -!TP_COLORAPP_LABEL_VIEWING;Viewing Conditions -!TP_COLORAPP_LIGHT;Lightness (J) -!TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. -!TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. -!TP_COLORAPP_NEUTRAL;Reset -!TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values -!TP_COLORAPP_RSTPRO;Red & skin-tones protection -!TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- -!TP_COLORAPP_SURROUND;Surround -!TP_COLORAPP_SURROUND_AVER;Average -!TP_COLORAPP_SURROUND_DARK;Dark -!TP_COLORAPP_SURROUND_DIM;Dim -!TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) -!TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. -!TP_COLORAPP_SURSOURCE;Dark surround -!TP_COLORAPP_SURSOURCE_TOOLTIP;Can be used if image has a dark border. -!TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness -!TP_COLORAPP_TCMODE_CHROMA;Chroma -!TP_COLORAPP_TCMODE_COLORF;Colorfulness -!TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 -!TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 -!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_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 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 -!TP_COLORTONING_BY;o C/L -!TP_COLORTONING_CHROMAC;Opacity -!TP_COLORTONING_COLOR;Color -!TP_COLORTONING_CURVEEDITOR_CL_TOOLTIP;Chroma opacity as a function of luminance oC=f(L) -!TP_COLORTONING_HIGHLIGHT;Highlights -!TP_COLORTONING_HUE;Hue -!TP_COLORTONING_LAB;L*a*b* blending -!TP_COLORTONING_LABEL;Color Toning -!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. -!TP_COLORTONING_METHOD;Method -!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_MIDTONES;Midtones -!TP_COLORTONING_NEUTRAL;Reset sliders -!TP_COLORTONING_NEUTRAL_TIP;Reset all values (Shadows, Midtones, Highlights) to default. -!TP_COLORTONING_OPACITY;Opacity -!TP_COLORTONING_RGBCURVES;RGB - Curves -!TP_COLORTONING_RGBSLIDERS;RGB - Sliders -!TP_COLORTONING_SA;Saturation Protection -!TP_COLORTONING_SATURATEDOPACITY;Strength -!TP_COLORTONING_SATURATIONTHRESHOLD;Threshold -!TP_COLORTONING_SHADOWS;Shadows -!TP_COLORTONING_SPLITCO;Shadows/Midtones/Highlights -!TP_COLORTONING_SPLITCOCO;Color Balance Shadows/Midtones/Highlights -!TP_COLORTONING_SPLITLR;Saturation 2 colors -!TP_COLORTONING_STR;Strength -!TP_COLORTONING_STRENGTH;Strength -!TP_COLORTONING_TWO2;Special chroma '2 colors' -!TP_COLORTONING_TWOALL;Special chroma -!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_GTEPASSPORT;Biometric Passport -!TP_CROP_GTFRAME;Frame -!TP_CROP_GTGRID;Grid -!TP_CROP_GTHARMMEANS;Harmonic Means -!TP_CROP_GTTRIANGLE1;Golden Triangles 1 -!TP_CROP_GTTRIANGLE2;Golden Triangles 2 -!TP_CROP_PPI;PPI= -!TP_DARKFRAME_AUTOSELECT;Auto-selection -!TP_DARKFRAME_LABEL;Dark-Frame -!TP_DEFRINGE_LABEL;Defringe -!TP_DEFRINGE_RADIUS;Radius -!TP_DEFRINGE_THRESHOLD;Threshold -!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_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_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_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 -!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. -!TP_DIRPYREQUALIZER_LABEL;Contrast by Detail Levels -!TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest -!TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast - -!TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast + -!TP_DIRPYREQUALIZER_LUMAFINEST;Finest -!TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral -!TP_DIRPYREQUALIZER_SKIN;Skin targetting/protection -!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_THRESHOLD;Threshold -!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_EDGESTOPPING;Edge stopping -!TP_EPD_GAMMA;Gamma -!TP_EPD_LABEL;Tone Mapping -!TP_EPD_REWEIGHTINGITERATES;Reweighting iterates -!TP_EPD_SCALE;Scale -!TP_EPD_STRENGTH;Strength -!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_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold -!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_SATURATION;Saturation -!TP_EXPOSURE_TCMODE_FILMLIKE;Film-like -!TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 -!TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 -!TP_EXPOSURE_TCMODE_LUMINANCE;Luminance -!TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual -!TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending -!TP_EXPOSURE_TCMODE_STANDARD;Standard -!TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard -!TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points -!TP_EXPOS_WHITEPOINT_LABEL;Raw White Points -!TP_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_AUTOSELECT;Auto-selection -!TP_FLATFIELD_BLURRADIUS;Blur radius -!TP_FLATFIELD_BLURTYPE;Blur type -!TP_FLATFIELD_BT_AREA;Area -!TP_FLATFIELD_BT_HORIZONTAL;Horizontal -!TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal -!TP_FLATFIELD_BT_VERTICAL;Vertical -!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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) -!TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. -!TP_GRADIENT_CENTER;Center -!TP_GRADIENT_CENTER_X;Center X -!TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). -!TP_GRADIENT_CENTER_Y;Center Y -!TP_GRADIENT_CENTER_Y_TOOLTIP;Shift gradient up (negative values) or down (positive values). -!TP_GRADIENT_DEGREE;Angle -!TP_GRADIENT_DEGREE_TOOLTIP;Rotation angle in degrees. -!TP_GRADIENT_FEATHER;Feather -!TP_GRADIENT_FEATHER_TOOLTIP;Gradient width in percent of the image diagonal. -!TP_GRADIENT_LABEL;Graduated Filter -!TP_GRADIENT_STRENGTH;Strength -!TP_GRADIENT_STRENGTH_TOOLTIP;Filter strength in stops. -!TP_HLREC_BLEND;Blend -!TP_HLREC_ENA_TOOLTIP;Could be activated by Auto Levels. -!TP_HSVEQUALIZER_CHANNEL;Channel -!TP_HSVEQUALIZER_HUE;H -!TP_HSVEQUALIZER_LABEL;HSV Equalizer -!TP_HSVEQUALIZER_SAT;S -!TP_HSVEQUALIZER_VAL;V -!TP_ICM_APPLYBASELINEEXPOSUREOFFSET;Baseline exposure -!TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP;Employ the embedded DCP baseline exposure offset. The setting is only available if the selected DCP has one. -!TP_ICM_APPLYHUESATMAP;Base table -!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_BLENDCMSMATRIX;Blend ICC highlights with matrix -!TP_ICM_BLENDCMSMATRIX_TOOLTIP;Enable to recover clipped highlights when using LUT-based ICC profiles. -!TP_ICM_BPC;Black Point Compensation -!TP_ICM_DCPILLUMINANT;Illuminant -!TP_ICM_DCPILLUMINANT_INTERPOLATED;Interpolated -!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_INPUTCAMERAICC;Auto-matched camera profile -!TP_ICM_INPUTCAMERAICC_TOOLTIP;Use RawTherapee's camera-specific DCP or ICC input color profiles. These profiles are more precise than simpler matrix ones. They are not available for all cameras. These profiles are stored in the /iccprofiles/input and /dcpprofiles folders and are automatically retrieved based on a file name matching to the exact model name of the camera. -!TP_ICM_INPUTCAMERA_TOOLTIP;Use a simple color matrix from dcraw, an enhanced RawTherapee version (whichever is available based on camera model) or one embedded in the DNG. -!TP_ICM_INPUTCUSTOM_TOOLTIP;Select your own DCP/ICC color profile file for the camera. -!TP_ICM_INPUTEMBEDDED_TOOLTIP;Use color profile embedded in non-raw files. -!TP_ICM_INPUTNONE;No profile -!TP_ICM_INPUTNONE_TOOLTIP;Use no input color profile at all.\nUse only in special cases. -!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_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. -!TP_ICM_TONECURVE;Tone curve -!TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. -!TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -!TP_IMPULSEDENOISE_THRESH;Threshold -!TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift -!TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. -!TP_LABCURVE_BRIGHTNESS;Lightness -!TP_LABCURVE_CHROMATICITY;Chromaticity -!TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. -!TP_LABCURVE_CONTRAST;Contrast -!TP_LABCURVE_CURVEEDITOR;Luminance Curve -!TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated -!TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel -!TP_LABCURVE_CURVEEDITOR_A_RANGE3;Red Pastel -!TP_LABCURVE_CURVEEDITOR_A_RANGE4;Red Saturated -!TP_LABCURVE_CURVEEDITOR_B_RANGE1;Blue Saturated -!TP_LABCURVE_CURVEEDITOR_B_RANGE2;Blue Pastel -!TP_LABCURVE_CURVEEDITOR_B_RANGE3;Yellow Pastel -!TP_LABCURVE_CURVEEDITOR_B_RANGE4;Yellow Saturated -!TP_LABCURVE_CURVEEDITOR_CC;CC -!TP_LABCURVE_CURVEEDITOR_CC_RANGE1;Neutral -!TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Dull -!TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel -!TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturated -!TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Chromaticity according to chromaticity C=f(C) -!TP_LABCURVE_CURVEEDITOR_CH;CH -!TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Chromaticity according to hue C=f(H) -!TP_LABCURVE_CURVEEDITOR_CL;CL -!TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L) -!TP_LABCURVE_CURVEEDITOR_HH;HH -!TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H) -!TP_LABCURVE_CURVEEDITOR_LC;LC -!TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C) -!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_LABCURVE_LABEL;L*a*b* Adjustments -!TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones -!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_LENSGEOM_AUTOCROP;Auto-Crop -!TP_LENSGEOM_FILL;Auto-fill -!TP_LENSGEOM_LABEL;Lens / Geometry -!TP_LENSPROFILE_LABEL;Profiled Lens Correction -!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 -!TP_PCVIGNETTE_FEATHER_TOOLTIP;Feathering:\n0 = corners only,\n50 = halfway to center,\n100 = to center. -!TP_PCVIGNETTE_LABEL;Vignette Filter -!TP_PCVIGNETTE_ROUNDNESS;Roundness -!TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Roundness:\n0 = rectangle,\n50 = fitted ellipse,\n100 = circle. -!TP_PCVIGNETTE_STRENGTH;Strength -!TP_PCVIGNETTE_STRENGTH_TOOLTIP;Filter strength in stops (reached in corners). -!TP_PERSPECTIVE_HORIZONTAL;Horizontal -!TP_PERSPECTIVE_LABEL;Perspective -!TP_PERSPECTIVE_VERTICAL;Vertical -!TP_PFCURVE_CURVEEDITOR_CH;Hue -!TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color.\nHigher = more,\nLower = less. -!TP_PREPROCESS_DEADPIXFILT;Dead pixel filter -!TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. -!TP_PREPROCESS_GREENEQUIL;Green equilibration -!TP_PREPROCESS_HOTPIXFILT;Hot pixel filter -!TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. -!TP_PREPROCESS_LABEL;Preprocessing -!TP_PREPROCESS_LINEDENOISE;Line noise filter -!TP_PREPROCESS_NO_FOUND;None found -!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. -!TP_RAWCACORR_AUTO;Auto-correction -!TP_RAWCACORR_CABLUE;Blue -!TP_RAWCACORR_CARED;Red -!TP_RAWCACORR_CASTR;Strength -!TP_RAWEXPOS_BLACKS;Black Levels -!TP_RAWEXPOS_BLACK_0;Green 1 (lead) -!TP_RAWEXPOS_BLACK_1;Red -!TP_RAWEXPOS_BLACK_2;Blue -!TP_RAWEXPOS_BLACK_3;Green 2 -!TP_RAWEXPOS_BLACK_BLUE;Blue -!TP_RAWEXPOS_BLACK_GREEN;Green -!TP_RAWEXPOS_BLACK_RED;Red -!TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation -!TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAWEXPOS_TWOGREEN;Link greens -!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_DCBENHANCE;DCB enhancement -!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/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 -!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/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 -!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. -!TP_RAW_MONO;Mono -!TP_RAW_NONE;None (Shows sensor pattern) -!TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection -!TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. -!TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames -!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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental -!TP_RAW_PIXELSHIFTGREEN;Check green channel for motion -!TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask -!TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask -!TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts -!TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold -!TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 -!TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. -!TP_RAW_PIXELSHIFTMM_AUTO;Automatic -!TP_RAW_PIXELSHIFTMM_CUSTOM;Custom -!TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size -!TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction -!TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE -!TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 -!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask -!TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. -!TP_RAW_PIXELSHIFTSIGMA;Blur radius -!TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. -!TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions -!TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!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 -!TP_RAW_VNG4;VNG4 -!TP_RESIZE_APPLIESTO;Applies to: -!TP_RESIZE_CROPPEDAREA;Cropped Area -!TP_RESIZE_FITBOX;Bounding Box -!TP_RESIZE_FULLIMAGE;Full Image -!TP_RESIZE_HEIGHT;Height -!TP_RESIZE_LANCZOS;Lanczos -!TP_RESIZE_SPECIFY;Specify: -!TP_RESIZE_WIDTH;Width -!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 -!TP_RETINEX_GAIN;Gain -!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_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. -!TP_RETINEX_GAMMA;Gamma -!TP_RETINEX_GAMMA_FREE;Free -!TP_RETINEX_GAMMA_HIGH;High -!TP_RETINEX_GAMMA_LOW;Low -!TP_RETINEX_GAMMA_MID;Middle -!TP_RETINEX_GAMMA_NONE;None -!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). -!TP_RETINEX_GRAD;Transmission gradient -!TP_RETINEX_GRADS;Strength gradient -!TP_RETINEX_GRADS_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Strength is reduced when iterations increase, and conversely. -!TP_RETINEX_GRAD_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Variance and Threshold are reduced when iterations increase, and conversely. -!TP_RETINEX_HIGH;High -!TP_RETINEX_HIGHLIG;Highlight -!TP_RETINEX_HIGHLIGHT;Highlight threshold -!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. -!TP_RETINEX_HSLSPACE_LIN;HSL-Linear -!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic -!TP_RETINEX_ITER;Iterations (Tone-mapping) -!TP_RETINEX_ITERF;Tone mapping -!TP_RETINEX_ITER_TOOLTIP;Simulate a tone-mapping operator.\nHigh values increase the processing time. -!TP_RETINEX_LABEL;Retinex -!TP_RETINEX_LABEL_MASK;Mask -!TP_RETINEX_LABSPACE;L*a*b* -!TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method -!TP_RETINEX_MAP_GAUS;Gaussian mask -!TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) -!TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) -!TP_RETINEX_MAP_METHOD_TOOLTIP;Use the mask generated by the Gaussian function above (Radius, Method) to reduce halos and artifacts.\n\nCurve only: apply a diagonal contrast curve on the mask.\nBeware of artifacts!\n\nGaussian mask: generate and use a Gaussian blur of the original mask.\nQuick.\n\nSharp mask: generate and use a wavelet on the original mask.\nSlow. -!TP_RETINEX_MAP_NONE;None -!TP_RETINEX_MEDIAN;Transmission median filter -!TP_RETINEX_METHOD;Method -!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights. -!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2 -!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture. -!TP_RETINEX_NEIGHBOR;Radius -!TP_RETINEX_NEUTRAL;Reset -!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values. -!TP_RETINEX_OFFSET;Offset (brightness) -!TP_RETINEX_SCALES;Gaussian gradient -!TP_RETINEX_SCALES_TOOLTIP;If slider at 0, all iterations are identical.\nIf > 0 Scale and radius are reduced when iterations increase, and conversely. -!TP_RETINEX_SETTINGS;Settings -!TP_RETINEX_SKAL;Scale -!TP_RETINEX_SLOPE;Free gamma slope -!TP_RETINEX_STRENGTH;Strength -!TP_RETINEX_THRESHOLD;Threshold -!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss. -!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4 -!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2 -!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map. -!TP_RETINEX_TRANF;Transmission -!TP_RETINEX_TRANSMISSION;Transmission map -!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_UNIFORM;Uniform -!TP_RETINEX_VARIANCE;Contrast -!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts. -!TP_RETINEX_VIEW;Process -!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_RETINEX_VIEW_NONE;Standard -!TP_RETINEX_VIEW_TRAN;Transmission - Auto -!TP_RETINEX_VIEW_TRAN2;Transmission - Fixed -!TP_RETINEX_VIEW_UNSHARP;Unsharp mask -!TP_RGBCURVES_BLUE;B -!TP_RGBCURVES_CHANNEL;Channel -!TP_RGBCURVES_GREEN;G -!TP_RGBCURVES_LABEL;RGB Curves -!TP_RGBCURVES_LUMAMODE;Luminosity mode -!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_RGBCURVES_RED;R -!TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter -!TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask -!TP_SHARPENEDGE_AMOUNT;Quantity -!TP_SHARPENEDGE_LABEL;Edges -!TP_SHARPENEDGE_PASSES;Iterations -!TP_SHARPENEDGE_THREE;Luminance only -!TP_SHARPENMICRO_AMOUNT;Quantity -!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_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 -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE1;Red/Purple -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Red -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE3;Red/Yellow -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE4;Yellow -!TP_VIBRANCE_CURVEEDITOR_SKINTONES_TOOLTIP;Hue according to hue H=f(H) -!TP_VIBRANCE_LABEL;Vibrance -!TP_VIBRANCE_PASTELS;Pastel Tones -!TP_VIBRANCE_PASTSATTOG;Link pastel and saturated tones -!TP_VIBRANCE_PROTECTSKINS;Protect skin-tones -!TP_VIBRANCE_PSTHRESHOLD;Pastel/saturated tones threshold -!TP_VIBRANCE_PSTHRESHOLD_SATTHRESH;Saturation threshold -!TP_VIBRANCE_PSTHRESHOLD_TOOLTIP;The vertical axis represents pastel tones at the bottom and saturated tones at the top.\nThe horizontal axis represents the saturation range. -!TP_VIBRANCE_PSTHRESHOLD_WEIGTHING;Pastel/saturated transition's weighting -!TP_VIBRANCE_SATURATED;Saturated Tones -!TP_VIGNETTING_CENTER;Center -!TP_VIGNETTING_CENTER_X;Center X -!TP_VIGNETTING_CENTER_Y;Center Y -!TP_VIGNETTING_STRENGTH;Strength -!TP_WAVELET_1;Level 1 -!TP_WAVELET_2;Level 2 -!TP_WAVELET_3;Level 3 -!TP_WAVELET_4;Level 4 -!TP_WAVELET_5;Level 5 -!TP_WAVELET_6;Level 6 -!TP_WAVELET_7;Level 7 -!TP_WAVELET_8;Level 8 -!TP_WAVELET_9;Level 9 -!TP_WAVELET_APPLYTO;Apply To -!TP_WAVELET_AVOID;Avoid color shift -!TP_WAVELET_B0;Black -!TP_WAVELET_B1;Grey -!TP_WAVELET_B2;Residual -!TP_WAVELET_BACKGROUND;Background -!TP_WAVELET_BACUR;Curve -!TP_WAVELET_BALANCE;Contrast balance d/v-h -!TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified. -!TP_WAVELET_BALCHRO;Chroma balance -!TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance. -!TP_WAVELET_BANONE;None -!TP_WAVELET_BASLI;Slider -!TP_WAVELET_BATYPE;Contrast balance method -!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_CCURVE;Local contrast -!TP_WAVELET_CH1;Whole chroma range -!TP_WAVELET_CH2;Saturated/pastel -!TP_WAVELET_CH3;Link contrast levels -!TP_WAVELET_CHCU;Curve -!TP_WAVELET_CHR;Chroma-contrast link strength -!TP_WAVELET_CHRO;Saturated/pastel threshold -!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. -!TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "chroma-contrast link strength" -!TP_WAVELET_CHSL;Sliders -!TP_WAVELET_CHTYPE;Chrominance method -!TP_WAVELET_COLORT;Opacity Red-Green -!TP_WAVELET_COMPCONT;Contrast -!TP_WAVELET_COMPGAMMA;Compression gamma -!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram. -!TP_WAVELET_COMPTM;Tone mapping -!TP_WAVELET_CONTEDIT;'After' contrast curve -!TP_WAVELET_CONTR;Gamut -!TP_WAVELET_CONTRA;Contrast -!TP_WAVELET_CONTRAST_MINUS;Contrast - -!TP_WAVELET_CONTRAST_PLUS;Contrast + -!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image. -!TP_WAVELET_CTYPE;Chrominance control -!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). -!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue) -!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero. -!TP_WAVELET_CURVEEDITOR_CL;L -!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment. -!TP_WAVELET_CURVEEDITOR_HH;HH -!TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue. -!TP_WAVELET_DALL;All directions -!TP_WAVELET_DAUB;Edge performance -!TP_WAVELET_DAUB2;D2 - low -!TP_WAVELET_DAUB4;D4 - standard -!TP_WAVELET_DAUB6;D6 - standard plus -!TP_WAVELET_DAUB10;D10 - medium -!TP_WAVELET_DAUB14;D14 - high -!TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the firsts levels. However the quality is not strictly related to this coefficient and can vary with images and uses. -!TP_WAVELET_DONE;Vertical -!TP_WAVELET_DTHR;Diagonal -!TP_WAVELET_DTWO;Horizontal -!TP_WAVELET_EDCU;Curve -!TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima -!TP_WAVELET_EDGE;Edge Sharpness -!TP_WAVELET_EDGEAMPLI;Base amplification -!TP_WAVELET_EDGEDETECT;Gradient sensitivity -!TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) -!TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection) -!TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky. -!TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise. -!TP_WAVELET_EDGESENSI;Edge sensitivity -!TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. -!TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. -!TP_WAVELET_EDRAD;Radius -!TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. -!TP_WAVELET_EDSL;Threshold Sliders -!TP_WAVELET_EDTYPE;Local contrast method -!TP_WAVELET_EDVAL;Strength -!TP_WAVELET_FINAL;Final Touchup -!TP_WAVELET_FINEST;Finest -!TP_WAVELET_HIGHLIGHT;Highlight luminance range -!TP_WAVELET_HS1;Whole luminance range -!TP_WAVELET_HS2;Shadows/Highlights -!TP_WAVELET_HUESKIN;Skin hue -!TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -!TP_WAVELET_HUESKY;Sky hue -!TP_WAVELET_HUESKY_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect. -!TP_WAVELET_ITER;Delta balance levels -!TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight: reduce low levels and increase high levels. -!TP_WAVELET_LABEL;Wavelet Levels -!TP_WAVELET_LARGEST;Coarsest -!TP_WAVELET_LEVCH;Chroma -!TP_WAVELET_LEVDIR_ALL;All levels in all directions -!TP_WAVELET_LEVDIR_INF;Below or equal the level -!TP_WAVELET_LEVDIR_ONE;One level -!TP_WAVELET_LEVDIR_SUP;Above the level -!TP_WAVELET_LEVELS;Wavelet levels -!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of detail levels the image is to be decomposed into. More levels require more RAM and require a longer processing time. -!TP_WAVELET_LEVF;Contrast -!TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1 -!TP_WAVELET_LEVONE;Level 2 -!TP_WAVELET_LEVTHRE;Level 4 -!TP_WAVELET_LEVTWO;Level 3 -!TP_WAVELET_LEVZERO;Level 1 -!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength -!TP_WAVELET_LIPST;Enhanced algoritm -!TP_WAVELET_LOWLIGHT;Shadow luminance range -!TP_WAVELET_MEDGREINF;First level -!TP_WAVELET_MEDI;Reduce artifacts in blue sky -!TP_WAVELET_MEDILEV;Edge detection -!TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine. -!TP_WAVELET_NEUTRAL;Neutral -!TP_WAVELET_NOIS;Denoise -!TP_WAVELET_NOISE;Denoise and Refine -!TP_WAVELET_NPHIGH;High -!TP_WAVELET_NPLOW;Low -!TP_WAVELET_NPNONE;None -!TP_WAVELET_NPTYPE;Neighboring pixels -!TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced. -!TP_WAVELET_OPACITY;Opacity Blue-Yellow -!TP_WAVELET_OPACITYW;Contrast balance d/v-h curve -!TP_WAVELET_OPACITYWL;Final local contrast -!TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right. -!TP_WAVELET_PASTEL;Pastel chroma -!TP_WAVELET_PROC;Process -!TP_WAVELET_RE1;Reinforced -!TP_WAVELET_RE2;Unchanged -!TP_WAVELET_RE3;Reduced -!TP_WAVELET_RESCHRO;Chroma -!TP_WAVELET_RESCON;Shadows -!TP_WAVELET_RESCONH;Highlights -!TP_WAVELET_RESID;Residual Image -!TP_WAVELET_SAT;Saturated chroma -!TP_WAVELET_SETTINGS;Wavelet Settings -!TP_WAVELET_SKIN;Skin targetting/protection -!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 -!TP_WAVELET_THRESHOLD2;Shadow levels -!TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value). -!TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels. -!TP_WAVELET_THRH;Highlights threshold -!TP_WAVELET_TILESBIG;Big tiles -!TP_WAVELET_TILESFULL;Full image -!TP_WAVELET_TILESIZE;Tiling method -!TP_WAVELET_TILESLIT;Little tiles -!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. -!TP_WAVELET_TMSTRENGTH;Compression strength -!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. -!TP_WAVELET_TMTYPE;Compression method -!TP_WAVELET_TON;Toning -!TP_WBALANCE_CLOUDY;Cloudy -!TP_WBALANCE_DAYLIGHT;Daylight (sunny) -!TP_WBALANCE_EQBLUERED;Blue/Red equalizer -!TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behavior of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable. -!TP_WBALANCE_FLASH55;Leica -!TP_WBALANCE_FLASH60;Standard, Canon, Pentax, Olympus -!TP_WBALANCE_FLASH65;Nikon, Panasonic, Sony, Minolta -!TP_WBALANCE_FLASH_HEADER;Flash -!TP_WBALANCE_FLUO1;F1 - Daylight -!TP_WBALANCE_FLUO2;F2 - Cool White -!TP_WBALANCE_FLUO3;F3 - White -!TP_WBALANCE_FLUO4;F4 - Warm White -!TP_WBALANCE_FLUO5;F5 - Daylight -!TP_WBALANCE_FLUO6;F6 - Lite White -!TP_WBALANCE_FLUO7;F7 - D65 Daylight Simulator -!TP_WBALANCE_FLUO8;F8 - D50 / Sylvania F40 Design -!TP_WBALANCE_FLUO9;F9 - Cool White Deluxe -!TP_WBALANCE_FLUO10;F10 - Philips TL85 -!TP_WBALANCE_FLUO11;F11 - Philips TL84 -!TP_WBALANCE_FLUO12;F12 - Philips TL83 -!TP_WBALANCE_FLUO_HEADER;Fluorescent -!TP_WBALANCE_GTI;GTI -!TP_WBALANCE_HMI;HMI -!TP_WBALANCE_JUDGEIII;JudgeIII -!TP_WBALANCE_LAMP_HEADER;Lamp -!TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 -!TP_WBALANCE_LED_HEADER;LED -!TP_WBALANCE_LED_LSI;LSI Lumelex 2040 -!TP_WBALANCE_SHADE;Shade -!TP_WBALANCE_SOLUX35;Solux 3500K -!TP_WBALANCE_SOLUX41;Solux 4100K -!TP_WBALANCE_SOLUX47;Solux 4700K (vendor) -!TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -!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". -!TP_WBALANCE_TUNGSTEN;Tungsten -!TP_WBALANCE_WATER1;UnderWater 1 -!TP_WBALANCE_WATER2;UnderWater 2 -!TP_WBALANCE_WATER_HEADER;UnderWater -!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_ZOOMIN;Zoom In\nShortcut: + -!ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - +!CURVEEDITOR_CATMULLROM;Flexible +!DYNPROFILEEDITOR_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles +!GENERAL_CURRENT;Current +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!PARTIALPASTE_DEHAZE;Haze removal +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) +!PREFERENCES_TAB_PERFORMANCE;Performance +!SAVEDLG_FILEFORMAT_FLOAT; floating-point +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) +!TP_COLORTONING_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_IMAGENUM_SN;SN mode +!TP_RETINEX_CONTEDIT_MAP;Equalizer +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. +!TP_RETINEX_MAP;Method +!TP_SHARPENING_BLUR;Blur radius +!TP_TM_FATTAL_THRESHOLD;Detail +!TP_WBALANCE_PICKER;Pick diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 7737d6578..f36bbe194 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -5,17 +5,22 @@ #05 2010-11-01 Ilia Popov #06 2012-07-17 Roman Milanskij #07 2014-02-12 Kostia (Kildor) Romanov +#08 2018-02-10 Kostia (Kildor) Romanov +#09 2018-12-13 Kostia (Kildor) Romanov ABOUT_TAB_BUILD;Версия ABOUT_TAB_CREDITS;Авторы ABOUT_TAB_LICENSE;Лицензия ABOUT_TAB_RELEASENOTES;Примечания к выпуску ABOUT_TAB_SPLASH;Заставка -ADJUSTER_RESET_TO_DEFAULT;Сбросить настройки +ADJUSTER_RESET_TO_DEFAULT;Click: Сбросить на значение по умолчанию.\nCtrl+click: Сбросить на начальное значение. BATCHQUEUE_AUTOSTART;Автостарт BATCHQUEUE_AUTOSTARTHINT;Автоматически запускать обработку при добавлении файла в очередь BATCHQUEUE_DESTFILENAME;Имя файла и путь к нему +BATCHQUEUE_STARTSTOPHINT;Начать или остановить обработку изображений в очереди.\n\Горячая клавиша: Ctrl-S BATCH_PROCESSING;Пакетная обработка +CURVEEDITOR_AXIS_IN;I: +CURVEEDITOR_AXIS_OUT;O: CURVEEDITOR_CURVE;Кривая CURVEEDITOR_CURVES;Кривые CURVEEDITOR_CUSTOM;Произвольный @@ -35,13 +40,28 @@ CURVEEDITOR_TOOLTIPLOAD;Загрузить тоновую кривую CURVEEDITOR_TOOLTIPPASTE;Вставить кривую из буфера обмена CURVEEDITOR_TOOLTIPSAVE;Сохранить тоновую кривую CURVEEDITOR_TYPE;Тип: -DIRBROWSER_FOLDERS;Папки +DIRBROWSER_FOLDERS;Каталоги +DONT_SHOW_AGAIN;Больше не показывать это сообщение. +DYNPROFILEEDITOR_DELETE;Удалить +DYNPROFILEEDITOR_EDIT;Редактировать +DYNPROFILEEDITOR_EDIT_RULE;Редактировать правило подбора +DYNPROFILEEDITOR_ENTRY_TOOLTIP;Сопоставление нечувствительно к регистру.\nИспользуйте префикс "re:"\nчтоб ввести регулярное выражение. +DYNPROFILEEDITOR_IMGTYPE_ANY;Любой +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Сдвиг пикселей +DYNPROFILEEDITOR_IMGTYPE_STD;Стандарт +DYNPROFILEEDITOR_MOVE_DOWN;Вниз +DYNPROFILEEDITOR_MOVE_UP;Вверх +DYNPROFILEEDITOR_NEW;Новый +DYNPROFILEEDITOR_NEW_RULE;Создать правило подбора +DYNPROFILEEDITOR_PROFILE;Профиль обработки EDITWINDOW_TITLE;Редактор EXIFFILTER_APERTURE;Диафрагма EXIFFILTER_CAMERA;Камера EXIFFILTER_EXPOSURECOMPENSATION;Компенсация экспозиции (EV) -EXIFFILTER_FILETYPE;Тип фильтра +EXIFFILTER_FILETYPE;Тип файла EXIFFILTER_FOCALLEN;Фокусное расстояние +EXIFFILTER_IMAGETYPE;Тип изображения EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Объектив EXIFFILTER_METADATAFILTER;Включить фильтры метаданных @@ -59,6 +79,7 @@ EXIFPANEL_RESET;Сбросить EXIFPANEL_RESETALL;Сбросить все EXIFPANEL_RESETALLHINT;Сбросить все теги в первоначальные значения EXIFPANEL_RESETHINT;Сбросить выбранные теги в первоначальные значения +EXIFPANEL_SHOWALL;Показать всё EXIFPANEL_SUBDIRECTORY;Подкаталог EXPORT_BYPASS_ALL;Выделить все / Снять выделение EXPORT_BYPASS_DEFRINGE;Пропустить подавление ореолов @@ -70,7 +91,7 @@ EXPORT_BYPASS_RAW_DCB_ENHANCE;Пропустить [raw] расширенный 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;Пропустить контурное повышение резкости @@ -91,10 +112,8 @@ FILEBROWSER_APPLYPROFILE_PARTIAL;Применить - частично FILEBROWSER_AUTODARKFRAME;Автоматический темновой кадр FILEBROWSER_AUTOFLATFIELD;Автоматическое плоское поле FILEBROWSER_BROWSEPATHBUTTONHINT;Нажмите кнопку мыши чтобы перейти к выбранному каталогу -FILEBROWSER_BROWSEPATHHINT;Введите путь для перехода.\nCtrl-O для перехода на диалог ввода текста.\nEnter / Ctrl-Enter (в обозревателе файлов) для перехода;\n\nЯрлыки путей:\n ~ - домашняя папка пользователя\n ! - папка пользователя с изображениями +FILEBROWSER_BROWSEPATHHINT;Введите путь для перехода.\nCtrl-O для перехода на диалог ввода текста.\nEnter / Ctrl-Enter (в обозревателе файлов) для перехода;\n\nЯрлыки путей:\n ~ - домашний каталог пользователя\n ! - каталог пользователя с изображениями FILEBROWSER_CACHE;Кэш -FILEBROWSER_CACHECLEARFROMFULL;Удалить из кэша - полностью -FILEBROWSER_CACHECLEARFROMPARTIAL;Удалить из кэша - частично FILEBROWSER_CLEARPROFILE;Удалить профиль FILEBROWSER_COLORLABEL_TOOLTIP;Color label\n\nUse dropdown menu or Shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_COPYPROFILE;Скопировать профиль @@ -107,8 +126,8 @@ FILEBROWSER_EMPTYTRASH;Очистить корзину FILEBROWSER_EMPTYTRASHHINT;Удалить файлы из корзины без возможности восстановления FILEBROWSER_EXTPROGMENU;Открыть с помощью FILEBROWSER_FLATFIELD;Плоское поле -FILEBROWSER_MOVETODARKFDIR;Переместить в папку темновых кадров -FILEBROWSER_MOVETOFLATFIELDDIR;Переместить в папку с файлами плоских полей +FILEBROWSER_MOVETODARKFDIR;Переместить в каталог темновых кадров +FILEBROWSER_MOVETOFLATFIELDDIR;Переместить в каталог файлов плоских полей FILEBROWSER_NEW_NAME;Новое имя: FILEBROWSER_OPENDEFAULTVIEWER;Программа просмотра в Windows по умолчанию (после обработки) FILEBROWSER_PARTIALPASTEPROFILE;Частичная вставка @@ -132,6 +151,7 @@ FILEBROWSER_POPUPPROCESS;Поместить в очередь на обрабо FILEBROWSER_POPUPPROCESSFAST;Поставить в очередь (Быстрый экспорт) FILEBROWSER_POPUPPROFILEOPERATIONS;Обработка операций профиля FILEBROWSER_POPUPRANK;Рейтинг +FILEBROWSER_POPUPRANK0;Снять FILEBROWSER_POPUPRANK1;Рейтинг 1 * FILEBROWSER_POPUPRANK2;Рейтинг 2 ** FILEBROWSER_POPUPRANK3;Рейтинг 3 *** @@ -145,7 +165,7 @@ FILEBROWSER_POPUPTRASH;Удалить в корзину 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 @@ -153,6 +173,7 @@ FILEBROWSER_RANK3_TOOLTIP;Рейтинг 3 *\nГорячая клавиша: 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,7 +184,8 @@ FILEBROWSER_SHOWCOLORLABEL5HINT;Показать изображения, отм FILEBROWSER_SHOWDIRHINT;Сбросить все фильтры.\nГорячая клавиша: d FILEBROWSER_SHOWEDITEDHINT;Показать измененные изображения.\nГорячая клавиша: 7 FILEBROWSER_SHOWEDITEDNOTHINT;Показать не измененные изображения.\nГорячая клавиша: 6 -FILEBROWSER_SHOWEXIFINFO;Показать информацию EXIF.\nГорячая клавиша: i\n\nГорячая клавиша в режиме Одиночного редактора: Alt-i +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 @@ -171,19 +193,27 @@ FILEBROWSER_SHOWRANK4HINT;Показать изображения с рейти FILEBROWSER_SHOWRANK5HINT;Показать изображения с рейтингом 5.\nГорячая клавиша: 5 FILEBROWSER_SHOWRECENTLYSAVEDHINT;Показать изображения, сохранённые недавно.\nГорячая клавиша: Alt-7 FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Показать изображения, сохранённые давно.\nГорячая клавиша: Alt-6 -FILEBROWSER_SHOWTRASHHINT;Показать содержимое корзины.\nГорячая клавиша: Ctrl-t +FILEBROWSER_SHOWTRASHHINT;Показать содержимое корзины.\nГорячая клавиша: Ctrl-T FILEBROWSER_SHOWUNCOLORHINT;Показать изображения без цветовой метки.\nГорячая клавиша: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Показать изображения без рейтинга\nГорячая клавиша: 0 FILEBROWSER_THUMBSIZE;Размер эскиза -FILEBROWSER_UNRANK_TOOLTIP;Удалить рейтинг\nГорячая клавиша: Shift-~ +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;Отмена GENERAL_CLOSE;Закрыть +GENERAL_CURRENT;Текущий GENERAL_DISABLE;Выключить GENERAL_DISABLED;Выключено GENERAL_ENABLE;Включить @@ -194,16 +224,20 @@ GENERAL_NA;Н/Д GENERAL_NO;Нет GENERAL_NONE;Нет GENERAL_OK;OK +GENERAL_OPEN;Открыть GENERAL_PORTRAIT;Портретный +GENERAL_RESET;Сбросить GENERAL_SAVE;Сохранить +GENERAL_SAVE_AS;Сохранить как... +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;Изменено @@ -223,8 +257,8 @@ HISTORY_MSG_10;Сжатие теней 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;Освещенность: Сжатие теней @@ -236,8 +270,8 @@ HISTORY_MSG_23;Резкость: Порог 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;Деконволюция: Значение @@ -287,7 +321,7 @@ HISTORY_MSG_74;Масштабирование: Величина 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;Масштабирование @@ -299,12 +333,12 @@ HISTORY_MSG_86;Кривая RGB: Яркость 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;Демозаик @@ -312,7 +346,7 @@ HISTORY_MSG_99;Фильтр горячих/битых пикселей 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;Подавление ореолов: радиус @@ -320,21 +354,20 @@ HISTORY_MSG_107;Подавление ореолов: порог 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;Файл темнового кадра HISTORY_MSG_124;Коррекция баланса белого -HISTORY_MSG_125;Сохранение пересветов HISTORY_MSG_126;Файл плоского поля HISTORY_MSG_127;Автовыбор плоского поля HISTORY_MSG_128;Радиус размытия плоского поля @@ -352,21 +385,21 @@ HISTORY_MSG_139;Ур. черного: Синий 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;ТК: Масштаб @@ -375,12 +408,14 @@ HISTORY_MSG_162;Тональная компрессия 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_172;L*a*b*: Ограничение 'ЯЦ' +HISTORY_MSG_173;ПШ: Восстановление деталей HISTORY_MSG_174;CIECAM02 HISTORY_MSG_175;CAM02: Адаптация CAT02 HISTORY_MSG_176;CAM02: Условия просмотра @@ -410,6 +445,7 @@ HISTORY_MSG_199;CAM02: Выходная гистограмма HISTORY_MSG_200;CAM02: Тональное отображение HISTORY_MSG_201;ПШ: Цветность К,З HISTORY_MSG_202;ПШ: Цветность С,Ж +HISTORY_MSG_203;ПШ: Пространство HISTORY_MSG_204;Шагов улучшения LMMSE HISTORY_MSG_205;CAM02: Горячие/битые пиксели HISTORY_MSG_206;CAT02: Автояркость сцены @@ -440,9 +476,7 @@ HISTORY_MSG_231;Ч&Б: Кривая 'До' HISTORY_MSG_232;Ч&Б: Тип кривой 'До' HISTORY_MSG_233;Ч&Б: Кривая 'После' HISTORY_MSG_234;Ч&Б: Тип кривой 'После' -HISTORY_MSG_235;Ч&Б: Автомиксер каналов HISTORY_MSG_236;--неиспользуемый-- -HISTORY_MSG_237;Ч&Б: Миксер HISTORY_MSG_238;ГФ: Растушёвка HISTORY_MSG_239;ГФ: Сила HISTORY_MSG_240;ГФ: Центр @@ -457,10 +491,66 @@ HISTORY_MSG_248;Кривая 'HH' HISTORY_MSG_249;КпУД: Порог HISTORY_MSG_250;ПШ: Улучшенный HISTORY_MSG_251;Ч&Б: Алгоритм +HISTORY_MSG_277;--неиспользуемый-- +HISTORY_MSG_293;Имитация плёнки +HISTORY_MSG_294;Имитация плёнки: Сила +HISTORY_MSG_295;Имитация плёнки: Плёнка +HISTORY_MSG_298;Фильтр битых пикселей +HISTORY_MSG_300;- +HISTORY_MSG_440;КпУД: Метод +HISTORY_MSG_485;Коррекция объектива +HISTORY_MSG_486;Коррекция объектива: Камера +HISTORY_MSG_487;Коррекция объектива: Объектив +HISTORY_MSG_488;Компрессия динамического диапазона +HISTORY_MSG_490;КДД: Величина +HISTORY_MSG_491;Баланс белого +HISTORY_MSG_492;Кривые RGB +HISTORY_MSG_493;Настройки L*a*b* +HISTORY_MSG_CLAMPOOG;Обрезание цвета за пределами охвата +HISTORY_MSG_DEHAZE_DEPTH;Убрать дымку: Глубина +HISTORY_MSG_DEHAZE_ENABLED;Убрать дымку +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Убрать дымку: Маска глубин +HISTORY_MSG_DEHAZE_STRENGTH;Убрать дымку: Сила +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_SOFTLIGHT_ENABLED;Мягкий свет +HISTORY_MSG_SOFTLIGHT_STRENGTH;Мягкий свет: Сила +HISTORY_MSG_TM_FATTAL_ANCHOR;КДД: Привязка HISTORY_NEWSNAPSHOT;Добавить -HISTORY_NEWSNAPSHOT_TOOLTIP;Горячая клавиша: Alt-s +HISTORY_NEWSNAPSHOT_TOOLTIP;Горячая клавиша: Alt-S HISTORY_SNAPSHOT;Снимок HISTORY_SNAPSHOTS;Снимки +ICCPROFCREATOR_ICCVERSION;Версия ICC: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Default +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Blue X +ICCPROFCREATOR_PRIM_BLUY;Blue Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Green X +ICCPROFCREATOR_PRIM_GREY;Green Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Red X +ICCPROFCREATOR_PRIM_REDY;Red Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 IPTCPANEL_CATEGORY;Категория IPTCPANEL_CITY;Город IPTCPANEL_COPYHINT;Копировать данные IPTC в буфер обмена @@ -478,6 +568,7 @@ IPTCPANEL_RESET;Сбросить IPTCPANEL_RESETHINT;Сбросить профиль на значения по умолчанию IPTCPANEL_SOURCE;Источник IPTCPANEL_TITLE;Название +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 @@ -485,6 +576,7 @@ MAIN_BUTTON_NAVSYNC_TOOLTIP;Синхронизировать файловый б 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;Оконный режим @@ -497,7 +589,7 @@ MAIN_FRAME_FILEBROWSER_TOOLTIP;Проводник.\nГорячая клавиш MAIN_FRAME_PLACES;Закладки MAIN_FRAME_PLACES_ADD;Добавить MAIN_FRAME_PLACES_DEL;Удалить -MAIN_FRAME_RECENT;Недавние папки +MAIN_FRAME_RECENT;Недавние каталоги MAIN_MSG_ALREADYEXISTS;Файл уже существует. MAIN_MSG_CANNOTLOAD;Невозможно загрузить изображение MAIN_MSG_CANNOTSAVE;Ошибка при сохранении файла @@ -511,6 +603,8 @@ MAIN_MSG_PATHDOESNTEXIST;Путь\n\n%1\n\nне существует. П 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;Детализация @@ -521,6 +615,7 @@ MAIN_TAB_EXPORT; Экспорт 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 @@ -532,23 +627,36 @@ MAIN_TOOLTIP_BACKCOLOR0;Фоновый цвет предпросмотра: 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: -- +OPTIONS_BUNDLED_MISSING;Встроенный профиль "%1" не найден!\n\nВаша установка может быть повреждена.\n\nБудут использованы внутренние дефолтные значения по умолчанию. +OPTIONS_DEFIMG_MISSING;Профиль по умолчанию для не-raw снимков не найден или не установлен.\n\nПожалуйста, проверьте каталог с профилями, он может отсутствовать или быть повреждён.\n\nБудет использован профиль "%1". +OPTIONS_DEFRAW_MISSING;Профиль по умолчанию для raw снимков не найден или не установлен.\n\nПожалуйста, проверьте каталог с профилями, он может отсутствовать или быть повреждён.\n\nБудет использован профиль "%1". +PARTIALPASTE_ADVANCEDGROUP;Дополнительные параметры PARTIALPASTE_BASICGROUP;Базовые настройки PARTIALPASTE_CACORRECTION;Коррекция C/A PARTIALPASTE_CHANNELMIXER;Смешение каналов @@ -580,18 +688,21 @@ PARTIALPASTE_HSVEQUALIZER;HSV Эквалайзер 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;Перспектива +PARTIALPASTE_PREPROCESS_DEADPIXFILT;Фильтр битых пикселей PARTIALPASTE_PREPROCESS_GREENEQUIL;Выравнивание зелёного канала +PARTIALPASTE_PREPROCESS_HOTPIXFILT;Фильтр горячих пикселей PARTIALPASTE_PREPROCESS_LINEDENOISE;Фильтр полосообразного шума PARTIALPASTE_RAWCACORR_AUTO;Автоматическая коррекция ХА PARTIALPASTE_RAWEXPOS_BLACK;Уровень черного PARTIALPASTE_RAWEXPOS_LINEAR;Коррекция точки белого -PARTIALPASTE_RAWEXPOS_PRESER;Сохранение пересветов PARTIALPASTE_RAWGROUP;Настройки Raw PARTIALPASTE_RAW_DCBENHANCE;Применить расширенный DCB PARTIALPASTE_RAW_DCBITERATIONS;Количество проходов DCB @@ -605,12 +716,21 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Тени/света PARTIALPASTE_SHARPENEDGE;Края PARTIALPASTE_SHARPENING;Повышение резкости PARTIALPASTE_SHARPENMICRO;Микроконтраст -PARTIALPASTE_VIBRANCE;Резонанс +PARTIALPASTE_SOFTLIGHT;Мягкий свет +PARTIALPASTE_TM_FATTAL;Компрессия динамического диапазона +PARTIALPASTE_VIBRANCE;Красочность PARTIALPASTE_VIGNETTING;Коррекция виньетирования PARTIALPASTE_WHITEBALANCE;Баланс белого PREFERENCES_ADD;Добавить +PREFERENCES_APPEARANCE;Внешний вид +PREFERENCES_APPEARANCE_COLORPICKERFONT;Шрифт пипетки +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Цвет маски обрезки +PREFERENCES_APPEARANCE_MAINFONT;Основной шрифт +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Цвет направляющих +PREFERENCES_APPEARANCE_THEME;Тема PREFERENCES_APPLNEXTSTARTUP;нужен перезапуск PREFERENCES_AUTOMONPROFILE;Использовать профиль основного монитора ОС +PREFERENCES_AUTOSAVE_TP_OPEN;Сохранить свёрнутое/развёрнутое состояние при выходе PREFERENCES_BATCH_PROCESSING;Пакетная обработка PREFERENCES_BEHADDALL;Всё в "Добавить" PREFERENCES_BEHADDALLHINT;Выставить все параметры в режим Добавить.\nНастройки параметров в панели пакетной обработки будут дельтой к сохранённым данным @@ -618,24 +738,30 @@ PREFERENCES_BEHAVIOR;Поведение PREFERENCES_BEHSETALL;Всё в "Установить" PREFERENCES_BEHSETALLHINT;Выставить все параметры в режим Установить.\nНастройки параметров в панели пакетной обработки будут абсолютными, будут показаны используемые значения PREFERENCES_BLACKBODY;Лампа накаливания -PREFERENCES_CACHECLEARALL;Удалить все -PREFERENCES_CACHECLEARPROFILES;Удалить параметры обработки -PREFERENCES_CACHECLEARTHUMBS;Удалить эскизы +PREFERENCES_CACHECLEAR;Очистить PREFERENCES_CACHEMAXENTRIES;Максимальное число элементов в кэше PREFERENCES_CACHEOPTS;Параметры кэширования PREFERENCES_CACHETHUMBHEIGHT;Максимальная высота эскиза -PREFERENCES_CIEART;Оптимизация CIECAM02 -PREFERENCES_CIEART_LABEL;Использовать числа с плавающей запятой вместо двойной точности -PREFERENCES_CIEART_TOOLTIP;Если включено, вычисления CIECAM02 будут выполняться в формате плавающей запятой с одинарной точностью вместо использования двойной точности. Это обеспечит небольшое увеличение скорости с несущественной потерей качества. PREFERENCES_CLIPPINGIND;Индикация пересветов/затемнений +PREFERENCES_CLUTSDIR;Каталог файлов HaldCLUT +PREFERENCES_CROP;Режим обрезки +PREFERENCES_CROP_GUIDES;Направляющие, отображающиеся вне режима обрезки +PREFERENCES_CROP_GUIDES_FRAME;Рамка +PREFERENCES_CROP_GUIDES_FULL;Оригинальные +PREFERENCES_CROP_GUIDES_NONE;Нет +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;Формат ключей PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Имя PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Путь к исполняемому файлу -PREFERENCES_CUTOVERLAYBRUSH; Цвет/прозрачность маски обрезки PREFERENCES_D50;5000K +PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K PREFERENCES_D65;6500K @@ -643,8 +769,9 @@ 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_DIRECTORIES;Каталоги PREFERENCES_DIRHOME;Домашний каталог PREFERENCES_DIRLAST;Последний каталог PREFERENCES_DIROTHER;Другой @@ -653,10 +780,9 @@ PREFERENCES_DIRSOFTWARE;Каталог установки PREFERENCES_EDITORLAYOUT;Тип редактора PREFERENCES_EXTERNALEDITOR;Внешний редактор PREFERENCES_FBROWSEROPTS;Настройки -PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Однорядная панель обозревателя файлов (отключите для экранов с низким разрешением) PREFERENCES_FILEFORMAT;Формат файлов PREFERENCES_FLATFIELDFOUND;Найдено -PREFERENCES_FLATFIELDSDIR;Папка с файлами плоских полей +PREFERENCES_FLATFIELDSDIR;Каталог файлов плоских полей PREFERENCES_FLATFIELDSHOTS;снимков PREFERENCES_FLATFIELDTEMPLATES;шаблонов PREFERENCES_FLUOF2;Лампа дневного света F2 @@ -676,12 +802,15 @@ PREFERENCES_GREY40;Yb=40 CIE L#70 PREFERENCES_HISTOGRAMPOSITIONLEFT;Гистограмма на левой панели PREFERENCES_HLTHRESHOLD;Порог срабатывания пересветов PREFERENCES_ICCDIR;Каталог ICC профилей -PREFERENCES_IMPROCPARAMS;Обработка по умолчанию +PREFERENCES_IMPROCPARAMS;Профиль обработки по умолчанию +PREFERENCES_INSPECT_LABEL;Предпросмотр +PREFERENCES_INSPECT_MAXBUFFERS_LABEL;Максимальное количество кешированных файлов PREFERENCES_INTENT_ABSOLUTE;Абсолютное колориметрическое PREFERENCES_INTENT_PERCEPTUAL;Перцепционное PREFERENCES_INTENT_RELATIVE;Относительное колориметрическое PREFERENCES_INTENT_SATURATION;По насыщенности PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Показывать встроенную миниатюру если файл не отредактирован +PREFERENCES_LANG;Язык PREFERENCES_LANGAUTODETECT;Использовать язык ОС PREFERENCES_MENUGROUPEXTPROGS;Группа "Открыть с помощью" PREFERENCES_MENUGROUPFILEOPERATIONS;Группа "Действия с файлами" @@ -690,13 +819,15 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Группа "Действия с про PREFERENCES_MENUGROUPRANK;Группа "Рейтинг" PREFERENCES_MENUOPTIONS;Настройки контекстного меню PREFERENCES_METADATA;Метаданные +PREFERENCES_MONITOR;Монитор PREFERENCES_MULTITAB;Много вкладок PREFERENCES_MULTITABDUALMON;Много вкладок, на втором мониторе (если возможно) +PREFERENCES_NAVIGATIONFRAME;Навигация 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;Коэффициент @@ -704,19 +835,24 @@ PREFERENCES_PARSEDEXT;Расширения для предпросмотра PREFERENCES_PARSEDEXTADD;Добавить PREFERENCES_PARSEDEXTADDHINT;Введите расширение и нажмите на эту кнопку, чтобы добавить его в список PREFERENCES_PARSEDEXTDELHINT;Удаление выбранных расширений из списка +PREFERENCES_PERFORMANCE_THREADS;Потоки +PREFERENCES_PERFORMANCE_THREADS_LABEL;Максимальное количество потоков для шумоподавления и уровней вейвлетов (0 для автовыбора) +PREFERENCES_PREVDEMO;Метод демозаика для превью +PREFERENCES_PREVDEMO_FAST;Быстрый +PREFERENCES_PREVDEMO_LABEL;Метод демозаика, используемый для превью при масштабе < 100% +PREFERENCES_PREVDEMO_SIDECAR;Как в PP3 PREFERENCES_PROFILEHANDLING;Профиль обработки PREFERENCES_PROFILELOADPR;Приоритет загрузки профиля обработки PREFERENCES_PROFILEPRCACHE;загружать из кэша PREFERENCES_PROFILEPRFILE;загружать из каталога с файлом PREFERENCES_PROFILESAVECACHE;Сохранять профиль обработки в кэше PREFERENCES_PROFILESAVEINPUT;Сохранять профиль обработки в одном каталоге с исходным файлом +PREFERENCES_PROFILE_NONE;Нет PREFERENCES_PROPERTY;Свойство PREFERENCES_PSPATH;Каталог установки Adobe Photoshop -PREFERENCES_RGBDTL_LABEL;Максимальное количество потоков для подавления шума -PREFERENCES_RGBDTL_TOOLTIP;Подавление шума требует в среднем 128М оперативной памяти для изображения в 10MPix или 512M для 40MPix и дополнительно 128MB на поток. Чем больше потоков будет запущено одновременно, тем быстрее будет расчёт. Оставьте 0 чтоб использовать максимально возможное количество потоков. -PREFERENCES_SELECTFONT;Выбрать шрифт +PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Запоминает масштаб и позицию текущего изображения при открытии нового.\n\nЭта настройка работает только при типе редактора "Одна вкладка" и выставлении настройки "Метод демозаика, используемый для превью при масштабе < 100%" в "Как в PP3". +PREFERENCES_SAVE_TP_OPEN_NOW;Сохранить сейчас PREFERENCES_SELECTLANG;Выбрать язык -PREFERENCES_SELECTTHEME;Выбрать тему PREFERENCES_SET;Установить PREFERENCES_SHOWBASICEXIF;Показывать основные данные Exif PREFERENCES_SHOWDATETIME;Показывать дату и время @@ -725,19 +861,24 @@ PREFERENCES_SHTHRESHOLD;Порог обрезки теней 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_SND_THRESHOLDSECS;после, секунд 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_THUMBNAIL_INSPECTOR_JPEG;Встроенное jpeg превью +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Показывать изображение +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Нейтрально обработанный raw-файл +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Встроенный полноразмерный jpeg, иначе нейтральный raw PREFERENCES_TP_LABEL;Панель инструментов: -PREFERENCES_TP_USEICONORTEXT;Использовать иконки вместо текста PREFERENCES_TP_VSCROLLBAR;Спрятать вертикальную полосу прокрутки +PREFERENCES_TUNNELMETADATA;Копировать данные Exif/IPTC/XMP неизменённо PREFERENCES_USEBUNDLEDPROFILES;Использовать предустановленный профиль PREFERENCES_VIEW;ББ устройства вывода (монитор, проектор и т.д.) PREFERENCES_WORKFLOW;Стиль работы @@ -755,10 +896,10 @@ PROFILEPANEL_PINTERNAL;Нейтральный PROFILEPANEL_PLASTSAVED;Последний сохранённый PROFILEPANEL_SAVEDLGLABEL;Сохранить профиль обработки... PROFILEPANEL_SAVEPPASTE;Параметры для сохранения -PROFILEPANEL_TOOLTIPCOPY;Скопировать текущий профиль в буфер обмена.\nCtrl+click для выбора параметров для копирования -PROFILEPANEL_TOOLTIPLOAD;Загрузить профиль из файла\nCtrl+click для выбора параметров для загрузки -PROFILEPANEL_TOOLTIPPASTE;Вставить профиль из буфера обмена\nCtrl+click для выбора параметров для вставки -PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\nCtrl+click для выбора параметров для сохранения +PROFILEPANEL_TOOLTIPCOPY;Скопировать текущий профиль в буфер обмена.\nCtrl+Click для выбора параметров для копирования +PROFILEPANEL_TOOLTIPLOAD;Загрузить профиль из файла\nCtrl+Click для выбора параметров для загрузки +PROFILEPANEL_TOOLTIPPASTE;Вставить профиль из буфера обмена\nCtrl+Click для выбора параметров для вставки +PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\nCtrl+Click для выбора параметров для сохранения PROGRESSBAR_LOADING;Загрузка изображения... PROGRESSBAR_LOADINGTHUMBS;Загрузка миниатюр... PROGRESSBAR_LOADJPEG;Чтение JPEG файла... @@ -773,8 +914,11 @@ PROGRESSBAR_SAVEPNG;Сохранение PNG файла... PROGRESSBAR_SAVETIFF;Сохранение TIFF файла... PROGRESSBAR_SNAPSHOT_ADDED;Снимок добавлен PROGRESSDLG_PROFILECHANGEDINBROWSER;Профиль изменён в браузере +QINFO_FRAMECOUNT;%2 кадров +QINFO_HDR;HDR / %2 кадр(ов) QINFO_ISO;ISO QINFO_NOEXIF;Данные Exif недоступны +QINFO_PIXELSHIFT;Сдвиг пикселей / %2 frame(s) SAVEDLG_AUTOSUFFIX;Автоматически добавлять суффикс если файл существует SAVEDLG_FILEFORMAT;Формат файла SAVEDLG_FORCEFORMATOPTS;Принудительно установить настройки сохранения @@ -799,7 +943,7 @@ THRESHOLDSELECTOR_HINT;Зажмите клавишу Shift для пер 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 @@ -808,7 +952,6 @@ TP_BWMIX_ALGO_LI;Линейный TP_BWMIX_ALGO_SP;Специальные эффекты TP_BWMIX_ALGO_TOOLTIP;Линейный: выдаст нормальный линейный отклик.\nСпециальные эффекты: выдаст специальные эффекты путём смешивания каналов нелинейно. TP_BWMIX_AUTOCH;Автоопределение -TP_BWMIX_AUTOCH_TIP;Автоматическое вычисление значений миксера каналов TP_BWMIX_CC_ENABLED;Подстраивать дополнительные цвета TP_BWMIX_CC_TOOLTIP;Включите для автоматической регулировки дополнительных цветов в модели ROYGCBPM TP_BWMIX_CHANNEL;Эквалайзер яркости @@ -816,7 +959,7 @@ TP_BWMIX_CURVEEDITOR1;Кривая "До" 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;Синий-Зелёный @@ -835,9 +978,8 @@ TP_BWMIX_MET;Метод TP_BWMIX_MET_CHANMIX;Миксер каналов TP_BWMIX_MET_DESAT;Обесцвечивание TP_BWMIX_MET_LUMEQUAL;Яркостный Эквалайзер -TP_BWMIX_MIXC;Миксер +TP_BWMIX_MIXC;Миксер каналов TP_BWMIX_NEUTRAL;Сбросить -TP_BWMIX_NEUTRAL_TIP;Сбросить все значения (фильтр, миксер каналов) на умолчательные TP_BWMIX_RGBLABEL;К: %1%% З: %2%% С: %3%% Итог: %4%% TP_BWMIX_RGBLABEL_HINT;Итоговые значения RGB, учитывающие все настройки миксера.\nИтог показывает сумму применённых значений RGB:\n- всегда 100% в относительных режимах\n- выше (светлее) или ниже (темнее) в абсолютных режимах. TP_BWMIX_RGB_TOOLTIP;Смешивание каналов RGB. Используйте пресеты для руководства.\nУчтите что отрицательные значения могут вызвать искажения или неустойчивое поведение. @@ -854,6 +996,10 @@ TP_BWMIX_SET_NORMCONTAST;Нормальный контраст 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;Ч&Б Стандарт @@ -868,60 +1014,58 @@ TP_CHMIXER_LABEL;Цветовые каналы 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. -TP_COLORAPP_ADAPTVIEWING;Яркость при просмотре (кд/м²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Абсолютная яркость при просмотре.\n(Обычно 16 кд/м²) -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Если галка отмечена (рекомендуется) RT расчитывает оптимальное значение из данных Exif.\nДля ручного редактирования необходимо предварительно снять галку. TP_COLORAPP_ALGO;Алгоритм TP_COLORAPP_ALGO_ALL;Все 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;--неиспользуемый-- -TP_COLORAPP_SHARPCIE_TOOLTIP;--неиспользуемый-- +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Абсолютная яркость при просмотре.\n(Обычно 16 кд/м²) TP_CROP_FIXRATIO;Пропорция: TP_CROP_GTDIAGONALS;Правило диагоналей TP_CROP_GTEPASSPORT;Биометрический паспорт TP_CROP_GTFRAME;Рамка TP_CROP_GTGRID;Сетка +TP_CROP_GTHARMMEANS;Гармоническое среднее TP_CROP_GTNONE;Нет TP_CROP_GTRULETHIRDS;Правило третей -TP_CROP_GUIDETYPE;Тип направляющей: +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_RESETCROP;Сбросить +TP_CROP_SELECTCROP;Выбрать TP_CROP_W;Ширина TP_CROP_X;x TP_CROP_Y;y @@ -930,20 +1074,48 @@ TP_DARKFRAME_LABEL;Темновой кадр TP_DEFRINGE_LABEL;Подавление ореолов TP_DEFRINGE_RADIUS;Радиус TP_DEFRINGE_THRESHOLD;Порог +TP_DEHAZE_DEPTH;Глубина +TP_DEHAZE_LABEL;Убрать дымку +TP_DEHAZE_SHOW_DEPTH_MAP;Показать маску глубин +TP_DEHAZE_STRENGTH;Сила +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_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;Lab +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 так и Lab.\n\nДля не-raw будет использован Lab режим вне зависимости от выбора. +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;Контраст- @@ -954,15 +1126,16 @@ TP_DIRPYREQUALIZER_THRESHOLD;Порог 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_EXPOSURE_AUTOLEVELS;Автоуровни TP_EXPOSURE_AUTOLEVELS_TIP;Переключение выполнения автоуровней для автоматической установки параметров экспозиции на основе анализа изображения TP_EXPOSURE_BLACKLEVEL;Уровень чёрного TP_EXPOSURE_BRIGHTNESS;Яркость +TP_EXPOSURE_CLAMPOOG;Обрезать цвета за пределами охвата TP_EXPOSURE_CLIP;Ограничить TP_EXPOSURE_CLIP_TIP;Часть пикселей, обрезаемая операцией автоматических уровней TP_EXPOSURE_COMPRHIGHLIGHTS;Сжатие светов @@ -973,14 +1146,21 @@ TP_EXPOSURE_CURVEEDITOR1;Тональная кривая 1 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;Тип размытия @@ -1020,11 +1200,12 @@ TP_HSVEQUALIZER_SAT;S 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;По умолчанию для камеры TP_ICM_INPUTCAMERAICC;Автоопределенный для камеры -TP_ICM_INPUTCAMERAICC_TOOLTIP;Использовать входящий цветовой профиль RawTherapee (DCP или ICC) для конкретной камеры. Эти профили более точные, чем простые матрицы. Доступны не для всех камер. Эти профили хранятся в папках /iccprofiles/input и /dcpprofiles и автоматически выбираются на основе сопоставления имени файла и названия модели камеры. +TP_ICM_INPUTCAMERAICC_TOOLTIP;Использовать входящий цветовой профиль RawTherapee (DCP или ICC) для конкретной камеры. Эти профили более точные, чем простые матрицы. Доступны не для всех камер. Эти профили хранятся в каталогах /iccprofiles/input и /dcpprofiles и автоматически выбираются на основе сопоставления имени файла и названия модели камеры. TP_ICM_INPUTCAMERA_TOOLTIP;Использовать простую цветовую матрицу из dcraw, улучшенную версию от RawTherapee (если она доступна для соотв. камеры) или встроенную в DNG. TP_ICM_INPUTCUSTOM;Пользовательский TP_ICM_INPUTCUSTOM_TOOLTIP;Выбор собственного файла профиля DCP/ICC для камеры @@ -1075,7 +1256,7 @@ TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Яркость в соответствии с 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;Защита красного и тонов кожи @@ -1083,10 +1264,26 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Защита красных тонов и оттен TP_LENSGEOM_AUTOCROP;Автокадрирование TP_LENSGEOM_FILL;Автозаполнение TP_LENSGEOM_LABEL;Геометрия +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Автоматически +TP_LENSPROFILE_CORRECTION_LCPFILE;Файл LCP +TP_LENSPROFILE_CORRECTION_MANUAL;Вручную TP_LENSPROFILE_LABEL;Профиль коррекции объектива -TP_LENSPROFILE_USECA;Корректировать ХА -TP_LENSPROFILE_USEDIST;Корректировать дисторсию -TP_LENSPROFILE_USEVIGN;Корректировать виньетирование +TP_LENSPROFILE_LENS_WARNING;Внимание: кроп-фактор, используемый для профилирования объектива больше чем кроп-фактор камеры. Результат может быть ошибочным. +TP_LENSPROFILE_MODE_HEADER;Выбор профиля объектива: +TP_LENSPROFILE_USE_CA;Хроматические абберации +TP_LENSPROFILE_USE_GEOMETRIC;Геометрия +TP_LENSPROFILE_USE_HEADER;Выбор искажений для коррекции: +TP_LENSPROFILE_USE_VIGNETTING;Виньетирование +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=к центру. @@ -1100,30 +1297,63 @@ TP_PERSPECTIVE_LABEL;Перспектива TP_PERSPECTIVE_VERTICAL;Вертикальная TP_PFCURVE_CURVEEDITOR_CH;Цвет TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Контроль силы подавления в зависимости от цвета.\nВыше - сильней, ниже - слабей. +TP_PREPROCESS_DEADPIXFILT;Битых пиксели +TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Фильтр пытается подавить битые пиксели. TP_PREPROCESS_GREENEQUIL;Выравнивание зелёного +TP_PREPROCESS_HOTPIXFILT;Горячие пиксели +TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Фильтр пытается подавить горячие пиксели. TP_PREPROCESS_LABEL;Предобработка TP_PREPROCESS_LINEDENOISE;Фильтр линейного шума TP_PREPROCESS_NO_FOUND;Ничего не найдено TP_RAWCACORR_AUTO;Автоматическая коррекция +TP_RAWCACORR_AUTOIT;Подходов +TP_RAWCACORR_AVOIDCOLORSHIFT;Избегать сдвига цветов TP_RAWCACORR_CABLUE;Синий TP_RAWCACORR_CARED;Красный +TP_RAWCACORR_CASTR;Сила TP_RAWEXPOS_BLACKS;Уровни черного +TP_RAWEXPOS_BLACK_0;Зелёный 1 (ведущий) +TP_RAWEXPOS_BLACK_1;Красный +TP_RAWEXPOS_BLACK_2;Синий +TP_RAWEXPOS_BLACK_3;Зелёный 2 +TP_RAWEXPOS_BLACK_BLUE;Синий +TP_RAWEXPOS_BLACK_GREEN;Зелёный +TP_RAWEXPOS_BLACK_RED;Красный TP_RAWEXPOS_LINEAR;Коррекция точки белого -TP_RAWEXPOS_PRESER;Сохранение пересветов +TP_RAWEXPOS_RGB;Красный, Зелёный, Синий 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_RCDVNG4;RCD+VNG4 +TP_RAW_SENSOR_BAYER_LABEL;Сенсор с матрицей Байера +TP_RAW_SENSOR_XTRANS_LABEL;Сенсор с матрицей X-Trans +TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Разрешить увеличение TP_RESIZE_APPLIESTO;Применить к: TP_RESIZE_CROPPEDAREA;Кадрированной области -TP_RESIZE_FITBOX;Ограничивающей рамке +TP_RESIZE_FITBOX;Ограничивающую рамку TP_RESIZE_FULLIMAGE;Полному изображению TP_RESIZE_H;В: TP_RESIZE_HEIGHT;высоту @@ -1135,6 +1365,10 @@ TP_RESIZE_SCALE;Масштаб 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 @@ -1154,11 +1388,12 @@ TP_SHADOWSHLIGHTS_RADIUS;Радиус TP_SHADOWSHLIGHTS_SHADOWS;Тени TP_SHADOWSHLIGHTS_SHARPMASK;Маска резкости TP_SHADOWSHLIGHTS_SHTONALW;Уровень -TP_SHARPENEDGE_AMOUNT;Количество +TP_SHARPENEDGE_AMOUNT;Величина TP_SHARPENEDGE_LABEL;Края TP_SHARPENEDGE_PASSES;Подходы TP_SHARPENEDGE_THREE;Только освещенность TP_SHARPENING_AMOUNT;Величина +TP_SHARPENING_CONTRAST;Порог контраста TP_SHARPENING_EDRADIUS;Радиус TP_SHARPENING_EDTOLERANCE;Границы краёв TP_SHARPENING_HALOCONTROL;Регулировка хром. аберраций @@ -1173,10 +1408,17 @@ TP_SHARPENING_RLD_DAMPING;Ослабление TP_SHARPENING_RLD_ITERATIONS;Повторений TP_SHARPENING_THRESHOLD;Порог TP_SHARPENING_USM;Маска размытия -TP_SHARPENMICRO_AMOUNT;Количество +TP_SHARPENMICRO_AMOUNT;Величина +TP_SHARPENMICRO_CONTRAST;Порог контраста TP_SHARPENMICRO_LABEL;Микроконтраст TP_SHARPENMICRO_MATRIX;Матрица 3×3 вместо 5×5 TP_SHARPENMICRO_UNIFORMITY;Равномерность +TP_SOFTLIGHT_LABEL;Мягкий свет +TP_SOFTLIGHT_STRENGTH;Сила +TP_TM_FATTAL_AMOUNT;Величина +TP_TM_FATTAL_ANCHOR;Якорь +TP_TM_FATTAL_LABEL;Компрессия динамического диапазона +TP_TM_FATTAL_THRESHOLD;Детализация TP_VIBRANCE_AVOIDCOLORSHIFT;Избегать сдвига цветов TP_VIBRANCE_CURVEEDITOR_SKINTONES;ОО TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Оттенки кожи @@ -1185,7 +1427,7 @@ TP_VIBRANCE_CURVEEDITOR_SKINTONES_RANGE2;Красный 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;Сохранить оттенки кожи @@ -1201,6 +1443,8 @@ TP_VIGNETTING_CENTER_Y;Центр Y TP_VIGNETTING_LABEL;Виньетирование TP_VIGNETTING_RADIUS;Радиус TP_VIGNETTING_STRENGTH;Степень +TP_WAVELET_STREN;Сила +TP_WAVELET_STRENGTH;Сила TP_WBALANCE_AUTO;Автоматический TP_WBALANCE_CAMERA;Камера TP_WBALANCE_CLOUDY;Облачно @@ -1235,6 +1479,7 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;Светодиодный TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Метод +TP_WBALANCE_PICKER;Выбрать TP_WBALANCE_SHADE;Тень TP_WBALANCE_SIZE;Размер пипетки: TP_WBALANCE_SOLUX35;Solux 3500K @@ -1249,59 +1494,37 @@ TP_WBALANCE_WATER2;Подводный 2 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. !!!!!!!!!!!!!!!!!!!!!!!!! -!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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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 !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_POPUPRANK0;Unrank -!FILEBROWSER_RESETDEFAULTPROFILE;Reset to default -!FILEBROWSER_SHOWNOTTRASHHINT;Show only non-deleted images. +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !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 -!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 +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue @@ -1323,11 +1546,10 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !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 @@ -1338,19 +1560,14 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue -!HISTORY_MSG_293;Film Simulation -!HISTORY_MSG_294;Film Simulation - Strength -!HISTORY_MSG_295;Film Simulation - Film !HISTORY_MSG_296;NR - Luminance curve !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 @@ -1442,7 +1659,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1490,7 +1707,6 @@ ZOOMPANEL_ZOOMOUT;Удалить - !HISTORY_MSG_437;Retinex - M - Method !HISTORY_MSG_438;Retinex - M - Equalizer !HISTORY_MSG_439;Retinex - Process -!HISTORY_MSG_440;CbDL - Method !HISTORY_MSG_441;Retinex - Gain transmission !HISTORY_MSG_442;Retinex - Scale !HISTORY_MSG_443;Output black point compensation @@ -1519,21 +1735,56 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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 -!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_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_489;DRC - Detail +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method +!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1559,71 +1810,36 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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_BUTTON_ICCPROFCREATOR;ICC Profile Creator !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 +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !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: !PARTIALPASTE_COLORTONING;Color toning +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control -!PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter -!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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 -!PREFERENCES_CURVEBBOXPOS_LEFT;Left -!PREFERENCES_CURVEBBOXPOS_RIGHT;Right -!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_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_EDITORCMDLINE;Custom command line -!PREFERENCES_EXPAUT;Expert +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !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 @@ -1633,83 +1849,45 @@ ZOOMPANEL_ZOOMOUT;Удалить - !PREFERENCES_HISTOGRAMWORKING;Use working profile for main histogram and Navigator !PREFERENCES_HISTOGRAM_TOOLTIP;If enabled, the working profile is used for rendering the main histogram and the Navigator panel, otherwise the gamma-corrected output profile is used. !PREFERENCES_IMG_RELOAD_NEEDED;These changes require the image to be reloaded (or a new image to be opened) to take effect. -!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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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 -!PREFERENCES_PROFILE_NONE;None !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset -!PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!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 -!PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. -!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 +!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 the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_HUE_TOOLTIP;Hue (h) - angle between 0° and 360°. !TP_COLORAPP_LABEL;CIE Color Appearance Model 2002 @@ -1718,7 +1896,8 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection @@ -1744,9 +1923,6 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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 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 @@ -1758,6 +1934,27 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1783,54 +1980,27 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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_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_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 !TP_DIRPYREQUALIZER_HUESKIN;Skin hue @@ -1839,15 +2009,9 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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 @@ -1856,122 +2020,81 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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_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. -!TP_PREPROCESS_HOTPIXFILT;Hot pixel filter -!TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. -!TP_RAWCACORR_CASTR;Strength -!TP_RAWEXPOS_BLACK_0;Green 1 (lead) -!TP_RAWEXPOS_BLACK_1;Red -!TP_RAWEXPOS_BLACK_2;Blue -!TP_RAWEXPOS_BLACK_3;Green 2 -!TP_RAWEXPOS_BLACK_BLUE;Blue -!TP_RAWEXPOS_BLACK_GREEN;Green -!TP_RAWEXPOS_BLACK_RED;Red -!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_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_IMAGENUM;Sub-image -!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) -!TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection +!TP_RAW_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!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 -!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_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.\n+fast gives less artifacts in flat areas +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;Equalizer !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 !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1997,7 +2120,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2036,9 +2159,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_SHARPENING_BLUR;Blur radius !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2107,7 +2228,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2118,7 +2239,7 @@ ZOOMPANEL_ZOOMOUT;Удалить - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2184,8 +2305,6 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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 @@ -2204,4 +2323,3 @@ ZOOMPANEL_ZOOMOUT;Удалить - !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 --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index e94beb82b..7bbebe45d 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -5,7 +5,6 @@ ABOUT_TAB_CREDITS;Заслуге ABOUT_TAB_LICENSE;Лиценца ABOUT_TAB_RELEASENOTES;Белешке о издању ABOUT_TAB_SPLASH;Увод -ADJUSTER_RESET_TO_DEFAULT;Врати на подразумевано BATCHQUEUE_AUTOSTART;Сам започни BATCHQUEUE_AUTOSTARTHINT;Покреће обраду фотографија када их закажете BATCHQUEUE_DESTFILENAME;Путања и име датотеке @@ -86,8 +85,6 @@ FILEBROWSER_AUTOFLATFIELD;Аутоматски одреди равно поље FILEBROWSER_BROWSEPATHBUTTONHINT;Кликните за одлазак на узабрану путању FILEBROWSER_BROWSEPATHHINT;Укуцајте путању за разгледање (Ctrl-o поставља фокус, Ctrl-Enter приказује у разгледачу датотека);nПречице путања: ~ — лични директоријум, ! — директоријум са сликама FILEBROWSER_CACHE;Остава -FILEBROWSER_CACHECLEARFROMFULL;Очисти из оставе — све -FILEBROWSER_CACHECLEARFROMPARTIAL;Очисти из оставе — половично FILEBROWSER_CLEARPROFILE;Обриши профил FILEBROWSER_COLORLABEL_TOOLTIP;Натпис у боји.\n\nКористите приложени мени или пречице:\nShift-Ctrl-0 Без боје\nShift-Ctrl-1 Црвена\nShift-Ctrl-2 Жута\nShift-Ctrl-3 Зелена\nShift-Ctrl-4 Плана\nShift-Ctrl-5 Љубичаста FILEBROWSER_COPYPROFILE;Умножи профил @@ -315,7 +312,6 @@ HISTORY_MSG_121;Сам исправи аберације HISTORY_MSG_122;Сам примени тамни кадар HISTORY_MSG_123;Датотека за тамни кадар HISTORY_MSG_124;Линеарна исправка експ. -HISTORY_MSG_125;Поправка експ. уз очување светлог HISTORY_MSG_126;Датотека са равним пољем HISTORY_MSG_127;Сам изабери равно поље HISTORY_MSG_128;Полупречник равног поља @@ -422,9 +418,7 @@ HISTORY_MSG_231;ЦБ - Пре криве HISTORY_MSG_232;ЦБ - Пре врсте криве HISTORY_MSG_233;ЦБ - Након приве HISTORY_MSG_234;ЦБ - Након врсте криве -HISTORY_MSG_235;ЦБ - Аутоматско мешање канала HISTORY_MSG_236;--неискоришћено-- -HISTORY_MSG_237;ЦБ - Миксер HISTORY_MSG_238;ФГ - Умекшање HISTORY_MSG_239;ФГ - Јачина HISTORY_MSG_240;ФГ - Центар @@ -534,8 +528,6 @@ MAIN_TOOLTIP_THRESHOLD;Праг 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;Мешање канала @@ -577,7 +569,6 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;Линијски филтер шума PARTIALPASTE_RAWCACORR_AUTO;Ауто хроматске аберације PARTIALPASTE_RAWEXPOS_BLACK;Ниво црне PARTIALPASTE_RAWEXPOS_LINEAR;Линеарни фактор исправке RAW беле тачке -PARTIALPASTE_RAWEXPOS_PRESER;Raw тачка беле уз очување светлих делова PARTIALPASTE_RAWGROUP;Raw подешавања PARTIALPASTE_RAW_DCBENHANCE;Примени корак ДЦБ побољшања PARTIALPASTE_RAW_DCBITERATIONS;Број ДЦБ понављања @@ -604,15 +595,9 @@ PREFERENCES_BEHAVIOR;Понашање PREFERENCES_BEHSETALL;Све у „Постави“ PREFERENCES_BEHSETALLHINT;Поставља све параметре у режим Постави.\nЊихово подешавање помоћу алата из панела за заказано ће бити апсолутне вредности као што су и изабране. PREFERENCES_BLACKBODY;Обична сијалица -PREFERENCES_CACHECLEARALL;Обриши све -PREFERENCES_CACHECLEARPROFILES;Обриши профиле -PREFERENCES_CACHECLEARTHUMBS;Обриши приказе PREFERENCES_CACHEMAXENTRIES;Највећи број мест у остави PREFERENCES_CACHEOPTS;Подешавање оставе PREFERENCES_CACHETHUMBHEIGHT;Највећа висина приказа -PREFERENCES_CIEART;CIECAM02 оптимизација -PREFERENCES_CIEART_LABEL;Једнострука тачност уместо двоструке -PREFERENCES_CIEART_TOOLTIP;Уколико је омогућено, ради CIECAM02 рачунања са једноструком тачношћу уместо са двоструком. Ово даје мало повећање брзине уз неизоставан губитак на квалитету. PREFERENCES_CLIPPINGIND;Показивачи одсечених делова PREFERENCES_CUSTPROFBUILD;Изградња произвољног почетног профила слике PREFERENCES_CUSTPROFBUILDHINT;Извршна датотека (или скрипта) која се позива када изграђујете нови почетни профил за слику.nПрихвата параметре из командне линије ради прављења .pp3 датотеке на основу неких правила:n[Путања до RAW/JPG] [Путања подразумеваног профила] [Бленда] [Експозиција у s] [Жижна дужина mm] [ИСО] [Објектив] [Фото-апарат] @@ -620,7 +605,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Кључни формати PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Назив PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;БрОзнаке PREFERENCES_CUSTPROFBUILDPATH;Извршна путања -PREFERENCES_CUTOVERLAYBRUSH;Маска исецања боје/провидног PREFERENCES_D50;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K @@ -639,7 +623,6 @@ PREFERENCES_DIRSOFTWARE;Директоријум са инсталацијом PREFERENCES_EDITORLAYOUT;Размештај програма PREFERENCES_EXTERNALEDITOR;Спољни уређивач PREFERENCES_FBROWSEROPTS;Опције разгледача датотеке -PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Прикажи алатке у једном реду PREFERENCES_FILEFORMAT;Формат датотеке PREFERENCES_FLATFIELDFOUND;Нађено PREFERENCES_FLATFIELDSDIR;Директоријум за равна поља @@ -698,11 +681,7 @@ PREFERENCES_PROFILESAVECACHE;Сачувај параметре обраде у PREFERENCES_PROFILESAVEINPUT;Сачувај парамтре обраде поред улазне датотеке PREFERENCES_PROPERTY;Особина PREFERENCES_PSPATH;Директоријум са инсталираним Адобе Фотошопом -PREFERENCES_RGBDTL_LABEL;Највећи број нири приликом уклањања шума -PREFERENCES_RGBDTL_TOOLTIP;Уклањање шума захтева око 128MB РАМ меморије за слику од 10 мегапиксела или 512MB за слику од 40 мегапиксела, уз додатних 128MB меморије по свакој нити. Што више нити се извршавају заједно то ће брже бити рачунање. Оставите ову вредност на „0“ како би програм аутоматски доделило што је више нитова могуће. -PREFERENCES_SELECTFONT;Изаберите фонт PREFERENCES_SELECTLANG;Језик -PREFERENCES_SELECTTHEME;Тема PREFERENCES_SET;Постави PREFERENCES_SHOWBASICEXIF;Прикажи основне Exif податке PREFERENCES_SHOWDATETIME;Прикажи датум и време @@ -713,16 +692,14 @@ PREFERENCES_SINGLETABVERTAB;Режим у једном листу, вертик PREFERENCES_SND_BATCHQUEUEDONE;Обрађене су заказане датотеке PREFERENCES_SND_HELP;Унесите путању до датотеке или оставите празно уколико не желите звук. На Windows-у можете да користите „SystemDefault“, „SystemAsterisk“ за системске звуке. PREFERENCES_SND_LNGEDITPROCDONE;Уредник је завршио обраду -PREFERENCES_SND_TRESHOLDSECS;бр. секунди +PREFERENCES_SND_THRESHOLDSECS;бр. секунди PREFERENCES_STARTUPIMDIR;Директоријум по покретању PREFERENCES_TAB_BROWSER;Преглед датотека PREFERENCES_TAB_COLORMGR;Управљање бојама PREFERENCES_TAB_GENERAL;Опште PREFERENCES_TAB_IMPROC;Обрада сликe -PREFERENCES_TAB_PERFORMANCE;Перформанса PREFERENCES_TAB_SOUND;Звуци PREFERENCES_TP_LABEL;Површ алата: -PREFERENCES_TP_USEICONORTEXT;Користи иконице језичка уместо текста PREFERENCES_TP_VSCROLLBAR;Сакриј клизаче у области са алаткама PREFERENCES_TUNNELMETADATA;Копирај неизмењене IPTC/XMP (када је слика означена другим програмом) PREFERENCES_USEBUNDLEDPROFILES;Користи профиле који долазе уз програм @@ -796,7 +773,6 @@ TP_BWMIX_ALGO_LI;Линеарно TP_BWMIX_ALGO_SP;Специјални ефекти TP_BWMIX_ALGO_TOOLTIP;Линеарно: производи нормални линеарни одговор.\nСпецијални ефекти: производи специјалне ефекте мешајући канале нелинеарно. TP_BWMIX_AUTOCH;Ауто -TP_BWMIX_AUTOCH_TIP;Израчунај вредности тако да оптимизује мешање канала. TP_BWMIX_CC_ENABLED;Подеси комплементарну боју TP_BWMIX_CC_TOOLTIP;Омогући за аутоматско подешавање комплементарне боје у ROYGCBPM режиму. TP_BWMIX_CHANNEL;Уједначавање луминансе @@ -819,9 +795,6 @@ TP_BWMIX_MET;Начин TP_BWMIX_MET_CHANMIX;Мешање канала TP_BWMIX_MET_DESAT;Уклањање боје TP_BWMIX_MET_LUMEQUAL;Уједначавање луминансе -TP_BWMIX_MIXC;Мешање -TP_BWMIX_NEUTRAL;Врати мешање -TP_BWMIX_NEUTRAL_TIP;Врати све вреднсоти (филтер боје, мешање канала) на подразумеване. TP_BWMIX_RGBLABEL;Р: %1%% Г: %2%% Б: %3%% Укупно: %4%% TP_BWMIX_RGBLABEL_HINT;Коначни РГБ фактори који се брину о опцијама за мешање.\n„Укупно“ приказује збир РГБ вредности:\n- у 100% у релативном режиму\n- више (светлије) или мање (тамније) од 100% у апсолутном режиму. TP_BWMIX_RGB_TOOLTIP;Мешање РГБ канала. Користите постојеће преподешене параметре као водиљу.\nОбратите пажњу на негативне вреднсти које могу да направе грешке унутар слике или изазову неправилно понашање. @@ -859,11 +832,6 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Изврће слику хоризонтално TP_COARSETRAF_TOOLTIP_ROTLEFT;Окреће слику улево TP_COARSETRAF_TOOLTIP_ROTRIGHT;Окреће слику удесно TP_COARSETRAF_TOOLTIP_VFLIP;Изврће слику вертикално -TP_COLORAPP_ADAPTSCENE;Луминозност сцене -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Апосолутна луминозност окружења сцене (cd/m²).\n1) Рачуна се из Exif података:\nБрзина затварача - ИСО вредност - отвор бленде - корекција експозиције камере.\n2) Рачуна се из беле тачке сирове слике унутар дела програма за компензацију експозиције. -TP_COLORAPP_ADAPTVIEWING;Луминозност за преглед (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Апсолутна луминозност окружења за преглед\n(обично 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Уколико је штиклирано (препоручено), програм рачуна оптималне вредности на основу Exif података.\nЗа ручно постављање ових вредности, одштиклирајте ово поље. TP_COLORAPP_ALGO;Алгоритам TP_COLORAPP_ALGO_ALL;Све TP_COLORAPP_ALGO_JC;Светлина + Боја (JC) @@ -893,8 +861,6 @@ TP_COLORAPP_CURVEEDITOR3;Крива боја TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Подешава било хрому, засићеност или живост боја.\n\nПриказује хистограм хроматисе (Лаб) пре CIECAM02.\nУколико је омогућено „CIECAM02 излазни хистограм у кривуљама“, приказује хистограм за C, s или M након CIECAM02.\n\nC, s и M се не приказују у главној површи за хистограм.\nЗа конаачни изла погледајте главну површ хистограма. TP_COLORAPP_DATACIE;CIECAM02 излазни хистограм у кривуљама TP_COLORAPP_DATACIE_TOOLTIP;Када је омогућено, хистограми у CIECAM02 кривим приказују приближне вредности/опсеге за J или Q, и C, s или M након CIECAM02 подешавања.\nОвај избор не утиче на приказ у главној површи за хистограм.\n\nКада је искључено, хистограми у CIECAM02 кривим приказују Лаб вредности пре CIECAM02 подешавања. -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Уколико је штиклирано (препоручено), програм рачина оптималне вредности, које се затим користе за CAT02, а такође за читав CIECAM02.\nДа би поставили вредности ручне, одштиклирајте ово поље (препоручене су вредности изнад 65). -TP_COLORAPP_DEGREE_TOOLTIP;Количина преображаја CIE хроматске адаптације2002. TP_COLORAPP_GAMUT;Контрола гамута (Лаб) TP_COLORAPP_GAMUT_TOOLTIP;Омогућава контролу гамута у Лаб режиму. TP_COLORAPP_HUE;Нијанса (h) @@ -909,8 +875,6 @@ TP_COLORAPP_MODEL;WP модел TP_COLORAPP_MODEL_TOOLTIP;Модел беле-тачке.\n\nБаланс беле [RT] + [излаз]: баланс беле из програма се користи за кадар, CIECAM02 се поставља на D50, а баланс беле излазног уређаја се одређује из Подешавања > Управљање бојама.\n\nБаланс беле [RT+CAT02] + [излаз]: подешавања баланса беле из програма се користе од стране CAT02, а баланс беле излазног уређаја се одређује из Подешавања - Управљање бојама. TP_COLORAPP_RSTPRO;Заштита црвене и боје коже TP_COLORAPP_RSTPRO_TOOLTIP;Заштита црвене боје и боје коже (клизачи и криве). -TP_COLORAPP_SHARPCIE;--не користи се-- -TP_COLORAPP_SHARPCIE_TOOLTIP;--не користи се-- TP_COLORAPP_SURROUND;Окружено TP_COLORAPP_SURROUND_AVER;Просечно TP_COLORAPP_SURROUND_DARK;Тамно @@ -929,6 +893,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;Светлина TP_COLORAPP_TCMODE_SATUR;Засићеност TP_COLORAPP_TONECIE;Мапирање тонова у CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;Уколико је искључена ова опција, мапирање тонова се врши у Лаб окружењу.\nУколико је укључена, мапирање се врши помоћу CIECAM02.\nМорате користити алат за мапирање тонова како би ова опција била примењена. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Апсолутна луминозност окружења за преглед\n(обично 16cd/m²). TP_COLORAPP_WBCAM;Баланс беле [RT+CAT02] + [излаз] TP_COLORAPP_WBRT;Баланс беле [RT] + [излаз] TP_CROP_FIXRATIO;Сразмерно: @@ -942,7 +907,6 @@ TP_CROP_GUIDETYPE;Вођицe: TP_CROP_H;В TP_CROP_LABEL;Исецање TP_CROP_PPI;ППИ= -TP_CROP_SELECTCROP; Изабери област TP_CROP_W;Ш TP_CROP_X;x TP_CROP_Y;y @@ -978,7 +942,6 @@ TP_EPD_LABEL;Мапирање тонова TP_EPD_REWEIGHTINGITERATES;Број поновних мерења TP_EPD_SCALE;Размера TP_EPD_STRENGTH;Јачина -TP_EPD_TOOLTIP;Мапирање тонова је могуће у Лаб (стандардном) или CIECAM02 режиму.\n\nЗа рад у CIECAM02 режиму укључите:\n1. CIECAM02\n2. Алгоритам="Осветљење + живописност (QM)"\n3. "Мапирање тонова у CIECAM02 осветљењу (Q)" TP_EXPOSURE_AUTOLEVELS;Ауто-нивои TP_EXPOSURE_AUTOLEVELS_TIP;Омогућава аутоматско одређивање нивоа, који подешава клизаче експозиције на основу податка о самој слици.\nУкључује чупање светлих делова уколико је неопходно. TP_EXPOSURE_BLACKLEVEL;Црна @@ -1104,9 +1067,6 @@ TP_LENSGEOM_AUTOCROP;Сам исеци TP_LENSGEOM_FILL;Сам попуни TP_LENSGEOM_LABEL;Објектив и геометрија TP_LENSPROFILE_LABEL;Профили за исправљање изобличења објектива -TP_LENSPROFILE_USECA;Исправљање хром. аберација -TP_LENSPROFILE_USEDIST;Исправљање изобличења -TP_LENSPROFILE_USEVIGN;Исправљање вињетарења TP_NEUTRAL;Неутрално TP_NEUTRAL_TIP;Враћа клизаче експозиције на неутралне вредности.\nПримењује се на исте контроле као у Ауто нивои, без обзира на то да ли сте користили Ауто нивое или не. TP_PCVIGNETTE_FEATHER;Умекшавање @@ -1130,7 +1090,6 @@ TP_RAWCACORR_CABLUE;Плава TP_RAWCACORR_CARED;Црвена TP_RAWEXPOS_BLACKS;Ниво црне TP_RAWEXPOS_LINEAR;Линеарни фактор корекције -TP_RAWEXPOS_PRESER;Очување светлих делова TP_RAWEXPOS_TWOGREEN;Обе зелене TP_RAW_DCBENHANCE;Примени ДЦБ побољшање TP_RAW_DCBITERATIONS;Број ДЦБ пролаза @@ -1271,7 +1230,7 @@ TP_WBALANCE_WATER_HEADER;Подводна фотографија ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Отвара нови прозор са детаљима ZOOMPANEL_ZOOM100;Повећава преглед на 100% z -ZOOMPANEL_ZOOMFITSCREEN;Уклапа слику у величину прозора Ф +ZOOMPANEL_ZOOMFITSCREEN;Уклапа слику у величину прозора Alt-Ф ZOOMPANEL_ZOOMIN;Увећава приказ слике + ZOOMPANEL_ZOOMOUT;Умањује приказ слике - @@ -1279,11 +1238,13 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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. !DIRBROWSER_FOLDERS;Folders !DONT_SHOW_AGAIN;Don't show this message again. @@ -1291,6 +1252,10 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1298,6 +1263,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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. +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels @@ -1305,6 +1271,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow @@ -1322,7 +1290,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -1330,11 +1298,17 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_CURRENT;Current !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue @@ -1356,7 +1330,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -1371,8 +1345,8 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -1475,7 +1449,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1555,18 +1529,102 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1592,15 +1650,15 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_ICCPROFCREATOR;ICC Profile Creator !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_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !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_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -1612,35 +1670,48 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1651,11 +1722,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_CURVEBBOXPOS_LEFT;Left !PREFERENCES_CURVEBBOXPOS_RIGHT;Right !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !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 @@ -1669,23 +1738,17 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1698,53 +1761,51 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !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;If active, indicates in grey the pixels which have out of gamut colors from the Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !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. !TP_BWMIX_FILTER_YELLOW;Yellow !TP_BWMIX_GAMMA;Gamma Correction !TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !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 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 @@ -1756,6 +1817,27 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1784,6 +1866,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1839,6 +1927,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1862,6 +1953,21 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1875,8 +1981,17 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength !TP_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1886,11 +2001,19 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1898,67 +2021,52 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !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_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1970,7 +2078,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1996,7 +2104,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2035,9 +2143,15 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2106,7 +2220,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2117,7 +2231,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2201,6 +2315,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике - !TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WBALANCE_PICKER;Pick !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 --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters) index a0597fbb6..597402cea 100644 --- a/rtdata/languages/Serbian (Latin Characters) +++ b/rtdata/languages/Serbian (Latin Characters) @@ -5,7 +5,6 @@ ABOUT_TAB_CREDITS;Zasluge ABOUT_TAB_LICENSE;Licenca ABOUT_TAB_RELEASENOTES;Beleške o izdanju 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 @@ -86,8 +85,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatski odredi ravno polje FILEBROWSER_BROWSEPATHBUTTONHINT;Kliknite za odlazak na uzabranu putanju FILEBROWSER_BROWSEPATHHINT;Ukucajte putanju za razgledanje (Ctrl-o postavlja fokus, Ctrl-Enter prikazuje u razgledaču datoteka);nPrečice putanja: ~ — lični direktorijum, ! — direktorijum sa slikama FILEBROWSER_CACHE;Ostava -FILEBROWSER_CACHECLEARFROMFULL;Očisti iz ostave — sve -FILEBROWSER_CACHECLEARFROMPARTIAL;Očisti iz ostave — polovično FILEBROWSER_CLEARPROFILE;Obriši profil FILEBROWSER_COLORLABEL_TOOLTIP;Natpis u boji.\n\nKoristite priloženi meni ili prečice:\nShift-Ctrl-0 Bez boje\nShift-Ctrl-1 Crvena\nShift-Ctrl-2 Žuta\nShift-Ctrl-3 Zelena\nShift-Ctrl-4 Plana\nShift-Ctrl-5 Ljubičasta FILEBROWSER_COPYPROFILE;Umnoži profil @@ -315,7 +312,6 @@ HISTORY_MSG_121;Sam ispravi aberacije HISTORY_MSG_122;Sam primeni tamni kadar HISTORY_MSG_123;Datoteka za tamni kadar HISTORY_MSG_124;Linearna ispravka eksp. -HISTORY_MSG_125;Popravka eksp. uz očuvanje svetlog HISTORY_MSG_126;Datoteka sa ravnim poljem HISTORY_MSG_127;Sam izaberi ravno polje HISTORY_MSG_128;Poluprečnik ravnog polja @@ -422,9 +418,7 @@ HISTORY_MSG_231;CB - Pre krive HISTORY_MSG_232;CB - Pre vrste krive HISTORY_MSG_233;CB - Nakon prive HISTORY_MSG_234;CB - Nakon vrste krive -HISTORY_MSG_235;CB - Automatsko mešanje kanala HISTORY_MSG_236;--neiskorišćeno-- -HISTORY_MSG_237;CB - Mikser HISTORY_MSG_238;FG - Umekšanje HISTORY_MSG_239;FG - Jačina HISTORY_MSG_240;FG - Centar @@ -534,8 +528,6 @@ MAIN_TOOLTIP_THRESHOLD;Prag 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 @@ -577,7 +569,6 @@ PARTIALPASTE_PREPROCESS_LINEDENOISE;Linijski filter šuma PARTIALPASTE_RAWCACORR_AUTO;Auto hromatske aberacije PARTIALPASTE_RAWEXPOS_BLACK;Nivo crne PARTIALPASTE_RAWEXPOS_LINEAR;Linearni faktor ispravke RAW bele tačke -PARTIALPASTE_RAWEXPOS_PRESER;Raw tačka bele uz očuvanje svetlih delova PARTIALPASTE_RAWGROUP;Raw podešavanja PARTIALPASTE_RAW_DCBENHANCE;Primeni korak DCB poboljšanja PARTIALPASTE_RAW_DCBITERATIONS;Broj DCB ponavljanja @@ -604,15 +595,9 @@ PREFERENCES_BEHAVIOR;Ponašanje PREFERENCES_BEHSETALL;Sve u „Postavi“ PREFERENCES_BEHSETALLHINT;Postavlja sve parametre u režim Postavi.\nNjihovo podešavanje pomoću alata iz panela za zakazano će biti apsolutne vrednosti kao što su i izabrane. PREFERENCES_BLACKBODY;Obična sijalica -PREFERENCES_CACHECLEARALL;Obriši sve -PREFERENCES_CACHECLEARPROFILES;Obriši profile -PREFERENCES_CACHECLEARTHUMBS;Obriši prikaze PREFERENCES_CACHEMAXENTRIES;Najveći broj mest u ostavi PREFERENCES_CACHEOPTS;Podešavanje ostave PREFERENCES_CACHETHUMBHEIGHT;Najveća visina prikaza -PREFERENCES_CIEART;CIECAM02 optimizacija -PREFERENCES_CIEART_LABEL;Jednostruka tačnost umesto dvostruke -PREFERENCES_CIEART_TOOLTIP;Ukoliko je omogućeno, radi CIECAM02 računanja sa jednostrukom tačnošću umesto sa dvostrukom. Ovo daje malo povećanje brzine uz neizostavan gubitak na kvalitetu. PREFERENCES_CLIPPINGIND;Pokazivači odsečenih delova PREFERENCES_CUSTPROFBUILD;Izgradnja proizvoljnog početnog profila slike PREFERENCES_CUSTPROFBUILDHINT;Izvršna datoteka (ili skripta) koja se poziva kada izgrađujete novi početni profil za sliku.nPrihvata parametre iz komandne linije radi pravljenja .pp3 datoteke na osnovu nekih pravila:n[Putanja do RAW/JPG] [Putanja podrazumevanog profila] [Blenda] [Ekspozicija u s] [Žižna dužina mm] [ISO] [Objektiv] [Foto-aparat] @@ -620,7 +605,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Ključni formati PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Naziv PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;BrOznake PREFERENCES_CUSTPROFBUILDPATH;Izvršna putanja -PREFERENCES_CUTOVERLAYBRUSH;Maska isecanja boje/providnog PREFERENCES_D50;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K @@ -639,7 +623,6 @@ PREFERENCES_DIRSOFTWARE;Direktorijum sa instalacijom 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_FLATFIELDFOUND;Nađeno PREFERENCES_FLATFIELDSDIR;Direktorijum za ravna polja @@ -698,11 +681,7 @@ PREFERENCES_PROFILESAVECACHE;Sačuvaj parametre obrade u ostavu PREFERENCES_PROFILESAVEINPUT;Sačuvaj paramtre obrade pored ulazne datoteke PREFERENCES_PROPERTY;Osobina PREFERENCES_PSPATH;Direktorijum sa instaliranim Adobe Fotošopom -PREFERENCES_RGBDTL_LABEL;Najveći broj niri prilikom uklanjanja šuma -PREFERENCES_RGBDTL_TOOLTIP;Uklanjanje šuma zahteva oko 128MB RAM memorije za sliku od 10 megapiksela ili 512MB za sliku od 40 megapiksela, uz dodatnih 128MB memorije po svakoj niti. Što više niti se izvršavaju zajedno to će brže biti računanje. Ostavite ovu vrednost na „0“ kako bi program automatski dodelilo što je više nitova moguće. -PREFERENCES_SELECTFONT;Izaberite font PREFERENCES_SELECTLANG;Jezik -PREFERENCES_SELECTTHEME;Tema PREFERENCES_SET;Postavi PREFERENCES_SHOWBASICEXIF;Prikaži osnovne Exif podatke PREFERENCES_SHOWDATETIME;Prikaži datum i vreme @@ -713,16 +692,14 @@ PREFERENCES_SINGLETABVERTAB;Režim u jednom listu, vertikalni listovi PREFERENCES_SND_BATCHQUEUEDONE;Obrađene su zakazane datoteke PREFERENCES_SND_HELP;Unesite putanju do datoteke ili ostavite prazno ukoliko ne želite zvuk. Na Windows-u možete da koristite „SystemDefault“, „SystemAsterisk“ za sistemske zvuke. PREFERENCES_SND_LNGEDITPROCDONE;Urednik je završio obradu -PREFERENCES_SND_TRESHOLDSECS;br. sekundi +PREFERENCES_SND_THRESHOLDSECS;br. sekundi PREFERENCES_STARTUPIMDIR;Direktorijum po pokretanju PREFERENCES_TAB_BROWSER;Pregled datoteka PREFERENCES_TAB_COLORMGR;Upravljanje bojama PREFERENCES_TAB_GENERAL;Opšte PREFERENCES_TAB_IMPROC;Obrada slike -PREFERENCES_TAB_PERFORMANCE;Performansa PREFERENCES_TAB_SOUND;Zvuci PREFERENCES_TP_LABEL;Površ alata: -PREFERENCES_TP_USEICONORTEXT;Koristi ikonice jezička umesto teksta PREFERENCES_TP_VSCROLLBAR;Sakrij klizače u oblasti sa alatkama PREFERENCES_TUNNELMETADATA;Kopiraj neizmenjene IPTC/XMP (kada je slika označena drugim programom) PREFERENCES_USEBUNDLEDPROFILES;Koristi profile koji dolaze uz program @@ -796,7 +773,6 @@ TP_BWMIX_ALGO_LI;Linearno TP_BWMIX_ALGO_SP;Specijalni efekti TP_BWMIX_ALGO_TOOLTIP;Linearno: proizvodi normalni linearni odgovor.\nSpecijalni efekti: proizvodi specijalne efekte mešajući kanale nelinearno. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Izračunaj vrednosti tako da optimizuje mešanje kanala. TP_BWMIX_CC_ENABLED;Podesi komplementarnu boju TP_BWMIX_CC_TOOLTIP;Omogući za automatsko podešavanje komplementarne boje u ROYGCBPM režimu. TP_BWMIX_CHANNEL;Ujednačavanje luminanse @@ -819,9 +795,6 @@ TP_BWMIX_MET;Način TP_BWMIX_MET_CHANMIX;Mešanje kanala TP_BWMIX_MET_DESAT;Uklanjanje boje TP_BWMIX_MET_LUMEQUAL;Ujednačavanje luminanse -TP_BWMIX_MIXC;Mešanje -TP_BWMIX_NEUTRAL;Vrati mešanje -TP_BWMIX_NEUTRAL_TIP;Vrati sve vrednsoti (filter boje, mešanje kanala) na podrazumevane. TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Ukupno: %4%% TP_BWMIX_RGBLABEL_HINT;Konačni RGB faktori koji se brinu o opcijama za mešanje.\n„Ukupno“ prikazuje zbir RGB vrednosti:\n- u 100% u relativnom režimu\n- više (svetlije) ili manje (tamnije) od 100% u apsolutnom režimu. TP_BWMIX_RGB_TOOLTIP;Mešanje RGB kanala. Koristite postojeće prepodešene parametre kao vodilju.\nObratite pažnju na negativne vrednsti koje mogu da naprave greške unutar slike ili izazovu nepravilno ponašanje. @@ -859,11 +832,6 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Izvrće sliku horizontalno TP_COARSETRAF_TOOLTIP_ROTLEFT;Okreće sliku ulevo TP_COARSETRAF_TOOLTIP_ROTRIGHT;Okreće sliku udesno TP_COARSETRAF_TOOLTIP_VFLIP;Izvrće sliku vertikalno -TP_COLORAPP_ADAPTSCENE;Luminoznost scene -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Aposolutna luminoznost okruženja scene (cd/m²).\n1) Računa se iz Exif podataka:\nBrzina zatvarača - ISO vrednost - otvor blende - korekcija ekspozicije kamere.\n2) Računa se iz bele tačke sirove slike unutar dela programa za kompenzaciju ekspozicije. -TP_COLORAPP_ADAPTVIEWING;Luminoznost za pregled (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Apsolutna luminoznost okruženja za pregled\n(obično 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Ukoliko je štiklirano (preporučeno), program računa optimalne vrednosti na osnovu Exif podataka.\nZa ručno postavljanje ovih vrednosti, odštiklirajte ovo polje. TP_COLORAPP_ALGO;Algoritam TP_COLORAPP_ALGO_ALL;Sve TP_COLORAPP_ALGO_JC;Svetlina + Boja (JC) @@ -893,8 +861,6 @@ TP_COLORAPP_CURVEEDITOR3;Kriva boja TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Podešava bilo hromu, zasićenost ili živost boja.\n\nPrikazuje histogram hromatise (Lab) pre CIECAM02.\nUkoliko je omogućeno „CIECAM02 izlazni histogram u krivuljama“, prikazuje histogram za C, s ili M nakon CIECAM02.\n\nC, s i M se ne prikazuju u glavnoj površi za histogram.\nZa konaačni izla pogledajte glavnu površ histograma. TP_COLORAPP_DATACIE;CIECAM02 izlazni histogram u krivuljama TP_COLORAPP_DATACIE_TOOLTIP;Kada je omogućeno, histogrami u CIECAM02 krivim prikazuju približne vrednosti/opsege za J ili Q, i C, s ili M nakon CIECAM02 podešavanja.\nOvaj izbor ne utiče na prikaz u glavnoj površi za histogram.\n\nKada je isključeno, histogrami u CIECAM02 krivim prikazuju Lab vrednosti pre CIECAM02 podešavanja. -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Ukoliko je štiklirano (preporučeno), program račina optimalne vrednosti, koje se zatim koriste za CAT02, a takođe za čitav CIECAM02.\nDa bi postavili vrednosti ručne, odštiklirajte ovo polje (preporučene su vrednosti iznad 65). -TP_COLORAPP_DEGREE_TOOLTIP;Količina preobražaja CIE hromatske adaptacije2002. TP_COLORAPP_GAMUT;Kontrola gamuta (Lab) TP_COLORAPP_GAMUT_TOOLTIP;Omogućava kontrolu gamuta u Lab režimu. TP_COLORAPP_HUE;Nijansa (h) @@ -909,8 +875,6 @@ TP_COLORAPP_MODEL;WP model TP_COLORAPP_MODEL_TOOLTIP;Model bele-tačke.\n\nBalans bele [RT] + [izlaz]: balans bele iz programa se koristi za kadar, CIECAM02 se postavlja na D50, a balans bele izlaznog uređaja se određuje iz Podešavanja > Upravljanje bojama.\n\nBalans bele [RT+CAT02] + [izlaz]: podešavanja balansa bele iz programa se koriste od strane CAT02, a balans bele izlaznog uređaja se određuje iz Podešavanja - Upravljanje bojama. TP_COLORAPP_RSTPRO;Zaštita crvene i boje kože TP_COLORAPP_RSTPRO_TOOLTIP;Zaštita crvene boje i boje kože (klizači i krive). -TP_COLORAPP_SHARPCIE;--ne koristi se-- -TP_COLORAPP_SHARPCIE_TOOLTIP;--ne koristi se-- TP_COLORAPP_SURROUND;Okruženo TP_COLORAPP_SURROUND_AVER;Prosečno TP_COLORAPP_SURROUND_DARK;Tamno @@ -929,6 +893,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;Svetlina TP_COLORAPP_TCMODE_SATUR;Zasićenost TP_COLORAPP_TONECIE;Mapiranje tonova u CIECAM02 TP_COLORAPP_TONECIE_TOOLTIP;Ukoliko je isključena ova opcija, mapiranje tonova se vrši u Lab okruženju.\nUkoliko je uključena, mapiranje se vrši pomoću CIECAM02.\nMorate koristiti alat za mapiranje tonova kako bi ova opcija bila primenjena. +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Apsolutna luminoznost okruženja za pregled\n(obično 16cd/m²). TP_COLORAPP_WBCAM;Balans bele [RT+CAT02] + [izlaz] TP_COLORAPP_WBRT;Balans bele [RT] + [izlaz] TP_CROP_FIXRATIO;Srazmerno: @@ -942,7 +907,6 @@ TP_CROP_GUIDETYPE;Vođice: TP_CROP_H;V TP_CROP_LABEL;Isecanje TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP; Izaberi oblast TP_CROP_W;Š TP_CROP_X;x TP_CROP_Y;y @@ -978,7 +942,6 @@ TP_EPD_LABEL;Mapiranje tonova TP_EPD_REWEIGHTINGITERATES;Broj ponovnih merenja TP_EPD_SCALE;Razmera TP_EPD_STRENGTH;Jačina -TP_EPD_TOOLTIP;Mapiranje tonova je moguće u Lab (standardnom) ili CIECAM02 režimu.\n\nZa rad u CIECAM02 režimu uključite:\n1. CIECAM02\n2. Algoritam="Osvetljenje + živopisnost (QM)"\n3. "Mapiranje tonova u CIECAM02 osvetljenju (Q)" TP_EXPOSURE_AUTOLEVELS;Auto-nivoi TP_EXPOSURE_AUTOLEVELS_TIP;Omogućava automatsko određivanje nivoa, koji podešava klizače ekspozicije na osnovu podatka o samoj slici.\nUključuje čupanje svetlih delova ukoliko je neophodno. TP_EXPOSURE_BLACKLEVEL;Crna @@ -1104,9 +1067,6 @@ TP_LENSGEOM_AUTOCROP;Sam iseci TP_LENSGEOM_FILL;Sam popuni TP_LENSGEOM_LABEL;Objektiv i geometrija TP_LENSPROFILE_LABEL;Profili za ispravljanje izobličenja objektiva -TP_LENSPROFILE_USECA;Ispravljanje hrom. aberacija -TP_LENSPROFILE_USEDIST;Ispravljanje izobličenja -TP_LENSPROFILE_USEVIGN;Ispravljanje vinjetarenja TP_NEUTRAL;Neutralno TP_NEUTRAL_TIP;Vraća klizače ekspozicije na neutralne vrednosti.\nPrimenjuje se na iste kontrole kao u Auto nivoi, bez obzira na to da li ste koristili Auto nivoe ili ne. TP_PCVIGNETTE_FEATHER;Umekšavanje @@ -1130,7 +1090,6 @@ TP_RAWCACORR_CABLUE;Plava TP_RAWCACORR_CARED;Crvena TP_RAWEXPOS_BLACKS;Nivo crne TP_RAWEXPOS_LINEAR;Linearni faktor korekcije -TP_RAWEXPOS_PRESER;Očuvanje svetlih delova TP_RAWEXPOS_TWOGREEN;Obe zelene TP_RAW_DCBENHANCE;Primeni DCB poboljšanje TP_RAW_DCBITERATIONS;Broj DCB prolaza @@ -1271,7 +1230,7 @@ TP_WBALANCE_WATER_HEADER;Podvodna fotografija 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 - @@ -1279,11 +1238,13 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !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. !DIRBROWSER_FOLDERS;Folders !DONT_SHOW_AGAIN;Don't show this message again. @@ -1291,6 +1252,10 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -1298,6 +1263,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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. +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_EQUALIZER;Bypass Wavelet Levels @@ -1305,6 +1271,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_POPUPCOLORLABEL0;Label: None !FILEBROWSER_POPUPCOLORLABEL1;Label: Red !FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow @@ -1322,7 +1290,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -1330,11 +1298,17 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !FILECHOOSER_FILTER_TIFF;TIFF files !GENERAL_APPLY;Apply !GENERAL_ASIMAGE;As Image +!GENERAL_CURRENT;Current !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_252;CbDL - Skin tar/prot !HISTORY_MSG_253;CbDL - Reduce artifacts !HISTORY_MSG_254;CbDL - Skin hue @@ -1356,7 +1330,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -1371,8 +1345,8 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -1475,7 +1449,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1555,18 +1529,102 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1592,15 +1650,15 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_ICCPROFCREATOR;ICC Profile Creator !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_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !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_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MONITOR_PROFILE_SYSTEM;System default !NAVIGATOR_B;B: !NAVIGATOR_G;G: @@ -1612,35 +1670,48 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_DEHAZE;Haze removal !PARTIALPASTE_EQUALIZER;Wavelet levels !PARTIALPASTE_FILMSIMULATION;Film simulation !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_LOCALCONTRAST;Local contrast -!PARTIALPASTE_METAGROUP;Metadata +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_METAGROUP;Metadata settings !PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift !PARTIALPASTE_RETINEX;Retinex -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1651,11 +1722,9 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PREFERENCES_CURVEBBOXPOS_LEFT;Left !PREFERENCES_CURVEBBOXPOS_RIGHT;Right !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !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 @@ -1669,23 +1738,17 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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 -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1698,53 +1761,51 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode -!PREFERENCES_SMA;Small (250x287) -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !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;If active, indicates in grey the pixels which have out of gamut colors from the Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !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. !TP_BWMIX_FILTER_YELLOW;Yellow !TP_BWMIX_GAMMA;Gamma Correction !TP_BWMIX_GAM_TOOLTIP;Correct gamma for each RGB channel. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_CBDL_AFT;After Black-and-White !TP_CBDL_BEF;Before Black-and-White !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !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 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 @@ -1756,6 +1817,27 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1784,6 +1866,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_CROP_GTHARMMEANS;Harmonic Means !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1839,6 +1927,9 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_EXPOSURE_TCMODE_LUMINANCE;Luminance !TP_EXPOSURE_TCMODE_PERCEPTUAL;Perceptual !TP_EXPOS_BLACKPOINT_LABEL;Raw Black Points @@ -1862,6 +1953,21 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1875,8 +1981,17 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_PREPROCESS_DEADPIXFILT_TOOLTIP;Tries to suppress dead pixels. !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CASTR;Strength !TP_RAWEXPOS_BLACK_0;Green 1 (lead) !TP_RAWEXPOS_BLACK_1;Red @@ -1886,11 +2001,19 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_RGB;Red, Green, Blue -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1898,67 +2021,52 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !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_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1970,7 +2078,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1996,7 +2104,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2035,9 +2143,15 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_RETINEX_VIEW_TRAN;Transmission - Auto !TP_RETINEX_VIEW_TRAN2;Transmission - Fixed !TP_RETINEX_VIEW_UNSHARP;Unsharp mask +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_WAVELET_1;Level 1 !TP_WAVELET_2;Level 2 !TP_WAVELET_3;Level 3 @@ -2106,7 +2220,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2117,7 +2231,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2201,6 +2315,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike - !TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. !TP_WAVELET_TMTYPE;Compression method !TP_WAVELET_TON;Toning +!TP_WBALANCE_PICKER;Pick !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 --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak index ada1225ef..8d2e16790 100644 --- a/rtdata/languages/Slovak +++ b/rtdata/languages/Slovak @@ -2,7 +2,6 @@ #02 2009-02-01 #03 2010-10-23 slapo -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 @@ -275,9 +274,6 @@ PREFERENCES_ADD;Pridať PREFERENCES_APPLNEXTSTARTUP;Aplikovaný pri ďalšom spustení PREFERENCES_BATCH_PROCESSING;dávkové spracovanie PREFERENCES_BEHAVIOR;Správanie sa -PREFERENCES_CACHECLEARALL;Vyčistiť všetko -PREFERENCES_CACHECLEARPROFILES;Vyčistiť profily -PREFERENCES_CACHECLEARTHUMBS;Vyčistiť zmenšeniny PREFERENCES_CACHEMAXENTRIES;Maximálny počet vstupov v cache PREFERENCES_CACHEOPTS;Možnosti cache PREFERENCES_CACHETHUMBHEIGHT;Maximálna výška zmenšenín @@ -322,9 +318,7 @@ PREFERENCES_PROFILESAVECACHE;Uložiť parametre spracovania do cache PREFERENCES_PROFILESAVEINPUT;Uložiť parametre spracovania k vstupnému súboru PREFERENCES_PROPERTY;Vlastnosť PREFERENCES_PSPATH;Inštalačný adresár Adobe Photoshop -PREFERENCES_SELECTFONT;Vybrať písmo PREFERENCES_SELECTLANG;Vybrať si jazyk -PREFERENCES_SELECTTHEME;Vybrať vzhľad PREFERENCES_SET;Nastaviť PREFERENCES_SHOWBASICEXIF;Zobrazovať základné EXIF informácie PREFERENCES_SHOWDATETIME;Ukázovať dátum a čas @@ -390,7 +384,6 @@ TP_CROP_GTRULETHIRDS;Pravidlo tretín TP_CROP_GUIDETYPE;Type vodidiel: TP_CROP_H;V TP_CROP_LABEL;Orezanie -TP_CROP_SELECTCROP; Vyberte Orez TP_CROP_W;Š TP_CROP_X;x TP_CROP_Y;y @@ -499,7 +492,7 @@ TP_WBALANCE_TEMPERATURE;Teplota 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ť - @@ -512,12 +505,14 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves !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. @@ -529,6 +524,10 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -539,6 +538,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass !EXPORT_BYPASS_ALL;Select / Unselect All @@ -577,8 +577,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_DARKFRAME;Dark-frame !FILEBROWSER_DELETEDLGMSGINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? @@ -632,7 +632,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -642,15 +642,18 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !GENERAL_ASIMAGE;As Image !GENERAL_AUTO;Automatic !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_88;Impulse NR threshold !HISTORY_MSG_93;CbDL - Value @@ -685,12 +688,11 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -794,9 +796,9 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -832,7 +834,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -847,8 +849,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -951,7 +953,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -1031,19 +1033,103 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1069,10 +1155,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). @@ -1088,27 +1171,30 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1125,8 +1211,10 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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 @@ -1135,6 +1223,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1152,19 +1241,22 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1176,32 +1268,33 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BEHADDALL;All to 'Add' !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_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1217,7 +1310,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1226,13 +1318,10 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1264,12 +1353,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1277,20 +1361,19 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!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_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1303,40 +1386,29 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles !PROFILEPANEL_LOADPPASTE;Parameters to load @@ -1354,11 +1426,14 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1367,8 +1442,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1376,13 +1451,12 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1409,9 +1483,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1442,11 +1515,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1457,8 +1526,9 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1476,8 +1546,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1489,14 +1557,13 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1516,11 +1583,9 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1532,6 +1597,27 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1564,11 +1650,17 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1638,13 +1730,15 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1670,10 +1764,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1720,6 +1810,12 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift !TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. !TP_LABCURVE_CHROMATICITY;Chromaticity @@ -1753,10 +1849,16 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1782,9 +1884,18 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_PREPROCESS_HOTPIXFILT;Hot pixel filter !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1797,17 +1908,24 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1815,7 +1933,8 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1823,67 +1942,51 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box !TP_RESIZE_FULLIMAGE;Full Image !TP_RESIZE_LANCZOS;Lanczos -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1895,7 +1998,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1921,7 +2024,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1973,13 +2076,19 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2069,7 +2178,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2080,7 +2189,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2192,6 +2301,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2203,4 +2313,4 @@ ZOOMPANEL_ZOOMOUT;Oddialiť - !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 --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi index 034995605..13c389d39 100644 --- a/rtdata/languages/Suomi +++ b/rtdata/languages/Suomi @@ -1,6 +1,5 @@ #01 2009-05-03 T. Kauppinen -ADJUSTER_RESET_TO_DEFAULT;Palauta oletusasetukset CURVEEDITOR_LINEAR;Suora CURVEEDITOR_LOADDLGLABEL;Lataa käyrä... CURVEEDITOR_SAVEDLGLABEL;Tallenna käyrä... @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Terävöinti PARTIALPASTE_VIGNETTING;Vinjetoinnin korjaus PARTIALPASTE_WHITEBALANCE;Valkotasapaino PREFERENCES_APPLNEXTSTARTUP;käytössä käynnistyksen jälkeen -PREFERENCES_CACHECLEARALL;Tyhjennä kaikki -PREFERENCES_CACHECLEARPROFILES;Tyhjennä profiilit -PREFERENCES_CACHECLEARTHUMBS;Tyhjennä esikatselukuvat PREFERENCES_CACHEMAXENTRIES;Välimuistin koko PREFERENCES_CACHEOPTS;Välimuistin asetukset PREFERENCES_CACHETHUMBHEIGHT;Suurin esikatselukuvan korkeus @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Tallenna käsittelyparametrit välimuistiin PREFERENCES_PROFILESAVEINPUT;Tallenna käsittelyparametrit oheistiedostoon PREFERENCES_PSPATH;Adobe Photoshop:n asennushakemisto PREFERENCES_SELECTLANG;Valitse kieli -PREFERENCES_SELECTTHEME;Valitse teema PREFERENCES_SHOWBASICEXIF;Perus EXIF-tiedot PREFERENCES_SHOWDATETIME;Päivämäärä ja aika PREFERENCES_SHTHRESHOLD;Kynnysarvo tummille alueille @@ -336,7 +331,6 @@ TP_CROP_GTRULETHIRDS;Kolmijako TP_CROP_GUIDETYPE;Sommittelumalli: TP_CROP_H;Kork. TP_CROP_LABEL;Rajaus -TP_CROP_SELECTCROP;Valitse alue TP_CROP_W;Lev. TP_CROP_X; x TP_CROP_Y; y @@ -422,6 +416,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -431,9 +426,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -450,6 +446,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -460,6 +460,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -500,8 +501,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -558,7 +559,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -570,16 +571,19 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -624,12 +628,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -733,9 +736,9 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -771,7 +774,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -786,8 +789,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -890,7 +893,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -970,19 +973,103 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1008,16 +1095,13 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1033,27 +1117,30 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1072,8 +1159,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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 @@ -1082,6 +1171,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1100,19 +1190,22 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1124,18 +1217,18 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1143,16 +1236,17 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1168,7 +1262,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1177,14 +1270,11 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1216,12 +1306,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1229,22 +1314,21 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1258,43 +1342,31 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1314,12 +1386,15 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1328,8 +1403,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1337,13 +1412,12 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1370,9 +1444,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1403,11 +1476,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1418,8 +1487,9 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1437,8 +1507,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1450,14 +1518,13 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1477,11 +1544,9 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1493,6 +1558,27 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1525,11 +1611,17 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1609,13 +1701,15 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1641,10 +1735,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1691,6 +1781,12 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1733,10 +1829,16 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1767,10 +1869,19 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1783,19 +1894,26 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1803,7 +1921,8 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1811,58 +1930,42 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1871,10 +1974,10 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1886,7 +1989,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1912,7 +2015,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1964,13 +2067,19 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2060,7 +2169,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2071,7 +2180,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2183,6 +2292,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2197,7 +2307,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K] !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 --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 0e45b4441..d16e7b95d 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -8,7 +8,6 @@ ABOUT_TAB_CREDITS;Erkännande ABOUT_TAB_LICENSE;Licens ABOUT_TAB_RELEASENOTES;Versionsnyheter 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 @@ -95,8 +94,6 @@ FILEBROWSER_AUTOFLATFIELD;Automatisk plattfältskorrigering FILEBROWSER_BROWSEPATHBUTTONHINT;Klicka för att komma till vald sökväg FILEBROWSER_BROWSEPATHHINT;Skriv in en sökväg och tryck Enter (Ctrl-Enter i filhanteraren).\nCtrl-O för att komma till sökfältet.\nEnter / Ctrl-Enter för att bläddra;\nEsc för att rensa ändringar.\nShift-Esc för att ta bort fokus från sökfältet.\n\n\nPath kortkommando:\n ~ - användarens hemkatalog\n ! - användarens bildkatalog FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Rensa från cachen - fullständigt -FILEBROWSER_CACHECLEARFROMPARTIAL;Rensa från cachen - delvis FILEBROWSER_CLEARPROFILE;Återställ profilen FILEBROWSER_COLORLABEL_TOOLTIP;Färgetikett\n\nAnvänd menyn eller kortkommandona:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Röd\nShift-Ctrl-2 Gul\nShift-Ctrl-3 Grön\nShift-Ctrl-4 Blå\nShift-Ctrl-5 Lila FILEBROWSER_COPYPROFILE;Kopiera profil @@ -349,7 +346,6 @@ HISTORY_MSG_121;Automat. CA-reducering HISTORY_MSG_122;Automat. svartbildsval HISTORY_MSG_123;Svartbildsfil HISTORY_MSG_124;Vitpunktskorrigering -HISTORY_MSG_125;Högdagerbevarande HISTORY_MSG_126;Plattfältsfil HISTORY_MSG_127;Automatiskt val av plattfält HISTORY_MSG_128;Oskärperadie för plattfält @@ -456,9 +452,7 @@ HISTORY_MSG_231;S/V 'Före'-kurva HISTORY_MSG_232;S/V 'Före'-kurvtyp HISTORY_MSG_233;S/V 'Efter'-kurva HISTORY_MSG_234;S/V 'Efter'-kurvtyp -HISTORY_MSG_235;S/V Automatisk kanalmixer HISTORY_MSG_236;--oanvänd-- -HISTORY_MSG_237;S/V Mixer HISTORY_MSG_238;Graderat filter - Fjäder HISTORY_MSG_239;Graderat filter - Styrka HISTORY_MSG_240;Graderat filter - Centrum @@ -492,7 +486,6 @@ HISTORY_MSG_269;CT - Hög - Röd HISTORY_MSG_270;CT - Hög - Grön HISTORY_MSG_271;CT - Hög - Blå HISTORY_MSG_272;CT - Balans -HISTORY_MSG_273;CT - Återställ HISTORY_MSG_274;CT - Mättnad skuggor HISTORY_MSG_275;CT - Mättnad i högdagrar HISTORY_MSG_276;CT - Opacitet @@ -601,7 +594,6 @@ HISTORY_MSG_388;W - Återstod - CB grön mellan HISTORY_MSG_389;W - Återstod - CB blå mellan HISTORY_MSG_390;W - Återstod - CB grön låg HISTORY_MSG_391;W - Återstod - CB blå låg -HISTORY_MSG_392;W - Återstod - CB återställning HISTORY_MSG_394;DCP - Basexponering HISTORY_MSG_395;DCP - Bastabell HISTORY_MSG_403;W - ES - Kantkänslighet @@ -748,8 +740,6 @@ NAVIGATOR_S;S: 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 @@ -797,7 +787,6 @@ PARTIALPASTE_PRSHARPENING;Skärpning efter storleksändring PARTIALPASTE_RAWCACORR_AUTO;Reducera kromatiska abberationer automatiskt PARTIALPASTE_RAWEXPOS_BLACK;Svärta PARTIALPASTE_RAWEXPOS_LINEAR;Vitpunktskorrigering -PARTIALPASTE_RAWEXPOS_PRESER;Korrigering av högdagrar PARTIALPASTE_RAWGROUP;Råbildsinställningar PARTIALPASTE_RAW_DCBENHANCE;DCB-förbättringssteg PARTIALPASTE_RAW_DCBITERATIONS;Antal DCB-iterationer @@ -817,14 +806,9 @@ PARTIALPASTE_VIGNETTING;Reducera vinjettering PARTIALPASTE_WAVELETGROUP;Wavelet-nivåer PARTIALPASTE_WHITEBALANCE;Vitbalans PREFERENCES_ADD;Lägg till +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Översiktsvyns guidefärg PREFERENCES_APPLNEXTSTARTUP;Kräver omstart av RawTherapee -PREFERENCES_AUTLISLOW;Låg -PREFERENCES_AUTLISMAX;Max - Medel av alla indelningar -PREFERENCES_AUTLISSTD;Hög -PREFERENCES_AUTLISVLOW;Ingen -PREFERENCES_AUTLOW;Låg PREFERENCES_AUTOMONPROFILE;Använd operativsystemets skärmfärgprofil -PREFERENCES_AUTSTD;Standard PREFERENCES_BATCH_PROCESSING;Batchbehandling PREFERENCES_BEHADDALL;Sätt allt till 'Lägg till' PREFERENCES_BEHADDALLHINT;Sätt alla parametrar till Lägg till-läge.\nFörändringar i parametrar batch-verktyget kommer att vara skillnader gentemot de lagrade värdena. @@ -832,16 +816,9 @@ PREFERENCES_BEHAVIOR;Uppträdande PREFERENCES_BEHSETALL;Sätt allt till 'Ange' PREFERENCES_BEHSETALLHINT;Sätt alla parametrar till Ange-läge.\nFörändringar i parametrar i batch-verktyget kommer att vara absoluta och de faktiska värdena kommer att visas. PREFERENCES_BLACKBODY;Glödlampa -PREFERENCES_CACHECLEARALL;Återställ alla -PREFERENCES_CACHECLEARPROFILES;Återställ profiler -PREFERENCES_CACHECLEARTHUMBS;Ta bort cachade miniatyrbilder PREFERENCES_CACHEMAXENTRIES;Maximalt antal cachefiler PREFERENCES_CACHEOPTS;Cacheinställningar PREFERENCES_CACHETHUMBHEIGHT;Maximal höjd på miniatyrbilderna -PREFERENCES_CIEART;CIECAM02-optimering -PREFERENCES_CIEART_FRAME;CIECAM02-Specifika inställningar -PREFERENCES_CIEART_LABEL;Använd flyttalsprecision istället för dubbel -PREFERENCES_CIEART_TOOLTIP;Om aktiverat, så kommer alla CIECAM02-beräkningar att utföras med enkel precision i flyttalsformatet istället för med dubbel precision. Detta ger en liten sänkning av beräkningstiden, till ett pris av en försumbar kvalitetsförsämring. PREFERENCES_CLIPPINGIND;Klippindikering PREFERENCES_CLUTSCACHE;HaldCLUT cache PREFERENCES_CLUTSCACHE_LABEL;Maximalt antal cachade CLUTs @@ -857,7 +834,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Format för nycklar PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Namn PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Exekverbar sökväg -PREFERENCES_CUTOVERLAYBRUSH;Bakgrundsfärg vid beskärning PREFERENCES_D50;5000K PREFERENCES_D55;5500K PREFERENCES_D60;6000K @@ -867,8 +843,6 @@ PREFERENCES_DARKFRAMESHOTS;bilder PREFERENCES_DARKFRAMETEMPLATES;mallar PREFERENCES_DATEFORMAT;Datumformat PREFERENCES_DATEFORMATHINT;Du kan använda följande format:\n%y: år\n%m: månad\n%d: dag\n\nTill exempel är det svenska datumformatet:\n%y-%m-%d -PREFERENCES_DAUB_LABEL;Använd Daubechies D6-wavelets istället för D4 -PREFERENCES_DAUB_TOOLTIP;Brusreduceringen och wavelet-verktyget använder en Debauchies moder-wavelet. Om du väljer D6 istället för D4 ökas antalet ortogonala Daubechies-koefficienter och troligtvis ökas också kvaliteten på de småskaliga nivåerna. Det blir ingen skillnad i minnesanvändning eller beräkningstid. PREFERENCES_DIRDARKFRAMES;Katalog för svartbilder PREFERENCES_DIRHOME;Hemkatalog PREFERENCES_DIRLAST;Senaste besökta katalog @@ -876,10 +850,8 @@ PREFERENCES_DIROTHER;Annan PREFERENCES_DIRSELECTDLG;Välj bildkatalog vid uppstart... PREFERENCES_DIRSOFTWARE;Installationskatalog 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_FLATFIELDFOUND;Hittade PREFERENCES_FLATFIELDSDIR;Plattfältskatalog @@ -919,11 +891,7 @@ PREFERENCES_INTENT_RELATIVE;Relativ kolorimetrisk PREFERENCES_INTENT_SATURATION;Mättnad PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Visa intern råbild om oredigerad PREFERENCES_LANGAUTODETECT;Använd operativsystemets språkinställning -PREFERENCES_LEVAUTDN;Brusreduceringsnivå -PREFERENCES_LEVDN;Cellstorlek -PREFERENCES_MAX;Max (Tile) PREFERENCES_MAXRECENTFOLDERS;Maximalt antal visade kataloger -PREFERENCES_MED;Medium (Tile/2) PREFERENCES_MENUGROUPEXTPROGS;Visa "Öppna med" PREFERENCES_MENUGROUPFILEOPERATIONS;Visa "Filaktiviteter" PREFERENCES_MENUGROUPLABEL;Visa "Etikett" @@ -931,12 +899,9 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Visa "Profilaktiviteter" PREFERENCES_MENUGROUPRANK;Visa "Betygsättning" PREFERENCES_MENUOPTIONS;Menyval för högerklick PREFERENCES_METADATA;Metadata -PREFERENCES_MIN;Mini (100x115) PREFERENCES_MULTITAB;Öppna bilderna i olika flikar PREFERENCES_MULTITABDUALMON;Visa bild på andra skärmen, om möjligt, i flerfliksläge -PREFERENCES_NAVGUIDEBRUSH;Översiktsvyns guidefärg PREFERENCES_NAVIGATIONFRAME;Navigering -PREFERENCES_NOISE;Brusreducering PREFERENCES_OUTDIR;Utmatningskatalog PREFERENCES_OUTDIRFOLDER;Spara till katalog PREFERENCES_OUTDIRFOLDERHINT;Spara de behandlade bilderna i den valda katalogen @@ -967,13 +932,8 @@ PREFERENCES_PROPERTY;Egenskaper PREFERENCES_PSPATH;Adobe Photoshops installationskatalog PREFERENCES_REMEMBERZOOMPAN;Kom ihåg förstoringsprocent och panorering PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Kom ihåg förstoringsgraden i % och panoreringen för den aktuella bilden när du öppnar en ny bild.\n\nDet här valet fungerar bara i Enkelfliksläget och när "Demosaicing-metod som ska användas för förstoringsgrader <100 %" är satt til "Som i PP3". -PREFERENCES_RGBDTL_LABEL;Maximalt antal trådar för brusreducering -PREFERENCES_RGBDTL_TOOLTIP;Brusreduceringen kräver ungefär 128MB RAM för en 10MPix bild och 512MB för en 40 MPix, och ytterligare 128MB per tråd. Ju fler trådar som körs parallellt, desto snabbare går beräkningarna. Ange värdet "0" för att automatiskt använda så många trådar som möjligt. -PREFERENCES_SELECTFONT;Välj typsnitt -PREFERENCES_SELECTFONT_COLPICKER;Välj typsnitt för färgpipetten PREFERENCES_SELECTLANG;Välj språk -PREFERENCES_SELECTTHEME;Välj tema -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Seriell läsning av tiff-filer +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Seriell läsning av TIFF-filer PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;När man arbetar med bilder i en katalog full med okomprimerade till-filer, så kan prestanda för att generera miniatyrbilder ökas genom att aktivera detta val. PREFERENCES_SET;Ange PREFERENCES_SHOWBASICEXIF;Visa grundlig Exif-information @@ -981,35 +941,23 @@ PREFERENCES_SHOWDATETIME;Visa datum och tid PREFERENCES_SHOWEXPOSURECOMPENSATION;Lägg till exponeringskompensation PREFERENCES_SHOWFILMSTRIPTOOLBAR;Visa verktygsraden för filmstrip PREFERENCES_SHTHRESHOLD;Tröskelvärde för skuggor -PREFERENCES_SIMPLAUT;Verktygsläge PREFERENCES_SINGLETAB;Öppna en bild åt gången PREFERENCES_SINGLETABVERTAB;Enkelfliksläge, vertikala flikar -PREFERENCES_SMA;Liten (250x287) PREFERENCES_SND_BATCHQUEUEDONE;Batchkön färdig PREFERENCES_SND_HELP;Fyll i en sökväg till ett ljud.\nI Windows kan "SystemDefault", "SystemAsterisk" o.s.v. användas.\nPå Linuxbaserade system kan du prova med "complete", "windows-attention" o.s.v. PREFERENCES_SND_LNGEDITPROCDONE;När behandlingen är klar -PREFERENCES_SND_TRESHOLDSECS;Ljudet kommer efter så här många sekunder +PREFERENCES_SND_THRESHOLDSECS;Ljudet kommer efter så här många sekunder PREFERENCES_STARTUPIMDIR;Bildkatalog som visas vid uppstart -PREFERENCES_STDAUT;Standard PREFERENCES_TAB_BROWSER;Filbläddrare PREFERENCES_TAB_COLORMGR;Färghantering PREFERENCES_TAB_GENERAL;Allmän PREFERENCES_TAB_IMPROC;Bildbehandling -PREFERENCES_TAB_PERFORMANCE;Prestanda PREFERENCES_TAB_SOUND;Ljud -PREFERENCES_TIMAX;Hög -PREFERENCES_TINB;Antal tiles -PREFERENCES_TISTD;Standard PREFERENCES_TP_LABEL;Verktygspanel: -PREFERENCES_TP_USEICONORTEXT;Använd ikoner istället för text PREFERENCES_TP_VSCROLLBAR;Göm verktygpanelens vertikala skrollist PREFERENCES_TUNNELMETADATA;Kopiera Exif/IPTC/XMP till utfilen oförändrat PREFERENCES_USEBUNDLEDPROFILES;Visa förinstallerade profiler PREFERENCES_VIEW;Utenhetens vitbalansvärde (datorskärm, TV, bildkanon, etc.) -PREFERENCES_WAVLEV;Öka waveletnivån vid kvalitet "hög" -PREFERENCES_WLONE;En nivå -PREFERENCES_WLTWO;Två nivåer -PREFERENCES_WLZER;Nej PREFERENCES_WORKFLOW;Arbetsflöde PROFILEPANEL_COPYPPASTE;Parametrar att kopiera PROFILEPANEL_GLOBALPROFILES;Förinstallerade profiler @@ -1063,8 +1011,6 @@ SAVEDLG_SUBSAMP_TOOLTIP;Bästa komprimering:\nJ:a:b 4:2:0\nh/v 2/2\nKroma halver 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 @@ -1082,7 +1028,6 @@ TP_BWMIX_ALGO_LI;Linjär TP_BWMIX_ALGO_SP;Specialeffekter TP_BWMIX_ALGO_TOOLTIP;Linjär: kommer att procudera ett normalt linjärt svar.\nSpecialeffekter: kommer att producera specialeffekter genom att miza kanalerna icke-linjärt. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Beräkna värden som optimerar kanalmixern TP_BWMIX_CC_ENABLED;Justera komplementär färg TP_BWMIX_CC_TOOLTIP;Aktivera för att tillåta automatisk justering av komplementär färg i ROYGCBPM-läget TP_BWMIX_CHANNEL;Luminansequalizer @@ -1109,9 +1054,6 @@ TP_BWMIX_MET;Metod TP_BWMIX_MET_CHANMIX;Kanalmixer TP_BWMIX_MET_DESAT;Reducera mättnad TP_BWMIX_MET_LUMEQUAL;Luminansequalizer -TP_BWMIX_MIXC;Blanda -TP_BWMIX_NEUTRAL;Återställ mixer -TP_BWMIX_NEUTRAL_TIP;Återställ alla värden (filter, kanalmixer) till standard TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Totalt: %4%% TP_BWMIX_RGBLABEL_HINT;Slutliga RGB-faktorer som tar hand om alla mixerinställningar\n"Totalt" visar summan av RGB-värden som faktiskt används:\n- alltid 100% i relativt läge\n- högre (ljusare) eller lägre (mörkare) än 100% i absolut läge. TP_BWMIX_RGB_TOOLTIP;Blanda RGB-kanalerna. Använd förinställningar som en vägledning.\nNotera negativa värden som kan orsaka artefakter eller felaktiga beteenden. @@ -1152,11 +1094,6 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Vänd horisontellt TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotera åt vänster.\nKortkommando: [ TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotera åt höger.\nKortkommando: ] TP_COARSETRAF_TOOLTIP_VFLIP;Vänd vertikalt -TP_COLORAPP_ADAPTSCENE;Luminans hos vyn -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolut luminans hos vyn (cd/m²).\n1) Beräknas från exif-informationen:\nSlutartid - ISO-tal - Bländartal - exponeringskompensation gjord av kameran.\n2) Beräknas från vitpunkten hos råbilden och RT:s reglage för exponeringskompensation -TP_COLORAPP_ADAPTVIEWING;Betrakningsluminans (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolut luminans hos betrakningsomgivningen\n(vanligtvis 16cd/m²) -TP_COLORAPP_ADAP_AUTO_TOOLTIP;Om checkboxen är aktiverad (rekommenderas) beräknar RT ett optimalt värde från exif-informationen.\nFör att sätta ett värde manuellt, avaktivera funktionen först TP_COLORAPP_ALGO;Algoritm TP_COLORAPP_ALGO_ALL;Alla TP_COLORAPP_ALGO_JC;Ljushet + kroma (JC) @@ -1186,8 +1123,6 @@ TP_COLORAPP_CURVEEDITOR3;Färgkurva TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Justera antingen kroma, mättnad eller colorfulness.\n\nVisar histogrammet hos kromaciteten (Lab) före CIECAM02.\nOm checkboxen "Show CIECAM02 output histograms in curves" är aktiverad, visas histogrammet för C, s eller M efter CIECAM02.\n\nC, s och M visas ej i histogrammet i huvudpanelen.\n\nFör slutligt resultat, se huvudpanelens histogram TP_COLORAPP_DATACIE;Resultat av CIECAM02-histogram i kurvor TP_COLORAPP_DATACIE_TOOLTIP;När detta är aktiverat, visar CIECAM02-histogram ungefärliga värden/intervall för J eller Q, och C, s eller M efter justeringar i CIECAM02.\nDet här valet påverkar inte huvudhistogrammet.\n\nNär detta är avaktiverat, visar histogrammet för CIECAM02-kurvor Lab-värden innan justeringar av CIECAM02 -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Om den här checkboxen är aktiverad (rekommenderas), beräknar RT ett optimalt värde som sedan dels används av CAT02 och dels för hela CIECAM02.\nFör att ange ett värde manuellt, avaktivera checkboxen först (värden över 65 rekommenderas) -TP_COLORAPP_DEGREE_TOOLTIP;Mängd CIE kromatisk anpassning 2002 TP_COLORAPP_GAMUT;Kontroll av tonomfång (Lab) TP_COLORAPP_GAMUT_TOOLTIP;Tillåt kontroll av tonomfång i Lab-läge TP_COLORAPP_HUE;Nyans(h) @@ -1202,8 +1137,6 @@ TP_COLORAPP_MODEL;Vitpunktsmodell TP_COLORAPP_MODEL_TOOLTIP;Vitpunktsmodell\n\nWB [RT] + [output]:\nRT:s vitbalans används för bilden, CIECAM02 sätts till D50, utmatningsenhetens vitbalans sätts i Inställningar > Färghantering\n\nWB [RT+CAT02] + [output]:\nRT:s vitbalansinställningar används av CAT02 och utmatningsenhetens vitbalans sätts i Inställningar TP_COLORAPP_RSTPRO;Bevara röda färger och hudtoner TP_COLORAPP_RSTPRO_TOOLTIP;Bevara röda färger och hudtoner (reglage och kurvor) -TP_COLORAPP_SHARPCIE;Skärpa, Kontrast genom detaljnivåer, Mikrokontrast och Fyll ut överstrålning med kvalitetskontroll -TP_COLORAPP_SHARPCIE_TOOLTIP;Skärpa, Kontrast genom detaljnivåer, Mikrokontrast och Fyll ut överstrålning kommer att använda CIECAM02 om den är aktiverad TP_COLORAPP_SURROUND;Omgivning TP_COLORAPP_SURROUND_AVER;Medel TP_COLORAPP_SURROUND_DARK;Mörk @@ -1222,6 +1155,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;Ljushet TP_COLORAPP_TCMODE_SATUR;Mättnad TP_COLORAPP_TONECIE;Tonmappning som använder CIECAM02 ljushet (Q) TP_COLORAPP_TONECIE_TOOLTIP;Om det här valet ej är aktiverat, görs tonmappningen i Lab.\nOm det här valet är aktiverat, görs tonmappningen mha CIECAM02.\nTonmappningsverktyget måste vara aktiverad för att den här inställningen ska ha någon effekt +TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolut luminans hos betrakningsomgivningen\n(vanligtvis 16cd/m²) TP_COLORAPP_WBCAM;Vitbalans [RT+CAT02] + [utmatning] TP_COLORAPP_WBRT;Vitbalans [RT] + [utmatning] TP_COLORTONING_AB;o C/L @@ -1270,7 +1204,6 @@ TP_CROP_GUIDETYPE;Guidetyp: TP_CROP_H;Höjd TP_CROP_LABEL;Beskär TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Välj beskärningsområde TP_CROP_W;Bredd TP_CROP_X;x TP_CROP_Y;y @@ -1346,7 +1279,6 @@ TP_EPD_LABEL;Tonmappning TP_EPD_REWEIGHTINGITERATES;Återviktade iterationer TP_EPD_SCALE;Skala TP_EPD_STRENGTH;Styrka -TP_EPD_TOOLTIP;Tonmappning är möjligt via Lab-läge (standard) och CIECAM02-läge.\n\nFör att aktivera CIECAM02- tonmappningsläget, aktivera följande:\n1. CIECAM02\n2. Algoritm="Intensitet + Färgmättnad (QM)"\n3. "Tonmappning mha CIECAM02 intensitet (Q)" TP_EXPOSURE_AUTOLEVELS;Autonivåer TP_EXPOSURE_AUTOLEVELS_TIP;Slå av/på autonivåer för att automatiskt beräkna och använda värden baserat på bildanalys\nAktiverar högdageråterställning om nödvändigt TP_EXPOSURE_BLACKLEVEL;Svärta @@ -1487,9 +1419,6 @@ TP_LENSGEOM_AUTOCROP;Autobeskärning TP_LENSGEOM_FILL;Fyll automatiskt TP_LENSGEOM_LABEL;Geometrisk- och distorsionskorrigering TP_LENSPROFILE_LABEL;Objektivkorrigeringsprofil -TP_LENSPROFILE_USECA;Korrigera för kromatiska abberationer -TP_LENSPROFILE_USEDIST;Korrigera distorsion -TP_LENSPROFILE_USEVIGN;Korrigera vinjettering TP_NEUTRAL;Återställ TP_NEUTRAL_TIP;Återställ exponeringsreglagen till neutrala värden.\nGäller för samma reglage som autonivåer, oavsett om du använder autonivåer eller ej TP_PCVIGNETTE_FEATHER;Fjäder @@ -1527,7 +1456,6 @@ TP_RAWEXPOS_BLACK_BLUE;Blå TP_RAWEXPOS_BLACK_GREEN;Grön TP_RAWEXPOS_BLACK_RED;Röd TP_RAWEXPOS_LINEAR;Vitpunktskorrigering -TP_RAWEXPOS_PRESER;Bevara högdagrar TP_RAWEXPOS_RGB;Röd, grön, blå TP_RAWEXPOS_TWOGREEN;Två gröna tillsammans TP_RAW_DCBENHANCE;DCB-förbättringssteg @@ -1856,8 +1784,8 @@ TP_WBALANCE_WATER_HEADER;Under vattnet 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: - @@ -1865,35 +1793,51 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !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_CATMULLROM;Flexible !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New !DYNPROFILEEDITOR_NEW_RULE;New Dynamic Profile Rule !DYNPROFILEEDITOR_PROFILE;Processing Profile +!EXIFFILTER_IMAGETYPE;Image type !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_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_RESETDEFAULTPROFILE;Reset to default +!GENERAL_CURRENT;Current +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTORY_MSG_173;NR - Detail recovery !HISTORY_MSG_203;NR - Color space +!HISTORY_MSG_235;B&W - CM - Auto +!HISTORY_MSG_237;B&W - CM !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_273;CT - Color Balance SMH +!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 @@ -1902,6 +1846,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !HISTORY_MSG_330;W - Toning - Opacity BY !HISTORY_MSG_344;W - Meth chroma sl/cur !HISTORY_MSG_353;W - ES - Gradient sensitivity +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_396;W - Contrast sub-tool !HISTORY_MSG_397;W - Chroma sub-tool @@ -1943,18 +1888,102 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1980,23 +2009,45 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_ICCPROFCREATOR;ICC Profile Creator !MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue. -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!MAIN_TAB_ADVANCED;Advanced +!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-w +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. +!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_DEHAZE;Haze removal !PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control !PARTIALPASTE_LOCALCONTRAST;Local contrast +!PARTIALPASTE_METADATA;Metadata mode +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_IMAGENUM;Sub-image !PARTIALPASTE_RAW_PIXELSHIFT;Pixel Shift -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_THEME;Theme +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CMMBPC;Black point compensation -!PREFERENCES_CROP;Crop editing -!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop area +!PREFERENCES_CROP;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -2004,45 +2055,85 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !PREFERENCES_D50_OLD;5000K !PREFERENCES_DIRECTORIES;Directories !PREFERENCES_EDITORCMDLINE;Custom command line +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !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 -!PREFERENCES_LISS;Auto multi-zone smoothing !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_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !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 !PREFERENCES_PRTINTENT;Rendering intent !PREFERENCES_PRTPROFILE;Color profile -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_THEME;Theme +!PREFERENCES_TAB_PERFORMANCE;Performance +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point +!SAVEDLG_FILEFORMAT_FLOAT; 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_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_CBDL_METHOD;Process located +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !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 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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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. @@ -2058,6 +2149,9 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_CLAMPOOG;Clip out-of-gamut colors +!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve +!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail. !TP_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. @@ -2065,6 +2159,21 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_ICM_APPLYLOOKTABLE;Look table !TP_ICM_PROFILEINTENT;Rendering Intent !TP_ICM_SAVEREFERENCE;Save Reference Image +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -2074,79 +2183,81 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB +!TP_RAW_DCBVNG4;DCB+VNG4 +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !TP_RAW_VNG4;VNG4 -!TP_RETINEX_CONTEDIT_MAP;Mask equalizer +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling +!TP_RETINEX_CONTEDIT_MAP;Equalizer !TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts. !TP_RETINEX_CURVEEDITOR_MAP_TOOLTIP;This curve can be applied alone or with a Gaussian mask or wavelet mask.\nBeware of artifacts! -!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce transmission map to achieve luminance.\nAbscissa: transmission -min from 0, mean, and values (max).\nOrdinate: gain. +!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.). !TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool. !TP_RETINEX_LABEL_MASK;Mask -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -2161,9 +2272,15 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !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_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold +!TP_SHARPENMICRO_CONTRAST;Contrast threshold +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !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. @@ -2171,11 +2288,11 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000). !TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero. !TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the firsts levels. However the quality is not strictly related to this coefficient and can vary with images and uses. -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGEDETECTTHR;Threshold low (noise) !TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection) !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_HIGHLIGHT;Highlight luminance range !TP_WAVELET_HS1;Whole luminance range @@ -2202,5 +2319,6 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: - !TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements. !TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out. !TP_WAVELET_TON;Toning +!TP_WBALANCE_PICKER;Pick !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 --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish index a0909bcab..59b2e8478 100644 --- a/rtdata/languages/Turkish +++ b/rtdata/languages/Turkish @@ -1,6 +1,5 @@ #01 2008-03-02 Oguz -ADJUSTER_RESET_TO_DEFAULT;Varsayılana dön CURVEEDITOR_LINEAR;Doğrusal CURVEEDITOR_LOADDLGLABEL;Eğriyi yükle... CURVEEDITOR_SAVEDLGLABEL;Eğriyi kaydet... @@ -231,9 +230,6 @@ PARTIALPASTE_SHARPENING;Sharpening PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_APPLNEXTSTARTUP;Bir sonraki başlamada uygulacacak. -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails PREFERENCES_CACHEMAXENTRIES;Maximal Number of Cache Entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximal Thumbnail Height @@ -275,7 +271,6 @@ PREFERENCES_PROFILESAVECACHE;Save Processing Parameters to the Cache PREFERENCES_PROFILESAVEINPUT;Save Processing Parameters Next to the Input File PREFERENCES_PSPATH;Adobe Photoshop installation directory PREFERENCES_SELECTLANG;Dil seç -PREFERENCES_SELECTTHEME;Select theme PREFERENCES_SHOWBASICEXIF;Temel exif bilgisini göster PREFERENCES_SHOWDATETIME;Tarih ve saati göster PREFERENCES_SHTHRESHOLD;Kırpılmış karaltılar için eşik @@ -336,7 +331,6 @@ TP_CROP_GTRULETHIRDS;Üçler kuralı TP_CROP_GUIDETYPE;Kılavuz türü: TP_CROP_H;Y TP_CROP_LABEL;Kırp -TP_CROP_SELECTCROP; Kırpma alanı seç TP_CROP_W;G TP_CROP_X;x TP_CROP_Y;y @@ -421,6 +415,7 @@ TP_WBALANCE_TEMPERATURE;Isı !ABOUT_TAB_LICENSE;License !ABOUT_TAB_RELEASENOTES;Release Notes !ABOUT_TAB_SPLASH;Splash +!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. !BATCHQUEUE_AUTOSTART;Auto-start !BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. !BATCHQUEUE_DESTFILENAME;Path and file name @@ -430,9 +425,10 @@ TP_WBALANCE_TEMPERATURE;Isı !CURVEEDITOR_AXIS_LEFT_TAN;LT: !CURVEEDITOR_AXIS_OUT;O: !CURVEEDITOR_AXIS_RIGHT_TAN;RT: +!CURVEEDITOR_CATMULLROM;Flexible !CURVEEDITOR_CURVE;Curve !CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CUSTOM;Custom +!CURVEEDITOR_CUSTOM;Standard !CURVEEDITOR_DARKS;Darks !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. !CURVEEDITOR_HIGHLIGHTS;Highlights @@ -449,6 +445,10 @@ TP_WBALANCE_TEMPERATURE;Isı !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_IMGTYPE_ANY;Any +!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +!DYNPROFILEEDITOR_IMGTYPE_STD;Standard !DYNPROFILEEDITOR_MOVE_DOWN;Move Down !DYNPROFILEEDITOR_MOVE_UP;Move Up !DYNPROFILEEDITOR_NEW;New @@ -459,6 +459,7 @@ TP_WBALANCE_TEMPERATURE;Isı !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 +!EXIFFILTER_IMAGETYPE;Image type !EXIFFILTER_METADATAFILTER;Enable metadata filters !EXIFPANEL_SHOWALL;Show all !EXPORT_BYPASS;Processing steps to bypass @@ -499,8 +500,8 @@ TP_WBALANCE_TEMPERATURE;Isı !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory !FILEBROWSER_CACHE;Cache -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple !FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark-frame @@ -557,7 +558,7 @@ TP_WBALANCE_TEMPERATURE;Isı !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 !FILECHOOSER_FILTER_ANY;All files -!FILECHOOSER_FILTER_COLPROF;Color profiles +!FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) !FILECHOOSER_FILTER_CURVE;Curve files !FILECHOOSER_FILTER_LCP;Lens correction profiles !FILECHOOSER_FILTER_PP;Processing profiles @@ -569,16 +570,19 @@ TP_WBALANCE_TEMPERATURE;Isı !GENERAL_AUTO;Automatic !GENERAL_BEFORE;Before !GENERAL_CLOSE;Close +!GENERAL_CURRENT;Current !GENERAL_FILE;File !GENERAL_NONE;None !GENERAL_OPEN;Open +!GENERAL_RESET;Reset +!GENERAL_SAVE_AS;Save as... !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. -!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +!HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -!HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. +!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. !HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. !HISTORY_MSG_82;Profile changed !HISTORY_MSG_83;S/H - Sharp mask @@ -623,12 +627,11 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_122;Dark-Frame - Auto-selection !HISTORY_MSG_123;Dark-Frame - File !HISTORY_MSG_124;White point correction -!HISTORY_MSG_125;Highlight preservation !HISTORY_MSG_126;Flat-Field - File !HISTORY_MSG_127;Flat-Field - Auto-selection !HISTORY_MSG_128;Flat-Field - Blur radius !HISTORY_MSG_129;Flat-Field - Blur type -!HISTORY_MSG_130;Auto distorion correction +!HISTORY_MSG_130;Auto distortion correction !HISTORY_MSG_131;NR - Luma !HISTORY_MSG_132;NR - Chroma !HISTORY_MSG_133;Output gamma @@ -732,9 +735,9 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_232;B&W - 'Before' curve type !HISTORY_MSG_233;B&W - 'After' curve !HISTORY_MSG_234;B&W - 'After' curve type -!HISTORY_MSG_235;B&W - Auto channel mixer +!HISTORY_MSG_235;B&W - CM - Auto !HISTORY_MSG_236;--unused-- -!HISTORY_MSG_237;B&W - Mixer +!HISTORY_MSG_237;B&W - CM !HISTORY_MSG_238;GF - Feather !HISTORY_MSG_239;GF - Strength !HISTORY_MSG_240;GF - Center @@ -770,7 +773,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_270;CT - High - Green !HISTORY_MSG_271;CT - High - Blue !HISTORY_MSG_272;CT - Balance -!HISTORY_MSG_273;CT - Reset +!HISTORY_MSG_273;CT - Color Balance SMH !HISTORY_MSG_274;CT - Sat. Shadows !HISTORY_MSG_275;CT - Sat. Highlights !HISTORY_MSG_276;CT - Opacity @@ -785,8 +788,8 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_285;NR - Median - Method !HISTORY_MSG_286;NR - Median - Type !HISTORY_MSG_287;NR - Median - Iterations -!HISTORY_MSG_288;Flat Field - Clip control -!HISTORY_MSG_289;Flat Field - Clip control - Auto +!HISTORY_MSG_288;Flat-Field - Clip control +!HISTORY_MSG_289;Flat-Field - Clip control - Auto !HISTORY_MSG_290;Black Level - Red !HISTORY_MSG_291;Black Level - Green !HISTORY_MSG_292;Black Level - Blue @@ -889,7 +892,7 @@ TP_WBALANCE_TEMPERATURE;Isı !HISTORY_MSG_389;W - Residual - CB blue mid !HISTORY_MSG_390;W - Residual - CB green low !HISTORY_MSG_391;W - Residual - CB blue low -!HISTORY_MSG_392;W - Residual - CB Reset +!HISTORY_MSG_392;W - Residual - Color Balance !HISTORY_MSG_393;DCP - Look table !HISTORY_MSG_394;DCP - Baseline exposure !HISTORY_MSG_395;DCP - Base table @@ -969,19 +972,103 @@ TP_WBALANCE_TEMPERATURE;Isı !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_488;Dynamic Range Compression +!HISTORY_MSG_489;DRC - Detail +!HISTORY_MSG_490;DRC - Amount !HISTORY_MSG_491;White Balance !HISTORY_MSG_492;RGB Curves !HISTORY_MSG_493;L*a*b* Adjustments +!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors +!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method !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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +!HISTORY_MSG_RAW_BORDER;Raw border +!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor !HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s +!ICCPROFCREATOR_COPYRIGHT;Copyright: +!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +!ICCPROFCREATOR_CUSTOM;Custom +!ICCPROFCREATOR_DESCRIPTION;Description: +!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +!ICCPROFCREATOR_GAMMA;Gamma +!ICCPROFCREATOR_ICCVERSION;ICC version: +!ICCPROFCREATOR_ILL;Illuminant: +!ICCPROFCREATOR_ILL_41;D41 +!ICCPROFCREATOR_ILL_50;D50 +!ICCPROFCREATOR_ILL_55;D55 +!ICCPROFCREATOR_ILL_60;D60 +!ICCPROFCREATOR_ILL_65;D65 +!ICCPROFCREATOR_ILL_80;D80 +!ICCPROFCREATOR_ILL_DEF;Default +!ICCPROFCREATOR_ILL_INC;StdA 2856K +!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +!ICCPROFCREATOR_PRIMARIES;Primaries: +!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +!ICCPROFCREATOR_PRIM_BEST;BestRGB +!ICCPROFCREATOR_PRIM_BETA;BetaRGB +!ICCPROFCREATOR_PRIM_BLUX;Blue X +!ICCPROFCREATOR_PRIM_BLUY;Blue Y +!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +!ICCPROFCREATOR_PRIM_GREX;Green X +!ICCPROFCREATOR_PRIM_GREY;Green Y +!ICCPROFCREATOR_PRIM_PROPH;Prophoto +!ICCPROFCREATOR_PRIM_REC2020;Rec2020 +!ICCPROFCREATOR_PRIM_REDX;Red X +!ICCPROFCREATOR_PRIM_REDY;Red Y +!ICCPROFCREATOR_PRIM_SRGB;sRGB +!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +!ICCPROFCREATOR_PRIM_WIDEG;Widegamut +!ICCPROFCREATOR_PROF_V2;ICC v2 +!ICCPROFCREATOR_PROF_V4;ICC v4 +!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +!ICCPROFCREATOR_SLOPE;Slope +!ICCPROFCREATOR_TRC_PRESET;Tone response curve: !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 @@ -1007,16 +1094,13 @@ TP_WBALANCE_TEMPERATURE;Isı !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_FULLSCREEN;Fullscreen +!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s !MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen @@ -1032,27 +1116,30 @@ TP_WBALANCE_TEMPERATURE;Isı !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 !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +!MAIN_TAB_FAVORITES;Favorites +!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u !MAIN_TAB_INSPECT; Inspect !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m !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 -!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +!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 +!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 !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_PREVIEWB;Preview the Blue channel.\nShortcut: b -!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -!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 -!MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +!MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +!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 +!MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l @@ -1071,8 +1158,10 @@ TP_WBALANCE_TEMPERATURE;Isı !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 @@ -1081,6 +1170,7 @@ TP_WBALANCE_TEMPERATURE;Isı !PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection !PARTIALPASTE_DARKFRAMEFILE;Dark-frame file !PARTIALPASTE_DEFRINGE;Defringe +!PARTIALPASTE_DEHAZE;Haze removal !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction !PARTIALPASTE_DIRPYREQUALIZER;Contrast by detail levels @@ -1099,19 +1189,22 @@ TP_WBALANCE_TEMPERATURE;Isı !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 !PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter !PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !PARTIALPASTE_PRSHARPENING;Post-resize sharpening !PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift !PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -!PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation !PARTIALPASTE_RAWGROUP;Raw Settings +!PARTIALPASTE_RAW_BORDER;Raw border !PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement !PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations !PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -1123,18 +1216,18 @@ TP_WBALANCE_TEMPERATURE;Isı !PARTIALPASTE_RGBCURVES;RGB curves !PARTIALPASTE_SHARPENEDGE;Edges !PARTIALPASTE_SHARPENMICRO;Microcontrast -!PARTIALPASTE_TM_FATTAL;HDR Tone mapping +!PARTIALPASTE_SOFTLIGHT;Soft light +!PARTIALPASTE_TM_FATTAL;Dynamic range compression !PARTIALPASTE_VIBRANCE;Vibrance -!PARTIALPASTE_WAVELETGROUP;Wavelet Levels !PREFERENCES_ADD;Add -!PREFERENCES_AUTLISLOW;Low -!PREFERENCES_AUTLISMAX;Max - Average of all tiles -!PREFERENCES_AUTLISSTD;High -!PREFERENCES_AUTLISVLOW;None -!PREFERENCES_AUTLOW;Low +!PREFERENCES_APPEARANCE;Appearance +!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +!PREFERENCES_APPEARANCE_MAINFONT;Main font +!PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +!PREFERENCES_APPEARANCE_THEME;Theme !PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -!PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -!PREFERENCES_AUTSTD;Standard +!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit !PREFERENCES_BATCH_PROCESSING;Batch Processing !PREFERENCES_BEHADDALL;All to 'Add' !PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -1142,16 +1235,17 @@ TP_WBALANCE_TEMPERATURE;Isı !PREFERENCES_BEHSETALL;All to 'Set' !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_BLACKBODY;Tungsten -!PREFERENCES_CIEART;CIECAM02 optimization -!PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -!PREFERENCES_CIEART_LABEL;Use float precision instead of double -!PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +!PREFERENCES_CACHECLEAR;Clear +!PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. !PREFERENCES_CLUTSCACHE;HaldCLUT Cache !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;Crop Editing +!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop !PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop !PREFERENCES_CROP_GUIDES_FRAME;Frame !PREFERENCES_CROP_GUIDES_FULL;Original @@ -1167,7 +1261,6 @@ TP_WBALANCE_TEMPERATURE;Isı !PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name !PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID !PREFERENCES_CUSTPROFBUILDPATH;Executable path -!PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency !PREFERENCES_D50;Settings in main menu !PREFERENCES_D50_OLD;5000K !PREFERENCES_D55;5500K @@ -1176,14 +1269,11 @@ TP_WBALANCE_TEMPERATURE;Isı !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_EDITORLAYOUT;Editor layout +!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser !PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat-fields directory !PREFERENCES_FLATFIELDSHOTS;shots @@ -1215,12 +1305,7 @@ TP_WBALANCE_TEMPERATURE;Isı !PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited !PREFERENCES_LANG;Language !PREFERENCES_LANGAUTODETECT;Use system language -!PREFERENCES_LEVAUTDN;Denoising level -!PREFERENCES_LEVDN;Cell size -!PREFERENCES_LISS;Auto multi-zone smoothing -!PREFERENCES_MAX;Maxi (Tile) !PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -!PREFERENCES_MED;Medium (Tile/2) !PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" !PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1228,22 +1313,21 @@ TP_WBALANCE_TEMPERATURE;Isı !PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata -!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_MULTITAB;Multiple Editor Tabs Mode !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -!PREFERENCES_NAVGUIDEBRUSH;Navigator guide color !PREFERENCES_NAVIGATIONFRAME;Navigation -!PREFERENCES_NOISE;Noise Reduction !PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails in the file browser !PREFERENCES_OVERLAY_FILENAMES_FILMSTRIP;Overlay filenames on thumbnails in the editor pannel !PREFERENCES_OVERWRITEOUTPUTFILE;Overwrite existing output files !PREFERENCES_PANFACTORLABEL;Pan rate amplification !PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. !PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +!PREFERENCES_PERFORMANCE_THREADS;Threads +!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) !PREFERENCES_PREVDEMO;Preview Demosaic Method !PREFERENCES_PREVDEMO_FAST;Fast !PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1257,43 +1341,31 @@ TP_WBALANCE_TEMPERATURE;Isı !PREFERENCES_PRTPROFILE;Color profile !PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset !PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -!PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -!PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -!PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -!PREFERENCES_SELECTFONT;Select main font -!PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font -!PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now +!PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +!PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +!PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. !PREFERENCES_SET;Set !PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar -!PREFERENCES_SIMPLAUT;Tool mode +!PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar !PREFERENCES_SINGLETAB;Single Editor Tab Mode !PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -!PREFERENCES_SMA;Small (250x287) !PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done !PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. !PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -!PREFERENCES_SND_TRESHOLDSECS;After seconds -!PREFERENCES_STDAUT;Standard +!PREFERENCES_SND_THRESHOLDSECS;After seconds !PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules -!PREFERENCES_TAB_PERFORMANCE;Performance & Quality +!PREFERENCES_TAB_PERFORMANCE;Performance !PREFERENCES_TAB_SOUND;Sounds -!PREFERENCES_THEME;Theme -!PREFERENCES_TIMAX;High -!PREFERENCES_TINB;Number of tiles -!PREFERENCES_TISTD;Standard +!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise !PREFERENCES_TP_LABEL;Tool panel: -!PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text !PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar !PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file !PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles !PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -!PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -!PREFERENCES_WLONE;One level -!PREFERENCES_WLTWO;Two levels -!PREFERENCES_WLZER;No !PREFERENCES_WORKFLOW;Layout !PROFILEPANEL_COPYPPASTE;Parameters to copy !PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1313,12 +1385,15 @@ TP_WBALANCE_TEMPERATURE;Isı !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 +!SAMPLEFORMAT_1;8-bit unsigned +!SAMPLEFORMAT_2;16-bit unsigned +!SAMPLEFORMAT_4;24-bit LogLuv +!SAMPLEFORMAT_8;32-bit LogLuv +!SAMPLEFORMAT_16;16-bit floating-point +!SAMPLEFORMAT_32;24-bit floating-point +!SAMPLEFORMAT_64;32-bit floating-point !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists +!SAVEDLG_FILEFORMAT_FLOAT; floating-point !SAVEDLG_FORCEFORMATOPTS;Force saving options !SAVEDLG_SUBSAMP;Subsampling !SAVEDLG_SUBSAMP_1;Best compression @@ -1327,8 +1402,8 @@ TP_WBALANCE_TEMPERATURE;Isı !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 Printer profile. -!SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +!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 @@ -1336,13 +1411,12 @@ TP_WBALANCE_TEMPERATURE;Isı !THRESHOLDSELECTOR_T;Top !THRESHOLDSELECTOR_TL;Top-left !THRESHOLDSELECTOR_TR;Top-right -!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 +!TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. !TP_BWMIX_AUTOCH;Auto -!TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. !TP_BWMIX_CC_ENABLED;Adjust complementary color !TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. !TP_BWMIX_CHANNEL;Luminance equalizer @@ -1369,9 +1443,8 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_BWMIX_MET_CHANMIX;Channel Mixer !TP_BWMIX_MET_DESAT;Desaturation !TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -!TP_BWMIX_MIXC;Mixer -!TP_BWMIX_NEUTRAL;Reset mixer -!TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +!TP_BWMIX_MIXC;Channel Mixer +!TP_BWMIX_NEUTRAL;Reset !TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% !TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. !TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1402,11 +1475,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_CBDL_METHOD;Process located !TP_CBDL_METHOD_TOOLTIP;Choose whether the Contrast by Detail Levels tool is to be positioned after the Black-and-White tool, which makes it work in L*a*b* space, or before it, which makes it work in RGB space. !TP_CHROMATABERR_LABEL;Chromatic Aberration -!TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -!TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -!TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -!TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -!TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance !TP_COLORAPP_ALGO;Algorithm !TP_COLORAPP_ALGO_ALL;All !TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1417,8 +1486,9 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. !TP_COLORAPP_BRIGHT;Brightness (Q) !TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. !TP_COLORAPP_CHROMA;Chroma (C) -!TP_COLORAPP_CHROMA_M;Colorfulnes (M) +!TP_COLORAPP_CHROMA_M;Colorfulness (M) !TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. !TP_COLORAPP_CHROMA_S;Saturation (S) !TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1436,8 +1506,6 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. !TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves !TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -!TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -!TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. !TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] !TP_COLORAPP_GAMUT;Gamut control (L*a*b*) !TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1449,14 +1517,13 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_COLORAPP_LABEL_VIEWING;Viewing Conditions !TP_COLORAPP_LIGHT;Lightness (J) !TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) !TP_COLORAPP_MODEL;WP Model -!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +!TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. !TP_COLORAPP_NEUTRAL;Reset !TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values !TP_COLORAPP_RSTPRO;Red & skin-tones protection !TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -!TP_COLORAPP_SHARPCIE;--unused-- -!TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- !TP_COLORAPP_SURROUND;Surround !TP_COLORAPP_SURROUND_AVER;Average !TP_COLORAPP_SURROUND_DARK;Dark @@ -1476,11 +1543,9 @@ TP_WBALANCE_TEMPERATURE;Isı !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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). !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 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 @@ -1492,6 +1557,27 @@ TP_WBALANCE_TEMPERATURE;Isı !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_LABREGIONS;Color correction regions +!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +!TP_COLORTONING_LABREGION_CHANNEL;Channel +!TP_COLORTONING_LABREGION_CHANNEL_ALL;All +!TP_COLORTONING_LABREGION_CHANNEL_B;Blue +!TP_COLORTONING_LABREGION_CHANNEL_G;Green +!TP_COLORTONING_LABREGION_CHANNEL_R;Red +!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +!TP_COLORTONING_LABREGION_HUEMASK;H +!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +!TP_COLORTONING_LABREGION_LIST_TITLE;Correction +!TP_COLORTONING_LABREGION_MASK;Mask +!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +!TP_COLORTONING_LABREGION_OFFSET;Offset +!TP_COLORTONING_LABREGION_POWER;Power +!TP_COLORTONING_LABREGION_SATURATION;Saturation +!TP_COLORTONING_LABREGION_SHOWMASK;Show mask +!TP_COLORTONING_LABREGION_SLOPE;Slope !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. @@ -1524,11 +1610,17 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_CROP_GTTRIANGLE1;Golden Triangles 1 !TP_CROP_GTTRIANGLE2;Golden Triangles 2 !TP_CROP_PPI;PPI= +!TP_CROP_RESETCROP;Reset +!TP_CROP_SELECTCROP;Select !TP_DARKFRAME_AUTOSELECT;Auto-selection !TP_DARKFRAME_LABEL;Dark-Frame !TP_DEFRINGE_LABEL;Defringe !TP_DEFRINGE_RADIUS;Radius !TP_DEFRINGE_THRESHOLD;Threshold +!TP_DEHAZE_DEPTH;Depth +!TP_DEHAZE_LABEL;Haze Removal +!TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +!TP_DEHAZE_STRENGTH;Strength !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 ! @@ -1608,13 +1700,15 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_EPD_REWEIGHTINGITERATES;Reweighting iterates !TP_EPD_SCALE;Scale !TP_EPD_STRENGTH;Strength -!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_CLAMPOOG;Clip out-of-gamut colors !TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. !TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD;Highlight compression threshold !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 @@ -1640,10 +1734,6 @@ TP_WBALANCE_TEMPERATURE;Isı !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_FLATFIELD_LABEL;Flat-Field -!TP_GAMMA_CURV;Gamma -!TP_GAMMA_FREE;Free gamma -!TP_GAMMA_OUTPUT;Output gamma -!TP_GAMMA_SLOP;Slope (linear) !TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. !TP_GRADIENT_CENTER;Center !TP_GRADIENT_CENTER_X;Center X @@ -1690,6 +1780,12 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. !TP_ICM_TONECURVE;Tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. +!TP_ICM_WORKING_TRC;Tone response curve: +!TP_ICM_WORKING_TRC_CUSTOM;Custom +!TP_ICM_WORKING_TRC_GAMMA;Gamma +!TP_ICM_WORKING_TRC_NONE;None +!TP_ICM_WORKING_TRC_SLOPE;Slope +!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction !TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1732,10 +1828,16 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_LENSGEOM_AUTOCROP;Auto-Crop !TP_LENSGEOM_FILL;Auto-fill !TP_LENSGEOM_LABEL;Lens / Geometry +!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +!TP_LENSPROFILE_CORRECTION_MANUAL;Manually !TP_LENSPROFILE_LABEL;Profiled Lens Correction -!TP_LENSPROFILE_USECA;Chromatic aberration correction -!TP_LENSPROFILE_USEDIST;Distortion correction -!TP_LENSPROFILE_USEVIGN;Vignetting correction +!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +!TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +!TP_LENSPROFILE_USE_CA;Chromatic aberration +!TP_LENSPROFILE_USE_GEOMETRIC;Geometric +!TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +!TP_LENSPROFILE_USE_VIGNETTING;Vignetting !TP_LOCALCONTRAST_AMOUNT;Amount !TP_LOCALCONTRAST_DARKNESS;Darkness level !TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1766,10 +1868,19 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line noise filter +!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical !TP_PREPROCESS_NO_FOUND;None found +!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter !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. !TP_RAWCACORR_AUTO;Auto-correction +!TP_RAWCACORR_AUTOIT;Iterations +!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWCACORR_CASTR;Strength @@ -1782,19 +1893,26 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RAWEXPOS_BLACK_GREEN;Green !TP_RAWEXPOS_BLACK_RED;Red !TP_RAWEXPOS_LINEAR;White-point correction -!TP_RAWEXPOS_PRESER;Highlight preservation !TP_RAWEXPOS_RGB;Red, Green, Blue !TP_RAWEXPOS_TWOGREEN;Link greens -!TP_RAW_1PASSMEDIUM;1-Pass (Medium) -!TP_RAW_3PASSBEST;3-Pass (Best) +!TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +!TP_RAW_2PASS;1-pass+fast +!TP_RAW_3PASSBEST;3-pass (Markesteijn) +!TP_RAW_4PASS;3-pass+fast !TP_RAW_AHD;AHD !TP_RAW_AMAZE;AMaZE +!TP_RAW_AMAZEVNG4;AMaZE+VNG4 +!TP_RAW_BORDER;Border !TP_RAW_DCB;DCB !TP_RAW_DCBENHANCE;DCB enhancement !TP_RAW_DCBITERATIONS;Number of DCB iterations +!TP_RAW_DCBVNG4;DCB+VNG4 !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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold !TP_RAW_EAHD;EAHD !TP_RAW_FAST;Fast !TP_RAW_HD;Threshold @@ -1802,7 +1920,8 @@ TP_WBALANCE_TEMPERATURE;Isı !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/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_IMAGENUM_SN;SN mode +!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1810,58 +1929,42 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RAW_MONO;Mono !TP_RAW_NONE;None (Shows sensor pattern) !TP_RAW_PIXELSHIFT;Pixel Shift -!TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection !TP_RAW_PIXELSHIFTBLUR;Blur motion mask -!TP_RAW_PIXELSHIFTEPERISO;ISO adaption -!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +!TP_RAW_PIXELSHIFTEPERISO;Sensitivity +!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. !TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames !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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -!TP_RAW_PIXELSHIFTEXP0;Experimental +!TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. !TP_RAW_PIXELSHIFTGREEN;Check green channel for motion !TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask !TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask !TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts !TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -!TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold !TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -!TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -!TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 !TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. !TP_RAW_PIXELSHIFTMM_AUTO;Automatic !TP_RAW_PIXELSHIFTMM_CUSTOM;Custom !TP_RAW_PIXELSHIFTMM_OFF;Off -!TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -!TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size !TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction !TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -!TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE !TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -!TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -!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 !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask !TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. !TP_RAW_PIXELSHIFTSIGMA;Blur radius !TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. !TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions !TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -!TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -!TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -!TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red !TP_RAW_RCD;RCD +!TP_RAW_RCDVNG4;RCD+VNG4 !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_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.\n+fast gives less artifacts in flat areas !TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix !TP_RAW_VNG4;VNG4 +!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box @@ -1870,10 +1973,10 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RESIZE_LANCZOS;Lanczos !TP_RESIZE_SPECIFY;Specify: !TP_RESIZE_WIDTH;Width -!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_CONTEDIT_HSL;HSL histogram +!TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +!TP_RETINEX_CONTEDIT_LH;Hue +!TP_RETINEX_CONTEDIT_MAP;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) @@ -1885,7 +1988,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RETINEX_GAIN;Gain !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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. !TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. !TP_RETINEX_GAMMA;Gamma !TP_RETINEX_GAMMA_FREE;Free @@ -1911,7 +2014,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_RETINEX_LABEL_MASK;Mask !TP_RETINEX_LABSPACE;L*a*b* !TP_RETINEX_LOW;Low -!TP_RETINEX_MAP;Mask method +!TP_RETINEX_MAP;Method !TP_RETINEX_MAP_GAUS;Gaussian mask !TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) !TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1963,13 +2066,19 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only +!TP_SHARPENING_BLUR;Blur radius +!TP_SHARPENING_CONTRAST;Contrast threshold !TP_SHARPENMICRO_AMOUNT;Quantity +!TP_SHARPENMICRO_CONTRAST;Contrast threshold !TP_SHARPENMICRO_LABEL;Microcontrast !TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 !TP_SHARPENMICRO_UNIFORMITY;Uniformity +!TP_SOFTLIGHT_LABEL;Soft Light +!TP_SOFTLIGHT_STRENGTH;Strength !TP_TM_FATTAL_AMOUNT;Amount -!TP_TM_FATTAL_LABEL;HDR Tone Mapping -!TP_TM_FATTAL_THRESHOLD;Threshold +!TP_TM_FATTAL_ANCHOR;Anchor +!TP_TM_FATTAL_LABEL;Dynamic Range Compression +!TP_TM_FATTAL_THRESHOLD;Detail !TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift !TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH !TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2059,7 +2168,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_WAVELET_DTWO;Horizontal !TP_WAVELET_EDCU;Curve !TP_WAVELET_EDGCONT;Local contrast -!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +!TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. !TP_WAVELET_EDGE;Edge Sharpness !TP_WAVELET_EDGEAMPLI;Base amplification !TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2070,7 +2179,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_WAVELET_EDGESENSI;Edge sensitivity !TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. !TP_WAVELET_EDGTHRESH;Detail -!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +!TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. !TP_WAVELET_EDRAD;Radius !TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. !TP_WAVELET_EDSL;Threshold Sliders @@ -2182,6 +2291,7 @@ TP_WBALANCE_TEMPERATURE;Isı !TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 !TP_WBALANCE_LED_HEADER;LED !TP_WBALANCE_LED_LSI;LSI Lumelex 2040 +!TP_WBALANCE_PICKER;Pick !TP_WBALANCE_SHADE;Shade !TP_WBALANCE_SOLUX35;Solux 3500K !TP_WBALANCE_SOLUX41;Solux 4100K @@ -2196,7 +2306,7 @@ TP_WBALANCE_TEMPERATURE;Isı !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 --git a/rtdata/languages/default b/rtdata/languages/default index 4f89e34ce..755ac4532 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -7,7 +7,7 @@ ABOUT_TAB_CREDITS;Credits ABOUT_TAB_LICENSE;License ABOUT_TAB_RELEASENOTES;Release Notes ABOUT_TAB_SPLASH;Splash -ADJUSTER_RESET_TO_DEFAULT;Reset to default +ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value. BATCHQUEUE_AUTOSTART;Auto-start BATCHQUEUE_AUTOSTARTHINT;Start processing automatically when a new job arrives. BATCHQUEUE_DESTFILENAME;Path and file name @@ -17,9 +17,10 @@ CURVEEDITOR_AXIS_IN;I: CURVEEDITOR_AXIS_LEFT_TAN;LT: CURVEEDITOR_AXIS_OUT;O: CURVEEDITOR_AXIS_RIGHT_TAN;RT: +CURVEEDITOR_CATMULLROM;Flexible CURVEEDITOR_CURVE;Curve CURVEEDITOR_CURVES;Curves -CURVEEDITOR_CUSTOM;Custom +CURVEEDITOR_CUSTOM;Standard CURVEEDITOR_DARKS;Darks 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. CURVEEDITOR_HIGHLIGHTS;Highlights @@ -43,6 +44,10 @@ 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_IMGTYPE_ANY;Any +DYNPROFILEEDITOR_IMGTYPE_HDR;HDR +DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift +DYNPROFILEEDITOR_IMGTYPE_STD;Standard DYNPROFILEEDITOR_MOVE_DOWN;Move Down DYNPROFILEEDITOR_MOVE_UP;Move Up DYNPROFILEEDITOR_NEW;New @@ -56,6 +61,7 @@ EXIFFILTER_CAMERA;Camera EXIFFILTER_EXPOSURECOMPENSATION;Exposure compensation (EV) EXIFFILTER_FILETYPE;File type EXIFFILTER_FOCALLEN;Focal length +EXIFFILTER_IMAGETYPE;Image type EXIFFILTER_ISO;ISO EXIFFILTER_LENS;Lens EXIFFILTER_METADATAFILTER;Enable metadata filters @@ -113,8 +119,8 @@ FILEBROWSER_AUTOFLATFIELD;Auto flat-field FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory FILEBROWSER_CACHE;Cache -FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial +FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles +FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles FILEBROWSER_CLEARPROFILE;Clear FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_COPYPROFILE;Copy @@ -203,7 +209,7 @@ 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. FILECHOOSER_FILTER_ANY;All files -FILECHOOSER_FILTER_COLPROF;Color profiles +FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc) FILECHOOSER_FILTER_CURVE;Curve files FILECHOOSER_FILTER_LCP;Lens correction profiles FILECHOOSER_FILTER_PP;Processing profiles @@ -217,6 +223,7 @@ GENERAL_AUTO;Automatic GENERAL_BEFORE;Before GENERAL_CANCEL;Cancel GENERAL_CLOSE;Close +GENERAL_CURRENT;Current GENERAL_DISABLE;Disable GENERAL_DISABLED;Disabled GENERAL_ENABLE;Enable @@ -229,17 +236,19 @@ GENERAL_NONE;None GENERAL_OK;OK GENERAL_OPEN;Open GENERAL_PORTRAIT;Portrait +GENERAL_RESET;Reset GENERAL_SAVE;Save +GENERAL_SAVE_AS;Save as... 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. HISTOGRAM_TOOLTIP_B;Show/Hide blue histogram. -HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. +HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar. HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. -HISTOGRAM_TOOLTIP_FULL;Toggle full (off) or scaled (on) histogram. HISTOGRAM_TOOLTIP_G;Show/Hide green histogram. HISTOGRAM_TOOLTIP_L;Show/Hide CIELab luminance histogram. +HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram. HISTOGRAM_TOOLTIP_R;Show/Hide red histogram. HISTOGRAM_TOOLTIP_RAW;Show/Hide raw histogram. HISTORY_CHANGED;Changed @@ -370,12 +379,11 @@ HISTORY_MSG_121;Raw CA Correction - Auto HISTORY_MSG_122;Dark-Frame - Auto-selection HISTORY_MSG_123;Dark-Frame - File HISTORY_MSG_124;White point correction -HISTORY_MSG_125;Highlight preservation HISTORY_MSG_126;Flat-Field - File HISTORY_MSG_127;Flat-Field - Auto-selection HISTORY_MSG_128;Flat-Field - Blur radius HISTORY_MSG_129;Flat-Field - Blur type -HISTORY_MSG_130;Auto distorion correction +HISTORY_MSG_130;Auto distortion correction HISTORY_MSG_131;NR - Luma HISTORY_MSG_132;NR - Chroma HISTORY_MSG_133;Output gamma @@ -479,9 +487,9 @@ HISTORY_MSG_231;B&W - 'Before' curve HISTORY_MSG_232;B&W - 'Before' curve type HISTORY_MSG_233;B&W - 'After' curve HISTORY_MSG_234;B&W - 'After' curve type -HISTORY_MSG_235;B&W - Auto channel mixer +HISTORY_MSG_235;B&W - CM - Auto HISTORY_MSG_236;Spot removal - Point modif. -HISTORY_MSG_237;B&W - Mixer +HISTORY_MSG_237;B&W - CM HISTORY_MSG_238;GF - Feather HISTORY_MSG_239;GF - Strength HISTORY_MSG_240;GF - Center @@ -517,7 +525,7 @@ HISTORY_MSG_269;CT - High - Red HISTORY_MSG_270;CT - High - Green HISTORY_MSG_271;CT - High - Blue HISTORY_MSG_272;CT - Balance -HISTORY_MSG_273;CT - Reset +HISTORY_MSG_273;CT - Color Balance SMH HISTORY_MSG_274;CT - Sat. Shadows HISTORY_MSG_275;CT - Sat. Highlights HISTORY_MSG_276;CT - Opacity @@ -532,8 +540,8 @@ HISTORY_MSG_284;CT - Auto sat. protection HISTORY_MSG_285;NR - Median - Method HISTORY_MSG_286;NR - Median - Type HISTORY_MSG_287;NR - Median - Iterations -HISTORY_MSG_288;Flat Field - Clip control -HISTORY_MSG_289;Flat Field - Clip control - Auto +HISTORY_MSG_288;Flat-Field - Clip control +HISTORY_MSG_289;Flat-Field - Clip control - Auto HISTORY_MSG_290;Black Level - Red HISTORY_MSG_291;Black Level - Green HISTORY_MSG_292;Black Level - Blue @@ -636,7 +644,7 @@ HISTORY_MSG_388;W - Residual - CB green mid HISTORY_MSG_389;W - Residual - CB blue mid HISTORY_MSG_390;W - Residual - CB green low HISTORY_MSG_391;W - Residual - CB blue low -HISTORY_MSG_392;W - Residual - CB Reset +HISTORY_MSG_392;W - Residual - Color Balance HISTORY_MSG_393;DCP - Look table HISTORY_MSG_394;DCP - Baseline exposure HISTORY_MSG_395;DCP - Base table @@ -716,24 +724,106 @@ HISTORY_MSG_484;CAM02 - Auto Yb scene 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_488;Dynamic Range Compression +HISTORY_MSG_489;DRC - Detail +HISTORY_MSG_490;DRC - Amount HISTORY_MSG_491;White Balance HISTORY_MSG_492;RGB Curves HISTORY_MSG_493;L*a*b* Adjustments +HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction -HISTORY_MSG_HISTMATCHING;Auto-matched Tone Curve +HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction +HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel +HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask +HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness +HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask +HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List +HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur +HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset +HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power +HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation +HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask +HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope +HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth +HISTORY_MSG_DEHAZE_ENABLED;Haze Removal +HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map +HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength +HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold +HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold +HISTORY_MSG_HISTMATCHING;Auto-matched tone curve +HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries +HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D +HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type +HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma +HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope +HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method 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_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold +HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion +HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction +HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter +HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations +HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift +HISTORY_MSG_RAW_BORDER;Raw border +HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling +HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius +HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold +HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace +HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light +HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength +HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot HISTORY_SNAPSHOTS;Snapshots +ICCPROFCREATOR_COPYRIGHT;Copyright: +ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0" +ICCPROFCREATOR_CUSTOM;Custom +ICCPROFCREATOR_DESCRIPTION;Description: +ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description +ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description. +ICCPROFCREATOR_GAMMA;Gamma +ICCPROFCREATOR_ICCVERSION;ICC version: +ICCPROFCREATOR_ILL;Illuminant: +ICCPROFCREATOR_ILL_41;D41 +ICCPROFCREATOR_ILL_50;D50 +ICCPROFCREATOR_ILL_55;D55 +ICCPROFCREATOR_ILL_60;D60 +ICCPROFCREATOR_ILL_65;D65 +ICCPROFCREATOR_ILL_80;D80 +ICCPROFCREATOR_ILL_DEF;Default +ICCPROFCREATOR_ILL_INC;StdA 2856K +ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles. +ICCPROFCREATOR_PRIMARIES;Primaries: +ICCPROFCREATOR_PRIM_ACESP0;ACES AP0 +ICCPROFCREATOR_PRIM_ACESP1;ACES AP1 +ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998) +ICCPROFCREATOR_PRIM_BEST;BestRGB +ICCPROFCREATOR_PRIM_BETA;BetaRGB +ICCPROFCREATOR_PRIM_BLUX;Blue X +ICCPROFCREATOR_PRIM_BLUY;Blue Y +ICCPROFCREATOR_PRIM_BRUCE;BruceRGB +ICCPROFCREATOR_PRIM_GREX;Green X +ICCPROFCREATOR_PRIM_GREY;Green Y +ICCPROFCREATOR_PRIM_PROPH;Prophoto +ICCPROFCREATOR_PRIM_REC2020;Rec2020 +ICCPROFCREATOR_PRIM_REDX;Red X +ICCPROFCREATOR_PRIM_REDY;Red Y +ICCPROFCREATOR_PRIM_SRGB;sRGB +ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles. +ICCPROFCREATOR_PRIM_WIDEG;Widegamut +ICCPROFCREATOR_PROF_V2;ICC v2 +ICCPROFCREATOR_PROF_V4;ICC v4 +ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as... +ICCPROFCREATOR_SLOPE;Slope +ICCPROFCREATOR_TRC_PRESET;Tone response curve: IPTCPANEL_CATEGORY;Category IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. IPTCPANEL_CITY;City @@ -776,17 +866,14 @@ IPTCPANEL_TITLE;Title 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_FULLSCREEN;Fullscreen +MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). MAIN_BUTTON_PREFERENCES;Preferences MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s +MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s\nSave current profile (.pp3).\nShortcut: Ctrl+Shift+s MAIN_BUTTON_SENDTOEDITOR;Edit image in external editor MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m @@ -826,6 +913,8 @@ MAIN_TAB_EXIF;Exif MAIN_TAB_EXPORT; Fast Export MAIN_TAB_EXPOSURE;Exposure MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e +MAIN_TAB_FAVORITES;Favorites +MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u MAIN_TAB_FILTER; Filter MAIN_TAB_INSPECT; Inspect MAIN_TAB_IPTC;IPTC @@ -835,19 +924,20 @@ MAIN_TAB_RAW;Raw MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r MAIN_TAB_TRANSFORM;Transform MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t -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 -MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: Middle grey\nShortcut: 9 +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 +MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9 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: < MAIN_TOOLTIP_INDCLIPPEDS;Clipped shadow indication.\nShortcut: > -MAIN_TOOLTIP_PREVIEWB;Preview the Blue channel.\nShortcut: b -MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the Focus Mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\n\nTo improve detection accuracy for noisy images evaluate at smaller zoom, about 10-30%. -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 -MAIN_TOOLTIP_PREVIEWR;Preview the Red channel.\nShortcut: r +MAIN_TOOLTIP_PREVIEWB;Preview the blue channel.\nShortcut: b +MAIN_TOOLTIP_PREVIEWFOCUSMASK;Preview the focus mask.\nShortcut: Shift-f\n\nMore accurate on images with shallow depth of field, low noise and at higher zoom levels.\nZoom out to 10-30% to improve detection accuracy on noisy images. +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 +MAIN_TOOLTIP_PREVIEWR;Preview the red channel.\nShortcut: r +MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%. MAIN_TOOLTIP_QINFO;Quick info on the image.\nShortcut: i MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l @@ -867,8 +957,9 @@ NAVIGATOR_S;S: 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 @@ -884,6 +975,7 @@ PARTIALPASTE_CROP;Crop PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark-frame auto-selection PARTIALPASTE_DARKFRAMEFILE;Dark-frame file PARTIALPASTE_DEFRINGE;Defringe +PARTIALPASTE_DEHAZE;Haze removal PARTIALPASTE_DETAILGROUP;Detail Settings PARTIALPASTE_DIALOGLABEL;Partial paste processing profile PARTIALPASTE_DIRPYRDENOISE;Noise reduction @@ -917,13 +1009,15 @@ PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter +PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter PARTIALPASTE_PRSHARPENING;Post-resize sharpening PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction +PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift PARTIALPASTE_RAWCACORR_CAREDBLUE;CA red & blue PARTIALPASTE_RAWEXPOS_BLACK;Black levels PARTIALPASTE_RAWEXPOS_LINEAR;White point correction -PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation PARTIALPASTE_RAWGROUP;Raw Settings +PARTIALPASTE_RAW_BORDER;Raw border PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations PARTIALPASTE_RAW_DMETHOD;Demosaic method @@ -939,20 +1033,21 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights PARTIALPASTE_SHARPENEDGE;Edges PARTIALPASTE_SHARPENING;Sharpening (USM/RL) PARTIALPASTE_SHARPENMICRO;Microcontrast -PARTIALPASTE_TM_FATTAL;HDR Tone mapping +PARTIALPASTE_SOFTLIGHT;Soft light +PARTIALPASTE_TM_FATTAL;Dynamic range compression PARTIALPASTE_VIBRANCE;Vibrance PARTIALPASTE_VIGNETTING;Vignetting correction PARTIALPASTE_WHITEBALANCE;White balance PREFERENCES_ADD;Add +PREFERENCES_APPEARANCE;Appearance +PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font +PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color +PREFERENCES_APPEARANCE_MAINFONT;Main font +PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Navigator guide color +PREFERENCES_APPEARANCE_THEME;Theme PREFERENCES_APPLNEXTSTARTUP;restart required -PREFERENCES_AUTLISLOW;Low -PREFERENCES_AUTLISMAX;Max - Average of all tiles -PREFERENCES_AUTLISSTD;High -PREFERENCES_AUTLISVLOW;None -PREFERENCES_AUTLOW;Low PREFERENCES_AUTOMONPROFILE;Use operating system's main monitor color profile -PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting -PREFERENCES_AUTSTD;Standard +PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit PREFERENCES_BATCH_PROCESSING;Batch Processing PREFERENCES_BEHADDALL;All to 'Add' PREFERENCES_BEHADDALLHINT;Set all parameters to the Add mode.\nAdjustments of parameters in the batch tool panel will be deltas to the stored values. @@ -960,23 +1055,27 @@ PREFERENCES_BEHAVIOR;Behavior PREFERENCES_BEHSETALL;All to 'Set' 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_BLACKBODY;Tungsten -PREFERENCES_CACHECLEARALL;Clear All -PREFERENCES_CACHECLEARPROFILES;Clear Processing Profiles -PREFERENCES_CACHECLEARTHUMBS;Clear Thumbnails +PREFERENCES_CACHECLEAR;Clear +PREFERENCES_CACHECLEAR_ALL;Clear all cached files: +PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles: +PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles: +PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched. PREFERENCES_CACHEMAXENTRIES;Maximum number of cache entries PREFERENCES_CACHEOPTS;Cache Options PREFERENCES_CACHETHUMBHEIGHT;Maximum thumbnail height -PREFERENCES_CIEART;CIECAM02 optimization -PREFERENCES_CIEART_FRAME;CIECAM02-Specific Settings -PREFERENCES_CIEART_LABEL;Use float precision instead of double -PREFERENCES_CIEART_TOOLTIP;If enabled, CIECAM02 calculations are performed in the single-precision floating-point format instead of the double-precision one. This provides a small increase in speed at the expense of a negligible loss of quality. +PREFERENCES_CHUNKSIZES;Tiles per thread +PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic +PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction +PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic +PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic +PREFERENCES_CHUNKSIZE_RGB;RGB processing PREFERENCES_CLIPPINGIND;Clipping Indication PREFERENCES_CLUTSCACHE;HaldCLUT Cache 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;Crop Editing +PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop PREFERENCES_CROP_GUIDES_FRAME;Frame PREFERENCES_CROP_GUIDES_FULL;Original @@ -992,7 +1091,6 @@ PREFERENCES_CUSTPROFBUILDKEYFORMAT;Keys format PREFERENCES_CUSTPROFBUILDKEYFORMAT_NAME;Name PREFERENCES_CUSTPROFBUILDKEYFORMAT_TID;TagID PREFERENCES_CUSTPROFBUILDPATH;Executable path -PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency PREFERENCES_D50;Settings in main menu PREFERENCES_D50_OLD;5000K PREFERENCES_D55;5500K @@ -1003,8 +1101,6 @@ PREFERENCES_DARKFRAMESHOTS;shots PREFERENCES_DARKFRAMETEMPLATES;templates PREFERENCES_DATEFORMAT;Date format PREFERENCES_DATEFORMATHINT;You can use the following formatting strings:\n%y - year\n%m - month\n%d - day\n\nFor example, the ISO 8601 standard dictates the date format as follows:\n%y-%m-%d -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 @@ -1013,11 +1109,10 @@ PREFERENCES_DIROTHER;Other PREFERENCES_DIRSELECTDLG;Select Image Directory at Startup... PREFERENCES_DIRSOFTWARE;Installation directory PREFERENCES_EDITORCMDLINE;Custom command line -PREFERENCES_EDITORLAYOUT;Editor Layout -PREFERENCES_EXPAUT;Expert +PREFERENCES_EDITORLAYOUT;Editor layout 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_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser PREFERENCES_FILEFORMAT;File format PREFERENCES_FLATFIELDFOUND;Found PREFERENCES_FLATFIELDSDIR;Flat-fields directory @@ -1060,12 +1155,7 @@ PREFERENCES_INTENT_SATURATION;Saturation PREFERENCES_INTERNALTHUMBIFUNTOUCHED;Show embedded JPEG thumbnail if raw is unedited PREFERENCES_LANG;Language PREFERENCES_LANGAUTODETECT;Use system language -PREFERENCES_LEVAUTDN;Denoising level -PREFERENCES_LEVDN;Cell size -PREFERENCES_LISS;Auto multi-zone smoothing -PREFERENCES_MAX;Maxi (Tile) PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders -PREFERENCES_MED;Medium (Tile/2) PREFERENCES_MENUGROUPEXTPROGS;Group "Open with" PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File operations" PREFERENCES_MENUGROUPLABEL;Group "Color label" @@ -1073,16 +1163,13 @@ PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing profile operations" PREFERENCES_MENUGROUPRANK;Group "Rank" PREFERENCES_MENUOPTIONS;Context Menu Options PREFERENCES_METADATA;Metadata -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_MULTITAB;Multiple Editor Tabs Mode PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs In Own Window Mode -PREFERENCES_NAVGUIDEBRUSH;Navigator guide color PREFERENCES_NAVIGATIONFRAME;Navigation -PREFERENCES_NOISE;Noise Reduction PREFERENCES_OUTDIR;Output Directory PREFERENCES_OUTDIRFOLDER;Save to folder PREFERENCES_OUTDIRFOLDERHINT;Save images to the selected folder. @@ -1098,6 +1185,10 @@ PREFERENCES_PARSEDEXTADDHINT;Add entered extension to the list. PREFERENCES_PARSEDEXTDELHINT;Delete selected extension from the list. PREFERENCES_PARSEDEXTDOWNHINT;Move selected extension down in the list. PREFERENCES_PARSEDEXTUPHINT;Move selected extension up in the list. +PREFERENCES_PERFORMANCE_MEASURE;Measure +PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console +PREFERENCES_PERFORMANCE_THREADS;Threads +PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic) PREFERENCES_PREVDEMO;Preview Demosaic Method PREFERENCES_PREVDEMO_FAST;Fast PREFERENCES_PREVDEMO_LABEL;Demosaicing method used for the preview at <100% zoom: @@ -1118,53 +1209,40 @@ PREFERENCES_PRTPROFILE;Color profile PREFERENCES_PSPATH;Adobe Photoshop installation directory PREFERENCES_REMEMBERZOOMPAN;Remember zoom % and pan offset PREFERENCES_REMEMBERZOOMPAN_TOOLTIP;Remember the zoom % and pan offset of the current image when opening a new image.\n\nThis option only works in "Single Editor Tab Mode" and when "Demosaicing method used for the preview at <100% zoom" is set to "As in PP3". -PREFERENCES_RGBDTL_LABEL;Max number of threads for Noise Reduction and Wavelet Levels -PREFERENCES_RGBDTL_TOOLTIP;Leave the setting at "0" to automatically use as many threads as possible. The more threads run in parallel, the faster the computation. Refer to RawPedia for memory requirements. -PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now -PREFERENCES_SELECTFONT;Select main font -PREFERENCES_SELECTFONT_COLPICKER;Select Color Picker's font +PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now PREFERENCES_SELECTLANG;Select language -PREFERENCES_SELECTTHEME;Select theme -PREFERENCES_SERIALIZE_TIFF_READ;Tiff Read Settings -PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize read of tiff files -PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncompressed tiff files enabling this option can increase performance of thumb generation. +PREFERENCES_SERIALIZE_TIFF_READ;TIFF Read Settings +PREFERENCES_SERIALIZE_TIFF_READ_LABEL;Serialize reading of TIFF files +PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with folders containing uncompressed TIFF files can increase performance of thumbnail generation. PREFERENCES_SET;Set PREFERENCES_SHOWBASICEXIF;Show basic Exif info PREFERENCES_SHOWDATETIME;Show date and time PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation -PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar +PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows -PREFERENCES_SIMPLAUT;Tool mode PREFERENCES_SINGLETAB;Single Editor Tab Mode PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs -PREFERENCES_SMA;Small (250x287) PREFERENCES_SND_BATCHQUEUEDONE;Queue processing done PREFERENCES_SND_HELP;Enter a full file path to set a sound, or leave blank for no sound.\nFor system sounds on Windows use "SystemDefault", "SystemAsterisk" etc., and on Linux use "complete", "window-attention" etc. PREFERENCES_SND_LNGEDITPROCDONE;Editor processing done -PREFERENCES_SND_TRESHOLDSECS;After seconds +PREFERENCES_SND_THRESHOLDSECS;After seconds PREFERENCES_STARTUPIMDIR;Image Directory at Startup -PREFERENCES_STDAUT;Standard PREFERENCES_TAB_BROWSER;File Browser PREFERENCES_TAB_COLORMGR;Color Management PREFERENCES_TAB_DYNAMICPROFILE;Dynamic Profile Rules PREFERENCES_TAB_GENERAL;General PREFERENCES_TAB_IMPROC;Image Processing -PREFERENCES_TAB_PERFORMANCE;Performance & Quality +PREFERENCES_TAB_PERFORMANCE;Performance PREFERENCES_TAB_SOUND;Sounds -PREFERENCES_THEME;Theme -PREFERENCES_TIMAX;High -PREFERENCES_TINB;Number of tiles -PREFERENCES_TISTD;Standard +PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview +PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show +PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering +PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise PREFERENCES_TP_LABEL;Tool panel: -PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) -PREFERENCES_WAVLEV;Increase wavelet level in quality 'high' -PREFERENCES_WLONE;One level -PREFERENCES_WLTWO;Two levels -PREFERENCES_WLZER;No PREFERENCES_WORKFLOW;Layout PROFILEPANEL_COPYPPASTE;Parameters to copy PROFILEPANEL_GLOBALPROFILES;Bundled profiles @@ -1205,13 +1283,16 @@ 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 +SAMPLEFORMAT_1;8-bit unsigned +SAMPLEFORMAT_2;16-bit unsigned +SAMPLEFORMAT_4;24-bit LogLuv +SAMPLEFORMAT_8;32-bit LogLuv +SAMPLEFORMAT_16;16-bit floating-point +SAMPLEFORMAT_32;24-bit floating-point +SAMPLEFORMAT_64;32-bit floating-point SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists SAVEDLG_FILEFORMAT;File format +SAVEDLG_FILEFORMAT_FLOAT; floating-point SAVEDLG_FORCEFORMATOPTS;Force saving options SAVEDLG_JPEGQUAL;JPEG quality SAVEDLG_PUTTOQUEUE;Put into processing queue @@ -1227,8 +1308,8 @@ SAVEDLG_SUBSAMP_TOOLTIP;Best compression:\nJ:a:b 4:2:0\nh/v 2/2\nChroma halved h 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 Printer profile. -SOFTPROOF_TOOLTIP;Soft-proofing\nIf active, let you simulate the printer's output by using the Printer profile set in Preferences > Color Management. +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 @@ -1236,8 +1317,8 @@ THRESHOLDSELECTOR_HINT;Hold the Shift key to move individual control poin THRESHOLDSELECTOR_T;Top THRESHOLDSELECTOR_TL;Top-left THRESHOLDSELECTOR_TR;Top-right -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 -TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop area using Shift-mouse drag +TOOLBAR_TOOLTIP_COLORPICKER;Lockable Color Picker\n\nWhen the tool is active:\n- Add a picker: left-click.\n- Drag a picker: left-click and drag.\n- Delete a picker: right-click.\n- Delete all pickers: Ctrl+Shift+right-click.\n- Revert to hand tool: right-click outside any picker. +TOOLBAR_TOOLTIP_CROP;Crop selection.\nShortcut: c\nMove the crop using Shift+mouse drag. TOOLBAR_TOOLTIP_HAND;Hand tool.\nShortcut: h 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. Center of rotation is the geometrical center of the image. TOOLBAR_TOOLTIP_WB;Spot white balance.\nShortcut: w @@ -1246,7 +1327,6 @@ TP_BWMIX_ALGO_LI;Linear TP_BWMIX_ALGO_SP;Special effects TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. TP_BWMIX_AUTOCH;Auto -TP_BWMIX_AUTOCH_TIP;Calculate values optimizing Channel Mixer. TP_BWMIX_CC_ENABLED;Adjust complementary color TP_BWMIX_CC_TOOLTIP;Enable to allow automatic adjustment of complementary colors in ROYGCBPM mode. TP_BWMIX_CHANNEL;Luminance equalizer @@ -1273,9 +1353,8 @@ TP_BWMIX_MET;Method TP_BWMIX_MET_CHANMIX;Channel Mixer TP_BWMIX_MET_DESAT;Desaturation TP_BWMIX_MET_LUMEQUAL;Luminance Equalizer -TP_BWMIX_MIXC;Mixer -TP_BWMIX_NEUTRAL;Reset mixer -TP_BWMIX_NEUTRAL_TIP;Reset all values (Color Filter, Channel Mixer) to default. +TP_BWMIX_MIXC;Channel Mixer +TP_BWMIX_NEUTRAL;Reset TP_BWMIX_RGBLABEL;R: %1%% G: %2%% B: %3%% Total: %4%% TP_BWMIX_RGBLABEL_HINT;Final RGB factors that take care of all the mixer options.\n"Total" displays the sum of the RGB values:\n- always 100% in relative mode\n- higher (lighter) or lower (darker) than 100% in absolute mode. TP_BWMIX_RGB_TOOLTIP;Mix the RGB channels. Use presets for guidance.\nPay attention to negative values that may cause artifacts or erratic behavior. @@ -1317,11 +1396,7 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Flip horizontally. TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotate left.\n\nShortcuts:\n[ - Multiple Editor Tabs Mode,\nAlt-[ - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotate right.\n\nShortcuts:\n] - Multiple Editor Tabs Mode,\nAlt-] - Single Editor Tab Mode. TP_COARSETRAF_TOOLTIP_VFLIP;Flip vertically. -TP_COLORAPP_ADAPTSCENE;Scene absolute luminance -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Absolute luminance of the scene environment (cd/m²).\n1) Calculated from the Exif data:\nShutter speed - ISO speed - F number - camera exposure correction.\n2) Calculated from the raw white point and RT's Exposure Compensation slider. -TP_COLORAPP_ADAPTVIEWING;Viewing absolute luminance (cd/m²) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16cd/m²). -TP_COLORAPP_ADAP_AUTO_TOOLTIP;If the checkbox is checked (recommended) RawTherapee calculates an optimum value from the Exif data.\nTo set the value manually, uncheck the checkbox first. +TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance TP_COLORAPP_ALGO;Algorithm TP_COLORAPP_ALGO_ALL;All TP_COLORAPP_ALGO_JC;Lightness + Chroma (JC) @@ -1332,8 +1407,9 @@ TP_COLORAPP_BADPIXSL;Hot/bad pixel filter TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression of hot/bad (brightly colored) pixels.\n0 = No effect\n1 = Median\n2 = Gaussian.\nAlternatively, adjust the image to avoid very dark shadows.\n\nThese artifacts are due to limitations of CIECAM02. TP_COLORAPP_BRIGHT;Brightness (Q) TP_COLORAPP_BRIGHT_TOOLTIP;Brightness in CIECAM02 takes into account the white's luminosity and differs from L*a*b* and RGB brightness. +TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended. TP_COLORAPP_CHROMA;Chroma (C) -TP_COLORAPP_CHROMA_M;Colorfulnes (M) +TP_COLORAPP_CHROMA_M;Colorfulness (M) TP_COLORAPP_CHROMA_M_TOOLTIP;Colorfulness in CIECAM02 differs from L*a*b* and RGB colorfulness. TP_COLORAPP_CHROMA_S;Saturation (S) TP_COLORAPP_CHROMA_S_TOOLTIP;Saturation in CIECAM02 differs from L*a*b* and RGB saturation. @@ -1351,8 +1427,6 @@ TP_COLORAPP_CURVEEDITOR3;Color curve TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Adjust either chroma, saturation or colorfulness.\n\nShows the histogram of chromaticity (L*a*b*) before CIECAM02.\nIf the "Show CIECAM02 output histograms in curves" checkbox is enabled, shows the histogram of C, s or M after CIECAM02.\n\nC, s and M are not shown in the main histogram panel.\nFor final output refer to the main histogram panel. TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. -TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). -TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. @@ -1364,14 +1438,13 @@ TP_COLORAPP_LABEL_SCENE;Scene Conditions TP_COLORAPP_LABEL_VIEWING;Viewing Conditions TP_COLORAPP_LIGHT;Lightness (J) TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. +TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%) TP_COLORAPP_MODEL;WP Model -TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. +TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected by the user, the output device's white balance is set in Viewing Conditions. TP_COLORAPP_NEUTRAL;Reset TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values TP_COLORAPP_RSTPRO;Red & skin-tones protection TP_COLORAPP_RSTPRO_TOOLTIP;Red & skin-tones protection affects both sliders and curves. -TP_COLORAPP_SHARPCIE;--unused-- -TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- TP_COLORAPP_SURROUND;Surround TP_COLORAPP_SURROUND_AVER;Average TP_COLORAPP_SURROUND_DARK;Dark @@ -1391,11 +1464,9 @@ 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_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_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²). 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 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 @@ -1409,6 +1480,25 @@ 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_LABREGIONS;Color correction regions +TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2 +TP_COLORTONING_LABREGION_CHANNEL;Channel +TP_COLORTONING_LABREGION_CHANNEL_ALL;All +TP_COLORTONING_LABREGION_CHANNEL_B;Blue +TP_COLORTONING_LABREGION_CHANNEL_G;Green +TP_COLORTONING_LABREGION_CHANNEL_R;Red +TP_COLORTONING_LABREGION_CHROMATICITYMASK;C +TP_COLORTONING_LABREGION_HUEMASK;H +TP_COLORTONING_LABREGION_LIGHTNESS;Lightness +TP_COLORTONING_LABREGION_LIGHTNESSMASK;L +TP_COLORTONING_LABREGION_LIST_TITLE;Correction +TP_COLORTONING_LABREGION_MASK;Mask +TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur +TP_COLORTONING_LABREGION_OFFSET;Offset +TP_COLORTONING_LABREGION_POWER;Power +TP_COLORTONING_LABREGION_SATURATION;Saturation +TP_COLORTONING_LABREGION_SHOWMASK;Show mask +TP_COLORTONING_LABREGION_SLOPE;Slope 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. @@ -1448,15 +1538,20 @@ TP_CROP_GUIDETYPE;Guide type: TP_CROP_H;Height TP_CROP_LABEL;Crop TP_CROP_PPI;PPI= -TP_CROP_SELECTCROP;Select Crop +TP_CROP_RESETCROP;Reset +TP_CROP_SELECTCROP;Select TP_CROP_W;Width -TP_CROP_X;X -TP_CROP_Y;Y +TP_CROP_X;Left +TP_CROP_Y;Top TP_DARKFRAME_AUTOSELECT;Auto-selection TP_DARKFRAME_LABEL;Dark-Frame TP_DEFRINGE_LABEL;Defringe TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold +TP_DEHAZE_DEPTH;Depth +TP_DEHAZE_LABEL;Haze Removal +TP_DEHAZE_SHOW_DEPTH_MAP;Show Depth Map +TP_DEHAZE_STRENGTH;Strength 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 ! @@ -1538,11 +1633,11 @@ TP_EPD_LABEL;Tone Mapping TP_EPD_REWEIGHTINGITERATES;Reweighting iterates TP_EPD_SCALE;Scale TP_EPD_STRENGTH;Strength -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;Auto Levels 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_BLACKLEVEL;Black TP_EXPOSURE_BRIGHTNESS;Lightness +TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors TP_EXPOSURE_CLIP;Clip % TP_EXPOSURE_CLIP_TIP;The fraction of pixels to be clipped in Auto Levels operation. TP_EXPOSURE_COMPRHIGHLIGHTS;Highlight compression @@ -1553,7 +1648,7 @@ 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_EXPCOMP;Exposure compensation -TP_EXPOSURE_HISTMATCHING;Auto-matched Tone Curve +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 @@ -1581,10 +1676,6 @@ TP_FLATFIELD_BT_VERTICAL;Vertical 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_FLATFIELD_LABEL;Flat-Field -TP_GAMMA_CURV;Gamma -TP_GAMMA_FREE;Free gamma -TP_GAMMA_OUTPUT;Output gamma -TP_GAMMA_SLOP;Slope (linear) TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. TP_GRADIENT_CENTER;Center TP_GRADIENT_CENTER_X;Center X @@ -1645,6 +1736,12 @@ TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile TP_ICM_TONECURVE;Tone curve TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only available if the selected DCP has a tone curve. TP_ICM_WORKINGPROFILE;Working Profile +TP_ICM_WORKING_TRC;Tone response curve: +TP_ICM_WORKING_TRC_CUSTOM;Custom +TP_ICM_WORKING_TRC_GAMMA;Gamma +TP_ICM_WORKING_TRC_NONE;None +TP_ICM_WORKING_TRC_SLOPE;Slope +TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles. TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction TP_IMPULSEDENOISE_THRESH;Threshold TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift @@ -1687,10 +1784,16 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. TP_LENSGEOM_AUTOCROP;Auto-Crop TP_LENSGEOM_FILL;Auto-fill TP_LENSGEOM_LABEL;Lens / Geometry +TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically +TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file +TP_LENSPROFILE_CORRECTION_MANUAL;Manually TP_LENSPROFILE_LABEL;Profiled Lens Correction -TP_LENSPROFILE_USECA;Chromatic aberration correction -TP_LENSPROFILE_USEDIST;Distortion correction -TP_LENSPROFILE_USEVIGN;Vignetting correction +TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. +TP_LENSPROFILE_MODE_HEADER;Select the lens profile: +TP_LENSPROFILE_USE_CA;Chromatic aberration +TP_LENSPROFILE_USE_GEOMETRIC;Geometric +TP_LENSPROFILE_USE_HEADER;Select distortions to correct: +TP_LENSPROFILE_USE_VIGNETTING;Vignetting TP_LOCALCONTRAST_AMOUNT;Amount TP_LOCALCONTRAST_DARKNESS;Darkness level TP_LOCALCONTRAST_LABEL;Local Contrast @@ -1721,10 +1824,19 @@ TP_PREPROCESS_HOTPIXFILT;Hot pixel filter TP_PREPROCESS_HOTPIXFILT_TOOLTIP;Tries to suppress hot pixels. TP_PREPROCESS_LABEL;Preprocessing TP_PREPROCESS_LINEDENOISE;Line noise filter +TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction +TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both +TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal +TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows +TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical TP_PREPROCESS_NO_FOUND;None found +TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter 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. TP_RAWCACORR_AUTO;Auto-correction +TP_RAWCACORR_AUTOIT;Iterations +TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time. +TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift TP_RAWCACORR_CABLUE;Blue TP_RAWCACORR_CARED;Red TP_RAWCACORR_CASTR;Strength @@ -1737,20 +1849,27 @@ TP_RAWEXPOS_BLACK_BLUE;Blue TP_RAWEXPOS_BLACK_GREEN;Green TP_RAWEXPOS_BLACK_RED;Red TP_RAWEXPOS_LINEAR;White-point correction -TP_RAWEXPOS_PRESER;Highlight preservation TP_RAWEXPOS_RGB;Red, Green, Blue TP_RAWEXPOS_TWOGREEN;Link greens -TP_RAW_1PASSMEDIUM;1-Pass (Medium) -TP_RAW_3PASSBEST;3-Pass (Best) +TP_RAW_1PASSMEDIUM;1-pass (Markesteijn) +TP_RAW_2PASS;1-pass+fast +TP_RAW_3PASSBEST;3-pass (Markesteijn) +TP_RAW_4PASS;3-pass+fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE +TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Border TP_RAW_DCB;DCB TP_RAW_DCBENHANCE;DCB enhancement TP_RAW_DCBITERATIONS;Number of DCB iterations +TP_RAW_DCBVNG4;DCB+VNG4 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/Sony Pixel Shift files. It falls back to AMaZE for non-Pixel Shift files. +TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold +TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image). +TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold TP_RAW_EAHD;EAHD TP_RAW_FALSECOLOR;False color suppression steps TP_RAW_FAST;Fast @@ -1759,7 +1878,8 @@ TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, bu 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/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_IMAGENUM_SN;SN mode +TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\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 @@ -1767,58 +1887,42 @@ TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (ste TP_RAW_MONO;Mono TP_RAW_NONE;None (Shows sensor pattern) TP_RAW_PIXELSHIFT;Pixel Shift -TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection TP_RAW_PIXELSHIFTBLUR;Blur motion mask -TP_RAW_PIXELSHIFTEPERISO;ISO adaption -TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nIncrease the value to improve motion detection for higher ISO.\nIncrease in small steps and watch the motion mask while increasing. +TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion +TP_RAW_PIXELSHIFTEPERISO;Sensitivity +TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images. TP_RAW_PIXELSHIFTEQUALBRIGHT;Equalize brightness of frames 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_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta colour cast in overexposed areas or enable motion correction. -TP_RAW_PIXELSHIFTEXP0;Experimental +TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP;Equalize the brightness of the frames to the brightness of the selected frame.\nIf there are overexposed areas in the frames select the brightest frame to avoid magenta color cast in overexposed areas or enable motion correction. TP_RAW_PIXELSHIFTGREEN;Check green channel for motion TP_RAW_PIXELSHIFTHOLEFILL;Fill holes in motion mask TP_RAW_PIXELSHIFTHOLEFILL_TOOLTIP;Fill holes in motion mask TP_RAW_PIXELSHIFTLMMSE;Use LMMSE for moving parts TP_RAW_PIXELSHIFTLMMSE_TOOLTIP;Use LMMSE instead of AMaZE for areas of motion.\nUseful for high ISO images. -TP_RAW_PIXELSHIFTMASKTHRESHOLD;3x3 new threshold TP_RAW_PIXELSHIFTMEDIAN;Use median for moving parts -TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median -TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP;Excludes selected frame from median.\nUseful if moving objects overlap in frame 2 and 3 TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP;Use median of all frames instead of selected frame for regions with motion.\nRemoves objects which are at different places in all frames.\nGives motion effect on slow moving (overlapping) objects. TP_RAW_PIXELSHIFTMM_AUTO;Automatic TP_RAW_PIXELSHIFTMM_CUSTOM;Custom TP_RAW_PIXELSHIFTMM_OFF;Off -TP_RAW_PIXELSHIFTMOTION;Motion detection level (deprecated) -TP_RAW_PIXELSHIFTMOTIONCORRECTION;Green motion correction size TP_RAW_PIXELSHIFTMOTIONMETHOD;Motion Correction TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection.\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate.\n100 means the AMaZE-demosaiced frame will be used. -TP_RAW_PIXELSHIFTNONGREENAMAZE;Check red/blue AMaZE TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue channels for motion -TP_RAW_PIXELSHIFTNONGREENCROSS2;Check green AMaZE -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 TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY;Show only motion mask TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP;Shows the motion mask without the image. -TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a mask showing the regions with motion. +TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion. TP_RAW_PIXELSHIFTSIGMA;Blur radius TP_RAW_PIXELSHIFTSIGMA_TOOLTIP;The default radius of 1.0 usually fits well for base ISO.\nIncrease the value for high ISO shots, 5.0 is a good starting point.\nWatch the motion mask while changing the value. TP_RAW_PIXELSHIFTSMOOTH;Smooth transitions TP_RAW_PIXELSHIFTSMOOTH_TOOLTIP;Smooth transitions between areas with motion and areas without.\nSet to 0 to disable transition smoothing.\nSet to 1 to either get the AMaZE/LMMSE result of the selected frame (depending on whether "Use LMMSE" is selected), or the median of all four frames if "Use median" is selected. -TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE;StdDev factor Blue -TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN;StdDev factor Green -TP_RAW_PIXELSHIFTSTDDEVFACTORRED;StdDev factor Red TP_RAW_RCD;RCD +TP_RAW_RCDVNG4;RCD+VNG4 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_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.\n+fast gives less artifacts in flat areas TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix TP_RAW_VNG4;VNG4 +TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling TP_RESIZE_APPLIESTO;Applies to: TP_RESIZE_CROPPEDAREA;Cropped Area TP_RESIZE_FITBOX;Bounding Box @@ -1833,10 +1937,10 @@ TP_RESIZE_SCALE;Scale TP_RESIZE_SPECIFY;Specify: TP_RESIZE_W;Width: TP_RESIZE_WIDTH;Width -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_CONTEDIT_HSL;HSL histogram +TP_RETINEX_CONTEDIT_LAB;L*a*b* histogram +TP_RETINEX_CONTEDIT_LH;Hue +TP_RETINEX_CONTEDIT_MAP;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) @@ -1848,7 +1952,7 @@ TP_RETINEX_FREEGAMMA;Free gamma TP_RETINEX_GAIN;Gain 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_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain. TP_RETINEX_GAIN_TOOLTIP;Acts on the restored image.\n\nThis is very different from the others settings. Used for black or white pixels, and to help balance the histogram. TP_RETINEX_GAMMA;Gamma TP_RETINEX_GAMMA_FREE;Free @@ -1874,7 +1978,7 @@ TP_RETINEX_LABEL;Retinex TP_RETINEX_LABEL_MASK;Mask TP_RETINEX_LABSPACE;L*a*b* TP_RETINEX_LOW;Low -TP_RETINEX_MAP;Mask method +TP_RETINEX_MAP;Method TP_RETINEX_MAP_GAUS;Gaussian mask TP_RETINEX_MAP_MAPP;Sharp mask (wavelet partial) TP_RETINEX_MAP_MAPT;Sharp mask (wavelet total) @@ -1937,6 +2041,8 @@ TP_SHARPENEDGE_LABEL;Edges TP_SHARPENEDGE_PASSES;Iterations TP_SHARPENEDGE_THREE;Luminance only TP_SHARPENING_AMOUNT;Amount +TP_SHARPENING_BLUR;Blur radius +TP_SHARPENING_CONTRAST;Contrast threshold TP_SHARPENING_EDRADIUS;Radius TP_SHARPENING_EDTOLERANCE;Edge tolerance TP_SHARPENING_HALOCONTROL;Halo control @@ -1952,15 +2058,19 @@ TP_SHARPENING_RLD_ITERATIONS;Iterations TP_SHARPENING_THRESHOLD;Threshold TP_SHARPENING_USM;Unsharp Mask TP_SHARPENMICRO_AMOUNT;Quantity +TP_SHARPENMICRO_CONTRAST;Contrast threshold TP_SHARPENMICRO_LABEL;Microcontrast TP_SHARPENMICRO_MATRIX;3×3 matrix instead of 5×5 TP_SHARPENMICRO_UNIFORMITY;Uniformity +TP_SOFTLIGHT_LABEL;Soft Light +TP_SOFTLIGHT_STRENGTH;Strength TP_SPOT_COUNTLABEL;%1 point(s) TP_SPOT_ENTRYCHANGED;Point changed TP_SPOT_LABEL;Spot removal TP_TM_FATTAL_AMOUNT;Amount -TP_TM_FATTAL_LABEL;HDR Tone Mapping -TP_TM_FATTAL_THRESHOLD;Threshold +TP_TM_FATTAL_ANCHOR;Anchor +TP_TM_FATTAL_LABEL;Dynamic Range Compression +TP_TM_FATTAL_THRESHOLD;Detail TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH TP_VIBRANCE_CURVEEDITOR_SKINTONES_LABEL;Skin-tones @@ -2053,7 +2163,7 @@ TP_WAVELET_DTHR;Diagonal TP_WAVELET_DTWO;Horizontal TP_WAVELET_EDCU;Curve TP_WAVELET_EDGCONT;Local contrast -TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, Top-Left, Top-Right, Bottom-right represent respectively local contast for low values, mean, mean+stdev, maxima +TP_WAVELET_EDGCONT_TOOLTIP;Adjusting the points to the left decreases contrast, and to the right increases it.\nBottom-left, top-left, top-right and bottom-right represent respectively local contrast for low values, mean, mean+stdev and maxima. TP_WAVELET_EDGE;Edge Sharpness TP_WAVELET_EDGEAMPLI;Base amplification TP_WAVELET_EDGEDETECT;Gradient sensitivity @@ -2064,7 +2174,7 @@ TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sens TP_WAVELET_EDGESENSI;Edge sensitivity TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged. TP_WAVELET_EDGTHRESH;Detail -TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centred on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. +TP_WAVELET_EDGTHRESH_TOOLTIP;Change the repartition between the first levels and the others. The higher the threshold the more the action is centered on the first levels. Be careful with negative values, they increase the action of high levels and can introduce artifacts. TP_WAVELET_EDRAD;Radius TP_WAVELET_EDRAD_TOOLTIP;This radius adjustment is very different from those in other sharpening tools. Its value is compared to each level through a complex function. In this sense, a value of zero still has an effect. TP_WAVELET_EDSL;Threshold Sliders @@ -2182,13 +2292,14 @@ TP_WBALANCE_LED_CRS;CRS SP12 WWMR16 TP_WBALANCE_LED_HEADER;LED TP_WBALANCE_LED_LSI;LSI Lumelex 2040 TP_WBALANCE_METHOD;Method +TP_WBALANCE_PICKER;Pick TP_WBALANCE_SHADE;Shade TP_WBALANCE_SIZE;Size: TP_WBALANCE_SOLUX35;Solux 3500K TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (vendor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -TP_WBALANCE_SPOTWB;Spot WB +TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview. 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". TP_WBALANCE_TEMPERATURE;Temperature diff --git a/rtdata/icons/mime-types b/rtdata/mime-types similarity index 93% rename from rtdata/icons/mime-types rename to rtdata/mime-types index c232119ee..505b00140 100644 --- a/rtdata/icons/mime-types +++ b/rtdata/mime-types @@ -9,10 +9,14 @@ 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; @@ -22,15 +26,14 @@ 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-hasselblad-3fr; -image/x-hasselblad-fff; -image/x-leaf-mos; -image/x-phaseone-iiq; image/x-tif; inode/directory; diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index 4ff90246d..91520dc0e 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -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 diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 9130ef9ad..4decccb6d 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -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 diff --git a/rtdata/options/options.win b/rtdata/options/options.win index 33ab499be..40e73aacc 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -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 diff --git a/rtdata/profiles/Auto-Matched Curve - ISO High.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO High.pp3 new file mode 100644 index 000000000..99f0af8fe --- /dev/null +++ b/rtdata/profiles/Auto-Matched Curve - ISO High.pp3 @@ -0,0 +1,50 @@ +[Exposure] +Auto=false +HistogramMatching=true + +[HLRecovery] +Enabled=true +Method=Blend + +[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 + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 + +[RAW] +CA=true + +[RAW Bayer] +Method=lmmse + +[RAW X-Trans] +Method=1-pass (medium) diff --git a/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 new file mode 100644 index 000000000..882c0130f --- /dev/null +++ b/rtdata/profiles/Auto-Matched Curve - ISO Low.pp3 @@ -0,0 +1,23 @@ +[Exposure] +Auto=false +HistogramMatching=true + +[HLRecovery] +Enabled=true +Method=Blend + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 + +[RAW] +CA=true diff --git a/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3 b/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3 new file mode 100644 index 000000000..f9196bb30 --- /dev/null +++ b/rtdata/profiles/Auto-Matched Curve - ISO Medium.pp3 @@ -0,0 +1,45 @@ +[Exposure] +Auto=false +HistogramMatching=true + +[HLRecovery] +Enabled=true +Method=Blend + +[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 + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 + +[RAW] +CA=true diff --git a/rtdata/profiles/Black-and-White/Black-and-White 1.pp3 b/rtdata/profiles/Black-and-White/Black-and-White 1.pp3 deleted file mode 100644 index 8ee75890b..000000000 --- a/rtdata/profiles/Black-and-White/Black-and-White 1.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=1;0;0;0.04;0.03;0.17684498029510265;0.21732319394192093;0.70232558139534862;0.74883720930232545;1;1; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=true -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=43 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=30 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-100 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Black-and-White/Black-and-White 2.pp3 b/rtdata/profiles/Black-and-White/Black-and-White 2.pp3 deleted file mode 100644 index f45ce9eb8..000000000 --- a/rtdata/profiles/Black-and-White/Black-and-White 2.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=1;0;0;0.45754265471370759;0.57906737998843294;1;1; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=true -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=43 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=30 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-100 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.84892086330935235;0.69064748201438808;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Black-and-White/Black-and-White 3.pp3 b/rtdata/profiles/Black-and-White/Black-and-White 3.pp3 deleted file mode 100644 index ae512281a..000000000 --- a/rtdata/profiles/Black-and-White/Black-and-White 3.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=0; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=true -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=43 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=30 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-100 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=2;0.25;0.5;0.75;50;12;-12;-50; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Black-and-White/Black-and-White 4.pp3 b/rtdata/profiles/Black-and-White/Black-and-White 4.pp3 deleted file mode 100644 index 630b5bafc..000000000 --- a/rtdata/profiles/Black-and-White/Black-and-White 4.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=0; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=true -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=43 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=30 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=-35 -Chromaticity=-100 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.18623481781376497;0.028340080971659902;0.50607287449392713;0.50607287449392713;0.77732793522267185;0.97975708502024295;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Default ISO High.pp3 b/rtdata/profiles/Default ISO High.pp3 deleted file mode 100644 index c15085093..000000000 --- a/rtdata/profiles/Default ISO High.pp3 +++ /dev/null @@ -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 --git a/rtdata/profiles/Default ISO Medium.pp3 b/rtdata/profiles/Default ISO Medium.pp3 deleted file mode 100644 index 0bd94097f..000000000 --- a/rtdata/profiles/Default ISO Medium.pp3 +++ /dev/null @@ -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 --git a/rtdata/profiles/Default.pp3 b/rtdata/profiles/Default.pp3 deleted file mode 100644 index 227ee2e6b..000000000 --- a/rtdata/profiles/Default.pp3 +++ /dev/null @@ -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 --git a/rtdata/profiles/Faded/Faded Amber 1 TM Bright.pp3 b/rtdata/profiles/Faded/Faded Amber 1 TM Bright.pp3 deleted file mode 100644 index dc602e9f8..000000000 --- a/rtdata/profiles/Faded/Faded Amber 1 TM Bright.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.047430830039525626;0.21343873517786571;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.22924901185770752;0.031620553359683806;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Amber 1 TM.pp3 b/rtdata/profiles/Faded/Faded Amber 1 TM.pp3 deleted file mode 100644 index 9841feaf6..000000000 --- a/rtdata/profiles/Faded/Faded Amber 1 TM.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.047430830039525626;0.21343873517786571;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.22924901185770752;0.031620553359683806;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Amber 1.pp3 b/rtdata/profiles/Faded/Faded Amber 1.pp3 deleted file mode 100644 index f446ddfde..000000000 --- a/rtdata/profiles/Faded/Faded Amber 1.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.047430830039525626;0.21343873517786571;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.22924901185770752;0.031620553359683806;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Blue 1 TM Bright.pp3 b/rtdata/profiles/Faded/Faded Blue 1 TM Bright.pp3 deleted file mode 100644 index ca5cd1608..000000000 --- a/rtdata/profiles/Faded/Faded Blue 1 TM Bright.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.24505928853754988;0.055335968379447285;1;1; -gCurve=3;0;0;0.1146245059288528;0.023715415019764076;1;1; -bCurve=3;0;0;0.086956521739130363;0.21739130434782611;0.9446640316205519;0.69960474308300313;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Blue 1 TM.pp3 b/rtdata/profiles/Faded/Faded Blue 1 TM.pp3 deleted file mode 100644 index 121969069..000000000 --- a/rtdata/profiles/Faded/Faded Blue 1 TM.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.24505928853754988;0.055335968379447285;1;1; -gCurve=3;0;0;0.1146245059288528;0.023715415019764076;1;1; -bCurve=3;0;0;0.086956521739130363;0.21739130434782611;0.9446640316205519;0.69960474308300313;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Blue 1.pp3 b/rtdata/profiles/Faded/Faded Blue 1.pp3 deleted file mode 100644 index 55cdb7493..000000000 --- a/rtdata/profiles/Faded/Faded Blue 1.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.24505928853754988;0.055335968379447285;1;1; -gCurve=3;0;0;0.1146245059288528;0.023715415019764076;1;1; -bCurve=3;0;0;0.086956521739130363;0.21739130434782611;0.9446640316205519;0.69960474308300313;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Blue Pink TM.pp3 b/rtdata/profiles/Faded/Faded Blue Pink TM.pp3 deleted file mode 100644 index 571d11611..000000000 --- a/rtdata/profiles/Faded/Faded Blue Pink TM.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.24505928853754988;0.055335968379447285;0.81034482758620685;0.94827586206896552;1;1; -gCurve=3;0;0;0.1146245059288528;0.023715415019764076;1;1; -bCurve=3;0;0;0.086956521739130363;0.21739130434782611;0.9446640316205519;0.69960474308300313;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Blue Pink.pp3 b/rtdata/profiles/Faded/Faded Blue Pink.pp3 deleted file mode 100644 index c60fe23d2..000000000 --- a/rtdata/profiles/Faded/Faded Blue Pink.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.24505928853754988;0.055335968379447285;0.81034482758620685;0.94827586206896552;1;1; -gCurve=3;0;0;0.1146245059288528;0.023715415019764076;1;1; -bCurve=3;0;0;0.086956521739130363;0.21739130434782611;0.9446640316205519;0.69960474308300313;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Chocolate 1 TM Bright.pp3 b/rtdata/profiles/Faded/Faded Chocolate 1 TM Bright.pp3 deleted file mode 100644 index 3ae99186e..000000000 --- a/rtdata/profiles/Faded/Faded Chocolate 1 TM Bright.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.16206896551724165;0.079310344827586171;1;1; -gCurve=3;0;0;0.1655172413793104;0.034482758620689787;1;1; -bCurve=3;0;0;0.55827995093362426;0.31529235382308862;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Chocolate 2 TM Bright.pp3 b/rtdata/profiles/Faded/Faded Chocolate 2 TM Bright.pp3 deleted file mode 100644 index 3eb53a151..000000000 --- a/rtdata/profiles/Faded/Faded Chocolate 2 TM Bright.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.15733951206215074;0.55445004770342121;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.16206896551724165;0.079310344827586171;1;1; -gCurve=3;0;0;0.1655172413793104;0.034482758620689787;1;1; -bCurve=3;0;0;0.55827995093362426;0.31529235382308862;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Golden 1.pp3 b/rtdata/profiles/Faded/Faded Golden 1.pp3 deleted file mode 100644 index c8f5d26a4..000000000 --- a/rtdata/profiles/Faded/Faded Golden 1.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=SatAndValueBlending -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.53359683794466362;0.72870684529014551;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=56 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.086956521739130432;0.090909090909090856;1;1; -gCurve=3;0;0;0.20266764462192638;0.12923950395936107;1;1; -bCurve=1;0;0;0.25296442687747034;0.22529644268774709;0.8656126482213431;0.80632411067193566;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Golden 2.pp3 b/rtdata/profiles/Faded/Faded Golden 2.pp3 deleted file mode 100644 index 1e7bb927d..000000000 --- a/rtdata/profiles/Faded/Faded Golden 2.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=SatAndValueBlending -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.53359683794466362;0.72870684529014551;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=56 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.086956521739130432;0.090909090909090856;0.94466403162055268;0.89328063241106692;1;1; -gCurve=3;0;0;0.20266764462192638;0.12923950395936107;0.90118577075098805;0.88537549407114613;1;1; -bCurve=1;0;0;0.25296442687747034;0.22529644268774709;0.8656126482213431;0.80632411067193566;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Green 1 TM Bright.pp3 b/rtdata/profiles/Faded/Faded Green 1 TM Bright.pp3 deleted file mode 100644 index 036c58fdc..000000000 --- a/rtdata/profiles/Faded/Faded Green 1 TM Bright.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Green 1 TM.pp3 b/rtdata/profiles/Faded/Faded Green 1 TM.pp3 deleted file mode 100644 index d3f7c6adc..000000000 --- a/rtdata/profiles/Faded/Faded Green 1 TM.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Green 1.pp3 b/rtdata/profiles/Faded/Faded Green 1.pp3 deleted file mode 100644 index 7ee20b51a..000000000 --- a/rtdata/profiles/Faded/Faded Green 1.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Green 2.pp3 b/rtdata/profiles/Faded/Faded Green 2.pp3 deleted file mode 100644 index 2c908cf2e..000000000 --- a/rtdata/profiles/Faded/Faded Green 2.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.083003952569169981;0.075098814229249022;0.74703557312252944;0.81422924901185822;1;1; -gCurve=3;0;0;0.32806324110671931;0.43083003952569182;1;1; -bCurve=3;0;0;0.040612308653546869;0.12528693478940064;0.85375494071146218;0.9130434782608694;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Green 3.pp3 b/rtdata/profiles/Faded/Faded Green 3.pp3 deleted file mode 100644 index 570e4f291..000000000 --- a/rtdata/profiles/Faded/Faded Green 3.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.11903093907591648;0.023682704102494199;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;40;0; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.24505928853754988;0.055335968379447285;0.81034482758620685;0.94827586206896552;1;1; -gCurve=3;0;0;0.1146245059288528;0.023715415019764076;1;1; -bCurve=3;0;0;0.086956521739130363;0.21739130434782611;0.9446640316205519;0.69960474308300313;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Neutral TM.pp3 b/rtdata/profiles/Faded/Faded Neutral TM.pp3 deleted file mode 100644 index 2f2e856ed..000000000 --- a/rtdata/profiles/Faded/Faded Neutral TM.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Neutral.pp3 b/rtdata/profiles/Faded/Faded Neutral.pp3 deleted file mode 100644 index c01e7c09f..000000000 --- a/rtdata/profiles/Faded/Faded Neutral.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Purple 1 TM Bright.pp3 b/rtdata/profiles/Faded/Faded Purple 1 TM Bright.pp3 deleted file mode 100644 index 75250f299..000000000 --- a/rtdata/profiles/Faded/Faded Purple 1 TM Bright.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.15517241379310354;0.075862068965517254;1;1; -gCurve=3;0;0;0.13793103448275862;0.055172413793103607;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Purple 1 TM.pp3 b/rtdata/profiles/Faded/Faded Purple 1 TM.pp3 deleted file mode 100644 index 24496dc67..000000000 --- a/rtdata/profiles/Faded/Faded Purple 1 TM.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.15517241379310354;0.075862068965517254;1;1; -gCurve=3;0;0;0.13793103448275862;0.055172413793103607;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Purple 1.pp3 b/rtdata/profiles/Faded/Faded Purple 1.pp3 deleted file mode 100644 index a77d52afd..000000000 --- a/rtdata/profiles/Faded/Faded Purple 1.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.15517241379310354;0.075862068965517254;1;1; -gCurve=3;0;0;0.13793103448275862;0.055172413793103607;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Purple 2 TM.pp3 b/rtdata/profiles/Faded/Faded Purple 2 TM.pp3 deleted file mode 100644 index 93017a0b1..000000000 --- a/rtdata/profiles/Faded/Faded Purple 2 TM.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.15517241379310354;0.075862068965517254;0.7;0.9;1;1; -gCurve=3;0;0;0.13793103448275862;0.055172413793103607;0.69655172413793076;0.90689655172413808;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Purple 2.pp3 b/rtdata/profiles/Faded/Faded Purple 2.pp3 deleted file mode 100644 index 650d38da6..000000000 --- a/rtdata/profiles/Faded/Faded Purple 2.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;20; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.15517241379310354;0.075862068965517254;0.69999999999999973;0.90000000000000013;1;1; -gCurve=3;0;0;0.13793103448275862;0.055172413793103607;0.69655172413793076;0.90689655172413808;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Teal Orange TM Bright.pp3 b/rtdata/profiles/Faded/Faded Teal Orange TM Bright.pp3 deleted file mode 100644 index c9d2eaf7a..000000000 --- a/rtdata/profiles/Faded/Faded Teal Orange TM Bright.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=170 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.29527054654490958;0.54755349597928327;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.068858525282812999;0.0083378765162873056;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.094310344827586101;0.09189655172413784;0.9956896551724137;0.92051724137931046;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=1;0.073578595317725717;0.69732441471571893;0.35;0.35;0.33333333333333331;0.5;0.35;0.35;0.5;0.5;0.35;0.35;0.66666666666666663;0.5;0.35;0.35;0.83333333333333326;0.5;0.35;0.35; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.18620689655172415;0.044827586206896544;0.85517241379310338;0.91379310344827591;1;1; -gCurve=3;0;0;0.13224137931034488;0.048793103448275733;0.95172413793103461;0.8655172413793103;1;1; -bCurve=3;0;0;0.12758620689655173;0.075862068965517226;0.90344827586206922;0.78620689655172393;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Teal Orange TM.pp3 b/rtdata/profiles/Faded/Faded Teal Orange TM.pp3 deleted file mode 100644 index 2e4b33b10..000000000 --- a/rtdata/profiles/Faded/Faded Teal Orange TM.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=170 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.29527054654490958;0.40962246149652437;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.068858525282812999;0.0083378765162873056;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.094310344827586101;0.09189655172413784;0.89568965517241339;0.9032758620689656;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=1;0.073578595317725717;0.69732441471571893;0.35;0.35;0.33333333333333331;0.5;0.35;0.35;0.5;0.5;0.35;0.35;0.66666666666666663;0.5;0.35;0.35;0.83333333333333326;0.5;0.35;0.35; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.18620689655172415;0.044827586206896544;0.85517241379310338;0.91379310344827591;1;1; -gCurve=3;0;0;0.13224137931034488;0.048793103448275733;0.95172413793103461;0.8655172413793103;1;1; -bCurve=3;0;0;0.12758620689655173;0.075862068965517226;0.90344827586206922;0.78620689655172393;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Teal Orange.pp3 b/rtdata/profiles/Faded/Faded Teal Orange.pp3 deleted file mode 100644 index a2f4cf765..000000000 --- a/rtdata/profiles/Faded/Faded Teal Orange.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.33320158102766828;0.53720866839307635;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.068858525282812999;0.0083378765162873056;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;80; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.094310344827586101;0.09189655172413784;0.89568965517241339;0.9032758620689656;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=1;0.073578595317725717;0.69732441471571893;0.35;0.35;0.33333333333333331;0.5;0.35;0.35;0.5;0.5;0.35;0.35;0.66666666666666663;0.5;0.35;0.35;0.83333333333333326;0.5;0.35;0.35; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.18620689655172415;0.044827586206896544;0.85517241379310338;0.91379310344827591;1;1; -gCurve=3;0;0;0.13224137931034488;0.048793103448275733;0.95172413793103461;0.8655172413793103;1;1; -bCurve=3;0;0;0.12758620689655173;0.075862068965517226;0.90344827586206922;0.78620689655172393;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Warm 1 TM Bright.pp3 b/rtdata/profiles/Faded/Faded Warm 1 TM Bright.pp3 deleted file mode 100644 index b742b71be..000000000 --- a/rtdata/profiles/Faded/Faded Warm 1 TM Bright.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;40; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.051383399209486022;0.17391304347826081;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Warm 1 TM.pp3 b/rtdata/profiles/Faded/Faded Warm 1 TM.pp3 deleted file mode 100644 index 3bea604e0..000000000 --- a/rtdata/profiles/Faded/Faded Warm 1 TM.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.27667984189723321;0.47035573122529734;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;40; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.051383399209486022;0.17391304347826081;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Warm 1.pp3 b/rtdata/profiles/Faded/Faded Warm 1.pp3 deleted file mode 100644 index 3f7e67442..000000000 --- a/rtdata/profiles/Faded/Faded Warm 1.pp3 +++ /dev/null @@ -1,101 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=60;0;20; -Green=0;60;40; -Blue=-20;20;40; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=-25 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HLRecovery] -Enabled=false -Method=Blend - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.051383399209486022;0.17391304347826081;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Warm 2.pp3 b/rtdata/profiles/Faded/Faded Warm 2.pp3 deleted file mode 100644 index ab60ddb4e..000000000 --- a/rtdata/profiles/Faded/Faded Warm 2.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;20; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.051383399209486022;0.17391304347826081;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.91699604743083007;0.76284584980237169;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Faded/Faded Warm 3.pp3 b/rtdata/profiles/Faded/Faded Warm 3.pp3 deleted file mode 100644 index 4a53330e8..000000000 --- a/rtdata/profiles/Faded/Faded Warm 3.pp3 +++ /dev/null @@ -1,97 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=FilmLike -Curve=3;0;0;0.23320158102766808;0.58893280632411094;0.69169960474308201;0.96047430830039549;1;1; -Curve2=3;0;0;0.12213438735177862;0.012648221343873525;0.46245059288537577;0.41250131169330889;1;1; - -[Channel Mixer] -Red=80;0;20; -Green=0;60;40; -Blue=-20;20;20; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=-29 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -LcCurve=0; -ClCurve=0; -lhCurve=0; -hhCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=true -Luma=0 -Ldetail=0 -Chroma=20 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.40 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=3;0;0;0.051383399209486022;0.17391304347826081;1;1; -gCurve=3;0;0;1;1; -bCurve=3;0;0;0.051383399209486022;0.17391304347826081;0.57312252964427013;0.95652173913043359;1;1; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Generic/Deep Shadows.pp3 b/rtdata/profiles/Generic/Deep Shadows.pp3 deleted file mode 100644 index 4fe3b95cb..000000000 --- a/rtdata/profiles/Generic/Deep Shadows.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=3;0;0;0.10280701754385937;0;0.22561403508771805;0.081754385964912232;0.82456140350877249;0.82456140350877249;1;1; -Curve2=3;0;0;0.20585593677025255;0.44367403149511991;0.6315789473684208;0.89473684210526305;1;1; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=true -Pastels=20 -Saturated=20 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=No -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Generic/Equilibrated.pp3 b/rtdata/profiles/Generic/Equilibrated.pp3 deleted file mode 100644 index 744f3032e..000000000 --- a/rtdata/profiles/Generic/Equilibrated.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=WeightedStd -Curve=3;0;0;0.10641712584710848;0;0.22561403508771805;0.12507568560390137;0.82456140350877249;0.82456140350877249;1;1; -Curve2=3;0;0;0.20585593677025255;0.44367403149511991;0.6315789473684208;0.89473684210526305;1;1; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=No -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Generic/High-Key.pp3 b/rtdata/profiles/Generic/High-Key.pp3 deleted file mode 100644 index 3046dd460..000000000 --- a/rtdata/profiles/Generic/High-Key.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=-10 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=2;0.105;0.25;0.75;15;60;30;-70; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=5 -Chromaticity=-10 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Generic/Natural 1.pp3 b/rtdata/profiles/Generic/Natural 1.pp3 deleted file mode 100644 index 8bfd2ffb0..000000000 --- a/rtdata/profiles/Generic/Natural 1.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=1;0;0;0.04;0.03;0.17684498029510265;0.21732319394192093;0.70232558139534862;0.74883720930232545;1;1; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Generic/Natural 2.pp3 b/rtdata/profiles/Generic/Natural 2.pp3 deleted file mode 100644 index 940cab16e..000000000 --- a/rtdata/profiles/Generic/Natural 2.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=5 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=1;0;0;0.45754265471370759;0.57906737998843294;1;1; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=5 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.84892086330935235;0.69064748201438808;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Generic/Punchy 1.pp3 b/rtdata/profiles/Generic/Punchy 1.pp3 deleted file mode 100644 index ae6cdbb7e..000000000 --- a/rtdata/profiles/Generic/Punchy 1.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=0; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=120;-10;-10; -Green=-10;120;-10; -Blue=-10;-10;120; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=10 -Chromaticity=5 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Generic/Punchy 2.pp3 b/rtdata/profiles/Generic/Punchy 2.pp3 deleted file mode 100644 index 750b01565..000000000 --- a/rtdata/profiles/Generic/Punchy 2.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=true -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=0; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=10 -Chromaticity=5 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=true -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Non-raw/Brighten.pp3 b/rtdata/profiles/Non-raw/Brighten.pp3 index 267aa4e0b..37f66fb75 100644 --- a/rtdata/profiles/Non-raw/Brighten.pp3 +++ b/rtdata/profiles/Non-raw/Brighten.pp3 @@ -1,20 +1,3 @@ -[Version] -AppVersion=4.2.2 -Version=322 - [Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true +Enabled=true LCurve=3;0;0;0.055044034166268768;0;0.52103559870550098;1;1;1; -aCurve=0; -bCurve=0; -ccCurve=3;0;0;0.10679611650485436;0.30420711974110037;1;1; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=3;0;0;0.3592233009708739;0.3592233009708739;0.40129449838187703;0.40129449838187703;1;0.0032362459546936488; diff --git a/rtdata/profiles/Pixel Shift/PS ISO High.pp3 b/rtdata/profiles/Pixel Shift/PS ISO High.pp3 index 2c9927e93..02cd7047c 100644 --- a/rtdata/profiles/Pixel Shift/PS ISO High.pp3 +++ b/rtdata/profiles/Pixel Shift/PS ISO High.pp3 @@ -1,7 +1,3 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - [RAW] CA=true diff --git a/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 b/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 index cbf2e6c74..5587b19e0 100644 --- a/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 +++ b/rtdata/profiles/Pixel Shift/PS ISO Low.pp3 @@ -1,20 +1,18 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - [Sharpening] Enabled=true +Contrast=5 Method=rld DeconvRadius=0.75 -DeconvAmount=75 +DeconvAmount=100 DeconvDamping=0 DeconvIterations=30 [SharpenMicro] Enabled=true +Contrast=15 Matrix=false Strength=20 -Uniformity=50 +Uniformity=5 [RAW] CA=true diff --git a/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3 b/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3 index 2c83094c2..71e9c3919 100644 --- a/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3 +++ b/rtdata/profiles/Pixel Shift/PS ISO Medium.pp3 @@ -1,7 +1,3 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - [RAW] CA=true diff --git a/rtdata/profiles/Pixel Shift/PS No Motion.pp3 b/rtdata/profiles/Pixel Shift/PS No Motion.pp3 index 7a73881a1..f1d889f97 100644 --- a/rtdata/profiles/Pixel Shift/PS No Motion.pp3 +++ b/rtdata/profiles/Pixel Shift/PS No Motion.pp3 @@ -1,20 +1,18 @@ -[Version] -AppVersion=5.0-r1-gtk3-503-g9e1fc78 -Version=326 - [Sharpening] Enabled=true +Contrast=5 Method=rld DeconvRadius=0.75 -DeconvAmount=75 +DeconvAmount=100 DeconvDamping=0 DeconvIterations=30 [SharpenMicro] Enabled=true +Contrast=15 Matrix=false Strength=20 -Uniformity=50 +Uniformity=5 [RAW] CA=true diff --git a/rtdata/profiles/Pop/Pop 1.pp3 b/rtdata/profiles/Pop/Pop 1.pp3 index 61685727e..2152a268b 100644 --- a/rtdata/profiles/Pop/Pop 1.pp3 +++ b/rtdata/profiles/Pop/Pop 1.pp3 @@ -1,7 +1,3 @@ -[Version] -AppVersion=4.2.84 -Version=322 - [Exposure] Auto=false Clip=0.02 @@ -13,31 +9,27 @@ Black=0 HighlightCompr=70 HighlightComprThreshold=0 ShadowCompr=50 +HistogramMatching=false +CurveFromHistogramMatching=false +ClampOOG=true CurveMode=FilmLike CurveMode2=Standard -Curve=3;0;0;0.084;0;0.187;0.188;0.442;0.58;1;1; +Curve=3;0;0;0.084000000000000005;0;0.187;0.188;0.442;0.57999999999999996;1;1; Curve2=0; [HLRecovery] Enabled=true Method=Blend -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false - [Luminance Curve] +Enabled=true Brightness=0 Contrast=0 Chromaticity=0 AvoidColorShift=false RedAndSkinTonesProtection=0 LCredsk=true -LCurve=3;0;0;0.5;0.4;1;1; +LCurve=3;0;0;0.5;0.40000000000000002;1;1; aCurve=0; bCurve=0; ccCurve=0; @@ -47,18 +39,14 @@ hhCurve=0; LcCurve=0; ClCurve=0; -[Vibrance] -Enabled=false - -[White Balance] -Setting=Camera -Equal=1 - [Color appearance] Enabled=true -Degree=100 +Degree=98 AutoDegree=true +Degreeout=85 +AutoDegreeout=true Surround=Average +Surrsrc=Average AdaptLum=16 Badpixsl=0 Model=RawT @@ -74,58 +62,34 @@ H-Hue=0 RSTProtection=0 AdaptScene=208 AutoAdapscen=true +YbScene=15 +Autoybscen=true SurrSource=false Gamut=true +Tempout=5000 +Greenout=1 +Tempsc=5000 +Greensc=1 +Ybout=18 Datacie=false Tonecie=true CurveMode=Brightness CurveMode2=Lightness CurveMode3=Colorfullness Curve=0; -Curve2=3;0;0;0.15;0;0.67;0.91;1;1; -Curve3=3;0;0;0.08;0.02;0.3;0.5;1;1; +Curve2=3;0;0;0.14999999999999999;0;0.67000000000000004;0.91000000000000003;1;1; +Curve3=3;0;0;0.080000000000000002;0.02;0.29999999999999999;0.5;1;1; [EPD] Enabled=true Strength=0.25 -EdgeStopping=2.4 -Scale=0.10 +Gamma=1 +EdgeStopping=1.3999999999999999 +Scale=0.5 ReweightingIterates=0 -[Shadows & Highlights] -Enabled=false - -[Gradient] -Enabled=false - [PCVignette] Enabled=true Strength=1 Feather=50 Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -CA=true -HotPixelFilter=true -DeadPixelFilter=false -HotDeadPixelThresh=100 diff --git a/rtdata/profiles/Pop/Pop 2 L.pp3 b/rtdata/profiles/Pop/Pop 2 L.pp3 deleted file mode 100644 index 13fe80293..000000000 --- a/rtdata/profiles/Pop/Pop 2 L.pp3 +++ /dev/null @@ -1,131 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=1 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=FilmLike -CurveMode2=Standard -Curve=3;0;0;0.179;0;0.384;0.502;1;1; -Curve2=0; - -[HLRecovery] -Enabled=true -Method=Blend - -[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=3;0;0;0.12;0.3;0.5;0.46;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false - -[White Balance] -Setting=Camera -Equal=1 - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=208 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Brightness -CurveMode2=Lightness -CurveMode3=Colorfullness -Curve=0; -Curve2=3;0;0;0.15;0;0.67;0.91;1;1; -Curve3=3;0;0;0.08;0.02;0.3;0.5;1;1; - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=2.4 -Scale=0.10 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[Gradient] -Enabled=false - -[PCVignette] -Enabled=true -Strength=1 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -CA=true -HotPixelFilter=true -DeadPixelFilter=false -HotDeadPixelThresh=100 diff --git a/rtdata/profiles/Pop/Pop 2 Lab.pp3 b/rtdata/profiles/Pop/Pop 2 Lab.pp3 new file mode 100644 index 000000000..796aeb5ba --- /dev/null +++ b/rtdata/profiles/Pop/Pop 2 Lab.pp3 @@ -0,0 +1,95 @@ +[Exposure] +Auto=false +Clip=0.02 +Compensation=1 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=70 +HighlightComprThreshold=0 +ShadowCompr=50 +HistogramMatching=false +CurveFromHistogramMatching=false +ClampOOG=true +CurveMode=FilmLike +CurveMode2=Standard +Curve=3;0;0;0.17899999999999999;0;0.38400000000000001;0.502;1;1; +Curve2=0; + +[HLRecovery] +Enabled=true +Method=Blend + +[Luminance Curve] +Enabled=true +Brightness=0 +Contrast=0 +Chromaticity=0 +AvoidColorShift=false +RedAndSkinTonesProtection=0 +LCredsk=true +LCurve=3;0;0;0.12;0.29999999999999999;0.5;0.46000000000000002;1;1; +aCurve=0; +bCurve=0; +ccCurve=0; +chCurve=0; +lhCurve=0; +hhCurve=0; +LcCurve=0; +ClCurve=0; + +[Color appearance] +Enabled=true +Degree=98 +AutoDegree=true +Degreeout=85 +AutoDegreeout=true +Surround=Average +Surrsrc=Average +AdaptLum=16 +Badpixsl=0 +Model=RawT +Algorithm=QM +J-Light=0 +Q-Bright=0 +C-Chroma=0 +S-Chroma=0 +M-Chroma=0 +J-Contrast=0 +Q-Contrast=0 +H-Hue=0 +RSTProtection=0 +AdaptScene=208 +AutoAdapscen=true +YbScene=15 +Autoybscen=true +SurrSource=false +Gamut=true +Tempout=5000 +Greenout=1 +Tempsc=5000 +Greensc=1 +Ybout=18 +Datacie=false +Tonecie=true +CurveMode=Brightness +CurveMode2=Lightness +CurveMode3=Colorfullness +Curve=0; +Curve2=3;0;0;0.14999999999999999;0;0.67000000000000004;0.91000000000000003;1;1; +Curve3=3;0;0;0.080000000000000002;0.02;0.29999999999999999;0.5;1;1; + +[EPD] +Enabled=true +Strength=0.25 +Gamma=1 +EdgeStopping=1.3999999999999999 +Scale=0.5 +ReweightingIterates=0 + +[PCVignette] +Enabled=true +Strength=1 +Feather=50 +Roundness=50 diff --git a/rtdata/profiles/Pop/Pop 3 Skin.pp3 b/rtdata/profiles/Pop/Pop 3 Skin.pp3 index 90ce7e346..650b2e189 100644 --- a/rtdata/profiles/Pop/Pop 3 Skin.pp3 +++ b/rtdata/profiles/Pop/Pop 3 Skin.pp3 @@ -1,7 +1,3 @@ -[Version] -AppVersion=4.2.84 -Version=322 - [Exposure] Auto=false Clip=0.02 @@ -13,31 +9,27 @@ Black=0 HighlightCompr=70 HighlightComprThreshold=0 ShadowCompr=50 +HistogramMatching=false +CurveFromHistogramMatching=false +ClampOOG=true CurveMode=SatAndValueBlending CurveMode2=Standard -Curve=3;0;0;0.084;0;0.187;0.188;0.442;0.58;1;1; +Curve=3;0;0;0.084000000000000005;0;0.187;0.188;0.442;0.57999999999999996;1;1; Curve2=0; [HLRecovery] Enabled=true Method=Blend -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false - [Luminance Curve] +Enabled=true Brightness=0 Contrast=0 Chromaticity=0 AvoidColorShift=false RedAndSkinTonesProtection=0 LCredsk=true -LCurve=3;0;0;0.5;0.4;1;1; +LCurve=3;0;0;0.5;0.40000000000000002;1;1; aCurve=0; bCurve=0; ccCurve=0; @@ -47,18 +39,14 @@ hhCurve=0; LcCurve=0; ClCurve=0; -[Vibrance] -Enabled=false - -[White Balance] -Setting=Camera -Equal=1 - [Color appearance] Enabled=true -Degree=100 +Degree=98 AutoDegree=true +Degreeout=85 +AutoDegreeout=true Surround=Average +Surrsrc=Average AdaptLum=16 Badpixsl=0 Model=RawT @@ -74,58 +62,34 @@ H-Hue=0 RSTProtection=50 AdaptScene=208 AutoAdapscen=true +YbScene=10 +Autoybscen=true SurrSource=false Gamut=true +Tempout=5000 +Greenout=1 +Tempsc=5000 +Greensc=1 +Ybout=18 Datacie=false Tonecie=true CurveMode=Brightness CurveMode2=Lightness CurveMode3=Colorfullness Curve=0; -Curve2=3;0;0;0.15;0;0.67;0.91;1;1; -Curve3=3;0;0;0.08;0.02;0.38;0.73;1;1; +Curve2=3;0;0;0.14999999999999999;0;0.67000000000000004;0.91000000000000003;1;1; +Curve3=3;0;0;0.080000000000000002;0.02;0.38;0.72999999999999998;1;1; [EPD] Enabled=true Strength=0.25 -EdgeStopping=2.4 -Scale=0.10 +Gamma=1 +EdgeStopping=1.3999999999999999 +Scale=0.5 ReweightingIterates=0 -[Shadows & Highlights] -Enabled=false - -[Gradient] -Enabled=false - [PCVignette] Enabled=true Strength=1 Feather=50 Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -CA=true -HotPixelFilter=true -DeadPixelFilter=false -HotDeadPixelThresh=100 diff --git a/rtdata/profiles/Pop/Pop 4 BW.pp3 b/rtdata/profiles/Pop/Pop 4 BW.pp3 deleted file mode 100644 index 4277869a4..000000000 --- a/rtdata/profiles/Pop/Pop 4 BW.pp3 +++ /dev/null @@ -1,153 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0.66 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=SatAndValueBlending -CurveMode2=Standard -Curve=3;0;0;0.084;0;0.187;0.188;0.587;0.742;1;1; -Curve2=0; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=true -Method=ChannelMixer -Auto=true -ComplementaryColors=true -Setting=RGB-Rel -Filter=None -MixerRed=-100 -MixerOrange=33 -MixerYellow=33 -MixerGreen=-100 -MixerCyan=33 -MixerBlue=0 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -Algorithm=SP -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.212;0.119;0.674;0.773;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false - -[White Balance] -Setting=Camera -Equal=1 - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=208 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Colorfullness -Curve=3;0;0;0.15;0;0.545;1;1;1; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=2.4 -Scale=0.10 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false - -[Gradient] -Enabled=false - -[PCVignette] -Enabled=true -Strength=1 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -CA=true -HotPixelFilter=true -DeadPixelFilter=false -HotDeadPixelThresh=100 diff --git a/rtdata/profiles/Pop/Pop 4 Black-and-White.pp3 b/rtdata/profiles/Pop/Pop 4 Black-and-White.pp3 new file mode 100644 index 000000000..9faa32a0a --- /dev/null +++ b/rtdata/profiles/Pop/Pop 4 Black-and-White.pp3 @@ -0,0 +1,120 @@ +[Exposure] +Auto=false +Clip=0.02 +Compensation=0.66000000000000003 +Brightness=0 +Contrast=0 +Saturation=0 +Black=0 +HighlightCompr=70 +HighlightComprThreshold=0 +ShadowCompr=50 +HistogramMatching=false +CurveFromHistogramMatching=false +ClampOOG=true +CurveMode=SatAndValueBlending +CurveMode2=Standard +Curve=3;0;0;0.084000000000000005;0;0.187;0.188;0.58699999999999997;0.74199999999999999;1;1; +Curve2=0; + +[HLRecovery] +Enabled=true +Method=Blend + +[Black & White] +Enabled=true +Method=ChannelMixer +Auto=false +ComplementaryColors=true +Setting=RGB-Rel +Filter=None +MixerRed=-100 +MixerOrange=33 +MixerYellow=33 +MixerGreen=-100 +MixerCyan=33 +MixerBlue=0 +MixerMagenta=33 +MixerPurple=33 +GammaRed=0 +GammaGreen=0 +GammaBlue=0 +Algorithm=SP +LuminanceCurve=0; +BeforeCurveMode=Standard +AfterCurveMode=Standard +BeforeCurve=0; +AfterCurve=0; + +[Luminance Curve] +Enabled=true +Brightness=0 +Contrast=0 +Chromaticity=0 +AvoidColorShift=false +RedAndSkinTonesProtection=0 +LCredsk=true +LCurve=3;0;0;0.21199999999999999;0.11899999999999999;0.67400000000000004;0.77300000000000002;1;1; +aCurve=0; +bCurve=0; +ccCurve=0; +chCurve=0; +lhCurve=0; +hhCurve=0; +LcCurve=0; +ClCurve=0; + +[Color appearance] +Enabled=true +Degree=97 +AutoDegree=true +Degreeout=85 +AutoDegreeout=true +Surround=Average +Surrsrc=Average +AdaptLum=16 +Badpixsl=0 +Model=RawT +Algorithm=QM +J-Light=0 +Q-Bright=0 +C-Chroma=0 +S-Chroma=0 +M-Chroma=0 +J-Contrast=0 +Q-Contrast=0 +H-Hue=0 +RSTProtection=0 +AdaptScene=164.33000000000001 +AutoAdapscen=true +YbScene=10 +Autoybscen=true +SurrSource=false +Gamut=true +Tempout=5000 +Greenout=1 +Tempsc=5000 +Greensc=1 +Ybout=18 +Datacie=false +Tonecie=true +CurveMode=Lightness +CurveMode2=Lightness +CurveMode3=Colorfullness +Curve=3;0;0;0.14999999999999999;0;0.54500000000000004;1;1;1; +Curve2=0; +Curve3=0; + +[EPD] +Enabled=true +Strength=0.25 +Gamma=1 +EdgeStopping=1.3999999999999999 +Scale=0.5 +ReweightingIterates=0 + +[PCVignette] +Enabled=true +Strength=1 +Feather=50 +Roundness=50 diff --git a/rtdata/profiles/Portrait/Portrait Lejto.pp3 b/rtdata/profiles/Portrait/Portrait Lejto.pp3 deleted file mode 100644 index 0fe9d68ad..000000000 --- a/rtdata/profiles/Portrait/Portrait Lejto.pp3 +++ /dev/null @@ -1,162 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=25 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=SatAndValueBlending -Curve=1;0;0;0.079285714285714293;0.03;0.18041642857142856;0.21375157142857143;0.702326;0.748837;1;1; -Curve2=1;0;0;0.075;0.13571428571428609;0.3;0.42857142857142855;0.7214285714285712;0.74642857142857144;1;1; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=0; -aCurve=0; -bCurve=1;0;0;1;1; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=No -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Portrait/Portrait Smooth.pp3 b/rtdata/profiles/Portrait/Portrait Smooth.pp3 deleted file mode 100644 index 26bb855dd..000000000 --- a/rtdata/profiles/Portrait/Portrait Smooth.pp3 +++ /dev/null @@ -1,139 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=70 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=FilmLike -CurveMode2=Standard -Curve=1;0;0;0.443;0.574;1;1; -Curve2=0; - -[HLRecovery] -Enabled=true -Method=Luminance - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false - -[Luminance Curve] -Brightness=-20 -Contrast=-20 -Chromaticity=0 -AvoidColorShift=true -RedAndSkinTonesProtection=50 -LCredsk=true -LCurve=3;0;0;0.043;0.014;0.162;0.162;0.652;0.93;1;1; -aCurve=0; -bCurve=0; -ccCurve=1;0;0;0.254;0.3;1;1; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Sharpening] -Enabled=true -Method=usm -Radius=0.5 -Amount=250 -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 - -[Color appearance] -Enabled=false - -[Impulse Denoising] -Enabled=false - -[Defringing] -Enabled=false - -[Directional Pyramid Denoising] -Enabled=false - -[EPD] -Enabled=false - -[Shadows & Highlights] -Enabled=false - -[Crop] -Enabled=false - -[Gradient] -Enabled=false - -[PCVignette] -Enabled=false - -[Directional Pyramid Equalizer] -Enabled=true -Gamutlab=true -Mult0=1 -Mult1=1 -Mult2=1 -Mult3=0.6 -Mult4=0.6 -Threshold=0.2 -Skinprotect=0 -Hueskin=-5;25;170;120; - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - -[RAW] -CA=true - diff --git a/rtdata/profiles/Skintones/Skintones - Natural TM.pp3 b/rtdata/profiles/Skintones/Skintones - Natural TM.pp3 deleted file mode 100644 index ba2ff3be4..000000000 --- a/rtdata/profiles/Skintones/Skintones - Natural TM.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=-1500 -HighlightCompr=40 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=FilmLike -CurveMode2=FilmLike -Curve=1;0;0;0.49407114624505927;0.49407114624505927;1;1; -Curve2=1;0;0;0.055335968379446598;0.019762845849802379;0.12648221343873495;0.11067193675889311;1;0.94861660079051413; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.063241106719367585;6.9388939039072284e-18;0.49407114624505927;0.50197628458498023;0.92885375494071132;0.99604743083003922;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=10 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=false -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.29629629629629628;0.19341563786008226;0.69547325102880675;0.80246913580246892;1;1; -Curve2=3;0;0;0.056806920298983779;0.020475350634080798;0.69802637104224341;0.88816662467456142;1;1; -Curve3=0; - -[Directional Pyramid Denoising] -Enabled=false -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Natural.pp3 b/rtdata/profiles/Skintones/Skintones - Natural.pp3 deleted file mode 100644 index fb05ab00f..000000000 --- a/rtdata/profiles/Skintones/Skintones - Natural.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=-1500 -HighlightCompr=30 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=FilmLike -CurveMode2=FilmLike -Curve=1;0;0;0.49802371541501977;0.49802371541501977;1;1; -Curve2=1;0;0;0.097430830039525476;0.066798418972331866;0.12648221343873495;0.11067193675889311;1;0.95256916996047469; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.063241106719367585;6.9388939039072284e-18;0.49407114624505927;0.50197628458498023;0.92885375494071132;0.99604743083003922;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=8 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.19753086419753088;0.18106995884773661;0.58847736625514402;0.79012345679012241;1;1; -Curve2=3;0;0;0.056806920298983779;0.020475350634080798;0.69802637104224341;0.88816662467456142;1;1; -Curve3=0; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Pale TM Bright.pp3 b/rtdata/profiles/Skintones/Skintones - Pale TM Bright.pp3 deleted file mode 100644 index 7ed909f89..000000000 --- a/rtdata/profiles/Skintones/Skintones - Pale TM Bright.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=10 -Contrast=10 -Saturation=0 -Black=0 -HighlightCompr=40 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=WeightedStd -CurveMode2=SatAndValueBlending -Curve=3;0;0;0.1013677790907735;0.011341564456759405;0.32302405498281778;0.2147079037800686;1;0.81422924901185889; -Curve2=3;0;0;0.16151202749140844;0.24319627128016638;0.59793814432989756;0.90034364261168354;1;1; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.063241106719367585;6.9388939039072284e-18;0.49407114624505927;0.50197628458498023;0.92885375494071132;0.99604743083003922;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=-5 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.29629629629629628;0.19341563786008226;0.69547325102880675;0.80246913580246892;1;1; -Curve2=3;0;0;0.056806920298983779;0.020475350634080798;0.69802637104224341;0.88816662467456142;1;1; -Curve3=0; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Pale TM.pp3 b/rtdata/profiles/Skintones/Skintones - Pale TM.pp3 deleted file mode 100644 index 3e3476e92..000000000 --- a/rtdata/profiles/Skintones/Skintones - Pale TM.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=10 -Contrast=10 -Saturation=0 -Black=0 -HighlightCompr=40 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=WeightedStd -CurveMode2=SatAndValueBlending -Curve=3;0;0;0.1013677790907735;0.011341564456759405;0.32302405498281778;0.2147079037800686;1;0.81422924901185889; -Curve2=3;0;0;0.16151202749140844;0.24319627128016638;0.59793814432989756;0.90034364261168354;1;1; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.063241106719367585;6.9388939039072284e-18;0.49407114624505927;0.50197628458498023;0.92885375494071132;0.99604743083003922;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=-5 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.29629629629629628;0.19341563786008226;0.69547325102880675;0.80246913580246892;1;1; -Curve2=3;0;0;0.14545;0;0.69802600000000004;0.88816700000000004;1;1; -Curve3=0; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.25 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Pale.pp3 b/rtdata/profiles/Skintones/Skintones - Pale.pp3 deleted file mode 100644 index 7f6aa9c99..000000000 --- a/rtdata/profiles/Skintones/Skintones - Pale.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=30 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=WeightedStd -CurveMode2=SatAndValueBlending -Curve=3;0;0;0.1013677790907735;0.011341564456759405;0.32302405498281778;0.2147079037800686;1;1; -Curve2=3;0;0;0.16151202749140844;0.24319627128016638;0.59793814432989756;0.90034364261168354;1;1; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=false -Pastels=50 -Saturated=50 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=JC -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Soft Texture.pp3 b/rtdata/profiles/Skintones/Skintones - Soft Texture.pp3 deleted file mode 100644 index 26815da33..000000000 --- a/rtdata/profiles/Skintones/Skintones - Soft Texture.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=0; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=No -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[Directional Pyramid Denoising] -Enabled=false -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=true -rCurve=3;0;0;0.058419243986254393;0.28522336769759427;0.46735395189003465;0.890034364261168;1;1; -gCurve=3;0;0;0.96563573883161546;0.66323024054982871;1;1; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Strong Texture.pp3 b/rtdata/profiles/Skintones/Skintones - Strong Texture.pp3 deleted file mode 100644 index 691cc118d..000000000 --- a/rtdata/profiles/Skintones/Skintones - Strong Texture.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=0 -HighlightComprThreshold=33 -ShadowCompr=50 -CurveMode=Standard -CurveMode2=Standard -Curve=0; -Curve2=0; - -[HLRecovery] -Enabled=false -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=false -Degree=90 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=No -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=false -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=0; -Curve2=0; -Curve3=0; - -[Directional Pyramid Denoising] -Enabled=false -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.25 -EdgeStopping=1.4 -Scale=1 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=true -rCurve=3;0;0;0.29209621993127149;0.054982817869415793;0.90034364261168398;0.46391752577319617;1;1; -gCurve=3;0;0;0.67697594501718261;0.95532646048109982;1;1; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Studio TM.pp3 b/rtdata/profiles/Skintones/Skintones - Studio TM.pp3 deleted file mode 100644 index 944670a23..000000000 --- a/rtdata/profiles/Skintones/Skintones - Studio TM.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=-1500 -HighlightCompr=40 -HighlightComprThreshold=0 -ShadowCompr=0 -CurveMode=WeightedStd -CurveMode2=SatAndValueBlending -Curve=3;0;0;0.083003952569169939;0.21343873517786566;1;1; -Curve2=3;0;0;0.063063463161166899;0.13925774599931898;0.86956521739130421;0.76284584980237158;1;1; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.15019762845849804;0.02766798418972332;0.31620553359683784;0.23715415019762845;0.49407114624505927;0.50197628458498023;0.92885375494071132;0.99604743083003922;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=10 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.06584362139917696;0.01234567901234568;0.24279835390946511;0.12757201646090524;0.46502057613168757;0.49324520929459226;0.67901234567901192;0.84773662551440199;1;1; -Curve2=0; -Curve3=1;0;0;0.86008230452674928;1; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.15 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=10 -HighlightTonalWidth=80 -Shadows=10 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=30 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - Studio.pp3 b/rtdata/profiles/Skintones/Skintones - Studio.pp3 deleted file mode 100644 index d58c7be11..000000000 --- a/rtdata/profiles/Skintones/Skintones - Studio.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=-1500 -HighlightCompr=30 -HighlightComprThreshold=0 -ShadowCompr=0 -CurveMode=WeightedStd -CurveMode2=SatAndValueBlending -Curve=3;0;0;0.083003952569169939;0.21343873517786566;1;1; -Curve2=3;0;0;0.063063463161166899;0.13925774599931898;0.86956521739130421;0.76284584980237158;1;1; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[Luminance Curve] -Brightness=0 -Contrast=0 -Chromaticity=0 -AvoidColorShift=false -RedAndSkinTonesProtection=0 -LCredsk=true -LCurve=3;0;0;0.15019762845849804;0.02766798418972332;0.31620553359683784;0.23715415019762845;0.49407114624505927;0.50197628458498023;0.92885375494071132;0.99604743083003922;1;1; -aCurve=0; -bCurve=0; -ccCurve=0; -chCurve=0; -lhCurve=0; -hhCurve=0; -LcCurve=0; -ClCurve=0; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=10 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.06584362139917696;0.01234567901234568;0.24279835390946511;0.12757201646090524;0.46502057613168757;0.49324520929459226;0.67901234567901192;0.84773662551440199;1;1; -Curve2=0; -Curve3=1;0;0;0.90534979423868323;1; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.15 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - StudioBase 1 TM.pp3 b/rtdata/profiles/Skintones/Skintones - StudioBase 1 TM.pp3 deleted file mode 100644 index 227cf09f9..000000000 --- a/rtdata/profiles/Skintones/Skintones - StudioBase 1 TM.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=30 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=WeightedStd -CurveMode2=SatAndValueBlending -Curve=3;0;0;1;1; -Curve2=3;0;0;1;1; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.11522633744855965;0.01234567901234568;0.49382716049382719;0.49382716049382719;0.76131687242798285;0.95473251028806605;1;1; -Curve2=0; -Curve3=1;0;0;1;1; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=true -Strength=0.15 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Skintones/Skintones - StudioBase 1.pp3 b/rtdata/profiles/Skintones/Skintones - StudioBase 1.pp3 deleted file mode 100644 index e0d38aefc..000000000 --- a/rtdata/profiles/Skintones/Skintones - StudioBase 1.pp3 +++ /dev/null @@ -1,173 +0,0 @@ -[Version] -AppVersion=4.2.84 -Version=322 - -[Exposure] -Auto=false -Clip=0.02 -Compensation=0 -Brightness=0 -Contrast=0 -Saturation=0 -Black=0 -HighlightCompr=20 -HighlightComprThreshold=0 -ShadowCompr=50 -CurveMode=WeightedStd -CurveMode2=SatAndValueBlending -Curve=3;0;0;1;1; -Curve2=3;0;0;1;1; - -[HLRecovery] -Enabled=true -Method=Blend - -[Channel Mixer] -Red=100;0;0; -Green=0;100;0; -Blue=0;0;100; - -[Black & White] -Enabled=false -Method=Desaturation -Auto=false -ComplementaryColors=true -Setting=NormalContrast -Filter=None -MixerRed=33 -MixerOrange=33 -MixerYellow=33 -MixerGreen=33 -MixerCyan=33 -MixerBlue=33 -MixerMagenta=33 -MixerPurple=33 -GammaRed=0 -GammaGreen=0 -GammaBlue=0 -LuminanceCurve=0; -BeforeCurveMode=Standard -AfterCurveMode=Standard -BeforeCurve=0; -AfterCurve=0; - -[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; - -[Vibrance] -Enabled=false -Pastels=0 -Saturated=0 -PSThreshold=0;75; -ProtectSkins=false -AvoidColorShift=false -PastSatTog=true -SkinTonesCurve=0; - -[Color appearance] -Enabled=true -Degree=100 -AutoDegree=true -Surround=Average -AdaptLum=16 -Badpixsl=0 -Model=RawT -Algorithm=QM -J-Light=0 -Q-Bright=0 -C-Chroma=0 -S-Chroma=0 -M-Chroma=0 -J-Contrast=0 -Q-Contrast=0 -H-Hue=0 -RSTProtection=0 -AdaptScene=2000 -AutoAdapscen=true -SurrSource=false -Gamut=true -Datacie=false -Tonecie=true -CurveMode=Lightness -CurveMode2=Lightness -CurveMode3=Chroma -Curve=3;0;0;0.10699588477366252;0.049382716049382713;0.49382716049382719;0.49382716049382719;0.76131687242798285;0.95473251028806605;1;1; -Curve2=0; -Curve3=1;0;0;1;1; - -[Directional Pyramid Denoising] -Enabled=true -Enhance=false -Luma=0 -Ldetail=0 -Chroma=15 -Method=Lab -Redchro=0 -Bluechro=0 -Gamma=1.7 - -[EPD] -Enabled=false -Strength=0.15 -EdgeStopping=1.4 -Scale=0.25 -ReweightingIterates=0 - -[Shadows & Highlights] -Enabled=false -HighQuality=false -Highlights=0 -HighlightTonalWidth=80 -Shadows=0 -ShadowTonalWidth=80 -LocalContrast=0 -Radius=40 - -[Gradient] -Enabled=false -Degree=0 -Feather=25 -Strength=0.6 -CenterX=0 -CenterY=0 - -[PCVignette] -Enabled=false -Strength=0.6 -Feather=50 -Roundness=50 - -[HSV Equalizer] -HCurve=0; -SCurve=0; -VCurve=0; - -[Film Simulation] -Enabled=false - -[Wavelet] -Enabled=false - -[RGB Curves] -LumaMode=false -rCurve=0; -gCurve=0; -bCurve=0; - -[ColorToning] -Enabled=false - diff --git a/rtdata/profiles/Standard Film Curve - ISO High.pp3 b/rtdata/profiles/Standard Film Curve - ISO High.pp3 new file mode 100644 index 000000000..4dd3a9b1d --- /dev/null +++ b/rtdata/profiles/Standard Film Curve - ISO High.pp3 @@ -0,0 +1,53 @@ +[Exposure] +Auto=false +HistogramMatching=false +CurveMode=FilmLike +Curve=1;0;0;0.11;0.089999999999999997;0.32000000000000001;0.42999999999999999;0.66000000000000003;0.87;1;1; + +[HLRecovery] +Enabled=true +Method=Blend + +[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 + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 + +[RAW] +CA=true + +[RAW Bayer] +Method=lmmse + +[RAW X-Trans] +Method=1-pass (medium) diff --git a/rtdata/profiles/Standard Film Curve - ISO Low.pp3 b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 new file mode 100644 index 000000000..c23b5b8a4 --- /dev/null +++ b/rtdata/profiles/Standard Film Curve - ISO Low.pp3 @@ -0,0 +1,25 @@ +[Exposure] +Auto=false +HistogramMatching=false +CurveMode=FilmLike +Curve=1;0;0;0.11;0.089999999999999997;0.32000000000000001;0.42999999999999999;0.66000000000000003;0.87;1;1; + +[HLRecovery] +Enabled=true +Method=Blend + +[LensProfile] +LcMode=lfauto +UseDistortion=true +UseVignette=true +UseCA=false + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 + +[RAW] +CA=true diff --git a/rtdata/profiles/Standard Film Curve - ISO Medium.pp3 b/rtdata/profiles/Standard Film Curve - ISO Medium.pp3 new file mode 100644 index 000000000..4aff630f5 --- /dev/null +++ b/rtdata/profiles/Standard Film Curve - ISO Medium.pp3 @@ -0,0 +1,47 @@ +[Exposure] +Auto=false +HistogramMatching=false +CurveMode=FilmLike +Curve=1;0;0;0.11;0.089999999999999997;0.32000000000000001;0.42999999999999999;0.66000000000000003;0.87;1;1; + +[HLRecovery] +Enabled=true +Method=Blend + +[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 + +[Color Management] +ToneCurve=false +ApplyLookTable=true +ApplyBaselineExposureOffset=true +ApplyHueSatMap=true +DCPIlluminant=0 + +[RAW] +CA=true diff --git a/rtdata/profiles/Unclipped.pp3 b/rtdata/profiles/Unclipped.pp3 new file mode 100644 index 000000000..48cf72f86 --- /dev/null +++ b/rtdata/profiles/Unclipped.pp3 @@ -0,0 +1,27 @@ +[Exposure] +ClampOOG=false +Curve=0; +Curve2=0; + +[Black & White] +BeforeCurve=0; +AfterCurve=0; + +[Vibrance] +Enabled=false + +[Color appearance] +Enabled=false + +[Film Simulation] +Enabled=false + +[RGB Curves] +LumaMode=false + +[Color Management] +ApplyLookTable=false + +[RAW] +CA=true +CAAutoIterations=2 diff --git a/rtdata/rawtherapee.desktop.in b/rtdata/rawtherapee.desktop.in new file mode 100644 index 000000000..233a737b6 --- /dev/null +++ b/rtdata/rawtherapee.desktop.in @@ -0,0 +1,19 @@ +[Desktop Entry] +Type=Application +Version=1.0 +Name=RawTherapee +GenericName=Raw photo editor +GenericName[cs]=Editor raw obrázků +GenericName[fr]=Éditeur d'images raw +GenericName[pl]=Edytor zdjęć raw +Comment=An advanced raw photo development program +Comment[cs]=Program pro konverzi a zpracování digitálních raw fotografií +Comment[fr]=Logiciel de conversion et de traitement de photos numériques de format raw (but de capteur) +Comment[pl]=Zaawansowany program do wywoływania zdjęć typu raw +Icon=rawtherapee +Exec=rawtherapee %f +Terminal=false +MimeType=image/jpeg;image/png;image/tiff;image/x-adobe-dng;image/x-canon-cr2;image/x-canon-crf;image/x-canon-crw;image/x-fuji-raf;image/x-hasselblad-3fr;image/x-hasselblad-fff;image/x-jpg;image/x-kodak-dcr;image/x-kodak-k25;image/x-kodak-kdc;image/x-leaf-mos;image/x-leica-rwl;image/x-mamiya-mef;image/x-minolta-mrw;image/x-nikon-nef;image/x-nikon-nrw;image/x-olympus-orf;image/x-panasonic-raw;image/x-panasonic-rw2;image/x-pentax-pef;image/x-pentax-raw;image/x-phaseone-iiq;image/x-raw;image/x-rwz;image/x-samsung-srw;image/x-sigma-x3f;image/x-sony-arq;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-tif; +Categories=Photography;Graphics;2DGraphics;RasterGraphics;GTK; +Keywords=raw;photography;develop;pp3;graphics; +StartupWMClass=rawtherapee diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css index a2fadeca3..20478367f 100644 --- a/rtdata/themes/RawTherapee-GTK3-20_.css +++ b/rtdata/themes/RawTherapee-GTK3-20_.css @@ -18,17 +18,34 @@ along with RawTherapee. If not, see . */ +/* text-shadow causes a serious performance degradation in rendering the UI, + * at least in comboboxes with many entries (i.e. Profiled Lens Correction). +*/ + +* { + color: #AAAAAA; + text-shadow: none; +} + +*:disabled { + color: #666666; +} + /* Scrollbar stuck workaround */ scrollbar:not(.overlay-indicator):hover { min-width: 1px; } -* { - color: #AAAAAA; -} - -*:disabled { - color: #666666; +/* Toolbar stuck workaround */ +.scrollableToolbar > scrollbar:not(.dummy), +.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy), +.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy), +.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy) > slider:not(.dummy) { + padding: 0; + margin: 0; + min-height: 0; + min-width: 0; + border: none; } .view:selected:not(check):not(radio) { @@ -220,9 +237,10 @@ scrollbar.vertical.overlay-indicator:not(.hovering) slider { button { padding: 0; + box-shadow: none; min-height: 5px; min-width: 5px; - background-image: linear-gradient(#343434, #2E2E2E, #292929); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); } /* Curve mode buttons and drop-downs */ @@ -247,7 +265,7 @@ radiobutton > radio { background-image: linear-gradient(#343434, #2E2E2E, #292929); } -button:hover , button.flat:hover, checkbutton:hover > check, radiobutton:hover > radio { +button.flat:hover, checkbutton:hover > check, radiobutton:hover > radio { background-image: linear-gradient(shade(#343434,1.3), shade(#2E2E2E,1.3), shade(#292929,1.3)); } @@ -255,6 +273,22 @@ button.popupbutton-arrow { min-width: 18px; } +button:hover { + background-image: linear-gradient(to bottom, rgba(150,150,150,.3), rgba(80,80,80,.3)); +} + +button:active { + background-image: linear-gradient(to bottom, rgba(30,30,30,.3), rgba(0,0,0,.3)); +} + +button:checked { + background-image: linear-gradient(to bottom, rgba(30,30,30,.8), rgba(0,0,0,.8)); +} + +button:checked:hover { + background-image: linear-gradient(to bottom, rgba(60,60,60,1), rgba(30,30,30,1)); +} + /* Save, Cancel, OK ... buttons */ .dialog-action-area button { min-height: 24px; @@ -324,34 +358,29 @@ scale:disabled trough { 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; } -progressbar.vertical trough { - min-width: 6px; -} -progressbar.vertical trough progress { - min-width: 6px; -} - -progressbar.horizontal trough { - min-height: 6px; -} -progressbar.horizontal trough progress { - min-height: 6px; -} - -progressbar trough { - background-color: #2A2A2A; - border-color: #202020; -} - -notebook header progressbar trough { - background-color: #202020; - border-color: #181818; -} +/* */ .drawingarea { border-radius: 0; @@ -593,7 +622,6 @@ flowboxchild:selected { /* Editor tab button */ #MainNotebook grid label, #MainNotebook grid image { - /* OK */ padding: 1px; } @@ -916,5 +944,101 @@ button#MyFileChooserButton { } #ToolPanelNotebook button { - margin: 0px; + margin: 0px; +} + +button.flat { + background: none; + border: none; + outline: none; +} + +button.flat:checked { + background: #262626; +} + +.text-button, .image-button, .independent { + box-shadow: none; + min-height: 24px; + min-width: 24px; + padding: 0px; +} + +/* Makes image-comboboxes (e.g. tone curve types) have same size as image buttons */ +combobox, .popupbutton-arrow { + min-height: 24px; +} + +/* Makes image-combobox small icons centered */ +button.toggle > grid > image { + padding: 4px; +} + +#histButton { + background: none; + min-height: 16px; + min-width: 16px; +} + +/* -gtk-icon-shadow looks buggy on the small histogram icons */ +#histButton:hover { + -gtk-icon-shadow: none; +} + +.narrowbutton { + min-width: 10px; +} + + +.smallbuttonbox button { + min-width: 16px; + min-height: 16px; +} + +/* Adds padding around sides of text-buttons */ +button.text-button { + padding: 0 8px; +} + +/* Adds gap between combobox contents and combobox edges */ +button.combo, .image-combo .toggle, #MyFileChooserButton { + padding-left: 4px; + padding-right: 4px; +} + +/* Progress bars */ + +progressbar.horizontal { + min-width: 100px; + margin-bottom: 2px; +} + +progressbar.vertical { + min-height: 100px; + margin: 8px 0; +} + +progressbar trough { + background-color: #383838; + border: none; +} + +progressbar progress { + border-color: #363636; + border-radius: 3px; + background-color: #215d9c; +} + +progressbar.horizontal trough, progressbar.horizontal progress { + min-height: 10px; +} + +progressbar.vertical trough, progressbar.vertical progress { + min-width: 10px; +} + +/* Add padding to grid cells */ + +.grid-spacing > * { + margin: 2px; } diff --git a/rtdata/themes/RawTherapee-GTK3-_19.css b/rtdata/themes/RawTherapee-GTK3-_19.css index 8443768c3..a796b60a1 100644 --- a/rtdata/themes/RawTherapee-GTK3-_19.css +++ b/rtdata/themes/RawTherapee-GTK3-_19.css @@ -506,3 +506,20 @@ GtkNotebook { 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 --git a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css b/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css index 888533053..d1bb4fdbc 100644 --- a/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue - Bright-GTK3-20_.css @@ -41,7 +41,7 @@ /*** Change me end *****************************************************************************/ -@define-color bg-light-grey rgb(115,115,115); +@define-color bg-light-grey rgb(119,119,119); @define-color bg-grey rgb(95,95,95); @define-color bg-dark-grey rgb(55,55,55); diff --git a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css b/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css index 23e32e1ec..581549750 100644 --- a/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue - Dark-GTK3-20_.css @@ -25,7 +25,7 @@ /*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ -@define-color accent-color rgb(33,82,145); /*** Active color for Lists, Menu, Borders ... * Default: rgb(33,82,145) ***/ +@define-color accent-color rgb(33,82,150); /*** Active color for Lists, Menu, Borders ... * Default: rgb(33,82,145) ***/ @define-color text-hl-color rgb(200,200,200); /*** Active text color * Default: rgb(200,200,200) ***/ @define-color bg-highlighted-text-color rgb(33,82,145); /*** Highlighted text color background* Default: rgb(33,82,145) ***/ @@ -33,7 +33,7 @@ @define-color bg-image rgb(58,58,58); /*** Image area & File Browser background * Default: rgb(58,58,58) ***/ -@define-color accent-color2 rgb(33,82,145); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(33,82,145) ***/ +@define-color accent-color2 rgb(33,82,150); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(33,82,145) ***/ @define-color accent-color4 rgb(98,98,98); /*** Slider knob * Default: rgb(98,98,98) ***/ @define-color accent-color3 rgb(33,82,145); /*** Selected thumbnail background color * Default: rgb(33,82,145) ***/ diff --git a/rtdata/themes/TooWaBlue-GTK3-20_.css b/rtdata/themes/TooWaBlue-GTK3-20_.css index a65fb2d3e..172684452 100644 --- a/rtdata/themes/TooWaBlue-GTK3-20_.css +++ b/rtdata/themes/TooWaBlue-GTK3-20_.css @@ -1,8 +1,8 @@ /* This file is part of RawTherapee. - Copyright (c) 2016-2017 TooWaBoo - Version 2.62 + Copyright (c) 2016-2019 TooWaBoo + Version 3.04 RawTherapee is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -71,36 +71,55 @@ text-shadow: none; outline-style: none; /* removes the ugly dashed focus line */ border-image: none; + background-image: none; + background-color: transparent; transition: none; + -gtk-icon-shadow: none; + -gtk-icon-style: symbolic; + min-width: 0; + min-height: 0; + padding: 0; + margin: 0; + border: none; + box-shadow: none; } +/*GTK+4 now supports a more versatile -gtk-icon-filter instead. Replace +-gtk-icon-effect: dim; with -gtk-icon-filter: opacity(0.5); and +-gtk-icon-effect: highlight; with -gtk-icon-filter: brightness(1.2);.*/ *:disabled { color: @fg-disabled; + -gtk-icon-effect: dim; +} +*:hover { + -gtk-icon-effect: highlight; } #ToolPanelNotebook { - min-width: 24.08334em; + min-width: 25em; } #HistoryPanel { - min-width: 18em; + min-width: 17.5em; } window.background { background-color: @bg-light-grey; } +/* Single Window */ window > box { - padding: 0.41667em; + padding: 0.416666666666666666em; } +/**/ dialog { background-color: @bg-grey; border-radius: 0; - -GtkDialog-button-spacing: 6; - -GtkDialog-content-area-spacing: 4; + -GtkDialog-button-spacing: 0; + -GtkDialog-content-area-spacing: 0; -GtkDialog-content-area-border: 0; -GtkDialog-action-area-border: 0; } dialog > box { - padding: 0.66667em; + padding: 0.666666666666666666em; } messagedialog { background-color: @bg-light-grey; @@ -108,11 +127,10 @@ messagedialog { } tooltip { background-color: @bg-tooltip; - border: 0.08334em solid @border-tooltip; - border-radius: 0.33334em; + border: 0.083333333333333333em solid @border-tooltip; + border-radius: 0.333333333333333333em; padding: 0; margin: 0; - box-shadow: none; } tooltip label { color: @text-tooltip; @@ -122,25 +140,37 @@ paned { background-color: @bg-light-grey; } +arrow { + min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; +} +/* combobox cellview to high for font size 8@96dpi*/ +cellview { + margin: -1px 0; +} + +text { + background-color: @bg-dark-grey; +} + /*?win*/ #PlacesPaned { margin: 0; } +overshoot, undershoot { background-image: none; /* removes the dashed scrollbar line */ } label { - padding: 0; - margin: 0; -} - -.drawingarea:not(.slider) { - background-color: @bg-dark-grey; + padding: 0.083333333333333333em 0; + margin: 0.19em; + min-height: 1.333333333333333333em; } /*** Frames ************************************************************************************/ +border, frame { border: none; padding: 0; @@ -149,87 +179,76 @@ frame { min-height: 0; min-width: 0; border-radius: 0; - box-shadow: none; } -#BatchQueueButtonsMainContainer frame, -#MyExpander frame, -dialog frame { - margin: 0.16667em 0.5em; -} /* affects selection list*/ -entry > window > frame, -filechooser frame { +entry > window > frame { margin: 0; } #PlacesPaned frame { - margin: -8px 0 0; + margin: -5px 0 0; } -frame > border { - padding: 0; - border-radius: 0; - border: none; - background-color: transparent; +#RightNotebook > stack > scrolledwindow frame, +#BatchQueueButtonsMainContainer frame, +#MyExpander frame, +dialog frame { margin: 0; - min-height: 0; - min-width: 0; - box-shadow: none; + padding: 0.19em 0.75em; } - +#RightNotebook > stack > scrolledwindow frame > border, #BatchQueueButtonsMainContainer > frame > border, #MyExpander frame > border, dialog frame > border { - padding: 0.5em; + padding: 0 0.333333333333333333em 0.333333333333333333em; border-radius: 0; - border: 0.08334em solid @border-color; + border: 0.083333333333333333em solid @border-color; background-color: transparent; - margin: 0 -0.5em; + margin: 0 -0.583333333333333333em; } -/* affects selection list*/ -entry > window > frame> border, -filechooser > frame > border { - padding: 0; - border: none; - background-color: transparent; - margin: 0; -} -#PrefNotebook box > frame > border { - padding-top: 0; - padding-bottom: 0.25em; -} - -#BatchQueueButtonsMainContainer frame > label, -#ToolPanelNotebook frame > label, -dialog frame > label { - margin: 0; - padding: 0.16667em 0.5em; -} -#BatchQueueButtonsMainContainer frame > border { - margin-bottom: 0.83334em; -} -#BatchQueueButtonsMainContainer frame:nth-child(3) > border { - padding-left: 0.91667em; -} - frame > label { margin: 0; - padding: 0.5em 0; + padding: 0.416666666666666666em 0; color: @headline-frame; } frame > checkbutton label{ color: @headline-frame; } +#RightNotebook > stack > scrolledwindow frame > label:not(.dummy), +#BatchQueueButtonsMainContainer frame > label:not(.dummy), +#ToolPanelNotebook frame > label:not(.dummy), +dialog frame > label:not(.dummy) { + padding: 0.25em 0.5em; +} + +#PrefNotebook box > frame > border { + padding-top: 0; + padding-bottom: 0.25em; +} +#PrefNotebook scrolledwindow scrolledwindow { + border: 0.083333333333333333em solid @bg-dark-grey; +} + +#BatchQueueButtonsMainContainer frame > border { + margin-bottom: 0.833333333333333333em; +} +#BatchQueueButtonsMainContainer frame:nth-child(3) > border { + padding-left: 0.916666666666666666em; +} + /*** end ***************************************************************************************/ /*** Lists & Views *****************************************************************************/ textview.view, treeview.view { background-color: @bg-dark-grey; border-color: @view-grid-border; - padding: 0.16667em; + padding: 0.166666666666666666em; margin: 0; } +treeview header { + background-color: @bg-dark-grey; +} textview:hover, treeview:hover { background-color: @bg-list-hover; } @@ -239,161 +258,214 @@ textview:selected, treeview:selected { border-top-color: transparent; } -#RightNotebook > stack > :nth-child(1) treeview { - border: 0.08334em solid @bg-dark-grey; - border-bottom: none; +/* Filter treeview */ +#RightNotebook > stack > :nth-child(1) checkbutton + scrolledwindow { + min-height: calc(6em + 43px); + border: 0.083333333333333333em solid @bg-dark-grey; } +#RightNotebook > stack > :nth-child(1) checkbutton + scrolledwindow treeview { + border-bottom: 0.083333333333333333em solid @bg-dark-grey; +} +/**/ -#PlacesPaned > box:nth-child(1) treeview { - padding: 0.08334em 0 0.08334em 0.5em; - -gtk-icon-style: symbolic; +#PlacesPaned > box:nth-child(3) treeview { + padding: 0.25em 0; } #HistoryPanel { - margin-top: 0.5em; + margin-top: 0.25em; +} +#RightNotebook #HistoryPanel { + margin-top: 0.333333333333333333em; } #HistoryPanel > border { margin-top: 1.75em; } #HistoryPanel > label { - margin: 0 0 -1.33334em 0; - padding: 0; + margin: 0 0 -1.5em 0; + padding: 0 0 0 0.083333333333333333em; } #Snapshots > border { - min-height: calc(6.5em + 36px); + min-height: calc(6em + 36px); } #Snapshots > label { margin-bottom: -4px; } -#Snapshots button { - margin-top: -8px; - margin-bottom: -4px; +#Snapshots scrolledwindow + box { + background-color: @bg-dark-grey; + margin: -8px 0 -4px ; + border-top: 0.083333333333333333em solid @view-grid-border; } -#Snapshots > box > :nth-child(1) { - margin-bottom: 0.41667em; +#PlacesPaned > box:nth-child(1) scrolledwindow + grid { + background-color:@bg-dark-grey; + margin: -2px 0 -2px 0; + border-top: 0.083333333333333333em solid @view-grid-border; } -#PlacesPaned > box:nth-child(3) > box:nth-child(2), -#PlacesPaned > box:nth-child(1) > :nth-child(1), -#HistoryPanel > border, -#Snapshots > box > :nth-child(1) { +fontchooser scrolledwindow, +#PlacesPaned scrolledwindow, +#HistoryPanel scrolledwindow, +#Snapshots scrolledwindow { background-color: @bg-dark-grey; - border: 0.08334em solid @bg-dark-grey; + border: 0.083333333333333333em solid @bg-dark-grey; } /*Corrects the space of the snapshot view to the paned separator*/ #Snapshots { - margin-top: -0.33334em; + margin-top: 0.166666666666666666em; } /**/ /*** end ***************************************************************************************/ /*** Navigator *********************************************************************************/ -#Navigator .drawingarea { - border-top: 0.41667em solid @bg-dark-grey; - border-bottom: 0.25em solid @bg-dark-grey; -} #Navigator { - background-color: @bg-dark-grey; + padding-top: 0.75em; padding-bottom: 0.25em; + background-color: @bg-dark-grey; } -#Navigator box label { - padding: 0.16667em 0; +#Navigator label { + padding: 0; } /*** end ***************************************************************************************/ /*** Load - Save dialog ************************************************************************/ -filechooser * { - box-shadow: none; +filechooser { +margin-bottom: 0.25em; } + +filechooser box > box box > button { +margin-top: 0.5em; +margin-right: 0; +} + +filechooser image { + opacity: 0.80; +} +filechooser *:selected image, +filechooser *:checked image, +filechooser *:active image { + opacity: 1; +} + +filechooser list { + background-color: @bg-dark-grey; +} + filechooser #pathbarbox { border: none; background-color: @bg-dark-grey; padding: 0.5em; } -filechooser box { - border-color: transparent; -} - -filechooser > box > paned > box { - border: 0.08334em solid @bg-dark-grey; +/* Right side */ +filechooser > box > paned > box:nth-child(3) { + border: 0.083333333333333333em solid @bg-dark-grey; background-color: @bg-dark-grey; -} -filechooser placessidebar { - padding: 0 0.08334em; - background-color: @bg-dark-grey; -} - -filechooser list { - background-color: @bg-dark-grey; - border: none; - box-shadow: none; padding: 0; - margin: -3px 0 0; -} -filechooser list row { margin: 0; - padding: 0; - min-height: calc(1.41667em + 8px); } -filechooser list row label{ - margin: 0; +filechooser > box > paned > box:nth-child(3) > box > * > * > * > frame { padding: 0; + margin: -8px -1px; + background-color: @bg-dark-grey; +} +/**/ +filechooser placessidebar viewport.frame { + background-color: @bg-dark-grey; + padding: 0; + margin: -4px 0 -1px; + border: 0.083333333333333333em solid @bg-dark-grey; +} +filechooser placessidebar list row image { + min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; +} +filechooser placessidebar list row { + margin: 0; + padding: 0 0.5em 0 0.83333333333333333em; + min-height: calc(1.416666666666666666em + 8px); +} +filechooser placessidebar list row label{ + margin: 0 0 0 0.583333333333333333em; } filechooser list row:hover { background-color: @bg-list-hover; } -filechooser list row:selected label, -filechooser list row:selected { +filechooser placessidebar list row:selected label, +filechooser placessidebar list row:selected { background-color: @accent-color; color: @text-hl-color; } + /*** end ***************************************************************************************/ /*** Histogram *********************************************************************************/ #HistogramPanel { - margin: -2px 0; + min-height: 0; + margin: 0; + padding: 0; border: none; + background-color: transparent; } -#HistogramArea, -#HistogramRGBArea { - border: 0.08334em solid @bg-dark-grey; + +#HistogramPanel > :nth-child(2) { + border: none; + border-left: 0.083333333333333333em solid @bg-light-grey; background-color: @bg-dark-grey; } -#fullButton, -#histButton { - padding: 0.47em 0.41667em; - margin: 0; - border-color: @bg-light-grey; - border-style: solid; - border-width: 0 0 0 0.08334em; +#HistogramPanel > :nth-child(1) { + border: none; + background-color: transparent; +} + +#EditorLeftPaned #HistogramPanel > :nth-child(1) { + border: none; + border-right: 0.083333333333333333em solid @bg-light-grey; background-color: @bg-dark-grey; +} + +#EditorLeftPaned #HistogramPanel > :nth-child(2) { + border: none; + background-color: transparent; +} + +#HistogramArea, +#HistogramRGBArea { + border: 0.083333333333333333em solid @bg-dark-grey; + background-color: @bg-dark-grey; +} + +#histButton { + padding: 0.25em 0.25em 0; + margin: 0 0 -1px 0; + border: none; + background-color: transparent; background-image: none; - box-shadow: none; - min-height: 0; - min-width: 0; + min-height: 1.333333333333333333em; + min-width: 1.333333333333333333em; border-radius: 0; + box-shadow: none; } -#fullButton { - padding: 0.47em 0.41667em 0.58334em; -} -#EditorLeftPaned #fullButton, -#EditorLeftPaned #histButton { - border-width: 0 0.08334em 0 0; +#histButton:last-child { + padding-bottom: 0.25em; + margin: 0; } + /*** end ***************************************************************************************/ /*** Separator *********************************************************************************/ -separator { +separator, +.separator { + min-width: 0.083333333333333333em; + min-height: 0.083333333333333333em; background-color: transparent; } grid separator.horizontal, box separator.horizontal { - margin: 0.16667em 0; + margin: 0.25em 0.19em; padding: 0; } grid separator.vertical, box separator.vertical { @@ -401,8 +473,15 @@ grid separator.vertical, box separator.vertical { padding: 0; } -#PlacesPaned .view.separator, -filechooser separator, +#PlacesPaned .view.separator { + min-height: 0.5em; +} + +filechooser separator { + background-color: @view-grid-border; +} + +.view.separator, dialog separator { background-color: @border-color; } @@ -413,27 +492,38 @@ popover separator:not(:only-child) { paned.horizontal > separator { background-color: transparent; - min-width: 0.41667em; - border-left: 0.25em solid @bg-light-grey; - border-right: 0.25em solid @bg-light-grey; - margin: 0 -0.25em; - padding: 0; + background-image: none; + min-width: 0; + border: none; + margin: 0 -0.25em 0 -3px; + padding: 0 0.25em; } - +/* Double line separator */ paned.vertical > separator { - background-image: image(@bg-dark-grey); + background-image: none; background-color: @bg-light-grey; - min-height: 0.5em; - border-top: 1px solid @bg-light-grey; - border-bottom: 1px solid @bg-light-grey; - margin: 0.25em 0 0; + min-height: 0.416666666666666666em; + border-top: 0.083333333333333333em solid @bg-dark-grey; + border-bottom: none; + margin: 0.416666666666666666em 0 -0.5em; padding: 0.2em 0 0; } +#EditorLeftPaned > paned.vertical:last-child > separator { + margin-bottom: 1px; +} +/**/ +/* Remove hard coded pixel from tool button */ +#EditorLeftPaned > paned.vertical:last-child > box { + margin-top: -2px; + padding: 0; +} +/**/ + dialog paned.horizontal > separator { background-color: @bg-grey; - border-color: @bg-grey; - min-width: 0.33334em; + border-color: @bg-grey; + min-width: 0.333333333333333333em; } menu separator { @@ -447,57 +537,56 @@ menu separator { padding: 0; } -#EditorTopPanel separator, -#IopsPanel separator, -#FileBrowser separator { - background-color: shade(@bg-light-grey,.75); - margin-top: 0.33334em; - margin-bottom: 0.33334em; +.scrollableToolbar separator.vertical { + background-color: shade(@bg-light-grey, .72); + margin: 0.19em; } -#MyExpander separator { +#MyExpander separator.horizontal { background-color: @view-grid-border; - margin: 0.33334em 0; + margin: 0.25em 0.19em; } #MyFileChooserButton separator { background-color: transparent; } #PlacesPaned .view.separator { - color: @border-color; + color: @view-grid-border; +} + +#MetaPanelNotebook separator { + background-color: @border-color; + margin: 0.19em 0; } /*** end****************************************************************************************/ /*** PartialPaste ******************************************************************************/ #PartialPaste { - border-bottom: 0.08334em solid @border-color; - border-top: 0.08334em solid @border-color; + border-bottom: 0.083333333333333333em solid @border-color; + border-top: 0.083333333333333333em solid @border-color; padding-top: 0.5em; padding-bottom: 0.5em; } #PartialPaste separator.vertical { - margin: 0 0.33334em; + margin: 0 0.333333333333333333em; padding: 0; } #PartialPaste separator { /* Struggles with #PartialPasteHeaderSep */ background-color: @border-color; - margin: 0.16667em 0.5em 0.16667em 1.16667em; + margin: 0.166666666666666666em 0.5em 0.166666666666666666em 1.166666666666666666em; } #PartialPasteHeaderSep.horizontal { background-color: rgb(192,192,192); - margin: 0.16667em 0.5em; + margin: 0.166666666666666666em 0.5em; } #PartialPasteHeader label { color: @headline-big; font-weight: bold; } -#PartialPasteHeader { - margin: 0.5em 0 0 0; - padding: 0; -} + /*** end ***************************************************************************************/ /*** Scrollbar *********************************************************************************/ @@ -506,6 +595,7 @@ scrollbar { border: none; margin: 0; padding: 0; + border-radius: 0; } scrollbar slider { background-color: @text-color; @@ -513,7 +603,13 @@ scrollbar slider { margin: 0; border-color: transparent; border-style: solid; - border-radius: 1em; + border-radius: 0.5em; +} +scrollbar.overlay-indicator { + opacity: 0.8; +} +scrollbar.overlay-indicator:not(.hovering) { + opacity: 0.5; } scrollbar:not(.overlay-indicator) { @@ -522,10 +618,10 @@ scrollbar:not(.overlay-indicator) { background-color: rgba(0,0,0,.30); } scrollbar:not(.overlay-indicator).horizontal { - border-width: 0 0.08334em 0.08334em 0.08334em; + border-width: 0 0.083333333333333333em 0.083333333333333333em 0.083333333333333333em; } scrollbar:not(.overlay-indicator).vertical { - border-width: 0.08334em 0.08334em 0.08334em 0; + border-width: 0.083333333333333333em 0.083333333333333333em 0.083333333333333333em 0; } scrollbar:not(.overlay-indicator) slider { background-color: shade(@text-color, .9); @@ -546,9 +642,9 @@ scrollbar.horizontal.hovering.fine-tune slider { scrollbar.horizontal.overlay-indicator:not(.hovering) slider { min-width: 2em; min-height: 0.25em; - border-width: 0.08334em; + border-width: 0; border-radius: 0.25em; - margin: 0 0.16667em; + margin: 0.166666666666666666em 0.25em; } scrollbar:not(.overlay-indicator).vertical slider, @@ -566,13 +662,13 @@ scrollbar.vertical.hovering.fine-tune slider { scrollbar.vertical.overlay-indicator:not(.hovering) slider { min-width: 0.25em; min-height: 2em; - border-width: 0.08334em; - border-radius: 0.5em; - margin: 0.16667em 0; + border-width: 0; + border-radius: 0.25em; + margin: 0.25em 0.166666666666666666em; } scrollbar:not(.overlay-indicator) slider:hover, -scrollbar slider:hover { +scrollbar.hovering slider:hover { background-color: shade(@accent-color2,1.12); } @@ -581,61 +677,84 @@ scrollbar:not(.overlay-indicator):hover { min-width: 1px; } +/* Toolbar stuck workaround */ +.scrollableToolbar > scrollbar:not(.dummy), +.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy), +.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy), +.scrollableToolbar > scrollbar:not(.dummy) > contents:not(.dummy) > trough:not(.dummy) > slider:not(.dummy) { + padding: 0; + margin: 0; + min-height: 0; + min-width: 0; + border: none; +} + /*** end ***************************************************************************************/ /*** Scale**************************************************************************************/ scale { padding: 0; - min-height: 1.83334em; - margin: 0 0.25em; + min-height: 1.833333333333333333em; + margin: 0 -0.333333333333333333em; } scale slider { - /* Slider size is min-width x min-height; margin have to be half of those values, but negative */ - min-width: 1em; - min-height: 1em; - margin: calc(-0.33334em - 1px); - border-radius: 0.83334em; + min-width: 0; + min-height: 0; + margin: -0.583333333333333333em; + padding: 0.583333333333333333em; + border-radius: 1.166666666666666666em; background-image: linear-gradient(to bottom, shade (@accent-color4,1.15), shade (@accent-color4,.85)); - border: 0.08334em solid @bg-button-border; - box-shadow: none; + border: 0.083333333333333333em solid shade(@bg-dark-grey,0.9); } scale slider:hover { background-image: linear-gradient(to bottom, shade (@accent-color4,1.25), shade (@accent-color4,.95)); } scale trough { - margin: 0.5em; /* has to be half of "scale slider / min-width min-height*/ - background-color: @bg-scale-entry; - border: 0.08334em solid @bg-button-border; - box-shadow: inset 0 0.08334em rgba(255, 255, 255, 0.11), 0 0.08334em rgba(242, 242, 242, 0.11); - border-radius: 0.5em; + margin: 0.583333333333333333em; + background-color: shade(@bg-grey,.83); + border-radius: 0.333333333333333333em; + min-height: 0; + min-width: 0; + padding: 0 0.583333333333333333em; + border: none; } -scale:not(:disabled) trough highlight { - background-color: @accent-color2; - border: 0.08334em solid @bg-button-border; - box-shadow: inset 0 0.08334em shade(@accent-color2, 1.3); - border-radius: 0.5em; +scale.color trough { + border: 0.083333333333333333em solid shade(@bg-dark-grey,0.9); + min-height: 0.333333333333333333em; + min-width: 0.333333333333333333em; + border-radius: 0; + padding: 0; } -scale.fine-tune trough { - margin: calc(0.5em - 1px); - padding: 1px; +scale trough highlight { + background-color: transparent; + background-image: linear-gradient(to bottom, shade (@accent-color2,1.22), shade(@accent-color2,.88)); + border: 0.083333333333333333em solid shade(@bg-dark-grey,0.9); + margin: 0 -0.583333333333333333em; + border-radius: 0.333333333333333333em; + min-height: 0; + min-width: 0; + padding: 0.333333333333333333em 0.333333333333333333em 0 0; /*height of trough */ } + scale.fine-tune trough highlight { - margin: -2px; + padding: 0.5em 0.5em 0 0; + border-radius: 0.5em; } scale:disabled slider, -scale:disabled trough { - background-color: shade(@bg-grey,.9); - box-shadow: none; +scale:disabled trough highlight { + background-color: shade(@bg-grey,.83); background-image: none; + border-color: transparent; } +#BatchQueueButtonsMainContainer scale trough, #BatchQueueButtonsMainContainer scale:disabled slider, -#BatchQueueButtonsMainContainer scale:disabled trough { - background-color: shade(@bg-light-grey,.85); +#BatchQueueButtonsMainContainer scale:disabled trough highlight { + background-color: @bg-grey; } /*** end ***************************************************************************************/ @@ -645,50 +764,61 @@ progressbar.vertical { min-width: 0; min-height: 9em; } +progressbar text { + background-color: transparent; +} progressbar.vertical text { color: transparent; } -progressbar.vertical trough { - min-width: 0.5em; +progressbar trough { + background-color: alpha(@bg-grey, .45); + border: 0.083333333333333333em solid transparent; + border-radius: 0.416666666666666666em; +} +#IopsPanel progressbar trough { + background-color: @bg-grey; +} + +progressbar trough progress { background-color: transparent; - border-width: 0; + border-radius: 0.416666666666666666em; + border: 0.083333333333333333em solid @bg-button-border; +} + +progressbar.vertical trough { + min-width: 0.416666666666666666em; } progressbar.vertical trough progress { - min-width: 0.5em; - margin: 0 -1px; - background-color: @accent-color2; - border-width: 0; - border-radius: 0.5em; + min-width: 0.416666666666666666em; + margin: -1px 0; + background-image: linear-gradient(to right, shade (@accent-color2,1.2), shade(@accent-color2,.85)); } + progressbar.horizontal trough { - min-height: 0.41667em; - background-color: transparent; - border: none; - border-radius: 0.5em; - margin-top: 0.58334em; + min-height: 0.416666666666666666em; + margin-top: 0.416666666666666666em; } -progressbar.horizontal trough progress { - min-height: 0.41667em; - margin: -1px 0; - background-color: @accent-color2; - border: none; - border-radius: 0.5em; +#IopsPanel progressbar.horizontal trough { + margin-top: 0; } -#IopsPanel progressbar.horizontal trough { - min-height: 0.5em; - background-color: @bg-scale-entry; - border: 0.08334em solid @bg-button-border; - margin-top: 0.25em; +progressbar.horizontal trough progress { + min-height: 0.416666666666666666em; + margin: 0 -1px; + background-image: linear-gradient(to bottom, shade (@accent-color2,1.2), shade(@accent-color2,.85)); } -#IopsPanel progressbar.horizontal trough progress { - min-height: 0.5em; - margin: -1px 0; - background-color: @accent-color2; - border: none; - border-radius: 0.5em; + +/* #IopsPanel progressbar trough.empty, */ +progressbar.horizontal trough.empty, +progressbar.vertical trough.empty { + background-color: transparent; +} +progressbar trough.empty progress { + border-color: transparent; + background-image: none; + box-shadow: none; } /*** end ***************************************************************************************/ @@ -701,64 +831,54 @@ notebook tab, notebook stack { border-radius: 0; border: none; - box-shadow: none; padding: 0; margin: 0; min-width: 0; min-height: 0; } -notebook header { +notebook > header { background-color: @bg-dark-grey; - padding: 0 0.41667em; + padding: 0 0.416666666666666666em; } -notebook header.left { - padding: 0.41667em 0; +notebook > header.left { + padding: 0.416666666666666666em 0; } notebook tabs { background-color: transparent; } -notebook header tab { +notebook > header tab { background-color: transparent; - margin: 0.41667em 0.25em; - padding: 0 0.33334em; + margin: 0.416666666666666666em 0.25em; + padding: 0 0.333333333333333333em; } -notebook header.left tab { - margin: 0.25em 0.41667em; - padding: 0.33334em 0; +notebook > header.left tab { + margin: 0.25em 0.416666666666666666em; + padding: 0.333333333333333333em 0; } -notebook header tab > grid > image { - min-height: 2.33334em; - min-width: 0; - padding: 0 0.16667em 0 0; +notebook > header tab > grid > image { + min-height: 2em; + min-width: 2em; + padding: 0.25em; margin: 0; } -notebook header.left tab > grid > image { - min-height: 0; - min-width: 2.33334em; - padding: 0.16667em 0 0; -} -notebook header tab label { - margin: 0.33334em; -} -notebook header tab:hover label { + +notebook > header tab:hover label { color: @headline-hl; } -notebook header tab:checked { +notebook > header tab:checked { box-shadow: 0 0.25em @accent-color2; } -notebook header.left tab:checked { +notebook > header.left tab:checked { box-shadow: 0.25em 0 @accent-color2; } notebook > header > tabs > arrow { background-color: transparent; border-radius: 0.2em; - min-width: 0; - min-height: 0; - padding: 0 0.16667em; + padding: 0 0.166666666666666666em; margin: 0.5em 0; } notebook > header.left > tabs > arrow { - padding: 0.16667em 0; + padding: 0.166666666666666666em 0; margin: 0 0.5em; } notebook > header > tabs > arrow:hover { @@ -777,11 +897,11 @@ dialog notebook stack { /*?win*/ #MainNotebook > stack { - padding: 0.41667em; + padding: 0.416666666666666666em; } #MainNotebook > stack > :nth-child(2) > box:nth-child(3) { - margin-top: 0.41667em; + margin-top: 0.416666666666666666em; } @@ -789,69 +909,91 @@ dialog notebook stack { dialog.csd #PrefNotebook > header, dialog.csd #AboutNotebook > header, window.csd:not(.fullscreen) #MainNotebook > header.top { - border-top: 0.083334em solid rgba(200,200,200,.18); + border-top: 0.083333333333333333em solid rgba(200,200,200,.18); } /**/ + +#RightNotebook > stack > scrolledwindow > viewport > box > box:last-child > image, +#ToolPanelNotebook > stack > scrolledwindow > viewport > box > box:last-child > image { + min-height: 5em; +} + +#ToolPanelNotebook { + background-color: @bg-dark-grey; +} +#ToolPanelNotebook > header { + border-bottom: 0.083333333333333333em solid @view-grid-border; + margin-left: 0.083333333333333333em; + margin-right: 0.083333333333333333em; + padding: 0 0.19em; +} #ToolPanelNotebook > header tabs { - margin-bottom: 0.33334em; + margin: 0 0 0.25em; } - #ToolPanelNotebook > header tab { - margin-left: 0; - margin-right: 0; - padding: 0 0.33334em; -} -#ToolPanelNotebook > header tab + tab { - margin-left: 0.33333em; -} - -#ToolPanelNotebook > header tab image{ - min-height: 2.5em; - min-width: 2em; padding: 0; - margin: 0; +} +#ToolPanelNotebook > header tab image{ + min-height: 2em; + min-width: 2em; + margin: 0.19em 0.25em 0.333333333333333333em; + padding: 0; +} +#ToolPanelNotebook > stack { + background-color: @bg-dark-grey; + padding: 0.5em 0; } #RightNotebook > header { - margin: 0 0.41667em 0 0; + margin: 0 0.416666666666666666em 0 0; } #RightNotebook > stack { background-color: @bg-grey; padding: 0; } - -#RightNotebook > stack > :nth-child(1) > * > box, -#RightNotebook > stack > :nth-child(4) > * > box { - padding: 0.5em; - border: 0.08334em solid @bg-entry-border; +#RightNotebook > header tab label { + padding-left: 0.25em; + padding-right: 0.25em; } -#PrefNotebook header { - margin: -0.66667em -0.66667em 0.33334em; -} -#AboutNotebook header { - margin: -0.66667em -0.66667em 0.66667em; +#RightNotebook > stack > scrolledwindow > viewport { + padding: 0 0.5em; + border: 0.083333333333333333em solid @bg-dark-grey; } -#AboutNotebook stack text { +#PrefNotebook > header { + margin: -0.666666666666666666em -0.666666666666666666em 0.333333333333333333em; +} +#PrefNotebook > stack { + margin: 0 -0.666666666666666666em; +} +#PrefNotebook > stack > scrolledwindow > viewport { + padding: 0 0.666666666666666666em; +} + +#AboutNotebook > header { + margin: -0.666666666666666666em -0.666666666666666666em 0.666666666666666666em; +} + +#AboutNotebook > stack text, +#AboutNotebook > stack textview { background-color: @bg-dark-grey; + padding: 0.75em 0; } - -/* All tool panels have a frame except for Meta which unlike the rest is a notebook itself. - * So we use CSS to make it look like a frame. */ - -#MetaPanelNotebook header { +/* Meta panel notebook */ +#MetaPanelNotebook > header { background-color: @bg-grey; - padding: 0.33334em; + padding: 0.333333333333333333em; margin: 0 0.5em 0; } #MetaPanelNotebook > header > tabs { background-color: @bg-dark-grey; - padding-left: 0.33334em; + padding-left: 0.333333333333333333em; } -#MetaPanelNotebook > header tab label{ - margin: 0.08334em; +#MetaPanelNotebook > stack { + background-color: @bg-dark-grey; + padding: 0 0 0.5em 0; } #MetaPanelNotebook > stack > box { @@ -859,77 +1001,39 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { background-color: @bg-grey; border-radius: 0; border-top-style: none; - padding: 0 0.33334em 0.25em; - margin: 0 0.5em -0.5em; + padding: 0 0.333333333333333333em 0.25em; + margin:0 0.5em -0.5em; } #MetaPanelNotebook > stack > box:nth-child(1) > scrolledwindow { - margin: 0 0 0.33334em; + margin: 0 0 0.333333333333333333em; padding: 0; } #MetaPanelNotebook > stack > box:nth-child(2) > scrolledwindow > viewport.frame { - padding: 0 0 0 1em; + padding: 0 0 0 1.083333333333333333em; } -#MetaPanelNotebook separator { - background-color: @border-color; - margin: 0.16667em 0; -} -#MetaPanelNotebook entry, #MetaPanelNotebook button, #MetaPanelNotebook combobox button { - margin-top: 0; - margin-bottom: 0; - min-height: 1.66667em; - min-width: 0.83334em; -} #MetaPanelNotebook entry { - padding: 0 0.33334em; + padding: 0 0.333333333333333333em; background-color: @bg-dark-grey; - margin: 0; border-radius: 0; + margin-left: 0; + margin-right: 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 > stack > box:nth-child(2) .view { - border: 0.08334em solid @bg-dark-grey; - padding: 0.16667em; - margin: 0; -} -#MetaPanelNotebook textview.view { - background-color: @bg-dark-grey; - padding: 0.08334em 0.33334em; - margin: 0; +#MetaPanelNotebook .view { + border: 0.083333333333333333em solid @bg-dark-grey; + padding: 0.083333333333333333em 0.25em; } + #MetaPanelNotebook text { background-color: transparent; +} + +#MetaPanelNotebook stack label { + margin-top: 0; + margin-bottom: 0; padding: 0; - margin: 0; -} - -#MetaPanelNotebook combobox button { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-left: none; -} -#MetaPanelNotebook combobox + button, -#MetaPanelNotebook combobox + button + button { - margin-left: 0.16667em; - min-width: 1.66667em; -} -#MetaPanelNotebook > stack > box > grid > button { - margin-top: 0.08334em; - margin-bottom: 0.08334em; - min-height: 2.16667em; -} - -#MetaPanelNotebook label { - padding: 0.08334em 0; } /*** end ***************************************************************************************/ @@ -937,7 +1041,7 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { /*** File Browser ******************************************************************************/ #FileCatalog { background-color: @bg-image; - border: 0.08334em solid @bg-dark-grey; + border: 0.083333333333333333em solid @bg-dark-grey; } #FileCatalog:selected { background-color: @accent-color3; @@ -951,47 +1055,18 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { } #ToolBarPanelFileBrowser { - margin: -2px -1px; + margin: 0 0 0.416666666666666666em 0; min-height: 0; min-width: 0; - padding: 0.41667em 0; -} - -#ToolBarPanelFileBrowser > box > button, -#ToolBarPanelFileBrowser > button { - margin: 0 0.08334em; -} -#ToolBarPanelFileBrowser > box > box > button { - min-height: 0.91667em; - min-width: 1.33333em; - padding: 0; - margin: 0.16667em 0 0 0; - border: none; - background-color: transparent; - background-image: none; - box-shadow: none; -} - -#ToolBarPanelFileBrowser entry + button.flat, -#FileBrowser entry + button.flat { - min-height: 1.66667em; - min-width: 1.66667em; - margin: 0 0 0 -1.66667em; - border-radius: 0 0.2em 0.2em 0; - border: 0.08334em solid transparent; padding: 0; } -#ToolBarPanelFileBrowser entry, -#FileBrowser entry { - min-height: 1.66667em; - min-width: 12em; - margin: 0 -2px 0 0; - padding: 0 2em 0 0.33334em; -} -#ToolBarPanelFileBrowser label, -#FileBrowser label { - margin: 0 0.33334em 0 0.5em; +#FileBrowserQueryToolbar > viewport > box { + margin: 0 0 0.416666666666666666em 0; + min-height: 0; + min-width: 0; + padding: 0; } + /*** end ***************************************************************************************/ /*** Image Editor ******************************************************************************/ @@ -1001,84 +1076,67 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { #BeforeAfterContainer { background-color: @bg-grey; - border: 0.08334em solid @bg-dark-grey; + border: 0.083333333333333333em solid @bg-dark-grey; border-radius: 0; padding: 0; - margin: 0.41667em 0; + margin: calc(0.416666666666666666em - 2px) 0 0.416666666666666666em; } #BeforeAfterContainer > box:nth-child(2) > box:nth-child(2), #BeforeAfterContainer > box:nth-child(1) > box:nth-child(2){ - border-top: 0.08334em solid @bg-dark-grey; + border-top: 0.083333333333333333em solid @bg-dark-grey; } #BeforeAfterContainer > box:nth-child(2){ - border-left: 0.08334em solid @bg-dark-grey; + border-left: 0.083333333333333333em solid @bg-dark-grey; } +/* !!! Must be same height as "Small Lock Button" */ #BeforeAfterContainer label { - min-height: 2.41667em; padding: 0 0.5em; + min-height: 2em; + min-width: 2em; + margin: 0.25em 0; + border: 0.083333333333333333em solid transparent; } -/* Small Lock Button */ -#BeforeAfterContainer button { - min-height: 1.66667em; - min-width: 1.75em; - margin: 0.25em; - padding: 0 0 0 0.08334em; -} -/**/ -#EditorTopPanel { - margin: -2px -2px; +#EditorToolbarTop { + margin: 0 -1px 0 -1px; padding: 0; min-height: 0; } -#EditorTopPanel button { - margin: 0 0.08334em; - min-height: 2.16667em; - min-width: 2.16667em; -} -/* Removes margin from the last button. Otherwise the filmstrip will cut of the right border. */ -#EditorTopPanel :last-child > button:last-child { - margin-right: 0; -} -#EditorTopPanel > box:nth-child(9) > button.image-button { - min-width: 1.05em; +#IopsPanel { + margin: 0; padding: 0; + min-height: 0; } -/*Button editor bottom*/ #EditorZoomPanel label { min-width: 4em; margin: 0; } -#IopsPanel button.Left image { - padding: 0 2px 0 3px; -} -#EditorZoomPanel button { - margin-left: 0.08334em; - margin-right: 0.08334em; -} /*** end ***************************************************************************************/ /*** Toolbox ***********************************************************************************/ -#ToolPanelNotebook stack { - background-color: @bg-dark-grey; - padding: 0 0 0.5em 0; +#MyExpander image { + min-width: 1.333333333333333333em; + min-height: 0; + margin: -1px 0.19em; } + /*Curve spinbutton background */ #MyExpander flowbox > flowboxchild { background-color: transparent; } /**/ #MyExpander .drawingarea:not(.slider) { - border: 0.08334em solid @bg-light-grey; + border: 0.083333333333333333em solid @bg-light-grey; + background-color: @bg-dark-grey; } #MyExpander .slider, -#MyExpander .drawingarea:nth-child(2) { +#MyExpander #CurveSHCSelector { background-image: linear-gradient(to bottom, shade (@accent-color4,1.15), shade (@accent-color4,.85)); background-color: @accent-color4; - border: 0.08334em solid rgb(15,15,15); + border: 0.083333333333333333em solid rgb(15,15,15); } #MyExpander .drawingarea:disabled { background-color: shade(@bg-grey,.85); @@ -1086,16 +1144,13 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { background-image: none; } #ThresholdAdjuster { - margin: 0.08334em 0 0.16667em 0; + margin: 0.083333333333333333em 0 0.166666666666666666em 0; } -#ToolPanelNotebook scrolledwindow viewport.frame { - padding: 0 0.56em; +#ToolPanelNotebook > stack > scrolledwindow > viewport.frame { + padding: 0 0.5em; + margin-top: -0.5em; } -/* #MyExpander.withScrollbar { - padding: 0 6px; -} - */ #MyExpander { margin: 0; @@ -1106,27 +1161,27 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { border: none; border-radius: 0; margin: 0; - padding: 0.5em; + padding: 0.5em 0.333333333333333333em; } /* Sub-tool (MyExpander) */ #ExpanderBox2 > box, #ExpanderBox2 > grid { background-color: transparent; - border: 0.08334em solid @border-color; + border: 0.083333333333333333em solid @border-color; border-radius: 0; - margin: 0; - padding: 0.5em; + margin: 0 0.19em; + padding: 0.333333333333333333em; } #MyExpanderTitle > box { margin: 0; - padding: 0.33334em 0; + padding: 0.25em 0; } #MyExpanderTitle label { color: @headline-big; padding: 0; - margin: 0 0.25em 0 0.5em; + margin: 0.083333333333333333em 0.25em 0 0.166666666666666666em; } #MyExpanderTitle:hover label { @@ -1135,25 +1190,26 @@ window.csd:not(.fullscreen) #MainNotebook > header.top { /*** end ***************************************************************************************/ /*** Context & popups menus *****************************************************************************/ -.popup > decoration { +.csd.popup > decoration { background-image: none; border-radius: 0; border: none; padding: 0; margin: 0; - box-shadow: 0 0.25em 0.75em 0.08334em rgba(0, 0, 0, 0.50), 0 0 0 0.08334em @bg-dark-grey; + box-shadow: 0 0.25em 0.75em 0.083333333333333333em rgba(0, 0, 0, 0.50), 0 0 0 0.083333333333333333em @bg-dark-grey; } menu { background-color: @bg-dark-grey; - border: 0.08334em solid @accent-color; - padding: 0.08334em; + border: 0.083333333333333333em solid @accent-color; + padding: 0.083333333333333333em; margin: 0; + border-radius: 0; } -menu > .top, -menu > .top:hover, -menu > .bottom, -menu > .bottom:hover { +menu > arrow.top, +menu > arrow.top:hover, +menu > arrow.bottom, +menu > arrow.bottom:hover { background-color: transparent; border: none; padding: 0.5em; @@ -1161,10 +1217,17 @@ menu > .bottom:hover { } menuitem { - padding: 0 0.33334em; - margin: 0.08334em; + padding: 0 0.333333333333333333em; + margin: 0.083333333333333333em; min-height: 2em; } + +menu arrow { + min-width: 1.333333333333333333em; + margin: 0 -0.19em; + padding: 0; + margin: 0 -0.25em 0 0; +} menuitem:hover { background-color: @accent-color; } @@ -1173,54 +1236,56 @@ menuitem:hover > * { color: @text-hl-color; } -menu image { +menu image:not(.dummy), +#MyExpander menu image:not(.dummy) { min-height: 2em; + min-width: 1.5em; padding: 0; - margin: 0 0.33334em 0 0; + margin: 0 0 0 -1.333333333333333333em; } /*** Selection popup list (used in filechooser) ***/ -entry > window > frame { +entry > window > frame:not(.dummy) { background-color: @bg-dark-grey; + padding: 0; } -entry > window > frame > border { +entry > window > frame > border:not(.dummy) { background-color: @bg-dark-grey; - padding: 0.08334em; - border: 0.08334em solid @accent-color; -} -entry > window > frame > border { - margin: 0.08334em; + padding: 0.083333333333333333em; + margin: 0.083333333333333333em; + border: 0.083333333333333333em solid @accent-color; } /* end */ /*** end ***************************************************************************************/ /*** Popover *** Context menu filechooser ******************************************************/ - -popover.background { +popover { + box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.5), 0 0 0 1px @bg-dark-grey; +} +popover { background-color: @bg-dark-grey; - border: 0.08334em solid @accent-color; + border: 0.083333333333333333em 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 { +popover > box { padding: 0; margin: -9px; } -popover.background modelbutton { +popover modelbutton { min-height: 2em; - padding: 0 0.41667em; + padding: 0 0.416666666666666666em; margin: 0; border-radius: 0; } -popover.background label { +popover label { margin-right: 0.5em; } -popover.background modelbutton:hover label, -popover.background modelbutton:hover { +popover modelbutton:hover label, +popover modelbutton:hover { background-color: @accent-color; color: @text-hl-color; } @@ -1228,25 +1293,27 @@ popover.background modelbutton:hover { /*** Switch ***********************************************************************************/ switch { - min-height: 2.16667em; + min-height: 2.333333333333333333em; min-width: 11em; - margin: 0; + margin: 0 0.19em; 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; + border: 0.083333333333333333em 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: 0.083333333333333333em solid @bg-entry-border; + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); border-radius: 0.2em 0 0 0.2em; + + /* Needed to cover the total switch */ + margin: -0.083333333333333333em; + padding: 0.083333333333333333em; } switch:checked slider{ border-radius: 0 0.2em 0.2em 0; @@ -1272,228 +1339,185 @@ switch:disabled:not(:checked) { /** end ****************************************************************************************/ /*** Buttons ***********************************************************************************/ -button { - min-height: 2.16667em; - min-width: 2.16667em; - margin: 0; - padding: 0; /* x */ +button, +#BeforeAfterContainer button { + min-height: 1.666666666666666666em; + min-width: 1.666666666666666666em;/*x*/ + margin: 0.19em; border-radius: 0.2em; - border: 0.08334em solid @bg-button-border; + border: 0.083333333333333333em solid @bg-button-border; background-color: transparent; - box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.1); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); } button.flat { - padding: 0;/* x */ -} -button.text-button label { - 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; + border: 0.083333333333333333em solid transparent; box-shadow: none; background-image: none; background-color: transparent; } -/* Resetbutton Queue & Save as*/ -dialog scale + button.flat, -scale + button.flat { - min-height: 1.33334em; - min-width: 1.25em; - margin: 0.25em 0 0.16667em 0.16667em; - padding: 0 0 0 0.08334em; - -gtk-icon-shadow: none; -} -/* Resetbutton */ -#MyExpander button.flat { - min-height: 1.33334em; - min-width: 1.25em; - margin: 0.08334em 0 0.08334em 0.16667em; - padding: 0 0 0 0.08334em; - -gtk-icon-shadow: none; -} - -#MyExpander scale + button.flat { - margin: 0 0 0 0.16667em; -} -#MyExpander image + button.flat { - margin: 0 0 0 0.41667em; -} -#MyExpander spinbutton + button.flat { - margin: 0 0 0 0.16667em; - padding-top: 0.08334em; -} -/**/ - -/* Buttons Curve drawingarea*/ -#MyExpander button.flat + button.flat, -#MyExpander button.flat:first-child { - min-height: 2.16667em; - min-width: 2.16667em; - margin: 0.08334em; - padding: 0; -} -/**/ - -#ToolBarPanelFileBrowser entry + button:hover, -#FileBrowser entry + button:hover, button.flat:hover, -button:hover { +button:hover, +#BeforeAfterContainer button:hover, +#FileBrowserQueryToolbar entry + button.flat:hover, +#FileBrowserIconToolbar entry + button.flat:hover { border-color: @bg-button-border; - box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.1); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); background-color: @bg-button-hover; } +.curve-mainbox .curve-buttonbox button.flat:hover, +#ToolPanelNotebook > stack > box > box button:hover, +#MainNotebook > header tab #CloseButton:hover, +#MainNotebook > header > grid > button:hover { + background-color: alpha(@bg-grey, 0.6); + border-color: shade(@bg-dark-grey, 0.6); + box-shadow: inset 0 0.1em rgba(242, 242, 242, 0.12); +} -#ToolBarPanelFileBrowser entry + button:active, -#FileBrowser entry + button:active, button.flat:active, button.flat:checked, button:active, -button:checked { +button:checked, +#BeforeAfterContainer button:checked, +#FileBrowserQueryToolbar entry + button.flat:active, +#FileBrowserIconToolbar entry + button.flat:active { border-color: @bg-button-border; - box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.08); + box-shadow: inset 0 0.1em rgba(242, 242, 242, 0.08); background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); background-color: @bg-button-active; } - -/* Add space between connected buttons */ -button.Right, -button.MiddleH { - margin-left: 0.16667em; - border: 0.08334em solid @bg-button-border; -} -/**/ - -/* Applies special styles in main notebook */ -#ProfilePanel { - margin-bottom: -2px; - padding-bottom: 0.41667em; -} -#ProfilePanel combobox { - margin-left: 0.16667em; -} -#PlacesPaned button.Left, -#PlacesPaned button.Right { - margin-top: 3px; -} -#PlacesPaned combobox { - margin-bottom: -3px; -} -/**/ - -/* Button base format for Toolbox and dialogs */ -#ToolPanelNotebook > stack > box > box > combobox .combo, -dialog button, -#MyExpander button, -#BatchQueueButtonsMainContainer button { - min-height: 1.66667em; - min-width: 0; - 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.26667em; -} -/**/ - -/* Add/remove space between buttons and labels in toolbox*/ -#MyExpander combobox:not(:first-child):not(:only-child), -#MyExpander button:not(.flat).Left, -#MyExpander button:not(.flat) + combobox, -#MyExpander combobox + button:not(.flat), -#MyExpander combobox + combobox -/* Crash -#MyExpander button + label, -#MyExpander combobox + label */ { - margin-left: 0.16667em; +.curve-mainbox .curve-buttonbox button.flat:active, +.curve-mainbox .curve-buttonbox button.flat:checked, +#ToolPanelNotebook > stack > box > box button:active, +#MainNotebook > header tab #CloseButton:active, +#MainNotebook > header > grid > button:active { + background-color: alpha(@bg-light-grey, 0.8); + border-color: shade(@bg-dark-grey, 0.6); + box-shadow: inset 0 0.1em rgba(242, 242, 242, 0.15); } -#MyExpander label + * > button:not(.flat).Left, -#MyExpander label + combobox:not(:first-child):not(:only-child), -#MyExpander label + button:not(.flat):not(spinbutton) { - margin-left: 0.33334em; +/* Combobox */ +button.combo { + padding: 0 0 0 0.25em; } - -buttonbox:not(.dialog-action-area) button{ - margin: 0.08334em 0 0.33334em 0.16667em; -} -#PrefNotebook buttonbox:not(.dialog-action-area) { - margin-right: -5px; -} - -/* Arrow toggle combo button */ -#IopsPanel button:not(.flat).Left + button:not(.flat).Right, -#MyExpander button:not(.flat).Left + button:not(.flat).Right { - border-left: none; +combobox entry.combo + button.combo { + min-width: 1em; margin-left: 0; - padding-left: 0.33334em; - padding-right: 0.33334em; + padding: 0; border-top-left-radius: 0; border-bottom-left-radius: 0; + border-left: none; } -#IopsPanel button:not(.flat).Left, -#MyExpander button:not(.flat).Left { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - min-width: 2.16667em; -} -/**/ - -/**/ -#MyExpander button.text-button label { - margin: 0;/* x */ -} -/* Graduated filter big button */ -#ExpanderBox > box > box:first-child > button:not(.flat):not(.text-button):first-child { - min-height: 2.16667em; - min-width: 2.16667em; - padding: 0; - margin: 0 0 0.5em; -} - -.popupbutton-arrow { +#WB-Size-Helper button.combo { min-width: 0; + margin: 0; +} +#WB-Size-Helper { + min-width: 3.5em; + margin: 0.19em; } +combobox arrow { + margin-right: 0.083333333333333333em; +} + +combobox entry.combo + button.combo arrow { + margin-right: 0; +} + +#PlacesPaned button.combo { + margin: 0; +} +#PlacesPaned combobox { + margin-bottom: calc(0.416666666666666666em - 8px); +} + +#ProfilePanel combobox { + margin-right: -2px; +} + +/* Misc */ +button label { + margin: 0 0.416666666666666666em; +} +button image:not(.dummy), +#MyExpander button image:not(.dummy) { + margin: 0; +} +#MyFileChooserButton label { + margin: 0 0 0 0.416666666666666666em; +} +#MyFileChooserButton image:not(.dummy):last-child { + margin: 0 0.416666666666666666em 0 0; + min-width: 1.333333333333333333em; + opacity: 0.85; +} +#MetaPanelNotebook button + button:last-child { + margin-right: 0; +} +#MetaPanelNotebook scrolledwindow + grid > button:first-child, +#MetaPanelNotebook scrolledwindow + grid + grid > button:first-child { + margin-left: 0; +} +#MetaPanelNotebook scrolledwindow + grid > button:last-child, +#MetaPanelNotebook scrolledwindow + grid + grid > button:last-child { + margin-right: 0; +} + +#ProfilePanel > grid { + margin-bottom: calc(0.416666666666666666em -2px); +} + +/* Reset button */ +scale + button.flat, +spinbutton + button.flat, +scale + image + image + button.flat { + min-height: 1.333333333333333333em; + margin-top:0.095em; + margin-bottom: 0.095em; +} + +/* Color chooser & buttons */ button.color { - min-height: 1.16667em; - padding: 0.25em; + min-width: 3.25em; + box-shadow: none; + background-image: none; + background-color: transparent; +} + +button.color colorswatch { + min-height: 0; + min-width: 0; + margin: 1px; + border-radius: 0.2em; +} + +colorchooser colorswatch { + border: 1px solid @bg-button-border; +} +colorchooser colorswatch#add-color-button:first-child { + border-radius: 5.5px 0 0 5.5px; +} + +/* Font chooser button */ +button.font label{ + min-height: 0; + min-width: 0; + margin: 0 0.19em; } /* Save, Cancel, OK ... buttons */ -.dialog-action-area button { - min-height: 2.16667em; - margin-top: 0.33334em; +dialog .dialog-action-area button { + min-height: 2.166666666666666666em; + margin: 0.5em 0 0 0.333333333333333333em; + padding: 0; } messagedialog .dialog-action-area button { - margin: 0 0.66667em 0.66667em 0.66667em; - min-height: 1.83334em; + min-height: 1.833333333333333333em; + margin: -12px 0.5em 0.5em; + padding: 0; } messagedialog .dialog-action-area button:not(:only-child):nth-child(1) { margin-right: 0.25em; @@ -1501,29 +1525,211 @@ messagedialog .dialog-action-area button:not(:only-child):nth-child(1) { messagedialog .dialog-action-area button:not(:only-child):nth-child(2) { margin-left: 0.25em; } + +/* Big tool buttons */ +#ToolBarPanelFileBrowser button, +#EditorTopPanel button, +#IopsPanel button, +#ProfilePanel button, +#MainNotebook > header > grid > button, +#MyExpander button.independent.toggle:not(.image-button):not(.text-button):first-child:only-child, /* Graduated filter big button */ +.curve-mainbox .curve-buttonbox button.flat, +#BatchQueueButtonsMainContainer + grid + box button, +#RightNotebook > stack > scrolledwindow:last-child button.image-button, /* Fast Export */ +#MetaPanelNotebook scrolledwindow + grid > button, +#MetaPanelNotebook scrolledwindow + grid + grid > button { + min-height: 2.5em; + min-width: 2.5em; + margin: 0 0.19em; +} +#ToolBarPanelFileBrowser > button:first-child, +#EditorTopPanel > button:first-child, +#IopsPanel > button:nth-child(6), +#ProfilePanel > grid > button:first-child { + margin-left: 0; +} +#ToolBarPanelFileBrowser > button:last-child, +#ToolBarPanelFileBrowser > box:last-child > button:last-child, +#EditorTopPanel > button:last-child, +#EditorTopPanel > box:last-child > button:last-child, +#IopsPanel > button:last-child, +#ProfilePanel > grid > button:last-child, +#BatchQueueButtonsMainContainer + grid + box button { + margin-right: 0; +} +#MyExpander button.independent.toggle:not(.image-button):not(.text-button):first-child:only-child, /* Graduated filter button */ +#MetaPanelNotebook scrolledwindow + grid > button, +#MetaPanelNotebook scrolledwindow + grid + grid > button { + margin: 0.19em; +} + +#EditorTopPanel button.narrowbutton { + min-width: 0.833333333333333333em; + padding: 0 0.166666666666666666em; +} + +/* Image close button */ +#MainNotebook > header tab #CloseButton { + padding: 0; + margin: 0.333333333333333333em 0 0.416666666666666666em 0.19em; + min-width: 1.5em; + min-height: 0; +} +#MainNotebook > header tab #CloseButton image{ + min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; +} + +/* Filter buttons*/ +#ToolBarPanelFileBrowser .smallbuttonbox { + min-height: 1.333333333333333333em; + padding: 0; + margin: 0; +} +#ToolBarPanelFileBrowser .smallbuttonbox:nth-child(2) { + margin: 0.083333333333333333em 0 -0.166666666666666666em; +} +#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton image { + margin: -0.19em; + min-width: 1.333333333333333333em; + min-height: 1.333333333333333333em; +} +#ToolBarPanelFileBrowser .smallbuttonbox button.smallbutton { + min-height: 0; + min-width: 1.333333333333333333em; + padding: 0; + margin: 0 0.25em; + border: none; + border-radius: 0; + background-color: transparent; + background-image: none; + box-shadow: none; +} +#FileBrowser #ToolBarPanelFileBrowser box:nth-child(7) > box.smallbuttonbox > button.smallbutton:checked, +#EditorLeftPaned #ToolBarPanelFileBrowser box:nth-child(5) > box.smallbuttonbox > button.smallbutton:checked { + background-image: image(rgba(30,30,30,.3)); + background-color: @bg-button-active; +} + +/* Arrow toggle combo button */ +#IopsPanel .image-combo button.Right, +#MyExpander .image-combo button.Right { + border-left: none; + margin-left: 0; + padding: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + min-width: 1.333333333333333333em; +} +#IopsPanel .image-combo button.Right image, +#MyExpander .image-combo button.Right image { + margin: 0 -0.083333333333333333em; +} +#IopsPanel .image-combo button.Left, +#MyExpander .image-combo button.Left { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + min-width: 2.5em; + margin-right: 0; +} +#MyExpander .image-combo button.Left { + min-width: 2.75em; +} +#MyExpander .image-combo button.Left label { + margin-right: 0; +} + +/* Search & Query buttons */ +#FileBrowserQueryToolbar entry + button.flat, +#FileBrowserIconToolbar entry + button.flat { + min-height: 1.666666666666666666em;/*x*/ + min-width: 1.666666666666666666em;/*x*/ + margin: 0; + border-radius: 0 0.2em 0.2em 0; + box-shadow: inset 0 0.1em rgba(0, 0, 0, 0.1), inset -0.1em -0.1em rgba(230, 230, 230, 0.07); + border: 0.083333333333333333em solid @bg-entry-border; + background-color: @bg-scale-entry; + padding: 0; +} +#FileBrowserQueryToolbar entry + button.flat:not(:hover):not(:active), +#FileBrowserIconToolbar entry + button.flat:not(:hover):not(:active) { + border-left: none; + padding-left: 0.083333333333333333em; +} +#FileBrowserIconToolbar box > entry + button.flat { + margin-top: 0.416666666666666666em; + margin-bottom: 0.416666666666666666em; + min-height: 0; +} + +/* Small Lock Button */ +#BeforeAfterContainer button { + min-height: 2em; + min-width: 2em; + margin: 0.25em 0.25em 0.25em 0; + padding: 0; + border-radius: 0.2em; + border: 0.083333333333333333em solid @bg-button-border; + background-color: transparent; + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.1); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); +} +#BeforeAfterContainer button image{ + margin: 0 0 0 0.083333333333333333em; +} +#BeforeAfterContainer button:checked image{ + margin: 0.083333333333333333em -0.166666666666666666em 0.083333333333333333em 0.25em; +} + +/* Snapshot & Places buttons */ +#Snapshots button, +#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button { + margin: 0; + padding: 0; + background-color: transparent; + background-image: none; + border: 0.083333333333333333em solid @bg-dark-grey; + border-radius: 0; + box-shadow: none; + min-height: 1.666666666666666666em;/*x*/ +} + +#Snapshots button:hover, +#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button:hover { +background-color: @bg-list-hover; +} +#Snapshots button:active, +#PlacesPaned > box:nth-child(1) scrolledwindow + grid > button:active { +background-color: shade(@bg-list-hover, 1.15); +} /**/ + /* View & Filechooser Buttons */ -dialog .view button, -window .view button { +.view button { background-color: @bg-dark-grey; background-image: none; box-shadow: none; min-height: 2em; - min-width: 1.33334em; - padding: 0 0.33334em; + min-width: 1.333333333333333333em; + padding: 0 0.19em; margin: 0; } -dialog .view button.text-button label, -window .view button.text-button label { +#pathbarbox button { + min-width: 2em; margin: 0; + padding: 0; + } +window treeview > header image { + min-width: 1.333333333333333333em; } + window .view button { border: none; - border-bottom: 0.08334em solid @border-color; + border-bottom: 0.083333333333333333em solid @view-grid-border; } dialog .view button { - border: 0.08334em solid @border-color; + border: 0.083333333333333333em solid @border-color; } .view button:checked, @@ -1536,40 +1742,34 @@ dialog .view button { color: @headline-hl; } -dialog .view header button:not(:first-child):not(:only-child), -window .view header button:not(:first-child):not(:only-child), +.view header button:not(:first-child):not(:only-child), .path-bar button:not(:first-child):not(:only-child) { border-left: none; } -dialog .view header button, -window .view header button, +.view header button, .path-bar button { border-radius: 0; } -#pathbarbox button:last-child { - min-height: 2em; - min-width: 2em; - margin: 0; - padding: 0; - } .path-bar button:first-child { border-top-left-radius: 0.2em; border-bottom-left-radius: 0.2em; - min-width: 2em; margin: 0; padding: 0; } .path-bar button:last-child { border-top-right-radius: 0.2em; border-bottom-right-radius: 0.2em; - min-width: 2em; margin: 0; padding: 0; } -.path-bar button label { - margin: 0; - padding: 0 0.33334em; +#pathbarbox button:not(:first-child):not(:last-child) label { + margin: 0 0.5em; +} + +#pathbarbox button:not(:first-child):not(:last-child) image { + margin: 0 0 0 0.5em; + min-width: 1.333333333333333333em; } /**/ @@ -1577,12 +1777,10 @@ window .view header button, popover button.text-button { background-color: @bg-dark-grey; background-image: none; - border: 0.08334em solid @border-color; + border: 0.083333333333333333em solid @border-color; box-shadow: none; background-image: none; - margin: 0.083334em 0; - min-height: 1.66667em; - padding: 0 0.66667em; + padding: 0 0.666666666666666666em; } popover button.text-button label { padding: 0; @@ -1604,198 +1802,139 @@ popover button.text-button:active { } /**/ -/* Titlebar & Notebook buttons */ -#MainNotebook > header.top > grid > button { - margin: 0 0 0 0.41667em; -} -#MainNotebook > header.left > grid > button { - margin: 0.41667em 0 0; -} - -headerbar button.titlebutton image { - padding: 0; - margin: 0; -} -headerbar button.titlebutton { - margin: 0 0 0 0.33334em; - background-image: none; - border: 0.08334em solid transparent; - background-color: transparent; - box-shadow: none; - min-width: 1.55em; - min-height: 1.55em; - padding: 0; -} -messagedialog headerbar button.titlebutton { - min-width: 1.25em; - min-height: 1.25em; - margin: 0; -} - -#MainNotebook tab #CloseButton { - padding: 0; - margin: 0.33334em -3px 0.33334em 0.08334em; - min-width: 1.5em; - min-height: 1.5em; -} -#MainNotebook > header > grid > button:hover, -#MainNotebook tab #CloseButton:hover, -headerbar button.titlebutton:hover{ - border-color: rgba(0,0,0,.8); - box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.11); - background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); - background-color: rgba(128, 128, 128,.20); -} -#MainNotebook > header > grid > button:active, -headerbar button.titlebutton:active{ - border-color: rgba(0,0,0,.8); - box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.15); - background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); - background-color: rgba(128, 128, 128,.40); -} -#MainNotebook tab #CloseButton:hover, -headerbar button.titlebutton.close:hover{ - border-color: rgba(0,0,0,.8); - background-image: linear-gradient(to bottom, rgb(180,0,0), rgb(160,0,0) 40%, rgb(130,0,0)); - box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.32); -} -#MainNotebook tab #CloseButton:active, -headerbar button.titlebutton.close:active{ - border-color: rgba(0,0,0,.8); - background-image: linear-gradient(to bottom, rgb(215,0,0), rgb(185,0,0) 40%, rgb(150,0,0)); - box-shadow: inset 0 0.08334em rgba(242, 242, 242, 0.4); -} -/**/ - /*** end ***************************************************************************************/ -/*** Ckeckbox & Radio **************************************************************************/ -checkbox, +/*** Checkbox & Radio **************************************************************************/ checkbutton, radiobutton { - padding: 0; - margin: 0; - min-height: 2em; -} -#PrefNotebook checkbox, -#PrefNotebook checkbutton { - min-height: 1.6667em; + padding: 0.083333333333333333em 0; + margin: 0.19em; + min-height: 1.666666666666666666em;/*x*/ } check, radio { - border: calc(0.083334em + 0.18px) solid @text-color; + border: 0.105em solid shade(@text-color, 0.95); background-image: none; background-color: transparent; margin: 0; padding: 0; - min-height: 1.16667em; - min-width: 1.16667em; + min-height: 1.166666666666666666em; + min-width: 1.166666666666666666em; box-shadow: none; background-repeat: no-repeat; - -gtk-icon-shadow: none; - color: @text-color; -} -radiobutton label, -checkbutton label { - margin: 0 0.5em; - padding: 0; + color: shade(@text-color, 0.95); } check { - border-radius: 0.16667em; + border-radius: 0.166666666666666666em; } radio{ - border-radius: 1.16667em; + border-radius: 1.166666666666666666em; } check:disabled, radio:disabled { border-color: @fg-disabled; } +radiobutton label, +checkbutton label { + margin: 0 0.583333333333333333em 0 0.416666666666666666em; + padding: 0; +} + frame > checkbutton check{ margin-left: 0.5em; } +#PartialPaste checkbutton { + padding: 0; + margin: 0.19em 0 0 0.583333333333333333em; +} #PartialPaste checkbutton:not(#PartialPasteHeader) { - min-height: 1.4em; - margin-left: 1.16667em; -} -#PartialPasteHeader { - min-height: 1.4em; - margin-left: 0.5em; -} - -#MyExpander button + checkbutton:last-child { - margin-left: 0.33334em; + margin: 0 0 0 1.166666666666666666em; } /*** end ***************************************************************************************/ /*** Entry & Spinbutton ************************************************************************/ #MyExpander entry, -entry { - margin: 0.08334em 0; - padding: 0 0.33334em; - min-height: 1.66667em; +entry, +spinbutton { + margin: 0.19em; + padding: 0 0.333333333333333333em; + min-height: 1.666666666666666666em;/*x*/ min-width: 0; border-radius: 0.2em; - 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; + box-shadow: inset 0.1em 0.1em rgba(0, 0, 0, 0.1), inset -0.1em -0.1em rgba(230, 230, 230, 0.07); + border: 0.083333333333333333em solid @bg-entry-border; background-color: @bg-scale-entry; } +#FileBrowserQueryToolbar entry, +#FileBrowserIconToolbar entry { + margin: 0; + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + box-shadow: inset 0.1em 0.1em rgba(0, 0, 0, 0.1), inset 0 -0.1em rgba(230, 230, 230, 0.07); +} +#FileBrowserIconToolbar box > entry { + margin-top: 0.416666666666666666em; + margin-bottom: 0.416666666666666666em; + margin-left: 0.19em; + min-height: 0; +} +#FileBrowserQueryToolbar box + box > label + entry { + margin-left: 0.19em; +} spinbutton { - margin: 0.08334em 0; padding: 0; - min-height: 1.66667em; - min-width: 0; - border-radius: 0.2em; - background-color: @bg-scale-entry; - border: 0.08334em solid @bg-entry-border; - box-shadow: inset 0.08334em 0.08334em rgba(0, 0, 0, 0.08), 0 0.08334em rgba(242, 242, 242, 0.1); } #MyExpander spinbutton { - margin: 0.16667em 0; + margin: 0.19em; padding: 0; - min-height: 1.33334em; + min-height: 1.333333333333333333em; min-width: 0; - border-top-left-radius: 1.83334em; - border-bottom-left-radius: 1.83334em; + border-top-left-radius: 1.833333333333333333em; + border-bottom-left-radius: 1.833333333333333333em; background-color: @bg-tb-spinbutton; - border: 0.08334em solid @bg-button-border; + border: 0.083333333333333333em solid @bg-button-border; color: @text-tbEntry; - box-shadow: inset 0.08334em 0.08334em rgba(0, 0, 0, .12), 0 0.08334em rgba(255, 255, 255, 0.12); + box-shadow: inset 0.1em 0.1em rgba(0, 0, 0, .1), inset -0.1em -0.1em rgba(250, 250, 250, .08); } +/* Needed for Reset & and Auto button height*/ #MyExpander button + label + spinbutton { - margin: 0.25em 0; /* Needed for Reset & and Auto button height*/ + margin-top: 0.333333333333333333em; + margin-bottom: 0.333333333333333333em; } #MyExpander checkbutton + label + spinbutton { - margin: 0.33334em 0; /* Needed for Reset & and Auto checkbox button height*/ + margin-top: 0.416666666666666666em; + margin-bottom: 0.416666666666666666em; } +/**/ -#MyExpander image + spinbutton { - margin-left: 0.25em; -} - -#BatchQueueButtonsMainContainer spinbutton button, #MyExpander spinbutton button, spinbutton button { padding: 0; margin: 0; - min-height: 0; - min-width: 1.33334em; + min-height: 1.333333333333333333em; + min-width: 1.666666666666666666em; background-image: none; background-color: transparent; border: none; border-radius: 0; box-shadow: none; - -gtk-icon-shadow: none; } +#MyExpander spinbutton button { + margin: -1px 0; + min-width: 1.333333333333333333em; +} + #MyExpander spinbutton entry, spinbutton entry { - padding: 0 0.33334em; + padding: 0 0.333333333333333333em; margin: 0; min-height: 0; min-width: 0; @@ -1804,10 +1943,9 @@ spinbutton entry { background-color: transparent; } #MyExpander spinbutton entry { - padding: 0 0.33334em 0 0.83334em; + padding: 0 0.333333333333333333em 0 0.833333333333333333em; } -#BatchQueueButtonsMainContainer spinbutton button:hover, #MyExpander spinbutton button:hover, spinbutton button:hover { background-color: rgba(0,0,0,0.3); @@ -1815,7 +1953,6 @@ spinbutton button:hover { border: none; box-shadow: none; } -#BatchQueueButtonsMainContainer spinbutton button:active, #MyExpander spinbutton button:active, spinbutton button:active { background-color: rgba(0,0,0,0.5); @@ -1852,36 +1989,75 @@ entry:focus > selection { .view entry { background-color: @bg-dark-grey; margin: 0 -2px; - border: 0.08334em solid @accent-color; + border: 0.083333333333333333em solid @accent-color; box-shadow: none; } /* end*/ /*** end ***************************************************************************************/ +/* Curves **************************************************************************************/ +.curve-mainbox { + margin: 0.19em; + border: 0.083333333333333333em solid @border-color; +} +.curve-mainbox .curve-curvebox { + margin: 0; + padding: 0.416666666666666666em; + background-color: @bg-dark-grey; +} +.curve-mainbox .curve-spinbuttonbox { + margin: 0; + padding: 0.25em; + border-top: 0.083333333333333333em solid @border-color; + background-color: @bg-dark-grey; +} +.curve-mainbox .curve-sliderbox { + margin: 0; + padding: 0.25em; + background-color: @bg-grey; + border-top: 0.083333333333333333em solid @border-color; +} +.curve-mainbox .curve-buttonbox { + padding: 0.25em; + background-color: @bg-dark-grey; +} +.curve-mainbox.left .curve-buttonbox { + border-right: 0.083333333333333333em solid @border-color; +} +.curve-mainbox.right .curve-buttonbox { + border-left: 0.083333333333333333em solid @border-color; +} +.curve-mainbox.top .curve-buttonbox { + border-bottom: 0.083333333333333333em solid @border-color; +} +.curve-mainbox.bottom .curve-buttonbox { + border-top: 0.083333333333333333em solid @border-color; +} +.curve-mainbox .curve-buttonbox button.flat { + margin: 0.095em; +} +/*** end ***************************************************************************************/ + /*** Window Layout *****************************************************************************/ -:not(.popup):not(tooltip) > decoration { +.csd:not(.popup):not(tooltip) > decoration { background-color: @winHeaderbar; background-image: none; - border-radius: 0.41667em 0.41667em 0 0; + border-radius: 0.416666666666666666em 0.416666666666666666em 0 0; border: none; padding: 0; - box-shadow: 0 0.25em 0.75em 0.08334em rgba(0, 0, 0, 0.5), 0 0 0 0.08334em @bg-dark-grey; - margin: 0.83334em; + box-shadow: 0 0.25em 0.75em 0.083333333333333333em rgba(0, 0, 0, 0.5), 0 0 0 0.083333333333333333em @bg-dark-grey; + margin: 0.833333333333333333em; } headerbar { background-color: shade(@winHeaderbar,1.12); - box-shadow: inset 0 0.08334em rgba(200,200,200,.13); + box-shadow: inset 0 0.083333333333333333em rgba(200,200,200,.13); background-image: linear-gradient(shade(@winHeaderbar,1.14), shade(@winHeaderbar,.86)); - border-bottom: 0.08334em solid @bg-dark-grey; - border-radius: 0.41667em 0.41667em 0 0; - min-height: 2.16667em; - padding: 0.08334em 0.41667em 0; - margin: 0; -} -messagedialog headerbar { + border-bottom: 0.083333333333333333em solid @bg-dark-grey; + border-radius: 0.416666666666666666em 0.416666666666666666em 0 0; min-height: 2em; - + padding: 0.083333333333333333em 0.416666666666666666em 0; + margin: 0; } headerbar .title{ color: @winTitle; @@ -1894,8 +2070,8 @@ headerbar .title{ /**/ /* Window in background */ -:not(.popup):not(tooltip) > decoration:backdrop { - box-shadow: 0 0.25em 0.75em 0.08334em rgba(0, 0, 0, 0.3), 0 0 0 0.08334em @bg-dark-grey; +.csd:not(.popup):not(tooltip) > decoration:backdrop { + box-shadow: 0 0.25em 0.75em 0.083333333333333333em rgba(0, 0, 0, 0.3), 0 0 0 0.083333333333333333em @bg-dark-grey; } headerbar:backdrop { box-shadow: none; @@ -1904,4 +2080,47 @@ headerbar:backdrop { headerbar .title:backdrop { color: alpha(@winTitle,.60); } +/* Titlebar buttons*/ + +headerbar button.titlebutton image { + padding: 0; + margin: 0; +} +headerbar button.titlebutton { + margin: 0 0 0 0.333333333333333333em; + background-image: none; + border: 0.083333333333333333em solid transparent; + background-color: transparent; + box-shadow: none; + min-width: 1.5em; + min-height: 1.5em; + padding: 0; +} +messagedialog headerbar button.titlebutton { + min-width: 1.25em; + min-height: 1.25em; + margin: 0; +} +headerbar button.titlebutton:hover{ + border-color: rgba(0,0,0,.8); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.11); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); + background-color: rgba(128, 128, 128,.20); +} +headerbar button.titlebutton:active{ + border-color: rgba(0,0,0,.8); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.15); + background-image: linear-gradient(to bottom, rgba(100,100,100,.3), rgba(30,30,30,.3)); + background-color: rgba(128, 128, 128,.40); +} +headerbar button.titlebutton.close:hover{ + border-color: rgba(0,0,0,.8); + background-image: linear-gradient(to bottom, rgb(180,0,0), rgb(160,0,0) 40%, rgb(130,0,0)); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.32); +} +headerbar button.titlebutton.close:active{ + border-color: rgba(0,0,0,.8); + background-image: linear-gradient(to bottom, rgb(215,0,0), rgb(185,0,0) 40%, rgb(150,0,0)); + box-shadow: inset 0 0.083333333333333333em rgba(242, 242, 242, 0.4); +} /*** end ***************************************************************************************/ diff --git a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css b/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css index 98ec912b1..29ebd6c96 100644 --- a/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css +++ b/rtdata/themes/TooWaGrey - Average Surround-GTK3-20_.css @@ -33,7 +33,7 @@ @define-color bg-image rgb(120,120,120); /*** Image area & File Browser background * Default: rgb(70,70,70) ***/ -@define-color accent-color2 rgb(49,132,220); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(35,99,166) ***/ +@define-color accent-color2 rgb(175,175,175); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(35,99,166) ***/ @define-color accent-color4 rgb(155,155,155); /*** Slider knob * Default: rgb(115,115,115) ***/ @define-color accent-color3 rgb(85,85,85); /*** Selected thumbnail background color * Default: rgb(35,99,166) ***/ @@ -43,10 +43,10 @@ @define-color bg-light-grey rgb(135,135,135); @define-color bg-grey rgb(120,120,120); -@define-color bg-dark-grey rgb(85,85,85); +@define-color bg-dark-grey rgb(90,90,90); -@define-color bg-button-hover rgba(0,0,0,.15); -@define-color bg-button-active rgba(0,0,0,.5); +@define-color bg-button-hover rgba(40,40,40,.16); +@define-color bg-button-active rgba(40,40,40,.4); @define-color winHeaderbar rgb(75,75,75); @define-color winTitle rgb(210,210,210); @@ -55,7 +55,7 @@ @define-color border-tooltip rgb(50,50,50); @define-color text-tooltip rgb(50,50,50); /***********************************************/ -@define-color text-color rgb(230,230,230); +@define-color text-color rgb(220,220,220); @define-color text-tbEntry rgb(245,245,245); @define-color border-color rgba(255,255,255,.35); @define-color bg-list-hover rgb(95,95,95); diff --git a/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css b/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css new file mode 100644 index 000000000..74dd5c7f0 --- /dev/null +++ b/rtdata/themes/TooWaGrey - Bright-GTK3-20_.css @@ -0,0 +1,72 @@ +/* + This file is part of RawTherapee. + + Copyright (c) 2016-2017 TooWaBoo + Requires RT 5.0 (Gtk+ >= 3.20) + + 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 . +*/ + + +/*****************************************/ +/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/*****************************************/ + +/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ + +@define-color accent-color rgb(112,112,112); /*** Active color for Lists, Menu, Borders ... * Default: rgb(35,99,166) ***/ +@define-color text-hl-color rgb(255,255,255); /*** Active text color * Default: rgb(210,210,210) ***/ + +@define-color bg-highlighted-text-color rgb(43,119,196); /*** Highlighted text color background* Default: rgb(35,99,166) ***/ +@define-color highlighted-text-color rgb(255,255,255); /*** Highlighted text color * Default: rgb(210,210,210) ***/ + +@define-color bg-image rgb(95,95,95); /*** Image area & File Browser background * Default: rgb(70,70,70) ***/ + +@define-color accent-color2 rgb(43,119,196); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(35,99,166) ***/ +@define-color accent-color4 rgb(135,135,135); /*** Slider knob * Default: rgb(115,115,115) ***/ + +@define-color accent-color3 rgb(55,55,55); /*** Selected thumbnail background color * Default: rgb(35,99,166) ***/ +@define-color text-hl-color3 rgb(210,210,210); /*** Selected thumbnail text color * Default: rgb(210,210,210) ***/ + +/*** Change me end *****************************************************************************/ + +@define-color bg-light-grey rgb(119,119,119); +@define-color bg-grey rgb(95,95,95); +@define-color bg-dark-grey rgb(55,55,55); + +@define-color bg-button-hover rgba(0,0,0,.25); +@define-color bg-button-active rgba(0,0,0,.60); + +@define-color winHeaderbar rgb(75,75,75); +@define-color winTitle rgb(210,210,210); + +@define-color bg-tooltip rgb(210,210,210); +@define-color border-tooltip rgb(36,36,36); +@define-color text-tooltip rgb(36,36,36); +/***********************************************/ +@define-color text-color rgb(210,210,210); +@define-color text-tbEntry rgb(230,230,230); +@define-color border-color rgba(255,255,255,.35); +@define-color bg-list-hover rgb(75,75,75); +@define-color bg-scale-entry rgba(0,0,0,.14); +@define-color bg-button-border rgba(0,0,0,.45); +@define-color bg-entry-border rgba(0,0,0,.40); +@define-color view-grid-border rgba(255,255,255,0.25); +@define-color headline-big rgb(210,210,210); +@define-color headline-hl rgb(255,255,255); +@define-color headline-frame rgb(245,245,245); +/*** New Color Variable v2.53 ************************************************************************/ +@define-color fg-disabled rgb(160,160,160); +@define-color bg-tb-spinbutton shade(@bg-grey, 1.3); +/***********************************************************************************************/ diff --git a/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css b/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css new file mode 100644 index 000000000..0f61e0935 --- /dev/null +++ b/rtdata/themes/TooWaGrey - Dark-GTK3-20_.css @@ -0,0 +1,72 @@ +/* + This file is part of RawTherapee. + + Copyright (c) 2016-2017 TooWaBoo + Requires RT 5.0 (Gtk+ >= 3.20) + + 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 . +*/ + + +/*****************************************/ +/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/*****************************************/ + +/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ + +@define-color accent-color rgb(65,65,65); /*** Active color for Lists, Menu, Borders ... * Default: rgb(33,82,145) ***/ +@define-color text-hl-color rgb(200,200,200); /*** Active text color * Default: rgb(200,200,200) ***/ + +@define-color bg-highlighted-text-color rgb(33,82,150); /*** Highlighted text color background* Default: rgb(33,82,145) ***/ +@define-color highlighted-text-color rgb(200,200,200); /*** Highlighted text color * Default: rgb(200,200,200) ***/ + +@define-color bg-image rgb(58,58,58); /*** Image area & File Browser background * Default: rgb(58,58,58) ***/ + +@define-color accent-color2 rgb(33,82,150); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(33,82,145) ***/ +@define-color accent-color4 rgb(98,98,98); /*** Slider knob * Default: rgb(98,98,98) ***/ + +@define-color accent-color3 rgb(30,30,30); /*** Selected thumbnail background color * Default: rgb(33,82,145) ***/ +@define-color text-hl-color3 rgb(200,200,200); /*** Selected thumbnail text color * Default: rgb(200,200,200) ***/ + +/*** Change me end *****************************************************************************/ + +@define-color bg-light-grey rgb(75,75,75); +@define-color bg-grey rgb(58,58,58); +@define-color bg-dark-grey rgb(30,30,30); + +@define-color bg-button-hover rgba(0,0,0,.3); +@define-color bg-button-active rgba(0,0,0,.7); + +@define-color winHeaderbar rgb(50,50,50); +@define-color winTitle rgb(190,190,190); + +@define-color bg-tooltip rgb(170,170,170); +@define-color border-tooltip rgb(36,36,36); +@define-color text-tooltip rgb(36,36,36); +/***********************************************/ +@define-color text-color rgb(176,176,176); +@define-color text-tbEntry rgb(192,192,192); +@define-color border-color rgba(255,255,255,.30); +@define-color bg-list-hover rgb(50,50,50); +@define-color bg-scale-entry rgba(0,0,0,.14); +@define-color bg-button-border rgba(0,0,0,.60); +@define-color bg-entry-border rgba(0,0,0,.40); +@define-color view-grid-border rgba(255,255,255,0.15); +@define-color headline-big rgb(187,187,187); +@define-color headline-hl rgb(215,215,215); +@define-color headline-frame rgb(210,210,210); +/*** New Color Variable v2.53 ************************************************************************/ +@define-color fg-disabled rgb(128,128,128); +@define-color bg-tb-spinbutton shade(@bg-grey, 1.35); +/***********************************************************************************************/ diff --git a/rtdata/themes/TooWaGrey-GTK3-20_.css b/rtdata/themes/TooWaGrey-GTK3-20_.css new file mode 100644 index 000000000..f681ef374 --- /dev/null +++ b/rtdata/themes/TooWaGrey-GTK3-20_.css @@ -0,0 +1,72 @@ +/* + This file is part of RawTherapee. + + Copyright (c) 2016-2017 TooWaBoo + Version 2.66 + + 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 . +*/ + + +/*****************************************/ +/**/ @import "TooWaBlue-GTK3-20_.css"; /**/ +/*****************************************/ + +/*** Change me *** rgb(red,green,blue) *** allowed values from 0 to 255 for each color ***/ + +@define-color accent-color rgb(88,88,88); /*** Active color for Lists, Menu, Borders ... * Default: rgb(35,99,166) ***/ +@define-color text-hl-color rgb(210,210,210); /*** Active text color * Default: rgb(210,210,210) ***/ + +@define-color bg-highlighted-text-color rgb(35,99,166); /*** Highlighted text color background* Default: rgb(35,99,166) ***/ +@define-color highlighted-text-color rgb(210,210,210); /*** Highlighted text color * Default: rgb(210,210,210) ***/ + +@define-color bg-image rgb(75,75,75); /*** Image area & File Browser background * Default: rgb(70,70,70) ***/ + +@define-color accent-color2 rgb(35,99,166); /*** Scale, Progressbar, Scrollbar, Tabs * Default: rgb(35,99,166) ***/ +@define-color accent-color4 rgb(115,115,115); /*** Slider knob * Default: rgb(115,115,115) ***/ + +@define-color accent-color3 rgb(40,40,40); /*** Selected thumbnail background color * Default: rgb(35,99,166) ***/ +@define-color text-hl-color3 rgb(210,210,210); /*** Selected thumbnail text color * Default: rgb(210,210,210) ***/ + +/*** Change me end *****************************************************************************/ + +@define-color bg-light-grey rgb(95,95,95); +@define-color bg-grey rgb(75,75,75); +@define-color bg-dark-grey rgb(40,40,40); + +@define-color bg-button-hover rgba(0,0,0,.25); +@define-color bg-button-active rgba(0,0,0,.60); + +@define-color winHeaderbar rgb(55,55,55); +@define-color winTitle rgb(190,190,190); + +@define-color bg-tooltip rgb(185,185,185); +@define-color border-tooltip rgb(40,40,40); +@define-color text-tooltip rgb(40,40,40); +/***********************************************/ +@define-color text-color rgb(186,186,186); +@define-color text-tbEntry rgb(192,192,192); +@define-color border-color rgba(255,255,255,.30); +@define-color bg-list-hover rgb(50,50,50); +@define-color bg-scale-entry rgba(0,0,0,.14); +@define-color bg-button-border rgba(0,0,0,.60); +@define-color bg-entry-border rgba(0,0,0,.40); +@define-color view-grid-border rgba(255,255,255,0.15); +@define-color headline-big rgb(195,195,195); +@define-color headline-hl rgb(230,230,230); +@define-color headline-frame rgb(215,215,215); +/*** New Color Variable v2.53 ************************************************************************/ +@define-color fg-disabled rgb(128,128,128); +@define-color bg-tb-spinbutton shade(@bg-grey, 1.33); +/***********************************************************************************************/ diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc index bfd56cc0a..bad95a4d8 100644 --- a/rtengine/CA_correct_RT.cc +++ b/rtengine/CA_correct_RT.cc @@ -1,11 +1,11 @@ //////////////////////////////////////////////////////////////// // -// Chromatic Aberration Auto-correction +// Chromatic Aberration correction on raw bayer cfa data // -// copyright (c) 2008-2010 Emil Martinec +// copyright (c) 2008-2010 Emil Martinec +// copyright (c) for improvements (speedups, iterated correction and avoid colour shift) 2018 Ingo Weyrich // -// -// code dated: November 26, 2010 +// code dated: September 8, 2018 // // CA_correct_RT.cc is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -14,20 +14,20 @@ // // 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 +// 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, see . // //////////////////////////////////////////////////////////////// -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #include "rtengine.h" #include "rawimagesource.h" #include "rt_math.h" +#include "gauss.h" #include "median.h" - +#include "StopWatch.h" namespace { bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) @@ -38,7 +38,7 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) // 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 @@ -49,22 +49,22 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) int i, j, k; - for(k = 0; k < (nDim - 1); k++) { // base row of matrix + for (k = 0; k < (nDim - 1); k++) { // base row of matrix // search of line with max element - double fMaxElem = fabs( pfMatr[k * nDim + k] ); + double fMaxElem = fabs(pfMatr[k * nDim + k]); int m = k; for (i = k + 1; i < nDim; i++) { - if(fMaxElem < fabs(pfMatr[i * nDim + k]) ) { + if (fMaxElem < fabs(pfMatr[i * nDim + k])) { fMaxElem = pfMatr[i * nDim + k]; m = i; } } // permutation of base line (index k) and max element line(index m) - if(m != k) { - for(i = k; i < nDim; i++) { - fAcc = pfMatr[k * nDim + i]; + if (m != k) { + for (i = k; i < nDim; i++) { + fAcc = pfMatr[k * nDim + i]; pfMatr[k * nDim + i] = pfMatr[m * nDim + i]; pfMatr[m * nDim + i] = fAcc; } @@ -74,16 +74,16 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) pfVect[m] = fAcc; } - if( pfMatr[k * nDim + k] == 0.) { + if (pfMatr[k * nDim + k] == 0.) { //linear system has no solution return false; // needs improvement !!! } // triangulation of matrix with coefficients - for(j = (k + 1); j < nDim; j++) { // current row of matrix + for (j = (k + 1); j < nDim; j++) { // current row of matrix fAcc = - pfMatr[j * nDim + k] / pfMatr[k * nDim + k]; - for(i = k; i < nDim; i++) { + for (i = k; i < nDim; i++) { pfMatr[j * nDim + i] = pfMatr[j * nDim + i] + fAcc * pfMatr[k * nDim + i]; } @@ -91,10 +91,10 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) } } - for(k = (nDim - 1); k >= 0; k--) { + for (k = (nDim - 1); k >= 0; k--) { pfSolution[k] = pfVect[k]; - for(i = (k + 1); i < nDim; i++) { + for (i = (k + 1); i < nDim; i++) { pfSolution[k] -= (pfMatr[k * nDim + i] * pfSolution[i]); } @@ -104,48 +104,79 @@ bool LinEqSolve(int nDim, double* pfMatr, double* pfVect, double* pfSolution) return true; } //end of linear equation solver -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - } using namespace std; using namespace rtengine; -void RawImageSource::CA_correct_RT(const bool autoCA, const double cared, const double cablue, const double caautostrength, array2D &rawData) +float* RawImageSource::CA_correct_RT( + bool autoCA, + size_t autoIterations, + double cared, + double cablue, + bool avoidColourshift, + const array2D &rawData, + double* fitParamsTransfer, + bool fitParamsIn, + bool fitParamsOut, + float* buffer, + bool freeBuffer, + size_t chunkSize, + bool measure +) { -// multithreaded and vectorized by Ingo Weyrich + + std::unique_ptr stop; + + if (measure) { + std::cout << "CA correcting " << W << "x" << H << " image with " << chunkSize << " tiles per thread" << std::endl; + stop.reset(new StopWatch("CA correction")); + } + + // multithreaded and vectorized by Ingo Weyrich constexpr int ts = 128; constexpr int tsh = ts / 2; - //shifts to location of vertical and diagonal neighbors + constexpr int cb = 2; // 2 pixels border will be excluded from correction + + //shifts to location of vertical and diagonal neighbours constexpr int v1 = ts, v2 = 2 * ts, v3 = 3 * ts, v4 = 4 * ts; //, p1=-ts+1, p2=-2*ts+2, p3=-3*ts+3, m1=ts+1, m2=2*ts+2, m3=3*ts+3; // Test for RGB cfa - for(int i = 0; i < 2; i++) - for(int j = 0; j < 2; j++) - if(FC(i, j) == 3) { - printf("CA correction supports only RGB Colour filter arrays\n"); - return; + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + if (FC(i, j) == 3) { + std::cout << "CA correction supports only RGB Colour filter arrays" << std::endl; + return buffer; } + } + } - volatile double progress = 0.0; + array2D* redFactor = nullptr; + array2D* blueFactor = nullptr; + array2D* oldraw = nullptr; + if (avoidColourshift) { + redFactor = new array2D((W + 1 - 2 * cb) / 2, (H + 1 - 2 * cb) / 2); + blueFactor = new array2D((W + 1 - 2 * cb) / 2, (H + 1 - 2 * cb) / 2); + oldraw = new array2D((W + 1- 2 * cb) / 2, H- 2 * cb); + // copy raw values before ca correction +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = cb; i < H - cb; ++i) { + for (int j = cb + (FC(i, 0) & 1); j < W - cb; j += 2) { + (*oldraw)[i - cb][(j - cb) / 2] = rawData[i][j]; + } + } + } - if(plistener) { + double progress = 0.0; + + if (plistener) { plistener->setProgress (progress); } // local variables const int width = W + (W & 1), height = H; - //temporary array to store simple interpolation of G - float *Gtmp = (float (*)) malloc ((height * width) / 2 * sizeof * Gtmp); - - // temporary array to avoid race conflicts, only every second pixel needs to be saved here - float *RawDataTmp = (float*) malloc( (height * width) * sizeof(float) / 2); - - float blockave[2][2] = {{0, 0}, {0, 0}}, blocksqave[2][2] = {{0, 0}, {0, 0}}, blockdenom[2][2] = {{0, 0}, {0, 0}}, blockvar[2][2]; - - // Because we can't break parallel processing, we need a switch do handle the errors - bool processpasstwo = true; - constexpr int border = 8; constexpr int border2 = 16; @@ -154,1013 +185,1185 @@ void RawImageSource::CA_correct_RT(const bool autoCA, const double cared, const const int vblsz = ceil((float)(height + border2) / (ts - border2) + 2 + vz1); const int hblsz = ceil((float)(width + border2) / (ts - border2) + 2 + hz1); + //temporary array to store simple interpolation of G + if (!buffer) { + buffer = static_cast(malloc ((height * width + vblsz * hblsz * (2 * 2 + 1)) * sizeof(float))); + } + float* Gtmp = buffer; + float* RawDataTmp = buffer + (height * width) / 2; + //block CA shift values and weight assigned to block - float* const blockwt = static_cast(calloc(vblsz * hblsz * (2 * 2 + 1), sizeof(float))); + float* const blockwt = buffer + (height * width); + memset(blockwt, 0, vblsz * hblsz * (2 * 2 + 1) * sizeof(float)); float (*blockshifts)[2][2] = (float (*)[2][2])(blockwt + vblsz * hblsz); + // Because we can't break parallel processing, we need a switch do handle the errors + bool processpasstwo = true; double fitparams[2][2][16]; - //order of 2d polynomial fit (polyord), and numpar=polyord^2 - int polyord = 4, numpar = 16; - - constexpr float eps = 1e-5f, eps2 = 1e-10f; //tolerance to avoid dividing by zero - - #pragma omp parallel - { - int progresscounter = 0; - - //direction of the CA shift in a tile - int GRBdir[2][3]; - - int shifthfloor[3], shiftvfloor[3], shifthceil[3], shiftvceil[3]; - - //local quadratic fit to shift data within a tile - float coeff[2][3][2]; - //measured CA shift parameters for a tile - float CAshift[2][2]; - //polynomial fit coefficients - //residual CA shift amount within a plaquette - float shifthfrac[3], shiftvfrac[3]; - //per thread data for evaluation of block CA shift variance - float blockavethr[2][2] = {{0, 0}, {0, 0}}, blocksqavethr[2][2] = {{0, 0}, {0, 0}}, blockdenomthr[2][2] = {{0, 0}, {0, 0}}; - - // assign working space - constexpr int buffersize = sizeof(float) * ts * ts + 8 * sizeof(float) * ts * tsh + 8 * 64 + 63; - char *buffer = (char *) malloc(buffersize); - char *data = (char*)( ( uintptr_t(buffer) + uintptr_t(63)) / 64 * 64); - - // shift the beginning of all arrays but the first by 64 bytes to avoid cache miss conflicts on CPUs which have <=4-way associative L1-Cache - - //rgb data in a tile - float* rgb[3]; - rgb[0] = (float (*)) data; - rgb[1] = (float (*)) (data + sizeof(float) * ts * tsh + 1 * 64); - rgb[2] = (float (*)) (data + sizeof(float) * (ts * ts + ts * tsh) + 2 * 64); - - //high pass filter for R/B in vertical direction - float *rbhpfh = (float (*)) (data + 2 * sizeof(float) * ts * ts + 3 * 64); - //high pass filter for R/B in horizontal direction - float *rbhpfv = (float (*)) (data + 2 * sizeof(float) * ts * ts + sizeof(float) * ts * tsh + 4 * 64); - //low pass filter for R/B in horizontal direction - float *rblpfh = (float (*)) (data + 3 * sizeof(float) * ts * ts + 5 * 64); - //low pass filter for R/B in vertical direction - float *rblpfv = (float (*)) (data + 3 * sizeof(float) * ts * ts + sizeof(float) * ts * tsh + 6 * 64); - //low pass filter for colour differences in horizontal direction - float *grblpfh = (float (*)) (data + 4 * sizeof(float) * ts * ts + 7 * 64); - //low pass filter for colour differences in vertical direction - float *grblpfv = (float (*)) (data + 4 * sizeof(float) * ts * ts + sizeof(float) * ts * tsh + 8 * 64); - float *grbdiff = rbhpfh; // there is no overlap in buffer usage => share - //green interpolated to optical sample points for R/B - float *gshift = rbhpfv; // there is no overlap in buffer usage => share - - - if (autoCA) { - // 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 - (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 - (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 - (W & 1)) ? width - (W & 1) - left : cc1; - - // rgb from input CFA data - // rgb values should be floating point numbers between 0 and 1 - // after white balance multipliers are applied - -#ifdef __SSE2__ - vfloat c65535v = F2V(65535.f); -#endif - - for (int rr = rrmin; rr < rrmax; rr++) { - int row = rr + top; - int cc = ccmin; - int col = cc + left; -#ifdef __SSE2__ - int c0 = FC(rr, cc); - if(c0 == 1) { - rgb[c0][rr * ts + cc] = rawData[row][col] / 65535.f; - cc++; - col++; - c0 = FC(rr, cc); - } - int indx1 = rr * ts + cc; - for (; cc < ccmax - 7; cc+=8, col+=8, indx1 += 8) { - vfloat val1 = LVFU(rawData[row][col]) / c65535v; - vfloat val2 = LVFU(rawData[row][col + 4]) / c65535v; - vfloat nonGreenv = _mm_shuffle_ps(val1,val2,_MM_SHUFFLE( 2,0,2,0 )); - STVFU(rgb[c0][indx1 >> 1], nonGreenv); - STVFU(rgb[1][indx1], val1); - STVFU(rgb[1][indx1 + 4], val2); - } -#endif - for (; cc < ccmax; cc++, col++) { - int c = FC(rr, cc); - int indx1 = rr * ts + cc; - rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; - } - } - - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - //fill borders - if (rrmin > 0) { - for (int rr = 0; rr < border; rr++) - for (int cc = ccmin; cc < ccmax; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; - } - } - - if (rrmax < rr1) { - for (int rr = 0; rr < border; 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; - } - } - - if (ccmin > 0) { - for (int rr = rrmin; rr < rrmax; rr++) - for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; - } - } - - if (ccmax < cc1) { - for (int rr = rrmin; rr < rrmax; rr++) - for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(top + rr)][(width - cc - 2)] / 65535.f; - } - } - - //also, fill the image corners - if (rrmin > 0 && ccmin > 0) { - for (int rr = 0; rr < border; rr++) - for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rawData[border2 - rr][border2 - cc] / 65535.f; - } - } - - if (rrmax < rr1 && ccmax < cc1) { - for (int rr = 0; rr < border; rr++) - for (int cc = 0; cc < border; 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 (rrmin > 0 && ccmax < cc1) { - for (int rr = 0; rr < border; rr++) - for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(border2 - rr)][(width - cc - 2)] / 65535.f; - } - } - - if (rrmax < rr1 && ccmin > 0) { - for (int rr = 0; rr < border; 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; - } - } - - //end of border fill - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - //end of initialization - - -#ifdef __SSE2__ - vfloat onev = F2V(1.f); - vfloat epsv = F2V(eps); -#endif - for (int rr = 3; rr < rr1 - 3; rr++) { - int row = rr + top; - int cc = 3 + (FC(rr,3) & 1); - int indx = rr * ts + cc; - int c = FC(rr,cc); -#ifdef __SSE2__ - for (; cc < cc1 - 9; cc+=8, indx+=8) { - //compute directional weights using image gradients - vfloat rgb1mv1v = LC2VFU(rgb[1][indx - v1]); - vfloat rgb1pv1v = LC2VFU(rgb[1][indx + v1]); - vfloat rgbcv = LVFU(rgb[c][indx >> 1]); - vfloat temp1v = epsv + vabsf(rgb1mv1v - rgb1pv1v); - vfloat wtuv = onev / SQRV(temp1v + vabsf(rgbcv - LVFU(rgb[c][(indx - v2) >> 1])) + vabsf(rgb1mv1v - LC2VFU(rgb[1][indx - v3]))); - vfloat wtdv = onev / SQRV(temp1v + vabsf(rgbcv - LVFU(rgb[c][(indx + v2) >> 1])) + vabsf(rgb1pv1v - LC2VFU(rgb[1][indx + v3]))); - vfloat rgb1m1v = LC2VFU(rgb[1][indx - 1]); - vfloat rgb1p1v = LC2VFU(rgb[1][indx + 1]); - vfloat temp2v = epsv + vabsf(rgb1m1v - rgb1p1v); - vfloat wtlv = onev / SQRV(temp2v + vabsf(rgbcv - LVFU(rgb[c][(indx - 2) >> 1])) + vabsf(rgb1m1v - LC2VFU(rgb[1][indx - 3]))); - vfloat wtrv = onev / SQRV(temp2v + vabsf(rgbcv - LVFU(rgb[c][(indx + 2) >> 1])) + vabsf(rgb1p1v - LC2VFU(rgb[1][indx + 3]))); - - //store in rgb array the interpolated G value at R/B grid points using directional weighted average - STC2VFU(rgb[1][indx], (wtuv * rgb1mv1v + wtdv * rgb1pv1v + wtlv * rgb1m1v + wtrv * rgb1p1v) / (wtuv + wtdv + wtlv + wtrv)); - } - -#endif - for (; cc < cc1 - 3; cc+=2, indx+=2) { - //compute directional weights using image gradients - float wtu = 1.f / SQR(eps + fabsf(rgb[1][indx + v1] - rgb[1][indx - v1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx - v2) >> 1]) + fabsf(rgb[1][indx - v1] - rgb[1][indx - v3])); - float wtd = 1.f / SQR(eps + fabsf(rgb[1][indx - v1] - rgb[1][indx + v1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx + v2) >> 1]) + fabsf(rgb[1][indx + v1] - rgb[1][indx + v3])); - float wtl = 1.f / SQR(eps + fabsf(rgb[1][indx + 1] - rgb[1][indx - 1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx - 2) >> 1]) + fabsf(rgb[1][indx - 1] - rgb[1][indx - 3])); - float wtr = 1.f / SQR(eps + fabsf(rgb[1][indx - 1] - rgb[1][indx + 1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx + 2) >> 1]) + fabsf(rgb[1][indx + 1] - rgb[1][indx + 3])); - - //store in rgb array the interpolated G value at R/B grid points using directional weighted average - rgb[1][indx] = (wtu * rgb[1][indx - v1] + wtd * rgb[1][indx + v1] + wtl * rgb[1][indx - 1] + wtr * rgb[1][indx + 1]) / (wtu + wtd + wtl + wtr); - } - - if (row > -1 && row < height) { - int offset = (FC(row,max(left + 3, 0)) & 1); - int col = max(left + 3, 0) + offset; - int indx = rr * ts + 3 - (left < 0 ? (left+3) : 0) + offset; -#ifdef __SSE2__ - for(; col < min(cc1 + left - 3, width) - 7; col+=8, indx+=8) { - STVFU(Gtmp[(row * width + col) >> 1], LC2VFU(rgb[1][indx])); - } -#endif - for(; col < min(cc1 + left - 3, width); col+=2, indx+=2) { - Gtmp[(row * width + col) >> 1] = rgb[1][indx]; - } - } - - } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#ifdef __SSE2__ - vfloat zd25v = F2V(0.25f); -#endif - for (int rr = 4; rr < rr1 - 4; rr++) { - int cc = 4 + (FC(rr, 2) & 1); - int indx = rr * ts + cc; - int c = FC(rr, cc); -#ifdef __SSE2__ - for (; cc < cc1 - 10; cc += 8, indx += 8) { - vfloat rgb1v = LC2VFU(rgb[1][indx]); - vfloat rgbcv = LVFU(rgb[c][indx >> 1]); - vfloat rgb1mv4 = LC2VFU(rgb[1][indx - v4]); - vfloat rgb1pv4 = LC2VFU(rgb[1][indx + v4]); - vfloat temp1v = vabsf(vabsf((rgb1v - rgbcv) - (rgb1pv4 - LVFU(rgb[c][(indx + v4) >> 1]))) + - vabsf(rgb1mv4 - LVFU(rgb[c][(indx - v4) >> 1]) - rgb1v + rgbcv) - - vabsf(rgb1mv4 - LVFU(rgb[c][(indx - v4) >> 1]) - rgb1pv4 + LVFU(rgb[c][(indx + v4) >> 1]))); - STVFU(rbhpfv[indx >> 1], temp1v); - vfloat rgb1m4 = LC2VFU(rgb[1][indx - 4]); - vfloat rgb1p4 = LC2VFU(rgb[1][indx + 4]); - vfloat temp2v = vabsf(vabsf((rgb1v - rgbcv) - (rgb1p4 - LVFU(rgb[c][(indx + 4) >> 1]))) + - vabsf(rgb1m4 - LVFU(rgb[c][(indx - 4) >> 1]) - rgb1v + rgbcv) - - vabsf(rgb1m4 - LVFU(rgb[c][(indx - 4) >> 1]) - rgb1p4 + LVFU(rgb[c][(indx + 4) >> 1]))); - STVFU(rbhpfh[indx >> 1], temp2v); - - //low and high pass 1D filters of G in vertical/horizontal directions - rgb1v = vmul2f(rgb1v); - vfloat glpfvv = (rgb1v + LC2VFU(rgb[1][indx + v2]) + LC2VFU(rgb[1][indx - v2])); - vfloat glpfhv = (rgb1v + LC2VFU(rgb[1][indx + 2]) + LC2VFU(rgb[1][indx - 2])); - rgbcv = vmul2f(rgbcv); - STVFU(rblpfv[indx >> 1], zd25v * vabsf(glpfvv - (rgbcv + LVFU(rgb[c][(indx + v2) >> 1]) + LVFU(rgb[c][(indx - v2) >> 1])))); - STVFU(rblpfh[indx >> 1], zd25v * vabsf(glpfhv - (rgbcv + LVFU(rgb[c][(indx + 2) >> 1]) + LVFU(rgb[c][(indx - 2) >> 1])))); - STVFU(grblpfv[indx >> 1], zd25v * (glpfvv + (rgbcv + LVFU(rgb[c][(indx + v2) >> 1]) + LVFU(rgb[c][(indx - v2) >> 1])))); - STVFU(grblpfh[indx >> 1], zd25v * (glpfhv + (rgbcv + LVFU(rgb[c][(indx + 2) >> 1]) + LVFU(rgb[c][(indx - 2) >> 1])))); - } - -#endif - for (; cc < cc1 - 4; cc += 2, indx += 2) { - rbhpfv[indx >> 1] = fabsf(fabsf((rgb[1][indx] - rgb[c][indx >> 1]) - (rgb[1][indx + v4] - rgb[c][(indx + v4) >> 1])) + - fabsf((rgb[1][indx - v4] - rgb[c][(indx - v4) >> 1]) - (rgb[1][indx] - rgb[c][indx >> 1])) - - fabsf((rgb[1][indx - v4] - rgb[c][(indx - v4) >> 1]) - (rgb[1][indx + v4] - rgb[c][(indx + v4) >> 1]))); - rbhpfh[indx >> 1] = fabsf(fabsf((rgb[1][indx] - rgb[c][indx >> 1]) - (rgb[1][indx + 4] - rgb[c][(indx + 4) >> 1])) + - fabsf((rgb[1][indx - 4] - rgb[c][(indx - 4) >> 1]) - (rgb[1][indx] - rgb[c][indx >> 1])) - - fabsf((rgb[1][indx - 4] - rgb[c][(indx - 4) >> 1]) - (rgb[1][indx + 4] - rgb[c][(indx + 4) >> 1]))); - - //low and high pass 1D filters of G in vertical/horizontal directions - float glpfv = (2.f * rgb[1][indx] + rgb[1][indx + v2] + rgb[1][indx - v2]); - float glpfh = (2.f * rgb[1][indx] + rgb[1][indx + 2] + rgb[1][indx - 2]); - rblpfv[indx >> 1] = 0.25f * fabsf(glpfv - (2.f * rgb[c][indx >> 1] + rgb[c][(indx + v2) >> 1] + rgb[c][(indx - v2) >> 1])); - rblpfh[indx >> 1] = 0.25f * fabsf(glpfh - (2.f * rgb[c][indx >> 1] + rgb[c][(indx + 2) >> 1] + rgb[c][(indx - 2) >> 1])); - grblpfv[indx >> 1] = 0.25f * (glpfv + (2.f * rgb[c][indx >> 1] + rgb[c][(indx + v2) >> 1] + rgb[c][(indx - v2) >> 1])); - grblpfh[indx >> 1] = 0.25f * (glpfh + (2.f * rgb[c][indx >> 1] + rgb[c][(indx + 2) >> 1] + rgb[c][(indx - 2) >> 1])); - } - } - - for (int dir = 0; dir < 2; dir++) { - for (int k = 0; k < 3; k++) { - for (int c = 0; c < 2; c++) { - coeff[dir][k][c] = 0; - } - } - } - -#ifdef __SSE2__ - vfloat zd3v = F2V(0.3f); - vfloat zd1v = F2V(0.1f); - vfloat zd5v = F2V(0.5f); -#endif - - // along line segments, find the point along each segment that minimizes the colour variance - // averaged over the tile; evaluate for up/down and left/right away from R/B grid point - for (int rr = 8; rr < rr1 - 8; rr++) { - int cc = 8 + (FC(rr, 2) & 1); - int indx = rr * ts + cc; - int c = FC(rr, cc); -#ifdef __SSE2__ - vfloat coeff00v = ZEROV; - vfloat coeff01v = ZEROV; - vfloat coeff02v = ZEROV; - vfloat coeff10v = ZEROV; - vfloat coeff11v = ZEROV; - vfloat coeff12v = ZEROV; - for (; cc < cc1 - 14; cc += 8, indx += 8) { - - //in linear interpolation, colour differences are a quadratic function of interpolation position; - //solve for the interpolation position that minimizes colour difference variance over the tile - - //vertical - vfloat temp1 = zd3v * (LC2VFU(rgb[1][indx + ts + 1]) - LC2VFU(rgb[1][indx - ts - 1])); - vfloat temp2 = zd3v * (LC2VFU(rgb[1][indx - ts + 1]) - LC2VFU(rgb[1][indx + ts - 1])); - vfloat gdiffvv = (LC2VFU(rgb[1][indx + ts]) - LC2VFU(rgb[1][indx - ts])) + (temp1 - temp2); - vfloat deltgrbv = LVFU(rgb[c][indx >> 1]) - LC2VFU(rgb[1][indx]); - - vfloat gradwtvv = (LVFU(rbhpfv[indx >> 1]) + zd5v * (LVFU(rbhpfv[(indx >> 1) + 1]) + LVFU(rbhpfv[(indx >> 1) - 1]))) * (LVFU(grblpfv[(indx >> 1) - v1]) + LVFU(grblpfv[(indx >> 1) + v1])) / (epsv + zd1v * (LVFU(grblpfv[(indx >> 1) - v1]) + LVFU(grblpfv[(indx >> 1) + v1])) + LVFU(rblpfv[(indx >> 1) - v1]) + LVFU(rblpfv[(indx >> 1) + v1])); - - coeff00v += gradwtvv * deltgrbv * deltgrbv; - coeff01v += gradwtvv * gdiffvv * deltgrbv; - coeff02v += gradwtvv * gdiffvv * gdiffvv; - - //horizontal - vfloat gdiffhv = (LC2VFU(rgb[1][indx + 1]) - LC2VFU(rgb[1][indx - 1])) + (temp1 + temp2); - - vfloat gradwthv = (LVFU(rbhpfh[indx >> 1]) + zd5v * (LVFU(rbhpfh[(indx >> 1) + v1]) + LVFU(rbhpfh[(indx >> 1) - v1]))) * (LVFU(grblpfh[(indx >> 1) - 1]) + LVFU(grblpfh[(indx >> 1) + 1])) / (epsv + zd1v * (LVFU(grblpfh[(indx >> 1) - 1]) + LVFU(grblpfh[(indx >> 1) + 1])) + LVFU(rblpfh[(indx >> 1) - 1]) + LVFU(rblpfh[(indx >> 1) + 1])); - - coeff10v += gradwthv * deltgrbv * deltgrbv; - coeff11v += gradwthv * gdiffhv * deltgrbv; - coeff12v += gradwthv * gdiffhv * gdiffhv; - } - - coeff[0][0][c>>1] += vhadd(coeff00v); - coeff[0][1][c>>1] += vhadd(coeff01v); - coeff[0][2][c>>1] += vhadd(coeff02v); - coeff[1][0][c>>1] += vhadd(coeff10v); - coeff[1][1][c>>1] += vhadd(coeff11v); - coeff[1][2][c>>1] += vhadd(coeff12v); - -#endif - for (; cc < cc1 - 8; cc += 2, indx += 2) { - - //in linear interpolation, colour differences are a quadratic function of interpolation position; - //solve for the interpolation position that minimizes colour difference variance over the tile - - //vertical - float gdiff = (rgb[1][indx + ts] - rgb[1][indx - ts]) + 0.3f * (rgb[1][indx + ts + 1] - rgb[1][indx - ts + 1] + rgb[1][indx + ts - 1] - rgb[1][indx - ts - 1]); - float deltgrb = (rgb[c][indx >> 1] - rgb[1][indx]); - - float gradwt = (rbhpfv[indx >> 1] + 0.5f * (rbhpfv[(indx >> 1) + 1] + rbhpfv[(indx >> 1) - 1]) ) * (grblpfv[(indx >> 1) - v1] + grblpfv[(indx >> 1) + v1]) / (eps + 0.1f * (grblpfv[(indx >> 1) - v1] + grblpfv[(indx >> 1) + v1]) + rblpfv[(indx >> 1) - v1] + rblpfv[(indx >> 1) + v1]); - - coeff[0][0][c>>1] += gradwt * deltgrb * deltgrb; - coeff[0][1][c>>1] += gradwt * gdiff * deltgrb; - coeff[0][2][c>>1] += gradwt * gdiff * gdiff; - - //horizontal - gdiff = (rgb[1][indx + 1] - rgb[1][indx - 1]) + 0.3f * (rgb[1][indx + 1 + ts] - rgb[1][indx - 1 + ts] + rgb[1][indx + 1 - ts] - rgb[1][indx - 1 - ts]); - - gradwt = (rbhpfh[indx >> 1] + 0.5f * (rbhpfh[(indx >> 1) + v1] + rbhpfh[(indx >> 1) - v1]) ) * (grblpfh[(indx >> 1) - 1] + grblpfh[(indx >> 1) + 1]) / (eps + 0.1f * (grblpfh[(indx >> 1) - 1] + grblpfh[(indx >> 1) + 1]) + rblpfh[(indx >> 1) - 1] + rblpfh[(indx >> 1) + 1]); - - coeff[1][0][c>>1] += gradwt * deltgrb * deltgrb; - coeff[1][1][c>>1] += gradwt * gdiff * deltgrb; - coeff[1][2][c>>1] += gradwt * gdiff * gdiff; - - // In Mathematica, - // f[x_]=Expand[Total[Flatten[ - // ((1-x) RotateLeft[Gint,shift1]+x RotateLeft[Gint,shift2]-cfapad)^2[[dv;;-1;;2,dh;;-1;;2]]]]]; - // extremum = -.5Coefficient[f[x],x]/Coefficient[f[x],x^2] - } - } - - for (int dir = 0; dir < 2; dir++) { - for (int k = 0; k < 3; k++) { - for (int c = 0; c < 2; c++) { - coeff[dir][k][c] *= 0.25f; - if(k == 1) { - coeff[dir][k][c] *= 0.3125f; - } else if(k == 2) { - coeff[dir][k][c] *= SQR(0.3125f); - } - } - } - } - - for (int c = 0; c < 2; c++) { - for (int dir = 0; dir < 2; dir++) { // vert/hor - - // CAshift[dir][c] are the locations - // that minimize colour difference variances; - // This is the approximate _optical_ location of the R/B pixels - if (coeff[dir][2][c] > eps2) { - CAshift[dir][c] = coeff[dir][1][c] / coeff[dir][2][c]; - blockwt[vblock * hblsz + hblock] = coeff[dir][2][c] / (eps + coeff[dir][0][c]) ; - } else { - CAshift[dir][c] = 17.0; - blockwt[vblock * hblsz + hblock] = 0; - } - - //data structure = CAshift[vert/hor][colour] - //dir : 0=vert, 1=hor - - //offset gives NW corner of square containing the min; dir : 0=vert, 1=hor - if (fabsf(CAshift[dir][c]) < 2.0f) { - blockavethr[dir][c] += CAshift[dir][c]; - blocksqavethr[dir][c] += SQR(CAshift[dir][c]); - blockdenomthr[dir][c] += 1; - } - //evaluate the shifts to the location that minimizes CA within the tile - blockshifts[vblock * hblsz + hblock][c][dir] = CAshift[dir][c]; //vert/hor CA shift for R/B - - }//vert/hor - }//colour - - if(plistener) { - progresscounter++; - - if(progresscounter % 8 == 0) - #pragma omp critical (cadetectpass1) - { - progress += (double)(8.0 * (ts - border2) * (ts - border2)) / (2 * height * width); - - if (progress > 1.0) { - progress = 1.0; - } - - plistener->setProgress(progress); - } - } + const size_t iterations = + autoCA + ? std::max(autoIterations, 1) + : 1; + const bool fitParamsSet = fitParamsTransfer && fitParamsIn && iterations < 2; + if (autoCA && fitParamsSet) { + // use stored parameters + int index = 0; + for (int c = 0; c < 2; ++c) { + for (int d = 0; d < 2; ++d) { + for (int e = 0; e < 16; ++e) { + fitparams[c][d][e] = fitParamsTransfer[index++]; } - - //end of diagnostic pass - #pragma omp critical (cadetectpass2) - { - for (int dir = 0; dir < 2; dir++) - for (int c = 0; c < 2; c++) { - blockdenom[dir][c] += blockdenomthr[dir][c]; - blocksqave[dir][c] += blocksqavethr[dir][c]; - blockave[dir][c] += blockavethr[dir][c]; - } } - #pragma omp barrier - - #pragma omp single - { - for (int dir = 0; dir < 2; dir++) - for (int c = 0; c < 2; c++) { - if (blockdenom[dir][c]) { - blockvar[dir][c] = blocksqave[dir][c] / blockdenom[dir][c] - SQR(blockave[dir][c] / blockdenom[dir][c]); - } else { - processpasstwo = false; - printf ("blockdenom vanishes \n"); - break; - } - } - - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - //now prepare for CA correction pass - //first, fill border blocks of blockshift array - if(processpasstwo) { - for (int vblock = 1; vblock < vblsz - 1; vblock++) { //left and right sides - for (int c = 0; c < 2; c++) { - for (int i = 0; i < 2; i++) { - blockshifts[vblock * hblsz][c][i] = blockshifts[(vblock) * hblsz + 2][c][i]; - blockshifts[vblock * hblsz + hblsz - 1][c][i] = blockshifts[(vblock) * hblsz + hblsz - 3][c][i]; - } - } - } - - for (int hblock = 0; hblock < hblsz; hblock++) { //top and bottom sides - for (int c = 0; c < 2; c++) { - for (int i = 0; i < 2; i++) { - blockshifts[hblock][c][i] = blockshifts[2 * hblsz + hblock][c][i]; - blockshifts[(vblsz - 1)*hblsz + hblock][c][i] = blockshifts[(vblsz - 3) * hblsz + hblock][c][i]; - } - } - } - - //end of filling border pixels of blockshift array - - //initialize fit arrays - double polymat[2][2][256], shiftmat[2][2][16]; - - for (int i = 0; i < 256; i++) { - polymat[0][0][i] = polymat[0][1][i] = polymat[1][0][i] = polymat[1][1][i] = 0; - } - - for (int i = 0; i < 16; i++) { - shiftmat[0][0][i] = shiftmat[0][1][i] = shiftmat[1][0][i] = shiftmat[1][1][i] = 0; - } - - int numblox[2] = {0, 0}; - - for (int vblock = 1; vblock < vblsz - 1; vblock++) - for (int hblock = 1; hblock < hblsz - 1; hblock++) { - // block 3x3 median of blockshifts for robustness - for (int c = 0; c < 2; c ++) { - float bstemp[2]; - for (int dir = 0; dir < 2; dir++) { - //temporary storage for median filter - const std::array p = { - blockshifts[(vblock - 1) * hblsz + hblock - 1][c][dir], - blockshifts[(vblock - 1) * hblsz + hblock][c][dir], - blockshifts[(vblock - 1) * hblsz + hblock + 1][c][dir], - blockshifts[(vblock) * hblsz + hblock - 1][c][dir], - blockshifts[(vblock) * hblsz + hblock][c][dir], - blockshifts[(vblock) * hblsz + hblock + 1][c][dir], - blockshifts[(vblock + 1) * hblsz + hblock - 1][c][dir], - blockshifts[(vblock + 1) * hblsz + hblock][c][dir], - blockshifts[(vblock + 1) * hblsz + hblock + 1][c][dir] - }; - bstemp[dir] = median(p); - } - - //now prepare coefficient matrix; use only data points within caautostrength/2 std devs of zero - if (SQR(bstemp[0]) > caautostrength * blockvar[0][c] || SQR(bstemp[1]) > caautostrength * blockvar[1][c]) { - continue; - } - - numblox[c]++; - - for (int dir = 0; dir < 2; dir++) { - double powVblockInit = 1.0; - for (int i = 0; i < polyord; i++) { - double powHblockInit = 1.0; - for (int j = 0; j < polyord; j++) { - double powVblock = powVblockInit; - for (int m = 0; m < polyord; m++) { - double powHblock = powHblockInit; - for (int n = 0; n < polyord; n++) { - polymat[c][dir][numpar * (polyord * i + j) + (polyord * m + n)] += powVblock * powHblock * blockwt[vblock * hblsz + hblock]; - powHblock *= hblock; - } - powVblock *= vblock; - } - shiftmat[c][dir][(polyord * i + j)] += powVblockInit * powHblockInit * bstemp[dir] * blockwt[vblock * hblsz + hblock]; - powHblockInit *= hblock; - } - powVblockInit *= vblock; - }//monomials - }//dir - }//c - }//blocks - - numblox[1] = min(numblox[0], numblox[1]); - - //if too few data points, restrict the order of the fit to linear - if (numblox[1] < 32) { - polyord = 2; - numpar = 4; - - if (numblox[1] < 10) { - - printf ("numblox = %d \n", numblox[1]); - processpasstwo = false; - } - } - - if(processpasstwo) - - //fit parameters to blockshifts - for (int c = 0; c < 2; c++) - for (int dir = 0; dir < 2; dir++) { - if (!LinEqSolve(numpar, polymat[c][dir], shiftmat[c][dir], fitparams[c][dir])) { - printf("CA correction pass failed -- can't solve linear equations for colour %d direction %d...\n", c, dir); - processpasstwo = false; - } - } - - } - - //fitparams[polyord*i+j] gives the coefficients of (vblock^i hblock^j) in a polynomial fit for i,j<=4 - } - //end of initialization for CA correction pass - //only executed if autoCA is true } + } - // Main algorithm: Tile loop - if(processpasstwo) { - #pragma omp for schedule(dynamic) collapse(2) nowait + for (size_t it = 0; it < iterations && processpasstwo; ++it) { + float blockave[2][2] = {}; + float blocksqave[2][2] = {}; + float blockdenom[2][2] = {}; + float blockvar[2][2]; - for (int top = -border; top < height; top += 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 - (W & 1) + border); - const int rr1 = bottom - top; - const int cc1 = right - left; + //order of 2d polynomial fit (polyord), and numpar=polyord^2 + int polyord = 4, numpar = 16; - 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 - (W & 1)) ? width - (W & 1) - left : cc1; + constexpr float eps = 1e-5f, eps2 = 1e-10f; //tolerance to avoid dividing by zero - // rgb from input CFA data - // rgb values should be floating point number between 0 and 1 - // after white balance multipliers are applied +#ifdef _OPENMP + #pragma omp parallel +#endif + { + int progresscounter = 0; + + //direction of the CA shift in a tile + int GRBdir[2][3]; + + int shifthfloor[3], shiftvfloor[3], shifthceil[3], shiftvceil[3]; + + //polynomial fit coefficients + //residual CA shift amount within a plaquette + float shifthfrac[3], shiftvfrac[3]; + + // assign working space + constexpr int buffersize = sizeof(float) * ts * ts + 8 * sizeof(float) * ts * tsh + 8 * 64 + 63; + constexpr int buffersizePassTwo = sizeof(float) * ts * ts + 4 * sizeof(float) * ts * tsh + 4 * 64 + 63; + char * const bufferThr = (char *) malloc((autoCA && !fitParamsSet) ? buffersize : buffersizePassTwo); + + char * const data = (char*)((uintptr_t(bufferThr) + uintptr_t(63)) / 64 * 64); + + // shift the beginning of all arrays but the first by 64 bytes to avoid cache miss conflicts on CPUs which have <= 4-way associative L1-Cache + + //rgb data in a tile + float* rgb[3]; + rgb[0] = (float*) data; + rgb[1] = (float*) (data + sizeof(float) * ts * tsh + 1 * 64); + rgb[2] = (float*) (data + sizeof(float) * (ts * ts + ts * tsh) + 2 * 64); + + if (autoCA && !fitParamsSet) { + constexpr float caAutostrength = 8.f; + //high pass filter for R/B in vertical direction + float* rbhpfh = (float*) (data + 2 * sizeof(float) * ts * ts + 3 * 64); + //high pass filter for R/B in horizontal direction + float* rbhpfv = (float*) (data + 2 * sizeof(float) * ts * ts + sizeof(float) * ts * tsh + 4 * 64); + //low pass filter for R/B in horizontal direction + float* rblpfh = (float*) (data + 3 * sizeof(float) * ts * ts + 5 * 64); + //low pass filter for R/B in vertical direction + float* rblpfv = (float*) (data + 3 * sizeof(float) * ts * ts + sizeof(float) * ts * tsh + 6 * 64); + //low pass filter for colour differences in horizontal direction + float* grblpfh = (float*) (data + 4 * sizeof(float) * ts * ts + 7 * 64); + //low pass filter for colour differences in vertical direction + float* grblpfv = (float*) (data + 4 * sizeof(float) * ts * ts + sizeof(float) * ts * tsh + 8 * 64); + // Main algorithm: Tile loop calculating correction parameters per tile + + //local quadratic fit to shift data within a tile + float coeff[2][3][2]; + //measured CA shift parameters for a tile + float CAshift[2][2]; + + //per thread data for evaluation of block CA shift variance + float blockavethr[2][2] = {}; + float blocksqavethr[2][2] = {}; + float blockdenomthr[2][2] = {}; + +#ifdef _OPENMP + #pragma omp for collapse(2) schedule(dynamic, chunkSize) nowait +#endif + for (int top = -border ; top < height; top += ts - border2) { + for (int left = -border; left < width - (W & 1); left += ts - border2) { + memset(bufferThr, 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 - (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 - (W & 1)) ? width - (W & 1) - left : cc1; + + // rgb from input CFA data + // rgb values should be floating point numbers between 0 and 1 + // after white balance multipliers are applied #ifdef __SSE2__ - vfloat c65535v = F2V(65535.f); - vmask gmask = _mm_set_epi32(0, 0xffffffff, 0, 0xffffffff); + vfloat c65535v = F2V(65535.f); #endif - for (int rr = rrmin; rr < rrmax; rr++) { - int row = rr + top; - int cc = ccmin; - int col = cc + left; - int indx = row * width + col; - int indx1 = rr * ts + cc; + + for (int rr = rrmin; rr < rrmax; rr++) { + int row = rr + top; + int cc = ccmin; + int col = cc + left; #ifdef __SSE2__ - int c = FC(rr, cc); - if(c & 1) { - rgb[1][indx1] = rawData[row][col] / 65535.f; - indx++; - indx1++; - cc++; - col++; - c = FC(rr, cc); - } - for (; cc < ccmax - 7; cc += 8, col += 8, indx += 8, indx1 += 8) { - vfloat val1v = LVFU(rawData[row][col]) / c65535v; - vfloat val2v = LVFU(rawData[row][col + 4]) / c65535v; - STVFU(rgb[c][indx1 >> 1], _mm_shuffle_ps(val1v, val2v, _MM_SHUFFLE(2, 0, 2, 0))); - vfloat gtmpv = LVFU(Gtmp[indx >> 1]); - STVFU(rgb[1][indx1], vself(gmask, PERMUTEPS(gtmpv, _MM_SHUFFLE(1, 1, 0, 0)), val1v)); - STVFU(rgb[1][indx1 + 4], vself(gmask, PERMUTEPS(gtmpv, _MM_SHUFFLE(3, 3, 2, 2)), val2v)); - } + int c0 = FC(rr, cc); + if (c0 == 1) { + rgb[c0][rr * ts + cc] = rawData[row][col] / 65535.f; + cc++; + col++; + c0 = FC(rr, cc); + } + int indx1 = rr * ts + cc; + for (; cc < ccmax - 7; cc+=8, col+=8, indx1 += 8) { + vfloat val1 = LVFU(rawData[row][col]) / c65535v; + vfloat val2 = LVFU(rawData[row][col + 4]) / c65535v; + vfloat nonGreenv = _mm_shuffle_ps(val1,val2,_MM_SHUFFLE(2,0,2,0)); + STVFU(rgb[c0][indx1 >> 1], nonGreenv); + STVFU(rgb[1][indx1], val1); + STVFU(rgb[1][indx1 + 4], val2); + } #endif - for (; cc < ccmax; cc++, col++, indx++, indx1++) { + for (; cc < ccmax; cc++, col++) { + int c = FC(rr, cc); + int indx1 = rr * ts + cc; + rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; + } + } + + //fill borders + if (rrmin > 0) { + for (int rr = 0; rr < border; rr++) { + for (int cc = ccmin; cc < ccmax; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; + } + } + } + + if (rrmax < rr1) { + for (int rr = 0; rr < border; 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; + } + } + } + + if (ccmin > 0) { + for (int rr = rrmin; rr < rrmax; rr++) { + for (int cc = 0; cc < border; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; + } + } + } + + if (ccmax < cc1) { + for (int rr = rrmin; rr < rrmax; rr++) { + for (int cc = 0; cc < border; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(top + rr)][(width - cc - 2)] / 65535.f; + } + } + } + + //also, fill the image corners + if (rrmin > 0 && ccmin > 0) { + for (int rr = 0; rr < border; rr++) { + for (int cc = 0; cc < border; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rawData[border2 - rr][border2 - cc] / 65535.f; + } + } + } + + if (rrmax < rr1 && ccmax < cc1) { + for (int rr = 0; rr < border; rr++) { + for (int cc = 0; cc < border; 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 (rrmin > 0 && ccmax < cc1) { + for (int rr = 0; rr < border; rr++) { + for (int cc = 0; cc < border; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + ccmax + cc) >> ((c & 1) ^ 1)] = rawData[(border2 - rr)][(width - cc - 2)] / 65535.f; + } + } + } + + if (rrmax < rr1 && ccmin > 0) { + for (int rr = 0; rr < border; 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; + } + } + } + + //end of border fill + //end of initialization + +#ifdef __SSE2__ + vfloat onev = F2V(1.f); + vfloat epsv = F2V(eps); +#endif + for (int rr = 3; rr < rr1 - 3; rr++) { + int row = rr + top; + int cc = 3 + (FC(rr,3) & 1); + int indx = rr * ts + cc; + int c = FC(rr,cc); +#ifdef __SSE2__ + for (; cc < cc1 - 9; cc+=8, indx+=8) { + //compute directional weights using image gradients + vfloat rgb1mv1v = LC2VFU(rgb[1][indx - v1]); + vfloat rgb1pv1v = LC2VFU(rgb[1][indx + v1]); + vfloat rgbcv = LVFU(rgb[c][indx >> 1]); + vfloat temp1v = epsv + vabsf(rgb1mv1v - rgb1pv1v); + vfloat wtuv = onev / SQRV(temp1v + vabsf(rgbcv - LVFU(rgb[c][(indx - v2) >> 1])) + vabsf(rgb1mv1v - LC2VFU(rgb[1][indx - v3]))); + vfloat wtdv = onev / SQRV(temp1v + vabsf(rgbcv - LVFU(rgb[c][(indx + v2) >> 1])) + vabsf(rgb1pv1v - LC2VFU(rgb[1][indx + v3]))); + vfloat rgb1m1v = LC2VFU(rgb[1][indx - 1]); + vfloat rgb1p1v = LC2VFU(rgb[1][indx + 1]); + vfloat temp2v = epsv + vabsf(rgb1m1v - rgb1p1v); + vfloat wtlv = onev / SQRV(temp2v + vabsf(rgbcv - LVFU(rgb[c][(indx - 2) >> 1])) + vabsf(rgb1m1v - LC2VFU(rgb[1][indx - 3]))); + vfloat wtrv = onev / SQRV(temp2v + vabsf(rgbcv - LVFU(rgb[c][(indx + 2) >> 1])) + vabsf(rgb1p1v - LC2VFU(rgb[1][indx + 3]))); + + //store in rgb array the interpolated G value at R/B grid points using directional weighted average + vfloat result = (wtuv * rgb1mv1v + wtdv * rgb1pv1v + wtlv * rgb1m1v + wtrv * rgb1p1v) / (wtuv + wtdv + wtlv + wtrv); + STC2VFU(rgb[1][indx], result); + } + +#endif + for (; cc < cc1 - 3; cc+=2, indx+=2) { + //compute directional weights using image gradients + float wtu = 1.f / SQR(eps + fabsf(rgb[1][indx + v1] - rgb[1][indx - v1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx - v2) >> 1]) + fabsf(rgb[1][indx - v1] - rgb[1][indx - v3])); + float wtd = 1.f / SQR(eps + fabsf(rgb[1][indx - v1] - rgb[1][indx + v1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx + v2) >> 1]) + fabsf(rgb[1][indx + v1] - rgb[1][indx + v3])); + float wtl = 1.f / SQR(eps + fabsf(rgb[1][indx + 1] - rgb[1][indx - 1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx - 2) >> 1]) + fabsf(rgb[1][indx - 1] - rgb[1][indx - 3])); + float wtr = 1.f / SQR(eps + fabsf(rgb[1][indx - 1] - rgb[1][indx + 1]) + fabsf(rgb[c][indx >> 1] - rgb[c][(indx + 2) >> 1]) + fabsf(rgb[1][indx + 1] - rgb[1][indx + 3])); + + //store in rgb array the interpolated G value at R/B grid points using directional weighted average + rgb[1][indx] = (wtu * rgb[1][indx - v1] + wtd * rgb[1][indx + v1] + wtl * rgb[1][indx - 1] + wtr * rgb[1][indx + 1]) / (wtu + wtd + wtl + wtr); + } + + if (row > -1 && row < height) { + int offset = (FC(row,max(left + 3, 0)) & 1); + int col = max(left + 3, 0) + offset; + int indx = rr * ts + 3 - (left < 0 ? (left+3) : 0) + offset; +#ifdef __SSE2__ + for (; col < min(cc1 + left - 3, width) - 7; col+=8, indx+=8) { + STVFU(Gtmp[(row * width + col) >> 1], LC2VFU(rgb[1][indx])); + } +#endif + for (; col < min(cc1 + left - 3, width); col+=2, indx+=2) { + Gtmp[(row * width + col) >> 1] = rgb[1][indx]; + } + } + } + +#ifdef __SSE2__ + vfloat zd25v = F2V(0.25f); +#endif + for (int rr = 4; rr < rr1 - 4; rr++) { + int cc = 4 + (FC(rr, 2) & 1); + int indx = rr * ts + cc; int c = FC(rr, cc); - rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; +#ifdef __SSE2__ + for (; cc < cc1 - 10; cc += 8, indx += 8) { + vfloat rgb1v = LC2VFU(rgb[1][indx]); + vfloat rgbcv = LVFU(rgb[c][indx >> 1]); + vfloat rgb1mv4 = LC2VFU(rgb[1][indx - v4]); + vfloat rgb1pv4 = LC2VFU(rgb[1][indx + v4]); + vfloat temp1v = vabsf(vabsf((rgb1v - rgbcv) - (rgb1pv4 - LVFU(rgb[c][(indx + v4) >> 1]))) + + vabsf(rgb1mv4 - LVFU(rgb[c][(indx - v4) >> 1]) - rgb1v + rgbcv) - + vabsf(rgb1mv4 - LVFU(rgb[c][(indx - v4) >> 1]) - rgb1pv4 + LVFU(rgb[c][(indx + v4) >> 1]))); + STVFU(rbhpfv[indx >> 1], temp1v); + vfloat rgb1m4 = LC2VFU(rgb[1][indx - 4]); + vfloat rgb1p4 = LC2VFU(rgb[1][indx + 4]); + vfloat temp2v = vabsf(vabsf((rgb1v - rgbcv) - (rgb1p4 - LVFU(rgb[c][(indx + 4) >> 1]))) + + vabsf(rgb1m4 - LVFU(rgb[c][(indx - 4) >> 1]) - rgb1v + rgbcv) - + vabsf(rgb1m4 - LVFU(rgb[c][(indx - 4) >> 1]) - rgb1p4 + LVFU(rgb[c][(indx + 4) >> 1]))); + STVFU(rbhpfh[indx >> 1], temp2v); - if ((c & 1) == 0) { - rgb[1][indx1] = Gtmp[indx >> 1]; + //low and high pass 1D filters of G in vertical/horizontal directions + rgb1v = vmul2f(rgb1v); + vfloat glpfvv = (rgb1v + LC2VFU(rgb[1][indx + v2]) + LC2VFU(rgb[1][indx - v2])); + vfloat glpfhv = (rgb1v + LC2VFU(rgb[1][indx + 2]) + LC2VFU(rgb[1][indx - 2])); + rgbcv = vmul2f(rgbcv); + STVFU(rblpfv[indx >> 1], zd25v * vabsf(glpfvv - (rgbcv + LVFU(rgb[c][(indx + v2) >> 1]) + LVFU(rgb[c][(indx - v2) >> 1])))); + STVFU(rblpfh[indx >> 1], zd25v * vabsf(glpfhv - (rgbcv + LVFU(rgb[c][(indx + 2) >> 1]) + LVFU(rgb[c][(indx - 2) >> 1])))); + STVFU(grblpfv[indx >> 1], zd25v * (glpfvv + (rgbcv + LVFU(rgb[c][(indx + v2) >> 1]) + LVFU(rgb[c][(indx - v2) >> 1])))); + STVFU(grblpfh[indx >> 1], zd25v * (glpfhv + (rgbcv + LVFU(rgb[c][(indx + 2) >> 1]) + LVFU(rgb[c][(indx - 2) >> 1])))); + } +#endif + for (; cc < cc1 - 4; cc += 2, indx += 2) { + rbhpfv[indx >> 1] = fabsf(fabsf((rgb[1][indx] - rgb[c][indx >> 1]) - (rgb[1][indx + v4] - rgb[c][(indx + v4) >> 1])) + + fabsf((rgb[1][indx - v4] - rgb[c][(indx - v4) >> 1]) - (rgb[1][indx] - rgb[c][indx >> 1])) - + fabsf((rgb[1][indx - v4] - rgb[c][(indx - v4) >> 1]) - (rgb[1][indx + v4] - rgb[c][(indx + v4) >> 1]))); + rbhpfh[indx >> 1] = fabsf(fabsf((rgb[1][indx] - rgb[c][indx >> 1]) - (rgb[1][indx + 4] - rgb[c][(indx + 4) >> 1])) + + fabsf((rgb[1][indx - 4] - rgb[c][(indx - 4) >> 1]) - (rgb[1][indx] - rgb[c][indx >> 1])) - + fabsf((rgb[1][indx - 4] - rgb[c][(indx - 4) >> 1]) - (rgb[1][indx + 4] - rgb[c][(indx + 4) >> 1]))); + + //low and high pass 1D filters of G in vertical/horizontal directions + float glpfv = (2.f * rgb[1][indx] + rgb[1][indx + v2] + rgb[1][indx - v2]); + float glpfh = (2.f * rgb[1][indx] + rgb[1][indx + 2] + rgb[1][indx - 2]); + rblpfv[indx >> 1] = 0.25f * fabsf(glpfv - (2.f * rgb[c][indx >> 1] + rgb[c][(indx + v2) >> 1] + rgb[c][(indx - v2) >> 1])); + rblpfh[indx >> 1] = 0.25f * fabsf(glpfh - (2.f * rgb[c][indx >> 1] + rgb[c][(indx + 2) >> 1] + rgb[c][(indx - 2) >> 1])); + grblpfv[indx >> 1] = 0.25f * (glpfv + (2.f * rgb[c][indx >> 1] + rgb[c][(indx + v2) >> 1] + rgb[c][(indx - v2) >> 1])); + grblpfh[indx >> 1] = 0.25f * (glpfh + (2.f * rgb[c][indx >> 1] + rgb[c][(indx + 2) >> 1] + rgb[c][(indx - 2) >> 1])); + } + } + + for (int dir = 0; dir < 2; dir++) { + for (int k = 0; k < 3; k++) { + for (int c = 0; c < 2; c++) { + coeff[dir][k][c] = 0; + } + } + } + +#ifdef __SSE2__ + vfloat zd3v = F2V(0.3f); + vfloat zd1v = F2V(0.1f); + vfloat zd5v = F2V(0.5f); +#endif + + // along line segments, find the point along each segment that minimizes the colour variance + // averaged over the tile; evaluate for up/down and left/right away from R/B grid point + for (int rr = 8; rr < rr1 - 8; rr++) { + int cc = 8 + (FC(rr, 2) & 1); + int indx = rr * ts + cc; + int c = FC(rr, cc); +#ifdef __SSE2__ + vfloat coeff00v = ZEROV; + vfloat coeff01v = ZEROV; + vfloat coeff02v = ZEROV; + vfloat coeff10v = ZEROV; + vfloat coeff11v = ZEROV; + vfloat coeff12v = ZEROV; + for (; cc < cc1 - 14; cc += 8, indx += 8) { + //in linear interpolation, colour differences are a quadratic function of interpolation position; + //solve for the interpolation position that minimizes colour difference variance over the tile + + //vertical + vfloat temp1 = zd3v * (LC2VFU(rgb[1][indx + ts + 1]) - LC2VFU(rgb[1][indx - ts - 1])); + vfloat temp2 = zd3v * (LC2VFU(rgb[1][indx - ts + 1]) - LC2VFU(rgb[1][indx + ts - 1])); + vfloat gdiffvv = (LC2VFU(rgb[1][indx + ts]) - LC2VFU(rgb[1][indx - ts])) + (temp1 - temp2); + vfloat deltgrbv = LVFU(rgb[c][indx >> 1]) - LC2VFU(rgb[1][indx]); + + vfloat gradwtvv = (LVFU(rbhpfv[indx >> 1]) + zd5v * (LVFU(rbhpfv[(indx >> 1) + 1]) + LVFU(rbhpfv[(indx >> 1) - 1]))) * (LVFU(grblpfv[(indx >> 1) - v1]) + LVFU(grblpfv[(indx >> 1) + v1])) / (epsv + zd1v * (LVFU(grblpfv[(indx >> 1) - v1]) + LVFU(grblpfv[(indx >> 1) + v1])) + LVFU(rblpfv[(indx >> 1) - v1]) + LVFU(rblpfv[(indx >> 1) + v1])); + + coeff00v += gradwtvv * deltgrbv * deltgrbv; + coeff01v += gradwtvv * gdiffvv * deltgrbv; + coeff02v += gradwtvv * gdiffvv * gdiffvv; + + //horizontal + vfloat gdiffhv = (LC2VFU(rgb[1][indx + 1]) - LC2VFU(rgb[1][indx - 1])) + (temp1 + temp2); + + vfloat gradwthv = (LVFU(rbhpfh[indx >> 1]) + zd5v * (LVFU(rbhpfh[(indx >> 1) + v1]) + LVFU(rbhpfh[(indx >> 1) - v1]))) * (LVFU(grblpfh[(indx >> 1) - 1]) + LVFU(grblpfh[(indx >> 1) + 1])) / (epsv + zd1v * (LVFU(grblpfh[(indx >> 1) - 1]) + LVFU(grblpfh[(indx >> 1) + 1])) + LVFU(rblpfh[(indx >> 1) - 1]) + LVFU(rblpfh[(indx >> 1) + 1])); + + coeff10v += gradwthv * deltgrbv * deltgrbv; + coeff11v += gradwthv * gdiffhv * deltgrbv; + coeff12v += gradwthv * gdiffhv * gdiffhv; + } + + coeff[0][0][c>>1] += vhadd(coeff00v); + coeff[0][1][c>>1] += vhadd(coeff01v); + coeff[0][2][c>>1] += vhadd(coeff02v); + coeff[1][0][c>>1] += vhadd(coeff10v); + coeff[1][1][c>>1] += vhadd(coeff11v); + coeff[1][2][c>>1] += vhadd(coeff12v); + +#endif + for (; cc < cc1 - 8; cc += 2, indx += 2) { + //in linear interpolation, colour differences are a quadratic function of interpolation position; + //solve for the interpolation position that minimizes colour difference variance over the tile + + //vertical + float gdiff = (rgb[1][indx + ts] - rgb[1][indx - ts]) + 0.3f * (rgb[1][indx + ts + 1] - rgb[1][indx - ts + 1] + rgb[1][indx + ts - 1] - rgb[1][indx - ts - 1]); + float deltgrb = (rgb[c][indx >> 1] - rgb[1][indx]); + + float gradwt = (rbhpfv[indx >> 1] + 0.5f * (rbhpfv[(indx >> 1) + 1] + rbhpfv[(indx >> 1) - 1])) * (grblpfv[(indx >> 1) - v1] + grblpfv[(indx >> 1) + v1]) / (eps + 0.1f * (grblpfv[(indx >> 1) - v1] + grblpfv[(indx >> 1) + v1]) + rblpfv[(indx >> 1) - v1] + rblpfv[(indx >> 1) + v1]); + + coeff[0][0][c>>1] += gradwt * deltgrb * deltgrb; + coeff[0][1][c>>1] += gradwt * gdiff * deltgrb; + coeff[0][2][c>>1] += gradwt * gdiff * gdiff; + + //horizontal + gdiff = (rgb[1][indx + 1] - rgb[1][indx - 1]) + 0.3f * (rgb[1][indx + 1 + ts] - rgb[1][indx - 1 + ts] + rgb[1][indx + 1 - ts] - rgb[1][indx - 1 - ts]); + + gradwt = (rbhpfh[indx >> 1] + 0.5f * (rbhpfh[(indx >> 1) + v1] + rbhpfh[(indx >> 1) - v1])) * (grblpfh[(indx >> 1) - 1] + grblpfh[(indx >> 1) + 1]) / (eps + 0.1f * (grblpfh[(indx >> 1) - 1] + grblpfh[(indx >> 1) + 1]) + rblpfh[(indx >> 1) - 1] + rblpfh[(indx >> 1) + 1]); + + coeff[1][0][c>>1] += gradwt * deltgrb * deltgrb; + coeff[1][1][c>>1] += gradwt * gdiff * deltgrb; + coeff[1][2][c>>1] += gradwt * gdiff * gdiff; + + // In Mathematica, + // f[x_]=Expand[Total[Flatten[ + // ((1-x) RotateLeft[Gint,shift1]+x RotateLeft[Gint,shift2]-cfapad)^2[[dv;;-1;;2,dh;;-1;;2]]]]]; + // extremum = -.5Coefficient[f[x],x]/Coefficient[f[x],x^2] + } + } + + for (int dir = 0; dir < 2; dir++) { + for (int k = 0; k < 3; k++) { + for (int c = 0; c < 2; c++) { + coeff[dir][k][c] *= 0.25f; + if (k == 1) { + coeff[dir][k][c] *= 0.3125f; + } else if (k == 2) { + coeff[dir][k][c] *= SQR(0.3125f); + } + } + } + } + + for (int c = 0; c < 2; c++) { + for (int dir = 0; dir < 2; dir++) { // vert/hor + + // CAshift[dir][c] are the locations + // that minimize colour difference variances; + // This is the approximate _optical_ location of the R/B pixels + if (coeff[dir][2][c] > eps2) { + CAshift[dir][c] = coeff[dir][1][c] / coeff[dir][2][c]; + blockwt[vblock * hblsz + hblock] = coeff[dir][2][c] / (eps + coeff[dir][0][c]) ; + } else { + CAshift[dir][c] = 17.0; + blockwt[vblock * hblsz + hblock] = 0; + } + + //data structure = CAshift[vert/hor][colour] + //dir : 0=vert, 1=hor + + //offset gives NW corner of square containing the min; dir : 0=vert, 1=hor + if (fabsf(CAshift[dir][c]) < 2.0f) { + blockavethr[dir][c] += CAshift[dir][c]; + blocksqavethr[dir][c] += SQR(CAshift[dir][c]); + blockdenomthr[dir][c] += 1; + } + //evaluate the shifts to the location that minimizes CA within the tile + blockshifts[vblock * hblsz + hblock][c][dir] = CAshift[dir][c]; //vert/hor CA shift for R/B + }//vert/hor + }//colour + + if (plistener) { + progresscounter++; + + if (progresscounter % 8 == 0) { +#ifdef _OPENMP + #pragma omp critical (cadetectpass1) +#endif + { + progress += 4.0 * SQR(ts - border2) / (iterations * height * width); + progress = std::min(progress, 1.0); + plistener->setProgress(progress); + } } } } - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - //fill borders - if (rrmin > 0) { - for (int rr = 0; rr < border; rr++) - for (int cc = ccmin; cc < ccmax; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; - rgb[1][rr * ts + cc] = rgb[1][(border2 - rr) * ts + cc]; - } + } + //end of diagnostic pass +#ifdef _OPENMP + #pragma omp critical (cadetectpass2) +#endif + { + for (int dir = 0; dir < 2; dir++) { + for (int c = 0; c < 2; c++) { + blockdenom[dir][c] += blockdenomthr[dir][c]; + blocksqave[dir][c] += blocksqavethr[dir][c]; + blockave[dir][c] += blockavethr[dir][c]; + } } + } +#ifdef _OPENMP + #pragma omp barrier +#endif - if (rrmax < rr1) { - 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; - if ((c & 1) == 0) { - rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + left + cc) >> 1]; +#ifdef _OPENMP + #pragma omp single +#endif + { + for (int dir = 0; dir < 2; dir++) + for (int c = 0; c < 2; c++) { + if (blockdenom[dir][c]) { + blockvar[dir][c] = blocksqave[dir][c] / blockdenom[dir][c] - SQR(blockave[dir][c] / blockdenom[dir][c]); + } else { + processpasstwo = false; + std::cout << "blockdenom vanishes" << std::endl; + break; + } + } + + //now prepare for CA correction pass + //first, fill border blocks of blockshift array + if (processpasstwo) { + for (int vblock = 1; vblock < vblsz - 1; vblock++) { //left and right sides + for (int c = 0; c < 2; c++) { + for (int i = 0; i < 2; i++) { + blockshifts[vblock * hblsz][c][i] = blockshifts[(vblock) * hblsz + 2][c][i]; + blockshifts[vblock * hblsz + hblsz - 1][c][i] = blockshifts[(vblock) * hblsz + hblsz - 3][c][i]; } } - } + } - if (ccmin > 0) { - for (int rr = rrmin; rr < rrmax; rr++) - for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; - rgb[1][rr * ts + cc] = rgb[1][rr * ts + border2 - cc]; - } - } - - if (ccmax < cc1) { - for (int rr = rrmin; rr < rrmax; rr++) - 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) { - rgb[1][rr * ts + ccmax + cc] = Gtmp[((top + rr) * width + (width - cc - 2)) >> 1]; + for (int hblock = 0; hblock < hblsz; hblock++) { //top and bottom sides + for (int c = 0; c < 2; c++) { + for (int i = 0; i < 2; i++) { + blockshifts[hblock][c][i] = blockshifts[2 * hblsz + hblock][c][i]; + blockshifts[(vblsz - 1)*hblsz + hblock][c][i] = blockshifts[(vblsz - 3) * hblsz + hblock][c][i]; } } - } + } - //also, fill the image corners - if (rrmin > 0 && ccmin > 0) { - for (int rr = 0; rr < border; rr++) - for (int cc = 0; cc < border; cc++) { - int c = FC(rr, cc); - rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = (rawData[border2 - rr][border2 - cc]) / 65535.f; - if ((c & 1) == 0) { - rgb[1][rr * ts + cc] = Gtmp[((border2 - rr) * width + border2 - cc) >> 1]; + //end of filling border pixels of blockshift array + + //initialize fit arrays + double polymat[2][2][256], shiftmat[2][2][16]; + + for (int i = 0; i < 256; i++) { + polymat[0][0][i] = polymat[0][1][i] = polymat[1][0][i] = polymat[1][1][i] = 0; + } + + for (int i = 0; i < 16; i++) { + shiftmat[0][0][i] = shiftmat[0][1][i] = shiftmat[1][0][i] = shiftmat[1][1][i] = 0; + } + + int numblox[2] = {0, 0}; + + for (int vblock = 1; vblock < vblsz - 1; vblock++) { + for (int hblock = 1; hblock < hblsz - 1; hblock++) { + // block 3x3 median of blockshifts for robustness + for (int c = 0; c < 2; c ++) { + float bstemp[2]; + for (int dir = 0; dir < 2; dir++) { + //temporary storage for median filter + const std::array p = { + blockshifts[(vblock - 1) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock - 1) * hblsz + hblock][c][dir], + blockshifts[(vblock - 1) * hblsz + hblock + 1][c][dir], + blockshifts[(vblock) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock) * hblsz + hblock][c][dir], + blockshifts[(vblock) * hblsz + hblock + 1][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock - 1][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock][c][dir], + blockshifts[(vblock + 1) * hblsz + hblock + 1][c][dir] + }; + bstemp[dir] = median(p); + } + + //now prepare coefficient matrix; use only data points within caAutostrength/2 std devs of zero + if (SQR(bstemp[0]) > caAutostrength * blockvar[0][c] || SQR(bstemp[1]) > caAutostrength * blockvar[1][c]) { + continue; + } + + numblox[c]++; + + for (int dir = 0; dir < 2; dir++) { + double powVblockInit = 1.0; + for (int i = 0; i < polyord; i++) { + double powHblockInit = 1.0; + for (int j = 0; j < polyord; j++) { + double powVblock = powVblockInit; + for (int m = 0; m < polyord; m++) { + double powHblock = powHblockInit; + for (int n = 0; n < polyord; n++) { + polymat[c][dir][numpar * (polyord * i + j) + (polyord * m + n)] += powVblock * powHblock * blockwt[vblock * hblsz + hblock]; + powHblock *= hblock; + } + powVblock *= vblock; + } + shiftmat[c][dir][(polyord * i + j)] += powVblockInit * powHblockInit * bstemp[dir] * blockwt[vblock * hblsz + hblock]; + powHblockInit *= hblock; + } + powVblockInit *= vblock; + }//monomials + }//dir + }//c + }//blocks + } + numblox[1] = min(numblox[0], numblox[1]); + + //if too few data points, restrict the order of the fit to linear + if (numblox[1] < 32) { + polyord = 2; + numpar = 4; + + if (numblox[1] < 10) { + std::cout << "numblox = " << numblox[1] << std::endl; + processpasstwo = false; + } + } + + if (processpasstwo) { + //fit parameters to blockshifts + for (int c = 0; c < 2; c++) { + for (int dir = 0; dir < 2; dir++) { + if (!LinEqSolve(numpar, polymat[c][dir], shiftmat[c][dir], fitparams[c][dir])) { + std::cout << "CA correction pass failed -- can't solve linear equations for colour %d direction " << c << std::endl; + processpasstwo = false; + } } } + } } + //fitparams[polyord*i+j] gives the coefficients of (vblock^i hblock^j) in a polynomial fit for i,j<=4 + } + //end of initialization for CA correction pass + //only executed if autoCA is true + } - if (rrmax < rr1 && ccmax < cc1) { - for (int rr = 0; rr < std::min(border, rr1 - rrmax); rr++) - for (int cc = 0; cc < std::min(border, cc1 - ccmax); cc++) { + // Main algorithm: Tile loop + if (processpasstwo) { + float* grbdiff = (float (*)) (data + 2 * sizeof(float) * ts * ts + 3 * 64); // there is no overlap in buffer usage => share + //green interpolated to optical sample points for R/B + float* gshift = (float (*)) (data + 2 * sizeof(float) * ts * ts + sizeof(float) * ts * tsh + 4 * 64); // there is no overlap in buffer usage => share +#ifdef _OPENMP + #pragma omp for schedule(dynamic, chunkSize) collapse(2) +#endif + for (int top = -border; top < height; top += ts - border2) { + for (int left = -border; left < width - (W & 1); left += ts - border2) { + memset(bufferThr, 0, buffersizePassTwo); + 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 - (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 - (W & 1)) ? width - (W & 1) - left : cc1; + + // rgb from input CFA data + // rgb values should be floating point number between 0 and 1 + // after white balance multipliers are applied + +#ifdef __SSE2__ + vfloat c65535v = F2V(65535.f); + vmask gmask = _mm_set_epi32(0, 0xffffffff, 0, 0xffffffff); +#endif + for (int rr = rrmin; rr < rrmax; rr++) { + int row = rr + top; + int cc = ccmin; + int col = cc + left; + int indx = row * width + col; + int indx1 = rr * ts + cc; +#ifdef __SSE2__ + int c = FC(rr, cc); + if (c & 1) { + rgb[1][indx1] = rawData[row][col] / 65535.f; + indx++; + indx1++; + cc++; + col++; + c = FC(rr, cc); + } + for (; cc < ccmax - 7; cc += 8, col += 8, indx += 8, indx1 += 8) { + vfloat val1v = LVFU(rawData[row][col]) / c65535v; + vfloat val2v = LVFU(rawData[row][col + 4]) / c65535v; + STVFU(rgb[c][indx1 >> 1], _mm_shuffle_ps(val1v, val2v, _MM_SHUFFLE(2, 0, 2, 0))); + vfloat gtmpv = LVFU(Gtmp[indx >> 1]); + STVFU(rgb[1][indx1], vself(gmask, PERMUTEPS(gtmpv, _MM_SHUFFLE(1, 1, 0, 0)), val1v)); + STVFU(rgb[1][indx1 + 4], vself(gmask, PERMUTEPS(gtmpv, _MM_SHUFFLE(3, 3, 2, 2)), val2v)); + } +#endif + for (; cc < ccmax; cc++, col++, indx++, indx1++) { int c = FC(rr, cc); - rgb[c][((rrmax + rr)*ts + ccmax + cc) >> ((c & 1) ^ 1)] = (rawData[(height - rr - 2)][(width - cc - 2)]) / 65535.f; + rgb[c][indx1 >> ((c & 1) ^ 1)] = rawData[row][col] / 65535.f; + if ((c & 1) == 0) { - rgb[1][(rrmax + rr)*ts + ccmax + cc] = Gtmp[((height - rr - 2) * width + (width - cc - 2)) >> 1]; + rgb[1][indx1] = Gtmp[indx >> 1]; } } - } + } - if (rrmin > 0 && ccmax < cc1) { - for (int rr = 0; rr < border; rr++) - 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) { - rgb[1][rr * ts + ccmax + cc] = Gtmp[((border2 - rr) * width + (width - cc - 2)) >> 1]; + //fill borders + if (rrmin > 0) { + for (int rr = 0; rr < border; rr++) { + for (int cc = ccmin; cc < ccmax; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][((border2 - rr) * ts + cc) >> ((c & 1) ^ 1)]; + rgb[1][rr * ts + cc] = rgb[1][(border2 - rr) * ts + cc]; } } - } + } - if (rrmax < rr1 && ccmin > 0) { - 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; - if ((c & 1) == 0) { - rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + (border2 - cc)) >> 1]; + if (rrmax < rr1) { + 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; + if ((c & 1) == 0) { + rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + left + cc) >> 1]; + } } } - } + } - //end of border fill - // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (ccmin > 0) { + for (int rr = rrmin; rr < rrmax; rr++) { + for (int cc = 0; cc < border; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = rgb[c][(rr * ts + border2 - cc) >> ((c & 1) ^ 1)]; + rgb[1][rr * ts + cc] = rgb[1][rr * ts + border2 - cc]; + } + } + } - if (!autoCA) { - //manual CA correction; use red/blue slider values to set CA shift parameters - for (int rr = 3; rr < rr1 - 3; rr++) - for (int cc = 3, indx = rr * ts + cc; cc < cc1 - 3; cc++, indx++) { - int c = FC(rr, cc); + if (ccmax < cc1) { + for (int rr = rrmin; rr < rrmax; rr++) { + 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) { + rgb[1][rr * ts + ccmax + cc] = Gtmp[((top + rr) * width + (width - cc - 2)) >> 1]; + } + } + } + } - if (c != 1) { + //also, fill the image corners + if (rrmin > 0 && ccmin > 0) { + for (int rr = 0; rr < border; rr++) { + for (int cc = 0; cc < border; cc++) { + int c = FC(rr, cc); + rgb[c][(rr * ts + cc) >> ((c & 1) ^ 1)] = (rawData[border2 - rr][border2 - cc]) / 65535.f; + if ((c & 1) == 0) { + rgb[1][rr * ts + cc] = Gtmp[((border2 - rr) * width + border2 - cc) >> 1]; + } + } + } + } + + if (rrmax < rr1 && ccmax < cc1) { + 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) { + rgb[1][(rrmax + rr)*ts + ccmax + cc] = Gtmp[((height - rr - 2) * width + (width - cc - 2)) >> 1]; + } + } + } + } + + if (rrmin > 0 && ccmax < cc1) { + for (int rr = 0; rr < border; rr++) { + 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) { + rgb[1][rr * ts + ccmax + cc] = Gtmp[((border2 - rr) * width + (width - cc - 2)) >> 1]; + } + } + } + } + + if (rrmax < rr1 && ccmin > 0) { + 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; + if ((c & 1) == 0) { + rgb[1][(rrmax + rr)*ts + cc] = Gtmp[((height - rr - 2) * width + (border2 - cc)) >> 1]; + } + } + } + } + //end of border fill + + if (!autoCA || fitParamsIn) { +#ifdef __SSE2__ + const vfloat onev = F2V(1.f); + const vfloat epsv = F2V(eps); +#endif + //manual CA correction; use red/blue slider values to set CA shift parameters + for (int rr = 3; rr < rr1 - 3; rr++) { + int cc = 3 + FC(rr, 1), c = FC(rr,cc), indx = rr * ts + cc; +#ifdef __SSE2__ + for (; cc < cc1 - 10; cc += 8, indx += 8) { + //compute directional weights using image gradients + vfloat val1v = epsv + vabsf(LC2VFU(rgb[1][(rr + 1) * ts + cc]) - LC2VFU(rgb[1][(rr - 1) * ts + cc])); + vfloat val2v = epsv + vabsf(LC2VFU(rgb[1][indx + 1]) - LC2VFU(rgb[1][indx - 1])); + vfloat wtuv = onev / SQRV(val1v + vabsf(LVFU(rgb[c][(rr * ts + cc) >> 1]) - LVFU(rgb[c][((rr - 2) * ts + cc) >> 1])) + vabsf(LC2VFU(rgb[1][(rr - 1) * ts + cc]) - LC2VFU(rgb[1][(rr - 3) * ts + cc]))); + vfloat wtdv = onev / SQRV(val1v + vabsf(LVFU(rgb[c][(rr * ts + cc) >> 1]) - LVFU(rgb[c][((rr + 2) * ts + cc) >> 1])) + vabsf(LC2VFU(rgb[1][(rr + 1) * ts + cc]) - LC2VFU(rgb[1][(rr + 3) * ts + cc]))); + vfloat wtlv = onev / SQRV(val2v + vabsf(LVFU(rgb[c][indx >> 1]) - LVFU(rgb[c][(indx - 2) >> 1])) + vabsf(LC2VFU(rgb[1][indx - 1]) - LC2VFU(rgb[1][indx - 3]))); + vfloat wtrv = onev / SQRV(val2v + vabsf(LVFU(rgb[c][indx >> 1]) - LVFU(rgb[c][(indx + 2) >> 1])) + vabsf(LC2VFU(rgb[1][indx + 1]) - LC2VFU(rgb[1][indx + 3]))); + + //store in rgb array the interpolated G value at R/B grid points using directional weighted average + vfloat result = (wtuv * LC2VFU(rgb[1][indx - v1]) + wtdv * LC2VFU(rgb[1][indx + v1]) + wtlv * LC2VFU(rgb[1][indx - 1]) + wtrv * LC2VFU(rgb[1][indx + 1])) / (wtuv + wtdv + wtlv + wtrv); + STC2VFU(rgb[1][indx], result); + } +#endif + for (; cc < cc1 - 3; cc += 2, indx += 2) { //compute directional weights using image gradients float wtu = 1.f / SQR(eps + fabsf(rgb[1][(rr + 1) * ts + cc] - rgb[1][(rr - 1) * ts + cc]) + fabsf(rgb[c][(rr * ts + cc) >> 1] - rgb[c][((rr - 2) * ts + cc) >> 1]) + fabsf(rgb[1][(rr - 1) * ts + cc] - rgb[1][(rr - 3) * ts + cc])); - float wtd = 1.f / SQR(eps + fabsf(rgb[1][(rr - 1) * ts + cc] - rgb[1][(rr + 1) * ts + cc]) + fabsf(rgb[c][(rr * ts + cc) >> 1] - rgb[c][((rr + 2) * ts + cc) >> 1]) + fabsf(rgb[1][(rr + 1) * ts + cc] - rgb[1][(rr + 3) * ts + cc])); + float wtd = 1.f / SQR(eps + fabsf(rgb[1][(rr + 1) * ts + cc] - rgb[1][(rr - 1) * ts + cc]) + fabsf(rgb[c][(rr * ts + cc) >> 1] - rgb[c][((rr + 2) * ts + cc) >> 1]) + fabsf(rgb[1][(rr + 1) * ts + cc] - rgb[1][(rr + 3) * ts + cc])); float wtl = 1.f / SQR(eps + fabsf(rgb[1][rr * ts + cc + 1] - rgb[1][rr * ts + cc - 1]) + fabsf(rgb[c][(rr * ts + cc) >> 1] - rgb[c][(rr * ts + cc - 2) >> 1]) + fabsf(rgb[1][rr * ts + cc - 1] - rgb[1][rr * ts + cc - 3])); - float wtr = 1.f / SQR(eps + fabsf(rgb[1][rr * ts + cc - 1] - rgb[1][rr * ts + cc + 1]) + fabsf(rgb[c][(rr * ts + cc) >> 1] - rgb[c][(rr * ts + cc + 2) >> 1]) + fabsf(rgb[1][rr * ts + cc + 1] - rgb[1][rr * ts + cc + 3])); + float wtr = 1.f / SQR(eps + fabsf(rgb[1][rr * ts + cc + 1] - rgb[1][rr * ts + cc - 1]) + fabsf(rgb[c][(rr * ts + cc) >> 1] - rgb[c][(rr * ts + cc + 2) >> 1]) + fabsf(rgb[1][rr * ts + cc + 1] - rgb[1][rr * ts + cc + 3])); //store in rgb array the interpolated G value at R/B grid points using directional weighted average rgb[1][indx] = (wtu * rgb[1][indx - v1] + wtd * rgb[1][indx + v1] + wtl * rgb[1][indx - 1] + wtr * rgb[1][indx + 1]) / (wtu + wtd + wtl + wtr); } - } - - float hfrac = -((float)(hblock - 0.5) / (hblsz - 2) - 0.5); - float vfrac = -((float)(vblock - 0.5) / (vblsz - 2) - 0.5) * height / width; - lblockshifts[0][0] = 2 * vfrac * cared; - lblockshifts[0][1] = 2 * hfrac * cared; - lblockshifts[1][0] = 2 * vfrac * cablue; - lblockshifts[1][1] = 2 * hfrac * cablue; - } else { - //CA auto correction; use CA diagnostic pass to set shift parameters - lblockshifts[0][0] = lblockshifts[0][1] = 0; - lblockshifts[1][0] = lblockshifts[1][1] = 0; - double powVblock = 1.0; - for (int i = 0; i < polyord; i++) { - double powHblock = powVblock; - for (int j = 0; j < polyord; j++) { - //printf("i= %d j= %d polycoeff= %f \n",i,j,fitparams[0][0][polyord*i+j]); - lblockshifts[0][0] += powHblock * fitparams[0][0][polyord * i + j]; - lblockshifts[0][1] += powHblock * fitparams[0][1][polyord * i + j]; - lblockshifts[1][0] += powHblock * fitparams[1][0][polyord * i + j]; - lblockshifts[1][1] += powHblock * fitparams[1][1][polyord * i + j]; - powHblock *= hblock; - } - powVblock *= vblock; - } - constexpr float bslim = 3.99; //max allowed CA shift - lblockshifts[0][0] = LIM(lblockshifts[0][0], -bslim, bslim); - lblockshifts[0][1] = LIM(lblockshifts[0][1], -bslim, bslim); - lblockshifts[1][0] = LIM(lblockshifts[1][0], -bslim, bslim); - lblockshifts[1][1] = LIM(lblockshifts[1][1], -bslim, bslim); - }//end of setting CA shift parameters - - - for (int c = 0; c < 3; c += 2) { - - //some parameters for the bilinear interpolation - shiftvfloor[c] = floor((float)lblockshifts[c>>1][0]); - shiftvceil[c] = ceil((float)lblockshifts[c>>1][0]); - shiftvfrac[c] = lblockshifts[c>>1][0] - shiftvfloor[c]; - - shifthfloor[c] = floor((float)lblockshifts[c>>1][1]); - shifthceil[c] = ceil((float)lblockshifts[c>>1][1]); - shifthfrac[c] = lblockshifts[c>>1][1] - shifthfloor[c]; - - GRBdir[0][c] = lblockshifts[c>>1][0] > 0 ? 2 : -2; - GRBdir[1][c] = lblockshifts[c>>1][1] > 0 ? 2 : -2; - - } - - - for (int rr = 4; rr < rr1 - 4; rr++) { - int cc = 4 + (FC(rr, 2) & 1); - int c = FC(rr, cc); - int indx = (rr * ts + cc) >> 1; - int indxfc = (rr + shiftvfloor[c]) * ts + cc + shifthceil[c]; - int indxff = (rr + shiftvfloor[c]) * ts + cc + shifthfloor[c]; - int indxcc = (rr + shiftvceil[c]) * ts + cc + shifthceil[c]; - int indxcf = (rr + shiftvceil[c]) * ts + cc + shifthfloor[c]; -#ifdef __SSE2__ - vfloat shifthfracv = F2V(shifthfrac[c]); - vfloat shiftvfracv = F2V(shiftvfrac[c]); - for (; cc < cc1 - 10; cc += 8, indxfc += 8, indxff += 8, indxcc += 8, indxcf += 8, indx += 4) { - //perform CA correction using colour ratios or colour differences - vfloat Ginthfloorv = vintpf(shifthfracv, LC2VFU(rgb[1][indxfc]), LC2VFU(rgb[1][indxff])); - vfloat Ginthceilv = vintpf(shifthfracv, LC2VFU(rgb[1][indxcc]), LC2VFU(rgb[1][indxcf])); - //Gint is bilinear interpolation of G at CA shift point - vfloat Gintv = vintpf(shiftvfracv, Ginthceilv, Ginthfloorv); - - //determine R/B at grid points using colour differences at shift point plus interpolated G value at grid point - //but first we need to interpolate G-R/G-B to grid points... - STVFU(grbdiff[indx], Gintv - LVFU(rgb[c][indx])); - STVFU(gshift[indx], Gintv); } -#endif - for (; cc < cc1 - 4; cc += 2, indxfc += 2, indxff += 2, indxcc += 2, indxcf += 2, ++indx) { - //perform CA correction using colour ratios or colour differences - float Ginthfloor = intp(shifthfrac[c], rgb[1][indxfc], rgb[1][indxff]); - float Ginthceil = intp(shifthfrac[c], rgb[1][indxcc], rgb[1][indxcf]); - //Gint is bilinear interpolation of G at CA shift point - float Gint = intp(shiftvfrac[c], Ginthceil, Ginthfloor); - - //determine R/B at grid points using colour differences at shift point plus interpolated G value at grid point - //but first we need to interpolate G-R/G-B to grid points... - grbdiff[indx] = Gint - rgb[c][indx]; - gshift[indx] = Gint; - } - } - - shifthfrac[0] /= 2.f; - shifthfrac[2] /= 2.f; - shiftvfrac[0] /= 2.f; - shiftvfrac[2] /= 2.f; - -#ifdef __SSE2__ - vfloat zd25v = F2V(0.25f); - vfloat onev = F2V(1.f); - vfloat zd5v = F2V(0.5f); - vfloat epsv = F2V(eps); -#endif - for (int rr = 8; rr < rr1 - 8; rr++) { - int cc = 8 + (FC(rr, 2) & 1); - int c = FC(rr, cc); - int GRBdir0 = GRBdir[0][c]; - int GRBdir1 = GRBdir[1][c]; -#ifdef __SSE2__ - vfloat shifthfracc = F2V(shifthfrac[c]); - vfloat shiftvfracc = F2V(shiftvfrac[c]); - for (int indx = rr * ts + cc; cc < cc1 - 14; cc += 8, indx += 8) { - //interpolate colour difference from optical R/B locations to grid locations - vfloat grbdiffinthfloor = vintpf(shifthfracc, LVFU(grbdiff[(indx - GRBdir1) >> 1]), LVFU(grbdiff[indx >> 1])); - vfloat grbdiffinthceil = vintpf(shifthfracc, LVFU(grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1]), LVFU(grbdiff[((rr - GRBdir0) * ts + cc) >> 1])); - //grbdiffint is bilinear interpolation of G-R/G-B at grid point - vfloat grbdiffint = vintpf(shiftvfracc, grbdiffinthceil, grbdiffinthfloor); - - //now determine R/B at grid points using interpolated colour differences and interpolated G value at grid point - vfloat cinv = LVFU(rgb[c][indx >> 1]); - vfloat rinv = LC2VFU(rgb[1][indx]); - vfloat RBint = rinv - grbdiffint; - vmask cmask = vmaskf_ge(vabsf(RBint - cinv), zd25v * (RBint + cinv)); - if(_mm_movemask_ps((vfloat)cmask)) { - // if for any of the 4 pixels the condition is true, do the math for all 4 pixels and mask the unused out at the end - //gradient weights using difference from G at CA shift points and G at grid points - vfloat p0 = onev / (epsv + vabsf(rinv - LVFU(gshift[indx >> 1]))); - vfloat p1 = onev / (epsv + vabsf(rinv - LVFU(gshift[(indx - GRBdir1) >> 1]))); - vfloat p2 = onev / (epsv + vabsf(rinv - LVFU(gshift[((rr - GRBdir0) * ts + cc) >> 1]))); - vfloat p3 = onev / (epsv + vabsf(rinv - LVFU(gshift[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1]))); - - grbdiffint = vself(cmask, (p0 * LVFU(grbdiff[indx >> 1]) + p1 * LVFU(grbdiff[(indx - GRBdir1) >> 1]) + - p2 * LVFU(grbdiff[((rr - GRBdir0) * ts + cc) >> 1]) + p3 * LVFU(grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1])) / (p0 + p1 + p2 + p3), grbdiffint); - - } - vfloat grbdiffold = rinv - cinv; - RBint = rinv - grbdiffint; - RBint = vself(vmaskf_gt(vabsf(grbdiffold), vabsf(grbdiffint)), RBint, cinv); - RBint = vself(vmaskf_lt(grbdiffold * grbdiffint, ZEROV), rinv - zd5v * (grbdiffold + grbdiffint), RBint); - STVFU(rgb[c][indx >> 1], RBint); - } -#endif - for (int c = FC(rr, cc), indx = rr * ts + cc; cc < cc1 - 8; cc += 2, indx += 2) { - float grbdiffold = rgb[1][indx] - rgb[c][indx >> 1]; - - //interpolate colour difference from optical R/B locations to grid locations - float grbdiffinthfloor = intp(shifthfrac[c], grbdiff[(indx - GRBdir1) >> 1], grbdiff[indx >> 1]); - float grbdiffinthceil = intp(shifthfrac[c], grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1], grbdiff[((rr - GRBdir0) * ts + cc) >> 1]); - //grbdiffint is bilinear interpolation of G-R/G-B at grid point - float grbdiffint = intp(shiftvfrac[c], grbdiffinthceil, grbdiffinthfloor); - - //now determine R/B at grid points using interpolated colour differences and interpolated G value at grid point - float RBint = rgb[1][indx] - grbdiffint; - - if (fabsf(RBint - rgb[c][indx >> 1]) < 0.25f * (RBint + rgb[c][indx >> 1])) { - if (fabsf(grbdiffold) > fabsf(grbdiffint) ) { - rgb[c][indx >> 1] = RBint; + if (!autoCA) { + float hfrac = -((float)(hblock - 0.5) / (hblsz - 2) - 0.5); + float vfrac = -((float)(vblock - 0.5) / (vblsz - 2) - 0.5) * height / width; + lblockshifts[0][0] = 2 * vfrac * cared; + lblockshifts[0][1] = 2 * hfrac * cared; + lblockshifts[1][0] = 2 * vfrac * cablue; + lblockshifts[1][1] = 2 * hfrac * cablue; + } else { + //CA auto correction; use CA diagnostic pass to set shift parameters + lblockshifts[0][0] = lblockshifts[0][1] = 0; + lblockshifts[1][0] = lblockshifts[1][1] = 0; + double powVblock = 1.0; + for (int i = 0; i < polyord; i++) { + double powHblock = powVblock; + for (int j = 0; j < polyord; j++) { + lblockshifts[0][0] += powHblock * fitparams[0][0][polyord * i + j]; + lblockshifts[0][1] += powHblock * fitparams[0][1][polyord * i + j]; + lblockshifts[1][0] += powHblock * fitparams[1][0][polyord * i + j]; + lblockshifts[1][1] += powHblock * fitparams[1][1][polyord * i + j]; + powHblock *= hblock; } - } else { + powVblock *= vblock; + } + constexpr float bslim = 3.99; //max allowed CA shift + lblockshifts[0][0] = LIM(lblockshifts[0][0], -bslim, bslim); + lblockshifts[0][1] = LIM(lblockshifts[0][1], -bslim, bslim); + lblockshifts[1][0] = LIM(lblockshifts[1][0], -bslim, bslim); + lblockshifts[1][1] = LIM(lblockshifts[1][1], -bslim, bslim); + }//end of setting CA shift parameters - //gradient weights using difference from G at CA shift points and G at grid points - float p0 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[indx >> 1])); - float p1 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[(indx - GRBdir1) >> 1])); - float p2 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[((rr - GRBdir0) * ts + cc) >> 1])); - float p3 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1])); + for (int c = 0; c < 3; c += 2) { - grbdiffint = (p0 * grbdiff[indx >> 1] + p1 * grbdiff[(indx - GRBdir1) >> 1] + - p2 * grbdiff[((rr - GRBdir0) * ts + cc) >> 1] + p3 * grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1]) / (p0 + p1 + p2 + p3) ; + //some parameters for the bilinear interpolation + shiftvfloor[c] = floor((float)lblockshifts[c>>1][0]); + shiftvceil[c] = ceil((float)lblockshifts[c>>1][0]); + if (lblockshifts[c>>1][0] < 0.f) { + std::swap(shiftvfloor[c], shiftvceil[c]); + } + shiftvfrac[c] = fabs(lblockshifts[c>>1][0] - shiftvfloor[c]); + + shifthfloor[c] = floor((float)lblockshifts[c>>1][1]); + shifthceil[c] = ceil((float)lblockshifts[c>>1][1]); + if (lblockshifts[c>>1][1] < 0.f) { + std::swap(shifthfloor[c], shifthceil[c]); + } + shifthfrac[c] = fabs(lblockshifts[c>>1][1] - shifthfloor[c]); + + GRBdir[0][c] = lblockshifts[c>>1][0] > 0 ? 2 : -2; + GRBdir[1][c] = lblockshifts[c>>1][1] > 0 ? 2 : -2; + } + + for (int rr = 4; rr < rr1 - 4; rr++) { + int cc = 4 + (FC(rr, 2) & 1); + int c = FC(rr, cc); + int indx = (rr * ts + cc) >> 1; + int indxfc = (rr + shiftvfloor[c]) * ts + cc + shifthceil[c]; + int indxff = (rr + shiftvfloor[c]) * ts + cc + shifthfloor[c]; + int indxcc = (rr + shiftvceil[c]) * ts + cc + shifthceil[c]; + int indxcf = (rr + shiftvceil[c]) * ts + cc + shifthfloor[c]; +#ifdef __SSE2__ + vfloat shifthfracv = F2V(shifthfrac[c]); + vfloat shiftvfracv = F2V(shiftvfrac[c]); + for (; cc < cc1 - 10; cc += 8, indxfc += 8, indxff += 8, indxcc += 8, indxcf += 8, indx += 4) { + //perform CA correction using colour ratios or colour differences + vfloat Ginthfloorv = vintpf(shifthfracv, LC2VFU(rgb[1][indxfc]), LC2VFU(rgb[1][indxff])); + vfloat Ginthceilv = vintpf(shifthfracv, LC2VFU(rgb[1][indxcc]), LC2VFU(rgb[1][indxcf])); + //Gint is bilinear interpolation of G at CA shift point + vfloat Gintv = vintpf(shiftvfracv, Ginthceilv, Ginthfloorv); + + //determine R/B at grid points using colour differences at shift point plus interpolated G value at grid point + //but first we need to interpolate G-R/G-B to grid points... + STVFU(grbdiff[indx], Gintv - LVFU(rgb[c][indx])); + STVFU(gshift[indx], Gintv); + } + +#endif + for (; cc < cc1 - 4; cc += 2, indxfc += 2, indxff += 2, indxcc += 2, indxcf += 2, ++indx) { + //perform CA correction using colour ratios or colour differences + float Ginthfloor = intp(shifthfrac[c], rgb[1][indxfc], rgb[1][indxff]); + float Ginthceil = intp(shifthfrac[c], rgb[1][indxcc], rgb[1][indxcf]); + //Gint is bilinear interpolation of G at CA shift point + float Gint = intp(shiftvfrac[c], Ginthceil, Ginthfloor); + + //determine R/B at grid points using colour differences at shift point plus interpolated G value at grid point + //but first we need to interpolate G-R/G-B to grid points... + grbdiff[indx] = Gint - rgb[c][indx]; + gshift[indx] = Gint; + } + } + + shifthfrac[0] /= 2.f; + shifthfrac[2] /= 2.f; + shiftvfrac[0] /= 2.f; + shiftvfrac[2] /= 2.f; + +#ifdef __SSE2__ + vfloat zd25v = F2V(0.25f); + vfloat onev = F2V(1.f); + vfloat zd5v = F2V(0.5f); + vfloat epsv = F2V(eps); +#endif + for (int rr = 8; rr < rr1 - 8; rr++) { + int cc = 8 + (FC(rr, 2) & 1); + int c = FC(rr, cc); + int GRBdir0 = GRBdir[0][c]; + int GRBdir1 = GRBdir[1][c]; +#ifdef __SSE2__ + vfloat shifthfracc = F2V(shifthfrac[c]); + vfloat shiftvfracc = F2V(shiftvfrac[c]); + for (int indx = rr * ts + cc; cc < cc1 - 14; cc += 8, indx += 8) { + //interpolate colour difference from optical R/B locations to grid locations + vfloat grbdiffinthfloor = vintpf(shifthfracc, LVFU(grbdiff[(indx - GRBdir1) >> 1]), LVFU(grbdiff[indx >> 1])); + vfloat grbdiffinthceil = vintpf(shifthfracc, LVFU(grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1]), LVFU(grbdiff[((rr - GRBdir0) * ts + cc) >> 1])); + //grbdiffint is bilinear interpolation of G-R/G-B at grid point + vfloat grbdiffint = vintpf(shiftvfracc, grbdiffinthceil, grbdiffinthfloor); //now determine R/B at grid points using interpolated colour differences and interpolated G value at grid point - if (fabsf(grbdiffold) > fabsf(grbdiffint) ) { - rgb[c][indx >> 1] = rgb[1][indx] - grbdiffint; + vfloat cinv = LVFU(rgb[c][indx >> 1]); + vfloat rinv = LC2VFU(rgb[1][indx]); + vfloat RBint = rinv - grbdiffint; + vmask cmask = vmaskf_ge(vabsf(RBint - cinv), zd25v * (RBint + cinv)); + if (_mm_movemask_ps((vfloat)cmask)) { + // if for any of the 4 pixels the condition is true, do the math for all 4 pixels and mask the unused out at the end + //gradient weights using difference from G at CA shift points and G at grid points + vfloat p0 = onev / (epsv + vabsf(rinv - LVFU(gshift[indx >> 1]))); + vfloat p1 = onev / (epsv + vabsf(rinv - LVFU(gshift[(indx - GRBdir1) >> 1]))); + vfloat p2 = onev / (epsv + vabsf(rinv - LVFU(gshift[((rr - GRBdir0) * ts + cc) >> 1]))); + vfloat p3 = onev / (epsv + vabsf(rinv - LVFU(gshift[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1]))); + + grbdiffint = vself(cmask, (p0 * LVFU(grbdiff[indx >> 1]) + p1 * LVFU(grbdiff[(indx - GRBdir1) >> 1]) + + p2 * LVFU(grbdiff[((rr - GRBdir0) * ts + cc) >> 1]) + p3 * LVFU(grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1])) / (p0 + p1 + p2 + p3), grbdiffint); + + } + vfloat grbdiffold = rinv - cinv; + RBint = rinv - grbdiffint; + RBint = vself(vmaskf_gt(vabsf(grbdiffold), vabsf(grbdiffint)), RBint, cinv); + RBint = vself(vmaskf_lt(grbdiffold * grbdiffint, ZEROV), rinv - zd5v * (grbdiffold + grbdiffint), RBint); + STVFU(rgb[c][indx >> 1], RBint); + } +#endif + for (int c = FC(rr, cc), indx = rr * ts + cc; cc < cc1 - 8; cc += 2, indx += 2) { + float grbdiffold = rgb[1][indx] - rgb[c][indx >> 1]; + + //interpolate colour difference from optical R/B locations to grid locations + float grbdiffinthfloor = intp(shifthfrac[c], grbdiff[(indx - GRBdir1) >> 1], grbdiff[indx >> 1]); + float grbdiffinthceil = intp(shifthfrac[c], grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1], grbdiff[((rr - GRBdir0) * ts + cc) >> 1]); + //grbdiffint is bilinear interpolation of G-R/G-B at grid point + float grbdiffint = intp(shiftvfrac[c], grbdiffinthceil, grbdiffinthfloor); + + //now determine R/B at grid points using interpolated colour differences and interpolated G value at grid point + float RBint = rgb[1][indx] - grbdiffint; + + if (fabsf(RBint - rgb[c][indx >> 1]) < 0.25f * (RBint + rgb[c][indx >> 1])) { + if (fabsf(grbdiffold) > fabsf(grbdiffint)) { + rgb[c][indx >> 1] = RBint; + } + } else { + + //gradient weights using difference from G at CA shift points and G at grid points + float p0 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[indx >> 1])); + float p1 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[(indx - GRBdir1) >> 1])); + float p2 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[((rr - GRBdir0) * ts + cc) >> 1])); + float p3 = 1.f / (eps + fabsf(rgb[1][indx] - gshift[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1])); + + grbdiffint = (p0 * grbdiff[indx >> 1] + p1 * grbdiff[(indx - GRBdir1) >> 1] + + p2 * grbdiff[((rr - GRBdir0) * ts + cc) >> 1] + p3 * grbdiff[((rr - GRBdir0) * ts + cc - GRBdir1) >> 1]) / (p0 + p1 + p2 + p3) ; + + //now determine R/B at grid points using interpolated colour differences and interpolated G value at grid point + if (fabsf(grbdiffold) > fabsf(grbdiffint)) { + rgb[c][indx >> 1] = rgb[1][indx] - grbdiffint; + } + } + + //if colour difference interpolation overshot the correction, just desaturate + if (grbdiffold * grbdiffint < 0) { + rgb[c][indx >> 1] = rgb[1][indx] - 0.5f * (grbdiffold + grbdiffint); } } + } - //if colour difference interpolation overshot the correction, just desaturate - if (grbdiffold * grbdiffint < 0) { - rgb[c][indx >> 1] = rgb[1][indx] - 0.5f * (grbdiffold + grbdiffint); + // copy CA corrected results to temporary image matrix + for (int rr = border; rr < rr1 - border; rr++) { + int c = FC(rr + top, left + border + (FC(rr + top, 2) & 1)); + int row = rr + top; + int cc = border + (FC(rr, 2) & 1); + int indx = (row * width + cc + left) >> 1; + int indx1 = (rr * ts + cc) >> 1; +#ifdef __SSE2__ + for (; indx < (row * width + cc1 - border - 7 + left) >> 1; indx+=4, indx1 += 4) { + STVFU(RawDataTmp[indx], c65535v * LVFU(rgb[c][indx1])); + } +#endif + for (; indx < (row * width + cc1 - border + left) >> 1; indx++, indx1++) { + RawDataTmp[indx] = 65535.f * rgb[c][indx1]; + } + } + + if (plistener) { + progresscounter++; + + if (progresscounter % 8 == 0) +#ifdef _OPENMP + #pragma omp critical (cacorrect) +#endif + { + progress += 4.0 * SQR(ts - border2) / (iterations * height * width); + progress = std::min(progress, 1.0); + plistener->setProgress(progress); } } } + } - // copy CA corrected results to temporary image matrix - for (int rr = border; rr < rr1 - border; rr++) { - int c = FC(rr + top, left + border + (FC(rr + top, 2) & 1)); - int row = rr + top; - int cc = border + (FC(rr, 2) & 1); - int indx = (row * width + cc + left) >> 1; - int indx1 = (rr * ts + cc) >> 1; -#ifdef __SSE2__ - for (; indx < (row * width + cc1 - border - 7 + left) >> 1; indx+=4, indx1 += 4) { - STVFU(RawDataTmp[indx], c65535v * LVFU(rgb[c][indx1])); - } + // copy temporary image matrix back to image matrix +#ifdef _OPENMP + #pragma omp for #endif - for (; indx < (row * width + cc1 - border + left) >> 1; indx++, indx1++) { - RawDataTmp[indx] = 65535.f * rgb[c][indx1]; + + for (int row = cb; row < height - cb; row++) { + int col = cb + (FC(row, 0) & 1); + int indx = (row * width + col) >> 1; +#ifdef __SSE2__ + for (; col < width - 7 - cb; col += 8, indx += 4) { + vfloat val = LVFU(RawDataTmp[indx]); + STC2VFU(rawData[row][col], val); + } +#endif + for (; col < width - cb; col += 2, indx++) { + rawData[row][col] = RawDataTmp[indx]; + } + } + + } + // clean up + free(bufferThr); + } + if (avoidColourshift) { + // to avoid or at least reduce the colour shift caused by raw ca correction we compute the per pixel difference factors + // of red and blue channel and apply a gaussian blur to them. + // Then we apply the resulting factors per pixel on the result of raw ca correction + +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef __SSE2__ + const vfloat onev = F2V(1.f); + const vfloat twov = F2V(2.f); + const vfloat zd5v = F2V(0.5f); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H - 2 * cb; ++i) { + const int firstCol = FC(i, 0) & 1; + const int colour = FC(i, firstCol); + const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; + int j = firstCol; +#ifdef __SSE2__ + for (; j < W - 7 - 2 * cb; j += 8) { + const vfloat newvals = LC2VFU(rawData[i + cb][j + cb]); + const vfloat oldvals = LVFU((*oldraw)[i][j / 2]); + vfloat factors = oldvals / newvals; + factors = vself(vmaskf_le(newvals, onev), onev, factors); + factors = vself(vmaskf_le(oldvals, onev), onev, factors); + STVFU((*nonGreen)[i/2][j/2], vclampf(factors, zd5v, twov)); + } +#endif + for (; j < W - 2 * cb; j += 2) { + (*nonGreen)[i/2][j/2] = (rawData[i + cb][j + cb] <= 1.f || (*oldraw)[i][j / 2] <= 1.f) ? 1.f : rtengine::LIM((*oldraw)[i][j / 2] / rawData[i + cb][j + cb], 0.5f, 2.f); + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + if (H % 2) { + // odd height => factors are not set in last row => use values of preceding row + for (int j = 0; j < (W + 1 - 2 * cb) / 2; ++j) { + (*redFactor)[(H - 2 * cb + 1) / 2 - 1][j] = (*redFactor)[(H - 2 * cb + 1) / 2 - 2][j]; + (*blueFactor)[(H - 2 * cb + 1) / 2 - 1][j] = (*blueFactor)[(H - 2 * cb + 1) / 2 - 2][j]; } } - if(plistener) { - progresscounter++; - - if(progresscounter % 8 == 0) - #pragma omp critical (cacorrect) - { - progress += (double)(8.0 * (ts - border2) * (ts - border2)) / (2 * height * width); - - if (progress > 1.0) { - progress = 1.0; - } - - plistener->setProgress(progress); + if (W % 2) { + // odd width => factors for one channel are not set in last column => use value of preceding column + const int ngRow = 1 - (FC(0, 0) & 1); + const int ngCol = FC(ngRow, 0) & 1; + const int colour = FC(ngRow, ngCol); + const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; + for (int i = 0; i < (H + 1 - 2 * cb) / 2; ++i) { + (*nonGreen)[i][(W - 2 * cb + 1) / 2 - 1] = (*nonGreen)[i][(W - 2* cb + 1) / 2 - 2]; } } - } - #pragma omp barrier -// copy temporary image matrix back to image matrix - #pragma omp for + // blur correction factors + gaussianBlur(*redFactor, *redFactor, (W + 1 - 2 * cb) / 2, (H + 1 - 2 * cb) / 2, 30.0); + gaussianBlur(*blueFactor, *blueFactor, (W + 1 - 2 * cb) / 2, (H + 1 - 2 * cb) / 2, 30.0); - for(int row = 0; row < height; row++) { - int col = FC(row, 0) & 1; - int indx = (row * width + col) >> 1; -#ifdef __SSE2__ - for(; col < width - 7; col += 8, indx += 4) { - STC2VFU(rawData[row][col], LVFU(RawDataTmp[indx])); - } + // apply correction factors to avoid (reduce) colour shift +#ifdef _OPENMP + #pragma omp for #endif - for(; col < width - (W & 1); col += 2, indx++) { - rawData[row][col] = RawDataTmp[indx]; + for (int i = 0; i < H - 2 * cb; ++i) { + const int firstCol = FC(i, 0) & 1; + const int colour = FC(i, firstCol); + const array2D* nonGreen = colour == 0 ? redFactor : blueFactor; + for (int j = firstCol; j < W - 2 * cb; j += 2) { + rawData[i + cb][j + cb] *= (*nonGreen)[i / 2][j / 2]; + } } } - } - - // clean up - free(buffer); } - free(Gtmp); - free(blockwt); - free(RawDataTmp); + if (autoCA && fitParamsTransfer && fitParamsOut) { + // store calculated parameters + int index = 0; + for (int c = 0; c < 2; ++c) { + for (int d = 0; d < 2; ++d) { + for (int e = 0; e < 16; ++e) { + fitParamsTransfer[index++] = fitparams[c][d][e]; + } + } + } + } - if(plistener) { + if (freeBuffer) { + free(buffer); + buffer = nullptr; + } + + if (avoidColourshift) { + delete oldraw; + delete redFactor; + delete blueFactor; + } + + if (plistener) { plistener->setProgress(1.0); } + return buffer; } diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 19e4472a3..347fa3f35 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -32,6 +32,7 @@ set(RTENGINESOURCEFILES EdgePreservingDecomposition.cc FTblockDN.cc PF_correct_RT.cc + ahd_demosaic_RT.cc alpha.cc amaze_demosaic_RT.cc cJSON.c @@ -53,14 +54,16 @@ set(RTENGINESOURCEFILES dfmanager.cc diagonalcurves.cc dirpyr_equalizer.cc + dual_demosaic_RT.cc dynamicprofile.cc - expo_before_b.cc + eahd_demosaic.cc fast_demo.cc ffmanager.cc flatcurves.cc gauss.cc green_equil_RT.cc hilite_recon.cc + hphd_demosaic_RT.cc iccjpeg.cc iccstore.cc icons.cc @@ -106,6 +109,7 @@ set(RTENGINESOURCEFILES profilestore.cc rawimage.cc rawimagesource.cc + rcd_demosaic.cc refreshmap.cc rt_algo.cc rtthumbnail.cc @@ -119,6 +123,16 @@ set(RTENGINESOURCEFILES tmo_fattal02.cc iplocalcontrast.cc histmatching.cc + pdaflinesfilter.cc + gamutwarning.cc + ipshadowshighlights.cc + xtrans_demosaic.cc + vng4_demosaic_RT.cc + ipsoftlight.cc + guidedfilter.cc + ipdehaze.cc + iplabregions.cc + lj92.c ) if(LENSFUN_HAS_LOAD_DIRECTORY) @@ -152,7 +166,7 @@ add_dependencies(rtengine UpdateInfo) # It may be nice to store library version too if(BUILD_SHARED_LIBS) - install (TARGETS rtengine DESTINATION ${LIBDIR}) + install(TARGETS rtengine DESTINATION ${LIBDIR}) endif() set_target_properties(rtengine PROPERTIES COMPILE_FLAGS "${RTENGINE_CXX_FLAGS}") diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc index 1c2d0219f..6505cedab 100644 --- a/rtengine/EdgePreservingDecomposition.cc +++ b/rtengine/EdgePreservingDecomposition.cc @@ -42,7 +42,8 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl } //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]; @@ -77,7 +78,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl 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) @@ -94,7 +95,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl 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 @@ -124,28 +125,14 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl #pragma omp parallel #endif { - float c = 0.0f; #ifdef _OPENMP - #pragma omp for reduction(+:rs) // Summation with error correction + #pragma omp for reduction(+:rs) #endif for(int ii = 0; ii < n; ii++) { - float temp = r[ii] * s[ii]; - float t = rs + temp; - - if( fabsf(rs) >= fabsf(temp) ) { - c += ((rs - t) + temp); - } else { - c += ((temp - t) + rs); - } - - rs = t; + rs += r[ii] * s[ii]; } -#ifdef _OPENMP - #pragma omp critical -#endif - rs += c; } ab = rs / ab; @@ -291,7 +278,7 @@ bool MultiDiagonalSymmetricMatrix::LazySetEntry(float value, int row, int column 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]; @@ -337,7 +324,9 @@ SSEFUNCTION void MultiDiagonalSymmetricMatrix::VectorProduct(float* RESTRICT Pro } #endif +#ifdef _OPENMP #pragma omp single +#endif { #ifdef __SSE2__ @@ -693,7 +682,7 @@ EdgePreservingDecomposition::~EdgePreservingDecomposition() 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) @@ -744,7 +733,7 @@ SSEFUNCTION float *EdgePreservingDecomposition::CreateBlur(float *Source, float gxv = (LVFU(rg[x + 1]) - LVFU(rg[x])) + (LVFU(rg[x + w + 1]) - LVFU(rg[x + w])); gyv = (LVFU(rg[x + w]) - LVFU(rg[x])) + (LVFU(rg[x + w + 1]) - LVFU(rg[x + 1])); //Apply power to the magnitude of the gradient to get the edge stopping function. - _mm_storeu_ps( &a[x + w * y], Scalev * pow_F((zd5v * _mm_sqrt_ps(gxv * gxv + gyv * gyv + sqrepsv)), EdgeStoppingv) ); + _mm_storeu_ps( &a[x + w * y], Scalev * pow_F((zd5v * vsqrtf(gxv * gxv + gyv * gyv + sqrepsv)), EdgeStoppingv) ); } for(; x < w1; x++) { @@ -789,7 +778,7 @@ SSEFUNCTION float *EdgePreservingDecomposition::CreateBlur(float *Source, float // 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 @@ -884,7 +873,7 @@ float *EdgePreservingDecomposition::CreateIteratedBlur(float *Source, float Scal 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; @@ -905,12 +894,12 @@ SSEFUNCTION void EdgePreservingDecomposition::CompressDynamicRange(float *Source #endif for(int ii = 0; ii < n - 3; ii += 4) { - _mm_storeu_ps( &Source[ii], xlogf(LVFU(Source[ii]) + epsv)); + _mm_storeu_ps( &Source[ii], xlogf(vmaxf(LVFU(Source[ii]), ZEROV) + epsv)); } } for(int ii = n - (n % 4); ii < n; ii++) { - Source[ii] = xlogf(Source[ii] + eps); + Source[ii] = xlogf(std::max(Source[ii], 0.f) + eps); } #else @@ -919,7 +908,7 @@ SSEFUNCTION void EdgePreservingDecomposition::CompressDynamicRange(float *Source #endif for(int ii = 0; ii < n; ii++) { - Source[ii] = xlogf(Source[ii] + eps); + Source[ii] = xlogf(std::max(Source[ii], 0.f) + eps); } #endif diff --git a/rtengine/EdgePreservingDecomposition.h b/rtengine/EdgePreservingDecomposition.h index 1eca7b2c8..c90123ed3 100644 --- a/rtengine/EdgePreservingDecomposition.h +++ b/rtengine/EdgePreservingDecomposition.h @@ -11,7 +11,7 @@ Anyway. Basically, this is an implementation of what's presented in the 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 @@ public: 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 --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index aec11e59b..4e62e1c1f 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -38,6 +38,7 @@ #include "cplx_wavelet_dec.h" #include "median.h" #include "iccstore.h" +#include "procparams.h" #ifdef _OPENMP #include #endif @@ -474,7 +475,7 @@ void ImProcFunctions::Tile_calc(int tilesize, int overlap, int kall, int imwidth 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 &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 @@ -547,7 +548,7 @@ BENCHFUN 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.workingProfile); const float wpi[3][3] = { {static_cast(wprofi[0][0]), static_cast(wprofi[0][1]), static_cast(wprofi[0][2])}, @@ -783,7 +784,7 @@ BENCHFUN numthreads = MIN(numthreads, options.rgbDenoiseThreadLimit); } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP denoiseNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); @@ -805,8 +806,15 @@ BENCHFUN } #endif - float *LbloxArray[denoiseNestedLevels * numthreads]; - float *fLbloxArray[denoiseNestedLevels * numthreads]; + const std::size_t blox_array_size = denoiseNestedLevels * numthreads; + + float *LbloxArray[blox_array_size]; + float *fLbloxArray[blox_array_size]; + + for (std::size_t i = 0; i < blox_array_size; ++i) { + LbloxArray[i] = nullptr; + fLbloxArray[i] = nullptr; + } if (numtiles > 1 && denoiseLuminance) { for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { @@ -815,7 +823,7 @@ BENCHFUN } } - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.working); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); //inverse matrix user select const float wip[3][3] = { {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, @@ -823,7 +831,7 @@ BENCHFUN {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.workingProfile); const float wp[3][3] = { {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, @@ -916,7 +924,7 @@ BENCHFUN 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 @@ -964,7 +972,7 @@ BENCHFUN } } } else {//RGB mode -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -999,7 +1007,7 @@ BENCHFUN } } } 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 @@ -1159,7 +1167,7 @@ BENCHFUN 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 @@ -1284,7 +1292,7 @@ BENCHFUN 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 @@ -1337,14 +1345,14 @@ BENCHFUN } } -#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; @@ -1354,7 +1362,7 @@ BENCHFUN 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 @@ -1454,7 +1462,7 @@ BENCHFUN } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif @@ -1591,7 +1599,7 @@ BENCHFUN realred /= 100.f; realblue /= 100.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) num_threads(denoiseNestedLevels) #endif @@ -1641,7 +1649,7 @@ BENCHFUN } } } else {//RGB mode -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) #endif @@ -1681,7 +1689,7 @@ BENCHFUN } } else { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(denoiseNestedLevels) #endif @@ -1741,14 +1749,16 @@ BENCHFUN } - if (denoiseLuminance) { - for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { + for (size_t i = 0; i < blox_array_size; ++i) { + if (LbloxArray[i]) { fftwf_free(LbloxArray[i]); + } + if (fLbloxArray[i]) { fftwf_free(fLbloxArray[i]); } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP omp_set_nested(oldNested); #endif @@ -1829,11 +1839,15 @@ BENCHFUN for (int iteration = 1; iteration <= dnparams.passes; ++iteration) { +#ifdef _OPENMP #pragma omp parallel +#endif { if (methmed < 2) { +#ifdef _OPENMP #pragma omp for +#endif for (int i = 1; i < hei - 1; ++i) { if (methmed == 0) { @@ -1848,7 +1862,9 @@ BENCHFUN } } else { +#ifdef _OPENMP #pragma omp for +#endif for (int i = 2; i < hei - 2; ++i) { if (methmed == 3) { @@ -1892,7 +1908,9 @@ BENCHFUN if (methmed < 2) { +#ifdef _OPENMP #pragma omp for +#endif for (int i = 1; i < hei - 1; ++i) { if (methmed == 0) { @@ -1907,7 +1925,9 @@ BENCHFUN } } else { +#ifdef _OPENMP #pragma omp for +#endif for (int i = 2; i < hei - 2; ++i) { if (methmed == 3) { @@ -1952,7 +1972,9 @@ BENCHFUN if (methmed < 2) { +#ifdef _OPENMP #pragma omp for +#endif for (int i = 1; i < hei - 1; ++i) { if (methmed == 0) { @@ -1967,7 +1989,9 @@ BENCHFUN } } else { +#ifdef _OPENMP #pragma omp for +#endif for (int i = 2; i < hei - 2; ++i) { if (methmed == 3) { @@ -2043,7 +2067,7 @@ BENCHFUN //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -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; @@ -2254,7 +2278,7 @@ void ImProcFunctions::Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, 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; @@ -2272,7 +2296,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2287,7 +2311,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2387,7 +2411,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit 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(); @@ -2411,7 +2435,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2427,7 +2451,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2446,7 +2470,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2550,7 +2574,7 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2565,7 +2589,7 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, } if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2605,7 +2629,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L } bool memoryAllocationFailed = false; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { @@ -2619,7 +2643,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L } if (!memoryAllocationFailed) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2643,7 +2667,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -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) { @@ -2733,7 +2757,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff } -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) @@ -2848,7 +2872,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef } -SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b, +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) @@ -2988,7 +3012,7 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition & } } -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; @@ -3153,7 +3177,7 @@ void ImProcFunctions::calcautodn_info(float &chaut, float &delta, int Nb, int le } -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 @@ -3166,7 +3190,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float** bcalc; hei = provicalc->getHeight(); wid = provicalc->getWidth(); - TMatrix wprofi = ICCStore::getInstance()->workingSpaceMatrix(params->icm.working); + TMatrix wprofi = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); const float wpi[3][3] = { {static_cast(wprofi[0][0]), static_cast(wprofi[0][1]), static_cast(wprofi[0][2])}, @@ -3192,7 +3216,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat bcalc[i] = new float[wid]; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -3241,7 +3265,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); 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])}, @@ -3315,7 +3339,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat //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 @@ -3331,7 +3355,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat aNv = LVFU(acalc[i >> 1][j >> 1]); bNv = LVFU(bcalc[i >> 1][j >> 1]); _mm_storeu_ps(&noisevarhue[i1 >> 1][j1 >> 1], xatan2f(bNv, aNv)); - _mm_storeu_ps(&noisevarchrom[i1 >> 1][j1 >> 1], _mm_max_ps(c100v, _mm_sqrt_ps(SQRV(aNv) + SQRV(bNv)))); + _mm_storeu_ps(&noisevarchrom[i1 >> 1][j1 >> 1], vmaxf(vsqrtf(SQRV(aNv) + SQRV(bNv)),c100v)); } for (; j < tileright; j += 2) { @@ -3368,7 +3392,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat #endif } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -3386,7 +3410,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat if (!denoiseMethodRgb) { //lab mode, modification Jacques feb 2013 and july 2014 -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for if (multiThread) #endif @@ -3523,17 +3547,17 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat } 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); } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp section #endif { diff --git a/rtengine/LUT.h b/rtengine/LUT.h index 0fd906dc0..de668cca8 100644 --- a/rtengine/LUT.h +++ b/rtengine/LUT.h @@ -74,8 +74,9 @@ // Bit representations of flags enum { - LUT_CLIP_BELOW = 1 << 0, - LUT_CLIP_ABOVE = 1 << 1 + LUT_CLIP_OFF, // LUT does not clip input values + LUT_CLIP_BELOW, // LUT clips input values at lower bound + LUT_CLIP_ABOVE // LUT clips input values at upper bound }; template @@ -88,33 +89,29 @@ using LUTd = LUT; using LUTuc = LUT; template -class LUT : - public rtengine::NonCopyable +class LUT { protected: // list of variables ordered to improve cache speed int maxs; float maxsf; - // For the SSE routine operator[](vfloat), we just clip float lookup values - // to just below the max value. - float maxIndexFloat; T * data; unsigned int clip; unsigned int size; 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... /// The user have to handle it itself, even if some method can (re)initialize it bool dirty; - LUT(int s, int flags = 0xfffffff) + LUT(int s, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE, bool initZero = false) { #ifndef NDEBUG @@ -135,14 +132,16 @@ public: upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; - maxIndexFloat = ((float)upperBound) - 1e-5; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = F2V( maxs ); sizeiv = _mm_set1_epi32( (int)(size - 1) ); sizev = F2V( size - 1 ); #endif + if (initZero) { + clear(); + } } - void operator ()(int s, int flags = 0xfffffff) + void operator ()(int s, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE, bool initZero = false) { #ifndef NDEBUG @@ -166,19 +165,22 @@ public: upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; - maxIndexFloat = ((float)upperBound) - 1e-5; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = F2V( maxs ); sizeiv = _mm_set1_epi32( (int)(size - 1) ); sizev = F2V( size - 1 ); #endif + if (initZero) { + clear(); + } + } LUT() { data = nullptr; reset(); -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = ZEROV; sizev = ZEROV; sizeiv = _mm_setzero_si128(); @@ -195,6 +197,8 @@ public: } } + explicit LUT(const LUT&) = delete; + void setClip(int flags) { clip = flags; @@ -222,7 +226,7 @@ public: return size > 0 ? upperBound : 0; } - LUT & operator=(LUT &rhs) + LUT & operator=(const LUT& rhs) { if (this != &rhs) { if (rhs.size > this->size) { @@ -242,8 +246,7 @@ public: this->upperBound = rhs.upperBound; this->maxs = this->size - 2; this->maxsf = (float)this->maxs; - this->maxIndexFloat = ((float)this->upperBound) - 1e-5; -#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 ); @@ -255,10 +258,10 @@ public: // handy to sum up per thread histograms. #pragma omp simd speeds up the loop by about factor 3 for LUTu (uint32_t). template::value>::type> - LUT & operator+=(LUT &rhs) + LUT & operator+=(const LUT& rhs) { if (rhs.size == this->size) { -#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 +#ifdef _OPENMP #pragma omp simd #endif @@ -274,7 +277,7 @@ public: template::value>::type> LUT & operator*=(float factor) { -#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 +#ifdef _OPENMP #pragma omp simd #endif @@ -289,7 +292,7 @@ public: template::value>::type> LUT & operator/=(float divisor) { -#ifdef _RT_NESTED_OPENMP // temporary solution to fix Issue #3324 +#ifdef _OPENMP #pragma omp simd #endif @@ -307,7 +310,7 @@ public: return data[ rtengine::LIM(index, 0, upperBound) ]; } -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ // NOTE: This function requires LUTs which clips only at lower bound @@ -317,7 +320,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(ZEROV, vminf(F2V(maxIndexFloat), indexv)); + vfloat clampedIndexes = vclampf(indexv, ZEROV, maxsv); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -349,7 +352,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(ZEROV, vminf(F2V(maxIndexFloat), indexv)); + vfloat clampedIndexes = vclampf(indexv, ZEROV, maxsv); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -369,7 +372,7 @@ public: vfloat lower = _mm_castsi128_ps(_mm_unpacklo_epi64(temp0, temp1)); vfloat upper = _mm_castsi128_ps(_mm_unpackhi_epi64(temp0, temp1)); - vfloat diff = clampedIndexes - _mm_cvtepi32_ps(indexes); + vfloat diff = vclampf(indexv, ZEROV, sizev) - _mm_cvtepi32_ps(indexes); // this automagically uses ZEROV in case indexv is NaN return vintpf(diff, upper, lower); } @@ -380,7 +383,7 @@ public: // Clamp and convert to integer values. Extract out of SSE register because all // lookup operations use regular addresses. - vfloat clampedIndexes = vmaxf(ZEROV, vminf(F2V(maxsf), indexv)); + vfloat clampedIndexes = vclampf(indexv, ZEROV, maxsv); // this automagically uses ZEROV in case indexv is NaN vint indexes = _mm_cvttps_epi32(clampedIndexes); int indexArray[4]; _mm_storeu_si128(reinterpret_cast<__m128i*>(&indexArray[0]), indexes); @@ -403,94 +406,35 @@ public: vfloat diff = indexv - _mm_cvtepi32_ps(indexes); return vintpf(diff, upper, lower); } + + // vectorized LUT access with integer indices. Clips at lower and upper bounds #ifdef __SSE4_1__ template::value>::type> - vfloat operator[](vint idxv ) const + vfloat operator[](vint idxv) const { - vfloat tempv, p1v; idxv = _mm_max_epi32( _mm_setzero_si128(), _mm_min_epi32(idxv, sizeiv)); - // access the LUT 4 times and shuffle the values into p1v - - int idx; - - // get 4th value - idx = _mm_extract_epi32(idxv, 3); - tempv = _mm_load_ss(&data[idx]); - p1v = PERMUTEPS(tempv, _MM_SHUFFLE(0, 0, 0, 0)); - // now p1v is 3 3 3 3 - - // get 3rd value - idx = _mm_extract_epi32(idxv, 2); - tempv = _mm_load_ss(&data[idx]); - p1v = _mm_move_ss( p1v, tempv); - // now p1v is 3 3 3 2 - - // get 2nd value - idx = _mm_extract_epi32(idxv, 1); - tempv = _mm_load_ss(&data[idx]); - p1v = PERMUTEPS( p1v, _MM_SHUFFLE(1, 0, 1, 0)); - // now p1v is 3 2 3 2 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 3 1 - - // get 1st value - idx = _mm_cvtsi128_si32(idxv); - tempv = _mm_load_ss(&data[idx]); - p1v = PERMUTEPS( p1v, _MM_SHUFFLE(3, 2, 0, 0)); - // now p1v is 3 2 1 1 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 1 0 - - return p1v; + // access the LUT 4 times. Trust the compiler. It generates good code here, better than hand written SSE code + return _mm_setr_ps(data[_mm_extract_epi32(idxv,0)], data[_mm_extract_epi32(idxv,1)], data[_mm_extract_epi32(idxv,2)], data[_mm_extract_epi32(idxv,3)]); } #else template::value>::type> - vfloat operator[](vint idxv ) const + vfloat operator[](vint idxv) const { - vfloat tempv, p1v; - tempv = _mm_cvtepi32_ps(idxv); - tempv = _mm_min_ps( tempv, sizev ); - idxv = _mm_cvttps_epi32(_mm_max_ps( tempv, _mm_setzero_ps( ) )); - // access the LUT 4 times and shuffle the values into p1v - - int idx; - - // get 4th value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(3, 3, 3, 3))); - tempv = _mm_load_ss(&data[idx]); - p1v = PERMUTEPS(tempv, _MM_SHUFFLE(0, 0, 0, 0)); - // now p1v is 3 3 3 3 - - // get 3rd value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(2, 2, 2, 2))); - tempv = _mm_load_ss(&data[idx]); - p1v = _mm_move_ss( p1v, tempv); - // now p1v is 3 3 3 2 - - // get 2nd value - idx = _mm_cvtsi128_si32 (_mm_shuffle_epi32(idxv, _MM_SHUFFLE(1, 1, 1, 1))); - tempv = _mm_load_ss(&data[idx]); - p1v = PERMUTEPS( p1v, _MM_SHUFFLE(1, 0, 1, 0)); - // now p1v is 3 2 3 2 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 3 1 - - // get 1st value - idx = _mm_cvtsi128_si32 (idxv); - tempv = _mm_load_ss(&data[idx]); - p1v = PERMUTEPS( p1v, _MM_SHUFFLE(3, 2, 0, 0)); - // now p1v is 3 2 1 1 - p1v = _mm_move_ss( p1v, tempv ); - // now p1v is 3 2 1 0 - - return p1v; + // convert to float because SSE2 has no min/max for 32bit integers + vfloat tempv = vclampf(_mm_cvtepi32_ps(idxv), ZEROV, sizev); // this automagically uses ZEROV in case idxv is NaN (which will never happen because it is a vector of int) + idxv = _mm_cvttps_epi32(tempv); + // access the LUT 4 times. Trust the compiler. It generates good code here, better than hand written SSE code + return _mm_setr_ps(data[_mm_cvtsi128_si32(idxv)], + data[_mm_cvtsi128_si32(_mm_shuffle_epi32(idxv, _MM_SHUFFLE(1, 1, 1, 1)))], + data[_mm_cvtsi128_si32(_mm_shuffle_epi32(idxv, _MM_SHUFFLE(2, 2, 2, 2)))], + data[_mm_cvtsi128_si32(_mm_shuffle_epi32(idxv, _MM_SHUFFLE(3, 3, 3, 3)))]); } #endif #endif // use with float indices - template::value>::type> - T operator[](float index) const + template::value && std::is_same::value>::type> + T operator[](V index) const { int idx = (int)index; // don't use floor! The difference in negative space is no problems here @@ -587,7 +531,6 @@ public: maxs = 0; maxsf = 0.f; clip = 0; - maxIndexFloat = ((float)upperBound) - 1e-5; } // create an identity LUT (LUT(x) = x) or a scaled identity LUT (LUT(x) = x / divisor) @@ -683,7 +626,7 @@ public: } // share the buffer with another LUT, handy for same data but different clip flags - void share(const LUT &source, int flags = 0xfffffff) + void share(const LUT &source, int flags = LUT_CLIP_BELOW | LUT_CLIP_ABOVE) { if (owner && data) { delete[] data; @@ -697,8 +640,7 @@ public: upperBound = size - 1; maxs = size - 2; maxsf = (float)maxs; - maxIndexFloat = ((float)upperBound) - 1e-5; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ maxsv = F2V( size - 2); sizeiv = _mm_set1_epi32( (int)(size - 1) ); sizev = F2V( size - 1 ); diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index a31c78767..fe89a7b65 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -7,6 +7,10 @@ // // code dated: November 24, 2010 // optimized: September 2013, Ingo Weyrich +// further optimized: February 2018, Ingo Weyrich +// +// Ingo Weyrich March 2018: The above comment 'Chromatic Aberration Auto-correction' sounds wrong +// I guess it should have been 'Purple fringe correction' though it's not restricted to 'Purple' // // PF_correct_RT.cc is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -22,1845 +26,1148 @@ // along with this program. If not, see . // //////////////////////////////////////////////////////////////// -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #include "gauss.h" #include "improcfun.h" #include "sleef.c" -#include "mytime.h" #include "../rtgui/myflatcurve.h" #include "rt_math.h" #include "opthelper.h" #include "median.h" - -#ifdef _OPENMP -#include -#endif - -using namespace std; +#include "jaggedarray.h" +#include "StopWatch.h" +#include "procparams.h" namespace rtengine { -extern const Settings* settings; -SSEFUNCTION void ImProcFunctions::PF_correct_RT(LabImage * src, LabImage * dst, double radius, int thresh) +// Defringe in Lab mode +void ImProcFunctions::PF_correct_RT(LabImage * lab, double radius, int thresh) { - const int halfwin = ceil(2 * radius) + 1; - - FlatCurve* chCurve = nullptr; - + BENCHFUN + std::unique_ptr chCurve; if (params->defringe.huecurve.size() && FlatCurveType(params->defringe.huecurve.at(0)) > FCT_Linear) { - chCurve = new FlatCurve(params->defringe.huecurve); + chCurve.reset(new FlatCurve(params->defringe.huecurve)); } - // local variables - const int width = src->W, height = src->H; - //temporary array to store chromaticity - float (*fringe); - fringe = (float (*)) malloc (height * width * sizeof(*fringe)); + const int width = lab->W, height = lab->H; - LabImage * tmp1; - tmp1 = new LabImage(width, height); + // temporary array to store chromaticity + const std::unique_ptr fringe(new float[width * height]); + + JaggedArray tmpa(width, height); + JaggedArray tmpb(width, height); + + double chromave = 0.0; // use double precision for large summations #ifdef _OPENMP #pragma omp parallel #endif { - gaussianBlur (src->a, tmp1->a, src->W, src->H, radius); - gaussianBlur (src->b, tmp1->b, src->W, src->H, radius); - } - - float chromave = 0.0f; + gaussianBlur(lab->a, tmpa, width, height, radius); + gaussianBlur(lab->b, tmpb, width, height, radius); #ifdef _OPENMP - #pragma omp parallel -#endif - { - float chromaChfactor = 1.0f; -#ifdef _OPENMP - #pragma omp for reduction(+:chromave) + #pragma omp for reduction(+:chromave) schedule(dynamic,16) #endif - for(int i = 0; i < height; i++ ) { + for (int i = 0; i < height; i++) { #ifdef __SSE2__ // vectorized per row precalculation of the atan2 values if (chCurve) { int k = 0; - for(; k < width - 3; k += 4) { - STVFU(fringe[i * width + k], xatan2f(LVFU(src->b[i][k]), LVFU(src->a[i][k]))); + for (; k < width - 3; k += 4) { + STVFU(fringe[i * width + k], xatan2f(LVFU(lab->b[i][k]), LVFU(lab->a[i][k]))); } - for(; k < width; k++) { - fringe[i * width + k] = xatan2f(src->b[i][k], src->a[i][k]); + for (; k < width; k++) { + fringe[i * width + k] = xatan2f(lab->b[i][k], lab->a[i][k]); } } -#endif // __SSE2__ +#endif - for(int j = 0; j < width; j++) { + for (int j = 0; j < width; j++) { + float chromaChfactor = 1.f; if (chCurve) { #ifdef __SSE2__ // use the precalculated atan values - float HH = fringe[i * width + j]; + const float HH = fringe[i * width + j]; #else // no precalculated values without SSE => calculate - float HH = xatan2f(src->b[i][j], src->a[i][j]); + const float HH = xatan2f(lab->b[i][j], lab->a[i][j]); #endif - float chparam = float((chCurve->getVal((Color::huelab_to_huehsv2(HH))) - 0.5f) * 2.0f); //get C=f(H) + float chparam = chCurve->getVal((Color::huelab_to_huehsv2(HH))) - 0.5f; // get C=f(H) - if(chparam > 0.f) { - chparam /= 2.f; // reduced action if chparam > 0 + if (chparam < 0.f) { + chparam *= 2.f; // increased action if chparam < 0 } - chromaChfactor = 1.0f + chparam; + chromaChfactor = SQR(1.f + chparam); } - float chroma = SQR(chromaChfactor * (src->a[i][j] - tmp1->a[i][j])) + SQR(chromaChfactor * (src->b[i][j] - tmp1->b[i][j])); //modulate chroma function hue + const float chroma = chromaChfactor * (SQR(lab->a[i][j] - tmpa[i][j]) + SQR(lab->b[i][j] - tmpb[i][j])); // modulate chroma function hue chromave += chroma; fringe[i * width + j] = chroma; } } } - chromave /= (height * width); - float threshfactor = SQR(thresh / 33.f) * chromave * 5.0f; + chromave /= height * width; - -// now chromave is calculated, so we postprocess fringe to reduce the number of divisions in future -#ifdef __SSE2__ + if (chromave > 0.0) { + // now as chromave is calculated, we postprocess fringe to reduce the number of divisions in future #ifdef _OPENMP - #pragma omp parallel -#endif - { - __m128 sumv = F2V( chromave ); - __m128 onev = F2V( 1.0f ); -#ifdef _OPENMP - #pragma omp for nowait + #pragma omp parallel for simd #endif - for(int j = 0; j < width * height - 3; j += 4) { - STVFU(fringe[j], onev / (LVFU(fringe[j]) + sumv)); - } - - #pragma omp single - - for(int j = width * height - (width * height) % 4; j < width * height; j++) { + for (int j = 0; j < width * height; j++) { fringe[j] = 1.f / (fringe[j] + chromave); } - } -#else -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for(int j = 0; j < width * height; j++) { - fringe[j] = 1.f / (fringe[j] + chromave); - } - -#endif - - // because we changed the values of fringe we also have to recalculate threshfactor - threshfactor = 1.0f / (threshfactor + chromave); + const float threshfactor = 1.f / (SQR(thresh / 33.f) * chromave * 5.0f + chromave); + const int halfwin = std::ceil(2 * radius) + 1; // Issue 1674: -// often, CA isn't evenly distributed, e.g. a lot in contrasty regions and none in the sky. +// often, colour fringe is not evenly distributed, e.g. a lot in contrasty regions and none in the sky. // 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 // Issue 1972: Split this loop in three parts to avoid most of the min and max-operations #ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = 0; i < height; i++ ) { - int j; + for (int i = 0; i < height; i++) { + int j = 0; + for (; j < halfwin - 1; j++) { - for(j = 0; j < halfwin - 1; j++) { - tmp1->a[i][j] = src->a[i][j]; - tmp1->b[i][j] = src->b[i][j]; + // test for pixel darker than some fraction of neighbourhood ave, near an edge, more saturated than average + if (fringe[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; - //test for pixel darker than some fraction of neighborhood ave, near an edge, more saturated than average - if (fringe[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) + for (int j1 = 0; j1 < j + halfwin; j1++) { + // neighbourhood average of pixels weighted by chrominance + const float wt = fringe[i1 * width + j1]; + atot += wt * lab->a[i1][j1]; + btot += wt * lab->b[i1][j1]; + norm += wt; + } - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = 0; j1 < j + halfwin; j1++) { - //neighborhood average of pixels weighted by chrominance - wt = fringe[i1 * width + j1]; - atot += wt * src->a[i1][j1]; - btot += wt * src->b[i1][j1]; - norm += wt; - } - - tmp1->a[i][j] = atot / norm; - tmp1->b[i][j] = btot / norm; + lab->a[i][j] = atot / norm; + lab->b[i][j] = btot / norm; + } } - } - for(; j < width - halfwin + 1; j++) { - tmp1->a[i][j] = src->a[i][j]; - tmp1->b[i][j] = src->b[i][j]; + for (; j < width - halfwin + 1; j++) { - //test for pixel darker than some fraction of neighborhood ave, near an edge, more saturated than average - if (fringe[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; + // test for pixel darker than some fraction of neighbourhood ave, near an edge, more saturated than average + if (fringe[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { - //neighborhood average of pixels weighted by chrominance - wt = fringe[i1 * width + j1]; - atot += wt * src->a[i1][j1]; - btot += wt * src->b[i1][j1]; - norm += wt; - } + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) + for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { + // neighbourhood average of pixels weighted by chrominance + const float wt = fringe[i1 * width + j1]; + atot += wt * lab->a[i1][j1]; + btot += wt * lab->b[i1][j1]; + norm += wt; + } - tmp1->a[i][j] = atot / norm; - tmp1->b[i][j] = btot / norm; + lab->a[i][j] = atot / norm; + lab->b[i][j] = btot / norm; + } } - } - for(; j < width; j++) { - tmp1->a[i][j] = src->a[i][j]; - tmp1->b[i][j] = src->b[i][j]; + for (; j < width; j++) { - //test for pixel darker than some fraction of neighborhood ave, near an edge, more saturated than average - if (fringe[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; + // test for pixel darker than some fraction of neighbourhood ave, near an edge, more saturated than average + if (fringe[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < width; j1++) { - //neighborhood average of pixels weighted by chrominance - wt = fringe[i1 * width + j1]; - atot += wt * src->a[i1][j1]; - btot += wt * src->b[i1][j1]; - norm += wt; - } + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) + for (int j1 = j - halfwin + 1; j1 < width; j1++) { + // neighbourhood average of pixels weighted by chrominance + const float wt = fringe[i1 * width + j1]; + atot += wt * lab->a[i1][j1]; + btot += wt * lab->b[i1][j1]; + norm += wt; + } - tmp1->a[i][j] = atot / norm; - tmp1->b[i][j] = btot / norm; + lab->a[i][j] = atot / norm; + lab->b[i][j] = btot / norm; + } } - } - }//end of ab channel averaging - - if(src != dst) -#ifdef _OPENMP - #pragma omp parallel for -#endif - for(int i = 0; i < height; i++ ) { - for(int j = 0; j < width; j++) { - dst->L[i][j] = src->L[i][j]; - } - } - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for(int i = 0; i < height; i++ ) { - for(int j = 0; j < width; j++) { - dst->a[i][j] = tmp1->a[i][j]; - dst->b[i][j] = tmp1->b[i][j]; - } + } // end of ab channel averaging } - - - delete tmp1; - - if(chCurve) { - delete chCurve; - } - - free(fringe); } -SSEFUNCTION void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * dst, double radius, int thresh) +// Defringe in CIECAM02 mode +void ImProcFunctions::PF_correct_RTcam(CieImage * ncie, double radius, int thresh) { - const int halfwin = ceil(2 * radius) + 1; + BENCHFUN - FlatCurve* chCurve = nullptr; + std::unique_ptr chCurve; if (params->defringe.huecurve.size() && FlatCurveType(params->defringe.huecurve.at(0)) > FCT_Linear) { - chCurve = new FlatCurve(params->defringe.huecurve); + chCurve.reset(new FlatCurve(params->defringe.huecurve)); } - // local variables - const int width = src->W, height = src->H; - const float piid = 3.14159265f / 180.f; - const float eps2 = 0.01f; + const int width = ncie->W, height = ncie->H; - //temporary array to store chromaticity - float (*fringe); - fringe = (float (*)) malloc (height * width * sizeof(*fringe)); - - float** sraa; - sraa = new float*[height]; - - for (int i = 0; i < height; i++) { - sraa[i] = new float[width]; - } - - float** srbb; - srbb = new float*[height]; - - for (int i = 0; i < height; i++) { - srbb[i] = new float[width]; - } - - float** tmaa; - tmaa = new float*[height]; - - for (int i = 0; i < height; i++) { - tmaa[i] = new float[width]; - } - - float** tmbb; - tmbb = new float*[height]; - - for (int i = 0; i < height; i++) { - tmbb[i] = new float[width]; - } + // temporary array to store chromaticity + const std::unique_ptr fringe(new float[width * height]); + float** const sraa = ncie->h_p; // we use the ncie->h_p buffer to avoid memory allocation/deallocation and reduce memory pressure + float** const srbb = ncie->C_p; // we use the ncie->C_p buffer to avoid memory allocation/deallocation and reduce memory pressure + JaggedArray tmaa(width, height); + JaggedArray tmbb(width, height); #ifdef _OPENMP #pragma omp parallel #endif { - float2 sincosval; #ifdef __SSE2__ - int j; - vfloat2 sincosvalv; - __m128 piidv = F2V(piid); -#endif // __SSE2__ + const vfloat piDiv180v = F2V(RT_PI_F_180); +#endif #ifdef _OPENMP #pragma omp for #endif for (int i = 0; i < height; i++) { + int j = 0; #ifdef __SSE2__ - for (j = 0; j < width - 3; j += 4) { - sincosvalv = xsincosf(piidv * LVFU(src->h_p[i][j])); - STVFU(sraa[i][j], LVFU(src->C_p[i][j])*sincosvalv.y); - STVFU(srbb[i][j], LVFU(src->C_p[i][j])*sincosvalv.x); + for (; j < width - 3; j += 4) { + const vfloat2 sincosvalv = xsincosf(piDiv180v * LVFU(ncie->h_p[i][j])); + STVFU(sraa[i][j], LVFU(ncie->C_p[i][j]) * sincosvalv.y); + STVFU(srbb[i][j], LVFU(ncie->C_p[i][j]) * sincosvalv.x); } - - for (; j < width; j++) { - sincosval = xsincosf(piid * src->h_p[i][j]); - sraa[i][j] = src->C_p[i][j] * sincosval.y; - srbb[i][j] = src->C_p[i][j] * sincosval.x; - } - -#else - - for (int j = 0; j < width; j++) { - sincosval = xsincosf(piid * src->h_p[i][j]); - sraa[i][j] = src->C_p[i][j] * sincosval.y; - srbb[i][j] = src->C_p[i][j] * sincosval.x; - } - #endif + for (; j < width; j++) { + const float2 sincosval = xsincosf(RT_PI_F_180 * 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; + } } } + double chromave = 0.0; // use double precision for large summations + #ifdef _OPENMP #pragma omp parallel #endif { - gaussianBlur (sraa, tmaa, src->W, src->H, radius); - gaussianBlur (srbb, tmbb, src->W, src->H, radius); - } + gaussianBlur(sraa, tmaa, width, height, radius); + gaussianBlur(srbb, tmbb, width, height, radius); - float chromave = 0.0f; + float chromaChfactor = 1.f; +#ifdef _OPENMP + #pragma omp for reduction(+:chromave) schedule(dynamic,16) +#endif + for (int i = 0; i < height; i++) { #ifdef __SSE2__ - - if( chCurve ) { -// vectorized precalculation of the atan2 values -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++ ) - { - for(j = 0; j < width - 3; j += 4) { + // vectorized per row precalculation of the atan2 values + if (chCurve) { + int j = 0; + for (; j < width - 3; j += 4) { STVFU(fringe[i * width + j], xatan2f(LVFU(srbb[i][j]), LVFU(sraa[i][j]))); } - for(; j < width; j++) { + for (; j < width; j++) { fringe[i * width + j] = xatan2f(srbb[i][j], sraa[i][j]); } } - } - } - #endif -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float chromaChfactor = 1.0f; -#ifdef _OPENMP - #pragma omp for reduction(+:chromave) -#endif - - for(int i = 0; i < height; i++ ) { - for(int j = 0; j < width; j++) { + for (int j = 0; j < width; j++) { if (chCurve) { #ifdef __SSE2__ - // use the precalculated atan values - float HH = fringe[i * width + j]; + // use the precalculated atan2 values + const float HH = fringe[i * width + j]; #else // no precalculated values without SSE => calculate - float HH = xatan2f(srbb[i][j], sraa[i][j]); + const float HH = xatan2f(srbb[i][j], sraa[i][j]); #endif - float chparam = float((chCurve->getVal((Color::huelab_to_huehsv2(HH))) - 0.5f) * 2.0f); //get C=f(H) + float chparam = chCurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f; //get C=f(H) - if(chparam > 0.f) { - chparam /= 2.f; // reduced action if chparam > 0 + if (chparam < 0.f) { + chparam *= 2.f; // increase action if chparam < 0 } - chromaChfactor = 1.0f + chparam; + chromaChfactor = SQR(1.f + chparam); } - float chroma = SQR(chromaChfactor * (sraa[i][j] - tmaa[i][j])) + SQR(chromaChfactor * (srbb[i][j] - tmbb[i][j])); //modulate chroma function hue + const float chroma = chromaChfactor * (SQR(sraa[i][j] - tmaa[i][j]) + SQR(srbb[i][j] - tmbb[i][j])); //modulate chroma function hue chromave += chroma; fringe[i * width + j] = chroma; } } } - chromave /= (height * width); - float threshfactor = SQR(thresh / 33.f) * chromave * 5.0f; // Calculated once to eliminate mult inside the next loop + chromave /= height * width; -// now chromave is calculated, so we postprocess fringe to reduce the number of divisions in future -#ifdef __SSE2__ + if (chromave > 0.0) { + // now as chromave is calculated, we postprocess fringe to reduce the number of divisions in future #ifdef _OPENMP - #pragma omp parallel -#endif - { - __m128 sumv = F2V( chromave + eps2 ); - __m128 onev = F2V( 1.0f ); -#ifdef _OPENMP - #pragma omp for + #pragma omp parallel for simd #endif - for(int j = 0; j < width * height - 3; j += 4) { - STVFU(fringe[j], onev / (LVFU(fringe[j]) + sumv)); + for (int j = 0; j < width * height; j++) { + fringe[j] = 1.f / (fringe[j] + chromave); } - } - for(int j = width * height - (width * height) % 4; j < width * height; j++) { - fringe[j] = 1.f / (fringe[j] + chromave + eps2); - } - -#else -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for(int j = 0; j < width * height; j++) { - fringe[j] = 1.f / (fringe[j] + chromave + eps2); - } - -#endif - - // because we changed the values of fringe we also have to recalculate threshfactor - threshfactor = 1.0f / (threshfactor + chromave + eps2); + const float threshfactor = 1.f / (SQR(thresh / 33.f) * chromave * 5.0f + chromave); + const int halfwin = std::ceil(2 * radius) + 1; // Issue 1674: -// often, CA isn't evenly distributed, e.g. a lot in contrasty regions and none in the sky. +// often, colour fringe is not evenly distributed, e.g. a lot in contrasty regions and none in the sky. // 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 // Issue 1972: Split this loop in three parts to avoid most of the min and max-operations -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) -#endif - - for(int i = 0; i < height; i++ ) { - int j; - - for(j = 0; j < halfwin - 1; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; - - if (fringe[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = 0; j1 < j + halfwin; j1++) { - //neighborhood average of pixels weighted by chrominance - wt = fringe[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); - } - } - } - - for(; j < width - halfwin + 1; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; - - if (fringe[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { - //neighborhood average of pixels weighted by chrominance - wt = fringe[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); - } - } - } - - for(; j < width; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; - - if (fringe[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < width; j1++) { - //neighborhood average of pixels weighted by chrominance - wt = fringe[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); - } - } - } - } //end of ab channel averaging - #ifdef _OPENMP - #pragma omp parallel -#endif - { -#ifdef __SSE2__ - int j; - __m128 interav, interbv; - __m128 piidv = F2V(piid); -#endif -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++ ) { -#ifdef __SSE2__ - - for(j = 0; j < width - 3; j += 4) { - STVFU(dst->sh_p[i][j], LVFU(src->sh_p[i][j])); - interav = LVFU(tmaa[i][j]); - interbv = LVFU(tmbb[i][j]); - STVFU(dst->h_p[i][j], (xatan2f(interbv, interav)) / piidv); - STVFU(dst->C_p[i][j], vsqrtf(SQRV(interbv) + SQRV(interav))); - } - - for(; j < width; j++) { - dst->sh_p[i][j] = src->sh_p[i][j]; - float intera = tmaa[i][j]; - float interb = tmbb[i][j]; - dst->h_p[i][j] = (xatan2f(interb, intera)) / piid; - dst->C_p[i][j] = sqrt(SQR(interb) + SQR(intera)); - } - -#else - - for(int j = 0; j < width; j++) { - dst->sh_p[i][j] = src->sh_p[i][j]; - float intera = tmaa[i][j]; - float interb = tmbb[i][j]; - dst->h_p[i][j] = (xatan2f(interb, intera)) / piid; - dst->C_p[i][j] = sqrt(SQR(interb) + SQR(intera)); - } - -#endif - } - } - - for (int i = 0; i < height; i++) { - delete [] sraa[i]; - } - - delete [] sraa; - - for (int i = 0; i < height; i++) { - delete [] srbb[i]; - } - - delete [] srbb; - - for (int i = 0; i < height; i++) { - delete [] tmaa[i]; - } - - delete [] tmaa; - - for (int i = 0; i < height; i++) { - delete [] tmbb[i]; - } - - delete [] tmbb; - - if(chCurve) { - delete chCurve; - } - - free(fringe); -} - -SSEFUNCTION 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; - t1.set(); - - const int width = src->W, height = src->H; - const float piid = 3.14159265f / 180.f; - - int i1, j1; - const float eps = 1.0f; - const float eps2 = 0.01f; - - float** sraa; - sraa = new float*[height]; - - for (int i = 0; i < height; i++) { - sraa[i] = new float[width]; - } - - float** srbb; - srbb = new float*[height]; - - for (int i = 0; i < height; i++) { - srbb[i] = new float[width]; - } - - float** tmaa; - tmaa = new float*[height]; - - for (int i = 0; i < height; i++) { - tmaa[i] = new float[width]; - } - - float** tmbb; - tmbb = new float*[height]; - - for (int i = 0; i < height; i++) { - tmbb[i] = new float[width]; - } - - float* badpix = (float*)malloc(width * height * sizeof(float)); - - float** tmL; - tmL = new float*[height]; - - for (int i = 0; i < height; i++) { - tmL[i] = new float[width]; - } - - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float2 sincosval; -#ifdef __SSE2__ - int j; - vfloat2 sincosvalv; - __m128 piidv = F2V(piid); -#endif // __SSE2__ -#ifdef _OPENMP - #pragma omp for + #pragma omp parallel for schedule(dynamic,16) #endif for (int i = 0; i < height; i++) { -#ifdef __SSE2__ + int j = 0; + for (; j < halfwin - 1; j++) { + if (fringe[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = 0; j1 < j + halfwin; j1++) { + // neighbourhood average of pixels weighted by chrominance + const float wt = fringe[i1 * width + j1]; + atot += wt * sraa[i1][j1]; + btot += wt * srbb[i1][j1]; + norm += wt; + } + } + tmaa[i][j] = atot / norm; + tmbb[i][j] = btot / norm; + } else { + tmaa[i][j] = sraa[i][j]; + tmbb[i][j] = srbb[i][j]; + } + } - for (j = 0; j < width - 3; j += 4) { - sincosvalv = xsincosf(piidv * LVFU(src->h_p[i][j])); - STVFU(sraa[i][j], LVFU(src->C_p[i][j])*sincosvalv.y); - STVFU(srbb[i][j], LVFU(src->C_p[i][j])*sincosvalv.x); + for (; j < width - halfwin + 1; j++) { + if (fringe[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { + // neighbourhood average of pixels weighted by chrominance + const float wt = fringe[i1 * width + j1]; + atot += wt * sraa[i1][j1]; + btot += wt * srbb[i1][j1]; + norm += wt; + } + } + tmaa[i][j] = atot / norm; + tmbb[i][j] = btot / norm; + } else { + tmaa[i][j] = sraa[i][j]; + tmbb[i][j] = srbb[i][j]; + } } for (; j < width; j++) { - sincosval = xsincosf(piid * src->h_p[i][j]); - sraa[i][j] = src->C_p[i][j] * sincosval.y; - srbb[i][j] = src->C_p[i][j] * sincosval.x; - } - -#else - - for (int j = 0; j < width; j++) { - sincosval = xsincosf(piid * src->h_p[i][j]); - sraa[i][j] = src->C_p[i][j] * sincosval.y; - srbb[i][j] = src->C_p[i][j] * sincosval.x; - } - -#endif - } - } - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - //chroma a and b - if(mode == 2) { //choice of gaussian blur - gaussianBlur (sraa, tmaa, src->W, src->H, radius); - gaussianBlur (srbb, tmbb, src->W, src->H, radius); - } - - //luma sh_p - gaussianBlur (src->sh_p, tmL, src->W, src->H, 2.0);//low value to avoid artifacts - } - - if(mode == 1) { //choice of median - #pragma omp parallel - { - int ip, in, jp, jn; - #pragma omp for nowait //nowait because next loop inside this parallel region is independent on this one - - for (int i = 0; i < height; i++) { - if (i < 2) { - ip = i + 2; - } else { - ip = i - 2; - } - - if (i > height - 3) { - in = i - 2; - } else { - in = i + 2; - } - - for (int j = 0; j < width; j++) { - if (j < 2) { - jp = j + 2; - } else { - jp = j - 2; - } - - if (j > width - 3) { - jn = j - 2; - } else { - jn = j + 2; - } - - tmaa[i][j] = median(sraa[ip][jp], sraa[ip][j], sraa[ip][jn], sraa[i][jp], sraa[i][j], sraa[i][jn], sraa[in][jp], sraa[in][j], sraa[in][jn]); - } - } - - #pragma omp for - - for (int i = 0; i < height; i++) { - if (i < 2) { - ip = i + 2; - } else { - ip = i - 2; - } - - if (i > height - 3) { - in = i - 2; - } else { - in = i + 2; - } - - for (int j = 0; j < width; j++) { - if (j < 2) { - jp = j + 2; - } else { - jp = j - 2; - } - - if (j > width - 3) { - jn = j - 2; - } else { - jn = j + 2; - } - - tmbb[i][j] = median(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn]); - } - } - } - } - -//luma badpixels - const float sh_thr = 4.5f;//low value for luma sh_p to avoid artifacts - const float shthr = sh_thr / 24.0f; - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; -#ifdef __SSE2__ - __m128 shfabsv, shmedv; - __m128 shthrv = F2V(shthr); - __m128 onev = F2V(1.0f); -#endif // __SSE2__ -#ifdef _OPENMP - #pragma omp for private(i1,j1) -#endif - - for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - float shfabs = fabs(src->sh_p[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++ ) { - shmed += fabs(src->sh_p[i1][j1] - tmL[i1][j1]); - } - - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); - } - -#ifdef __SSE2__ - - for (; j < width - 5; j += 4) { - shfabsv = vabsf(LVFU(src->sh_p[i][j]) - LVFU(tmL[i][j])); - shmedv = ZEROV; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - shmedv += vabsf(LVFU(src->sh_p[i1][j1]) - LVFU(tmL[i1][j1])); - } - - STVFU(badpix[i * width + j], vself(vmaskf_gt(shfabsv, (shmedv - shfabsv)*shthrv), onev, ZEROV)); - } - - for (; j < width - 2; j++) { - float shfabs = fabs(src->sh_p[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - shmed += fabs(src->sh_p[i1][j1] - tmL[i1][j1]); - } - - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); - } - -#else - - for (; j < width - 2; j++) { - float shfabs = fabs(src->sh_p[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - shmed += fabs(src->sh_p[i1][j1] - tmL[i1][j1]); - } - - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); - } - -#endif - - for (; j < width; j++) { - float shfabs = fabs(src->sh_p[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++ ) { - shmed += fabs(src->sh_p[i1][j1] - tmL[i1][j1]); - } - - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); - } - } - } - - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; -#ifdef _OPENMP - #pragma omp for private(i1,j1) schedule(dynamic,16) -#endif - - for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - if (!badpix[i * width + j]) { - continue; - } - - float norm = 0.0f; - float shsum = 0.0f; - float sum = 0.0f; - int tot = 0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++ ) { - if (i1 == i && j1 == j) { - continue; + if (fringe[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < width; j1++) { + // neighbourhood average of pixels weighted by chrominance + const float wt = fringe[i1 * width + j1]; + atot += wt * sraa[i1][j1]; + btot += wt * srbb[i1][j1]; + norm += wt; } - - if (badpix[i1 * width + j1]) { - continue; - } - - sum += src->sh_p[i1][j1]; - tot++; - float dirsh = 1.f / (SQR(src->sh_p[i1][j1] - src->sh_p[i][j]) + eps); - shsum += dirsh * src->sh_p[i1][j1]; - norm += dirsh; } - - if (norm > 0.f) { - src->sh_p[i][j] = shsum / norm; + tmaa[i][j] = atot / norm; + tmbb[i][j] = btot / norm; } else { - if(tot > 0) { - src->sh_p[i][j] = sum / tot; - } + tmaa[i][j] = sraa[i][j]; + tmbb[i][j] = srbb[i][j]; } } - - for (; j < width - 2; j++) { - if (!badpix[i * width + j]) { - continue; - } - - float norm = 0.0f; - float shsum = 0.0f; - float sum = 0.0f; - int tot = 0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - if (i1 == i && j1 == j) { - continue; - } - - if (badpix[i1 * width + j1]) { - continue; - } - - sum += src->sh_p[i1][j1]; - tot++; - float dirsh = 1.f / (SQR(src->sh_p[i1][j1] - src->sh_p[i][j]) + eps); - shsum += dirsh * src->sh_p[i1][j1]; - norm += dirsh; - } - - if (norm > 0.f) { - src->sh_p[i][j] = shsum / norm; - } else { - if(tot > 0) { - src->sh_p[i][j] = sum / tot; - } - } - } - - for (; j < width; j++) { - if (!badpix[i * width + j]) { - continue; - } - - float norm = 0.0f; - float shsum = 0.0f; - float sum = 0.0f; - int tot = 0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++ ) { - if (i1 == i && j1 == j) { - continue; - } - - if (badpix[i1 * width + j1]) { - continue; - } - - sum += src->sh_p[i1][j1]; - tot++; - float dirsh = 1.f / (SQR(src->sh_p[i1][j1] - src->sh_p[i][j]) + eps); - shsum += dirsh * src->sh_p[i1][j1]; - norm += dirsh; - } - - if (norm > 0.f) { - src->sh_p[i][j] = shsum / norm; - } else { - if(tot > 0) { - src->sh_p[i][j] = sum / tot; - } - } - } - } + } // end of ab channel averaging } -// end luma badpixels - - -// begin chroma badpixels - float chrommed = 0.f; -#ifdef _OPENMP - #pragma omp parallel for reduction(+:chrommed) -#endif - - for(int i = 0; i < height; i++ ) { - for(int j = 0; j < width; j++) { - float chroma = SQR(sraa[i][j] - tmaa[i][j]) + SQR(srbb[i][j] - tmbb[i][j]); - chrommed += chroma; - badpix[i * width + j] = chroma; - } - } - - chrommed /= (height * width); - float threshfactor = (thresh * chrommed) / 33.f; - -// now chrommed is calculated, so we postprocess badpix to reduce the number of divisions in future -#ifdef __SSE2__ -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; - __m128 sumv = F2V( chrommed + eps2 ); - __m128 onev = F2V( 1.0f ); -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++) { - for(j = 0; j < width - 3; j += 4) { - STVFU(badpix[i * width + j], onev / (LVFU(badpix[i * width + j]) + sumv)); - } - - for(; j < width; j++) { - badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed + eps2); - } - } - } -#else #ifdef _OPENMP #pragma omp parallel for #endif + for(int i = 0; i < height; i++) { + int j = 0; +#ifdef __SSE2__ - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { - badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed + eps2); + for (; j < width - 3; j += 4) { + const vfloat interav = LVFU(tmaa[i][j]); + const vfloat interbv = LVFU(tmbb[i][j]); + STVFU(ncie->h_p[i][j], xatan2f(interbv, interav) / F2V(RT_PI_F_180)); + STVFU(ncie->C_p[i][j], vsqrtf(SQRV(interbv) + SQRV(interav))); } - #endif - - // because we changed the values of badpix we also have to recalculate threshfactor - threshfactor = 1.0f / (threshfactor + chrommed + eps2); - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) -#endif - - for(int i = 0; i < height; i++ ) { - for(j = 0; j < halfwin; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; - - if (badpix[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = 0; j1 < j + halfwin; j1++) { - wt = badpix[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); - } - } - } - - for(; j < width - halfwin; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; - - if (badpix[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { - wt = badpix[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); - } - } - } - - for(; j < width; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; - - if (badpix[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < width; j1++) { - wt = badpix[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); - } - } - } + for (; j < width; j++) { + const float intera = tmaa[i][j]; + const float interb = tmbb[i][j]; + ncie->h_p[i][j] = xatan2f(interb, intera) / RT_PI_F_180; + ncie->C_p[i][j] = sqrt(SQR(interb) + SQR(intera)); } } - -#ifdef _OPENMP - #pragma omp parallel -#endif - { -#ifdef _OPENMP - #pragma omp for -#endif - - for(int i = 0; i < height; i++ ) { - for(int j = 0; j < width; j++) { - float intera = tmaa[i][j]; - float interb = tmbb[i][j]; - float CC = sqrt(SQR(interb) + SQR(intera)); - - if(hotbad == 0) { - if(CC < chrom && skinprot != 0.f) { - dst->h_p[i][j] = (xatan2f(interb, intera)) / piid; - dst->C_p[i][j] = sqrt(SQR(interb) + SQR(intera)); - } - } else { - dst->h_p[i][j] = (xatan2f(interb, intera)) / piid; - dst->C_p[i][j] = sqrt(SQR(interb) + SQR(intera)); - } - } - } - } - - if(src != dst) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for(int i = 0; i < height; i++ ) - for(int j = 0; j < width; j++) { - dst->sh_p[i][j] = src->sh_p[i][j]; - } - } - - - for (int i = 0; i < height; i++) { - delete [] sraa[i]; - } - - delete [] sraa; - - for (int i = 0; i < height; i++) { - delete [] srbb[i]; - } - - delete [] srbb; - - for (int i = 0; i < height; i++) { - delete [] tmaa[i]; - } - - delete [] tmaa; - - for (int i = 0; i < height; i++) { - delete [] tmbb[i]; - } - - delete [] tmbb; - - for (int i = 0; i < height; i++) { - delete [] tmL[i]; - } - - delete [] tmL; - - free(badpix); - - t2.set(); - - if( settings->verbose ) { - printf("Ciecam badpixels:- %d usec\n", t2.etime(t1)); - } - - } -SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom) +// CIECAM02 hot/bad pixel filter +void ImProcFunctions::Badpixelscam(CieImage * ncie, double radius, int thresh, int mode, float chrom, bool hotbad) { - const int halfwin = ceil(2 * radius) + 1; - MyTime t1, t2; - t1.set(); - - const int width = src->W, height = src->H; - - int i1, j1; - const float eps = 1.0f; - const float eps2 = 0.01f; - - float** sraa; - sraa = new float*[height]; - - for (int i = 0; i < height; i++) { - sraa[i] = new float[width]; + BENCHFUN + if (mode == 2 && radius < 0.25) { // for gauss sigma less than 0.25 gaussianblur() just calls memcpy => nothing to do here + return; } - float** srbb; - srbb = new float*[height]; + const int width = ncie->W, height = ncie->H; - for (int i = 0; i < height; i++) { - srbb[i] = new float[width]; - } + constexpr float eps = 1.f; - float** tmaa; - tmaa = new float*[height]; + JaggedArray tmL(width, height); - for (int i = 0; i < height; i++) { - tmaa[i] = new float[width]; - } - - float** tmbb; - tmbb = new float*[height]; - - for (int i = 0; i < height; i++) { - tmbb[i] = new float[width]; - } - - float* badpix = (float*)malloc(width * height * sizeof(float)); - - float** tmL; - tmL = new float*[height]; - - for (int i = 0; i < height; i++) { - tmL[i] = new float[width]; - } + const std::unique_ptr badpix(new float[width * height]); + if (radius >= 0.5) { // for gauss sigma less than 0.25 gaussianblur() just calls memcpy => nothing to do here + // luma badpixels + // for bad pixels in sh channel we need 0 / != 0 information. Use 1 byte per pixel instead of 4 to reduce memory pressure + uint8_t *badpixb = reinterpret_cast(badpix.get()); + constexpr float sh_thr = 4.5f; // low value for luma sh_p to avoid artifacts + constexpr float shthr = sh_thr / 24.0f; // divide by 24 because we are using a 5x5 grid and centre point is excluded from summation #ifdef _OPENMP - #pragma omp parallel -#endif - { -// float2 sincosval; -#ifdef __SSE2__ - int j; -// vfloat2 sincosvalv; -// __m128 piidv = F2V(piid); -#endif // __SSE2__ -#ifdef _OPENMP - #pragma omp for -#endif - - for (int i = 0; i < height; i++) { -#ifdef __SSE2__ - - for (j = 0; j < width - 3; j += 4) { - STVFU(sraa[i][j], LVFU(src->a[i][j])); - STVFU(srbb[i][j], LVFU(src->b[i][j])); - } - - for (; j < width; j++) { - sraa[i][j] = src->a[i][j]; - srbb[i][j] = src->b[i][j]; - } - -#else - - for (int j = 0; j < width; j++) { - sraa[i][j] = src->a[i][j]; - srbb[i][j] = src->b[i][j]; - } - -#endif - } - } - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - //chroma a and b - if(mode >= 2) { //choice of gaussian blur - gaussianBlur (sraa, tmaa, src->W, src->H, radius); - gaussianBlur (srbb, tmbb, src->W, src->H, radius); - } - - //luma sh_p - gaussianBlur (src->L, tmL, src->W, src->H, 2.0);//low value to avoid artifacts - } - - if(mode == 1) { //choice of median #pragma omp parallel +#endif { - int ip, in, jp, jn; - #pragma omp for nowait //nowait because next loop inside this parallel region is independent on this one - - for (int i = 0; i < height; i++) { - if (i < 2) { - ip = i + 2; - } else { - ip = i - 2; - } - - if (i > height - 3) { - in = i - 2; - } else { - in = i + 2; - } - - for (int j = 0; j < width; j++) { - if (j < 2) { - jp = j + 2; - } else { - jp = j - 2; - } - - if (j > width - 3) { - jn = j - 2; - } else { - jn = j + 2; - } - - tmaa[i][j] = median(sraa[ip][jp], sraa[ip][j], sraa[ip][jn], sraa[i][jp], sraa[i][j], sraa[i][jn], sraa[in][jp], sraa[in][j], sraa[in][jn]); - } - } + //luma sh_p + gaussianBlur(ncie->sh_p, tmL, width, height, radius / 2.0); // low value to avoid artifacts +#ifdef __SSE2__ + const vfloat shthrv = F2V(shthr); +#endif +#ifdef _OPENMP #pragma omp for +#endif for (int i = 0; i < height; i++) { - if (i < 2) { - ip = i + 2; - } else { - ip = i - 2; - } + int j = 0; + for (; j < 2; j++) { + const float shfabs = std::fabs(ncie->sh_p[i][j] - tmL[i][j]); + float shmed = 0.f; - if (i > height - 3) { - in = i - 2; - } else { - in = i + 2; - } - - for (int j = 0; j < width; j++) { - if (j < 2) { - jp = j + 2; - } else { - jp = j - 2; + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = 0; j1 <= j + 2; j1++) { + shmed += std::fabs(ncie->sh_p[i1][j1] - tmL[i1][j1]); + } } - if (j > width - 3) { - jn = j - 2; - } else { - jn = j + 2; - } - - tmbb[i][j] = median(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn]); + badpixb[i * width + j] = shfabs > ((shmed - shfabs) * shthr); } - } - } - } - -//luma badpixels - const float sh_thr = 4.5f;//low value for luma sh_p to avoid artifacts - const float shthr = sh_thr / 24.0f; - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; -#ifdef __SSE2__ - __m128 shfabsv, shmedv; - __m128 shthrv = F2V(shthr); - __m128 onev = F2V(1.0f); -#endif // __SSE2__ -#ifdef _OPENMP - #pragma omp for private(i1,j1) -#endif - - for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - float shfabs = fabs(src->L[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++ ) { - shmed += fabs(src->L[i1][j1] - tmL[i1][j1]); - } - - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); - } #ifdef __SSE2__ - for (; j < width - 5; j += 4) { - shfabsv = vabsf(LVFU(src->L[i][j]) - LVFU(tmL[i][j])); - shmedv = ZEROV; + for (; j < width - 5; j += 4) { + const vfloat shfabsv = vabsf(LVFU(ncie->sh_p[i][j]) - LVFU(tmL[i][j])); + vfloat shmedv = ZEROV; - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - shmedv += vabsf(LVFU(src->L[i1][j1]) - LVFU(tmL[i1][j1])); + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 <= j + 2; j1++) { + shmedv += vabsf(LVFU(ncie->sh_p[i1][j1]) - LVFU(tmL[i1][j1])); + } } - STVFU(badpix[i * width + j], vself(vmaskf_gt(shfabsv, (shmedv - shfabsv)*shthrv), onev, ZEROV)); - } - - for (; j < width - 2; j++) { - float shfabs = fabs(src->L[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - shmed += fabs(src->L[i1][j1] - tmL[i1][j1]); - } - - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); - } - -#else - - for (; j < width - 2; j++) { - float shfabs = fabs(src->L[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - shmed += fabs(src->L[i1][j1] - tmL[i1][j1]); - } - - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); - } - + uint8_t mask = _mm_movemask_ps((vfloat)vmaskf_gt(shfabsv, (shmedv - shfabsv) * shthrv)); + badpixb[i * width + j] = mask & 1; + badpixb[i * width + j + 1] = mask & 2; + badpixb[i * width + j + 2] = mask & 4; + badpixb[i * width + j + 3] = mask & 8; + } #endif + for (; j < width - 2; j++) { + const float shfabs = std::fabs(ncie->sh_p[i][j] - tmL[i][j]); + float shmed = 0.f; - for (; j < width; j++) { - float shfabs = fabs(src->L[i][j] - tmL[i][j]); - float shmed = 0.0f; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++ ) { - shmed += fabs(src->L[i1][j1] - tmL[i1][j1]); + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 <= j + 2; j1++) { + shmed += std::fabs(ncie->sh_p[i1][j1] - tmL[i1][j1]); + } } - badpix[i * width + j] = (shfabs > ((shmed - shfabs) * shthr)); + badpixb[i * width + j] = shfabs > ((shmed - shfabs) * shthr); + } + + for (; j < width; j++) { + const float shfabs = std::fabs(ncie->sh_p[i][j] - tmL[i][j]); + float shmed = 0.f; + + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 < width; j1++) { + shmed += std::fabs(ncie->sh_p[i1][j1] - tmL[i1][j1]); + } + } + + badpixb[i * width + j] = shfabs > ((shmed - shfabs) * shthr); + } } } - } - #ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; -#ifdef _OPENMP - #pragma omp for private(i1,j1) schedule(dynamic,16) + #pragma omp parallel for schedule(dynamic,16) #endif for (int i = 0; i < height; i++) { - for (j = 0; j < 2; j++) { - if (!badpix[i * width + j]) { - continue; - } + int j = 0; + for (; j < 2; j++) { + if (badpixb[i * width + j]) { + float norm = 0.f, shsum = 0.f, sum = 0.f, tot = 0.f; - float norm = 0.0f; - float shsum = 0.0f; - float sum = 0.0f; - int tot = 0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = 0; j1 <= j + 2; j1++ ) { - if (i1 == i && j1 == j) { - continue; + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = 0; j1 <= j + 2; j1++) { + if (!badpixb[i1 * width + j1]) { + sum += ncie->sh_p[i1][j1]; + tot += 1.f; + const float dirsh = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); + shsum += dirsh * ncie->sh_p[i1][j1]; + norm += dirsh; + } } - - if (badpix[i1 * width + j1]) { - continue; - } - - sum += src->L[i1][j1]; - tot++; - float dirsh = 1.f / (SQR(src->L[i1][j1] - src->L[i][j]) + eps); - shsum += dirsh * src->L[i1][j1]; - norm += dirsh; } - - if (norm > 0.f) { - src->L[i][j] = shsum / norm; - } else { - if(tot > 0) { - src->L[i][j] = sum / tot; + if (norm > 0.f) { + ncie->sh_p[i][j] = shsum / norm; + } else if (tot > 0.f) { + ncie->sh_p[i][j] = sum / tot; } } } for (; j < width - 2; j++) { - if (!badpix[i * width + j]) { - continue; - } + if (badpixb[i * width + j]) { + float norm = 0.f, shsum = 0.f, sum = 0.f, tot = 0.f; - float norm = 0.0f; - float shsum = 0.0f; - float sum = 0.0f; - int tot = 0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 <= j + 2; j1++ ) { - if (i1 == i && j1 == j) { - continue; + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 <= j + 2; j1++) { + if (!badpixb[i1 * width + j1]) { + sum += ncie->sh_p[i1][j1]; + tot += 1.f; + const float dirsh = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); + shsum += dirsh * ncie->sh_p[i1][j1]; + norm += dirsh; + } } - - if (badpix[i1 * width + j1]) { - continue; - } - - sum += src->L[i1][j1]; - tot++; - float dirsh = 1.f / (SQR(src->L[i1][j1] - src->L[i][j]) + eps); - shsum += dirsh * src->L[i1][j1]; - norm += dirsh; } - - if (norm > 0.f) { - src->L[i][j] = shsum / norm; - } else { - if(tot > 0) { - src->L[i][j] = sum / tot; + if (norm > 0.f) { + ncie->sh_p[i][j] = shsum / norm; + } else if (tot > 0.f) { + ncie->sh_p[i][j] = sum / tot; } } } for (; j < width; j++) { - if (!badpix[i * width + j]) { - continue; - } + if (badpixb[i * width + j]) { + float norm = 0.f, shsum = 0.f, sum = 0.f, tot = 0.f; - float norm = 0.0f; - float shsum = 0.0f; - float sum = 0.0f; - int tot = 0; - - for (i1 = max(0, i - 2); i1 <= min(i + 2, height - 1); i1++ ) - for (j1 = j - 2; j1 < width; j1++ ) { - if (i1 == i && j1 == j) { - continue; + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 < width; j1++) { + if (!badpixb[i1 * width + j1]) { + sum += ncie->sh_p[i1][j1]; + tot += 1.f; + const float dirsh = 1.f / (SQR(ncie->sh_p[i1][j1] - ncie->sh_p[i][j]) + eps); + shsum += dirsh * ncie->sh_p[i1][j1]; + norm += dirsh; + } } - - if (badpix[i1 * width + j1]) { - continue; - } - - sum += src->L[i1][j1]; - tot++; - float dirsh = 1.f / (SQR(src->L[i1][j1] - src->L[i][j]) + eps); - shsum += dirsh * src->L[i1][j1]; - norm += dirsh; } - - if (norm > 0.f) { - src->L[i][j] = shsum / norm; - } else { - if(tot > 0) { - src->L[i][j] = sum / tot; + if (norm > 0.f) { + ncie->sh_p[i][j] = shsum / norm; + } else if (tot > 0.f) { + ncie->sh_p[i][j] = sum / tot; } } } } - } -// end luma badpixels + } // end luma badpixels - if(mode == 3) { -// begin chroma badpixels - float chrommed = 0.f; + if (hotbad) { + JaggedArray sraa(width, height); + JaggedArray srbb(width, height); + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + +#ifdef __SSE2__ + const vfloat piDiv180v = F2V(RT_PI_F_180); +#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) { + const vfloat2 sincosvalv = xsincosf(piDiv180v * LVFU(ncie->h_p[i][j])); + STVFU(sraa[i][j], LVFU(ncie->C_p[i][j])*sincosvalv.y); + STVFU(srbb[i][j], LVFU(ncie->C_p[i][j])*sincosvalv.x); + } +#endif + for (; j < width; j++) { + const float2 sincosval = xsincosf(RT_PI_F_180 * 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; + } + } + } + + float** const tmaa = tmL; // reuse tmL buffer + JaggedArray tmbb(width, height); + + if (mode == 2) { // choice of gaussian blur +#ifdef _OPENMP + #pragma omp parallel +#endif + { + //chroma a and b + gaussianBlur(sraa, tmaa, width, height, radius); + gaussianBlur(srbb, tmbb, width, height, radius); + } + + } else if (mode == 1) { // choice of median +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef _OPENMP + #pragma omp for nowait // nowait because next loop inside this parallel region is independent on this one +#endif + + for (int i = 0; i < height; i++) { + const int ip = i < 2 ? i + 2 : i - 2; + const int in = i > height - 3 ? i - 2 : i + 2; + + for (int j = 0; j < width; j++) { + const int jp = j < 2 ? j + 2 : j -2; + const int jn = j > width - 3 ? j - 2 : j + 2; + + tmaa[i][j] = median(sraa[ip][jp], sraa[ip][j], sraa[ip][jn], sraa[i][jp], sraa[i][j], sraa[i][jn], sraa[in][jp], sraa[in][j], sraa[in][jn]); + } + } + +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < height; i++) { + const int ip = i < 2 ? i + 2 : i - 2; + const int in = i > height - 3 ? i - 2 : i + 2; + + for (int j = 0; j < width; j++) { + const int jp = j < 2 ? j + 2 : j -2; + const int jn = j > width - 3 ? j - 2 : j + 2; + + tmbb[i][j] = median(srbb[ip][jp], srbb[ip][j], srbb[ip][jn], srbb[i][jp], srbb[i][j], srbb[i][jn], srbb[in][jp], srbb[in][j], srbb[in][jn]); + } + } + } + } + + // begin chroma badpixels + double chrommed = 0.0; // use double precision for large summations #ifdef _OPENMP #pragma omp parallel for reduction(+:chrommed) #endif - for(int i = 0; i < height; i++ ) { - for(int j = 0; j < width; j++) { - float chroma = SQR(sraa[i][j] - tmaa[i][j]) + SQR(srbb[i][j] - tmbb[i][j]); + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + const float chroma = SQR(sraa[i][j] - tmaa[i][j]) + SQR(srbb[i][j] - tmbb[i][j]); chrommed += chroma; badpix[i * width + j] = chroma; } } - chrommed /= (height * width); - float threshfactor = (thresh * chrommed) / 33.f; + chrommed /= height * width; -// now chrommed is calculated, so we postprocess badpix to reduce the number of divisions in future + if (chrommed > 0.0) { + // now as chrommed is calculated, we postprocess badpix to reduce the number of divisions in future + const float threshfactor = 1.f / ((thresh * chrommed) / 33.f + chrommed); + const int halfwin = std::ceil(2 * radius) + 1; +#ifdef _OPENMP + #pragma omp parallel +#endif + { #ifdef __SSE2__ + const vfloat chrommedv = F2V(chrommed); + const vfloat onev = F2V(1.f); +#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) { + STVFU(badpix[i * width + j], onev / (LVFU(badpix[i * width + j]) + chrommedv)); + } +#endif + for (; j < width; j++) { + badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed); + } + } + +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = 0; i < height; i++) { + int j = 0; + for (; j < halfwin; j++) { + + if (badpix[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = 0; j1 < j + halfwin; j1++) { + const float wt = badpix[i1 * width + j1]; + atot += wt * sraa[i1][j1]; + btot += wt * srbb[i1][j1]; + norm += wt; + } + } + const float intera = atot / norm; + const float interb = btot / norm; + const float CC = sqrt(SQR(interb) + SQR(intera)); + + if (CC < chrom) { + ncie->h_p[i][j] = xatan2f(interb, intera) / RT_PI_F_180; + ncie->C_p[i][j] = CC; + } + } + } + +#ifdef __SSE2__ + const vfloat threshfactorv = F2V(threshfactor); + const vfloat chromv = F2V(chrom); + const vfloat piDiv180v = F2V(RT_PI_F_180); + for (; j < width - halfwin - 3; j+=4) { + + vmask selMask = vmaskf_lt(LVFU(badpix[i * width + j]), threshfactorv); + if (_mm_movemask_ps((vfloat)selMask)) { + vfloat atotv = ZEROV, btotv = ZEROV, normv = ZEROV; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { + const vfloat wtv = LVFU(badpix[i1 * width + j1]); + atotv += wtv * LVFU(sraa[i1][j1]); + btotv += wtv * LVFU(srbb[i1][j1]); + normv += wtv; + } + } + const vfloat interav = atotv / normv; + const vfloat interbv = btotv / normv; + const vfloat CCv = vsqrtf(SQRV(interbv) + SQRV(interav)); + + selMask = vandm(selMask, vmaskf_lt(CCv, chromv)); + if (_mm_movemask_ps((vfloat)selMask)) { + STVFU(ncie->h_p[i][j], vself(selMask, xatan2f(interbv, interav) / piDiv180v, LVFU(ncie->h_p[i][j]))); + STVFU(ncie->C_p[i][j], vself(selMask, CCv, LVFU(ncie->C_p[i][j]))); + } + } + } +#endif + for (; j < width - halfwin; j++) { + + if (badpix[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { + const float wt = badpix[i1 * width + j1]; + atot += wt * sraa[i1][j1]; + btot += wt * srbb[i1][j1]; + norm += wt; + } + } + const float intera = atot / norm; + const float interb = btot / norm; + const float CC = sqrt(SQR(interb) + SQR(intera)); + + if (CC < chrom) { + ncie->h_p[i][j] = xatan2f(interb, intera) / RT_PI_F_180; + ncie->C_p[i][j] = CC; + } + } + } + + for (; j < width; j++) { + + if (badpix[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < width; j1++) { + const float wt = badpix[i1 * width + j1]; + atot += wt * sraa[i1][j1]; + btot += wt * srbb[i1][j1]; + norm += wt; + } + } + const float intera = atot / norm; + const float interb = btot / norm; + const float CC = sqrt(SQR(interb) + SQR(intera)); + + if (CC < chrom) { + ncie->h_p[i][j] = xatan2f(interb, intera) / RT_PI_F_180; + ncie->C_p[i][j] = CC; + } + } + } + } + } + } + } +} + +// CbDL reduce artifacts +void ImProcFunctions::BadpixelsLab(LabImage * lab, double radius, int thresh, float chrom) +{ + BENCHFUN + + if (radius < 0.25) { // for gauss sigma less than 0.25 gaussianblur() just calls memcpy => nothing to do here + return; + } + + const int halfwin = std::ceil(2 * radius) + 1; + + const int width = lab->W, height = lab->H; + + constexpr float eps = 1.f; + + JaggedArray tmL(width, height); + + const std::unique_ptr badpix(new float[width * height]); + + if (radius >= 0.5) { // for gauss sigma less than 0.25 gaussianblur() just calls memcpy => nothing to do here + //luma badpixels + // for bad pixels in L channel we need 0 / != 0 information. Use 1 byte per pixel instead of 4 to reduce memory pressure + uint8_t *badpixb = reinterpret_cast(badpix.get()); + constexpr float sh_thr = 4.5f; // low value for luma L to avoid artifacts + constexpr float shthr = sh_thr / 24.0f; // divide by 24 because we are using a 5x5 grid and centre point is excluded from summation + #ifdef _OPENMP #pragma omp parallel #endif { - int j; - __m128 sumv = F2V( chrommed + eps2 ); - __m128 onev = F2V( 1.0f ); + // blur L channel + gaussianBlur(lab->L, tmL, width, height, radius / 2.0); // low value to avoid artifacts + +#ifdef __SSE2__ + const vfloat shthrv = F2V(shthr); +#endif #ifdef _OPENMP #pragma omp for #endif - for(int i = 0; i < height; i++) { - for(j = 0; j < width - 3; j += 4) { - STVFU(badpix[i * width + j], onev / (LVFU(badpix[i * width + j]) + sumv)); - } + for (int i = 0; i < height; i++) { + int j = 0; + for (; j < 2; j++) { + const float shfabs = std::fabs(lab->L[i][j] - tmL[i][j]); + float shmed = 0.f; - for(; j < width; j++) { - badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed + eps2); - } - } - } -#else -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { - badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed + eps2); - } - -#endif - - // because we changed the values of badpix we also have to recalculate threshfactor - threshfactor = 1.0f / (threshfactor + chrommed + eps2); - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int j; -#ifdef _OPENMP - #pragma omp for schedule(dynamic,16) -#endif - - for(int i = 0; i < height; i++ ) { - for(j = 0; j < halfwin; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; - - if (badpix[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = 0; j1 < j + halfwin; j1++) { - wt = badpix[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = 0; j1 <= j + 2; j1++) { + shmed += std::fabs(lab->L[i1][j1] - tmL[i1][j1]); } } + badpixb[i * width + j] = shfabs > ((shmed - shfabs) * shthr); } - for(; j < width - halfwin; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; +#ifdef __SSE2__ - if (badpix[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; + for (; j < width - 5; j += 4) { + const vfloat shfabsv = vabsf(LVFU(lab->L[i][j]) - LVFU(tmL[i][j])); + vfloat shmedv = ZEROV; - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { - wt = badpix[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 <= j + 2; j1++) { + shmedv += vabsf(LVFU(lab->L[i1][j1]) - LVFU(tmL[i1][j1])); } } + uint8_t mask = _mm_movemask_ps((vfloat)vmaskf_gt(shfabsv, (shmedv - shfabsv) * shthrv)); + badpixb[i * width + j] = mask & 1; + badpixb[i * width + j + 1] = mask & 2; + badpixb[i * width + j + 2] = mask & 4; + badpixb[i * width + j + 3] = mask & 8; + } +#endif + for (; j < width - 2; j++) { + const float shfabs = std::fabs(lab->L[i][j] - tmL[i][j]); + float shmed = 0.f; + + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 <= j + 2; j1++) { + shmed += std::fabs(lab->L[i1][j1] - tmL[i1][j1]); + } + } + badpixb[i * width + j] = shfabs > ((shmed - shfabs) * shthr); } - for(; j < width; j++) { - tmaa[i][j] = sraa[i][j]; - tmbb[i][j] = srbb[i][j]; + for (; j < width; j++) { + const float shfabs = std::fabs(lab->L[i][j] - tmL[i][j]); + float shmed = 0.f; - if (badpix[i * width + j] < threshfactor) { - float atot = 0.f; - float btot = 0.f; - float norm = 0.f; - float wt; - - for (int i1 = max(0, i - halfwin + 1); i1 < min(height, i + halfwin); i1++) - for (int j1 = j - halfwin + 1; j1 < width; j1++) { - wt = badpix[i1 * width + j1]; - atot += wt * sraa[i1][j1]; - btot += wt * srbb[i1][j1]; - norm += wt; - } - - if(norm > 0.f) { - tmaa[i][j] = (atot / norm); - tmbb[i][j] = (btot / norm); + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 < width; j1++) { + shmed += std::fabs(lab->L[i1][j1] - tmL[i1][j1]); } } + badpixb[i * width + j] = shfabs > ((shmed - shfabs) * shthr); } } } +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for (int i = 0; i < height; i++) { + int j = 0; + for (; j < 2; j++) { + if (badpixb[i * width + j]) { + float norm = 0.f, shsum = 0.f, sum = 0.f, tot = 0.f; + + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = 0; j1 <= j + 2; j1++) { + if (!badpixb[i1 * width + j1]) { + sum += lab->L[i1][j1]; + tot += 1.f; + const float dirsh = 1.f / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); + shsum += dirsh * lab->L[i1][j1]; + norm += dirsh; + } + } + } + if (norm > 0.f) { + lab->L[i][j] = shsum / norm; + } else if (tot > 0.f) { + lab->L[i][j] = sum / tot; + } + } + } + + for (; j < width - 2; j++) { + if (badpixb[i * width + j]) { + float norm = 0.f, shsum = 0.f, sum = 0.f, tot = 0.f; + + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 <= j + 2; j1++) { + if (!badpixb[i1 * width + j1]) { + sum += lab->L[i1][j1]; + tot += 1.f; + const float dirsh = 1.f / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); + shsum += dirsh * lab->L[i1][j1]; + norm += dirsh; + } + } + } + if (norm > 0.f) { + lab->L[i][j] = shsum / norm; + } else if (tot > 0.f) { + lab->L[i][j] = sum / tot; + } + } + } + + for (; j < width; j++) { + if (badpixb[i * width + j]) { + float norm = 0.f, shsum = 0.f, sum = 0.f, tot = 0.f; + + for (int i1 = std::max(0, i - 2); i1 <= std::min(i + 2, height - 1); i1++) { + for (int j1 = j - 2; j1 < width; j1++) { + if (!badpixb[i1 * width + j1]) { + sum += lab->L[i1][j1]; + tot += 1.f; + const float dirsh = 1.f / (SQR(lab->L[i1][j1] - lab->L[i][j]) + eps); + shsum += dirsh * lab->L[i1][j1]; + norm += dirsh; + } + } + } + if (norm > 0.f) { + lab->L[i][j] = shsum / norm; + } else if (tot > 0.f) { + lab->L[i][j] = sum / tot; + } + } + } + } + } // end luma badpixels + + float** const tmaa = tmL; // reuse tmL buffer + JaggedArray tmbb(width, height); + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + // blur chroma a and b + gaussianBlur(lab->a, tmaa, width, height, radius); + gaussianBlur(lab->b, tmbb, width, height, radius); + } + + // begin chroma badpixels + double chrommed = 0.0; // use double precision for large summations + +#ifdef _OPENMP + #pragma omp parallel for reduction(+:chrommed) +#endif + + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + const float chroma = SQR(lab->a[i][j] - tmaa[i][j]) + SQR(lab->b[i][j] - tmbb[i][j]); + chrommed += chroma; + badpix[i * width + j] = chroma; + } + } + + chrommed /= height * width; + + if (chrommed > 0.0) { + // now as chrommed is calculated, we postprocess badpix to reduce the number of divisions in future + #ifdef _OPENMP #pragma omp parallel #endif { +#ifdef __SSE2__ + const vfloat chrommedv = F2V(chrommed); + const vfloat onev = F2V(1.f); +#endif #ifdef _OPENMP #pragma omp for #endif - for(int i = 0; i < height; i++ ) { - for(int j = 0; j < width; j++) { - float intera = tmaa[i][j]; - float interb = tmbb[i][j]; - float CC = sqrt(SQR(interb / 327.68) + SQR(intera / 327.68f)); + for (int i = 0; i < height; i++) { + int j = 0; +#ifdef __SSE2__ + for (; j < width - 3; j += 4) { + STVFU(badpix[i * width + j], onev / (LVFU(badpix[i * width + j]) + chrommedv)); + } +#endif + for (; j < width; j++) { + badpix[i * width + j] = 1.f / (badpix[i * width + j] + chrommed); + } + } + } - if(CC < chrom && skinprot != 0.f) { - dst->a[i][j] = intera; - dst->b[i][j] = interb; + const float threshfactor = 1.f / ((thresh * chrommed) / 33.f + chrommed); + + chrom *= 327.68f; + chrom *= chrom; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) +#endif + + for (int i = 0; i < height; i++) { + int j = 0; + for (; j < halfwin; j++) { + if (badpix[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = 0; j1 < j + halfwin; j1++) { + const float wt = badpix[i1 * width + j1]; + atot += wt * lab->a[i1][j1]; + btot += wt * lab->b[i1][j1]; + norm += wt; + } + } + if (SQR(atot) + SQR(btot) < chrom * SQR(norm)) { + lab->a[i][j] = atot / norm; + lab->b[i][j] = btot / norm; + } + } + } + +#ifdef __SSE2__ + const vfloat chromv = F2V(chrom); + const vfloat threshfactorv = F2V(threshfactor); + for (; j < width - halfwin - 3; j += 4) { + vmask selMask = vmaskf_lt(LVFU(badpix[i * width + j]), threshfactorv); + if (_mm_movemask_ps(reinterpret_cast(selMask))) { + vfloat atotv = ZEROV, btotv = ZEROV, normv = ZEROV; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { + const vfloat wtv = LVFU(badpix[i1 * width + j1]); + atotv += wtv * LVFU(lab->a[i1][j1]); + btotv += wtv * LVFU(lab->b[i1][j1]); + normv += wtv; + } + } + selMask = vandm(selMask, vmaskf_lt(SQRV(atotv) + SQR(btotv), chromv * SQRV(normv))); + if (_mm_movemask_ps(reinterpret_cast(selMask))) { + const vfloat aOrig = LVFU(lab->a[i][j]); + const vfloat bOrig = LVFU(lab->b[i][j]); + STVFU(lab->a[i][j], vself(selMask, atotv / normv, aOrig)); + STVFU(lab->b[i][j], vself(selMask, btotv / normv, bOrig)); + } + } + } +#endif + for (; j < width - halfwin; j++) { + + if (badpix[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < j + halfwin; j1++) { + const float wt = badpix[i1 * width + j1]; + atot += wt * lab->a[i1][j1]; + btot += wt * lab->b[i1][j1]; + norm += wt; + } + } + if (SQR(atot) + SQR(btot) < chrom * SQR(norm)) { + lab->a[i][j] = atot / norm; + lab->b[i][j] = btot / norm; + } + } + } + + for (; j < width; j++) { + + if (badpix[i * width + j] < threshfactor) { + float atot = 0.f, btot = 0.f, norm = 0.f; + + for (int i1 = std::max(0, i - halfwin + 1); i1 < std::min(height, i + halfwin); i1++) { + for (int j1 = j - halfwin + 1; j1 < width; j1++) { + const float wt = badpix[i1 * width + j1]; + atot += wt * lab->a[i1][j1]; + btot += wt * lab->b[i1][j1]; + norm += wt; + } + } + if (SQR(atot) + SQR(btot) < chrom * SQR(norm)) { + lab->a[i][j] = atot / norm; + lab->b[i][j] = btot / norm; } } } } } - - if(src != dst) { -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for(int i = 0; i < height; i++ ) - for(int j = 0; j < width; j++) { - dst->L[i][j] = src->L[i][j]; - } - } - - - for (int i = 0; i < height; i++) { - delete [] sraa[i]; - } - - delete [] sraa; - - for (int i = 0; i < height; i++) { - delete [] srbb[i]; - } - - delete [] srbb; - - for (int i = 0; i < height; i++) { - delete [] tmaa[i]; - } - - delete [] tmaa; - - for (int i = 0; i < height; i++) { - delete [] tmbb[i]; - } - - delete [] tmbb; - - for (int i = 0; i < height; i++) { - delete [] tmL[i]; - } - - delete [] tmL; - - free(badpix); - - t2.set(); - - if( settings->verbose ) { - printf("Lab artifacts:- %d usec\n", t2.etime(t1)); - } - - } } diff --git a/rtengine/ahd_demosaic_RT.cc b/rtengine/ahd_demosaic_RT.cc new file mode 100644 index 000000000..d67c7b76b --- /dev/null +++ b/rtengine/ahd_demosaic_RT.cc @@ -0,0 +1,227 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Ingo Weyrich (heckflosse67@gmx.de) + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ + +// +// Adaptive Homogeneity-Directed interpolation is based on +// the work of Keigo Hirakawa, Thomas Parks, and Paul Lee. +// Optimized for speed and reduced memory usage 2018 Ingo Weyrich +// + +#include +#include "rtengine.h" +#include "rawimagesource.h" +#include "rt_math.h" +#include "procparams.h" +#include "../rtgui/multilangmgr.h" +#include "median.h" +//#define BENCHMARK +#include "StopWatch.h" + +namespace rtengine +{ +#define TS 144 +void RawImageSource::ahd_demosaic() +{ + BENCHFUN + + constexpr int dir[4] = { -1, 1, -TS, TS }; + float xyz_cam[3][3]; + LUTf cbrt(65536); + + int width = W, height = H; + + constexpr 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 } + }; + + constexpr float d65_white[3] = { 0.950456, 1, 1.088754 }; + + double progress = 0.0; + if (plistener) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AHD))); + plistener->setProgress (0.0); + } + + for (int i = 0; i < 65536; i++) { + const double r = i / 65535.0; + cbrt[i] = r > 0.008856 ? std::cbrt(r) : 7.787 * r + 16 / 116.0; + } + + for (int i = 0; i < 3; i++) + for (unsigned int j = 0; j < 3; j++) { + xyz_cam[i][j] = 0; + for (int k = 0; k < 3; k++) { + xyz_cam[i][j] += xyz_rgb[i][k] * imatrices.rgb_cam[k][j] / d65_white[i]; + } + } + + border_interpolate2(W, H, 5, rawData, red, green, blue); + +#ifdef _OPENMP +#pragma omp parallel +#endif +{ + int progresscounter = 0; + float *buffer = new float[13 * TS * TS]; /* 1053 kB per core */ + auto rgb = (float(*)[TS][TS][3]) buffer; + auto lab = (float(*)[TS][TS][3])(buffer + 6 * TS * TS); + auto homo = (uint16_t(*)[TS][TS])(buffer + 12 * TS * TS); + +#ifdef _OPENMP + #pragma omp for collapse(2) schedule(dynamic) nowait +#endif + for (int top = 2; top < height - 5; top += TS - 6) { + for (int left = 2; left < width - 5; left += TS - 6) { + // Interpolate green horizontally and vertically: + for (int row = top; row < top + TS && row < height - 2; row++) { + for (int col = left + (FC(row, left) & 1); col < std::min(left + TS, width - 2); col += 2) { + auto pix = &rawData[row][col]; + float val0 = 0.25f * ((pix[-1] + pix[0] + pix[1]) * 2 + - pix[-2] - pix[2]) ; + rgb[0][row - top][col - left][1] = median(val0, pix[-1], pix[1]); + float val1 = 0.25f * ((pix[-width] + pix[0] + pix[width]) * 2 + - pix[-2 * width] - pix[2 * width]) ; + rgb[1][row - top][col - left][1] = median(val1, pix[-width], pix[width]); + } + } + + // Interpolate red and blue, and convert to CIELab: + for (int d = 0; d < 2; d++) + for (int row = top + 1; row < top + TS - 1 && row < height - 3; row++) { + int cng = FC(row + 1, FC(row + 1, 0) & 1); + for (int col = left + 1; col < std::min(left + TS - 1, width - 3); col++) { + auto pix = &rawData[row][col]; + auto rix = &rgb[d][row - top][col - left]; + auto lix = lab[d][row - top][col - left]; + if (FC(row, col) == 1) { + rix[0][2 - cng] = CLIP(pix[0] + (0.5f * (pix[-1] + pix[1] + - rix[-1][1] - rix[1][1] ) )); + rix[0][cng] = CLIP(pix[0] + (0.5f * (pix[-width] + pix[width] + - rix[-TS][1] - rix[TS][1]))); + rix[0][1] = pix[0]; + } else { + rix[0][cng] = CLIP(rix[0][1] + (0.25f * (pix[-width - 1] + pix[-width + 1] + + pix[+width - 1] + pix[+width + 1] + - rix[-TS - 1][1] - rix[-TS + 1][1] + - rix[+TS - 1][1] - rix[+TS + 1][1]))); + rix[0][2 - cng] = pix[0]; + } + float xyz[3] = {}; + + for(unsigned int c = 0; c < 3; ++c) { + xyz[0] += xyz_cam[0][c] * rix[0][c]; + xyz[1] += xyz_cam[1][c] * rix[0][c]; + xyz[2] += xyz_cam[2][c] * rix[0][c]; + } + + xyz[0] = cbrt[xyz[0]]; + xyz[1] = cbrt[xyz[1]]; + xyz[2] = cbrt[xyz[2]]; + + lix[0] = 116.f * xyz[1] - 16.f; + lix[1] = 500.f * (xyz[0] - xyz[1]); + lix[2] = 200.f * (xyz[1] - xyz[2]); + } + } + + // Build homogeneity maps from the CIELab images: + + for (int row = top + 2; row < top + TS - 2 && row < height - 4; row++) { + int tr = row - top; + float ldiff[2][4], abdiff[2][4]; + + for (int col = left + 2, tc = 2; col < left + TS - 2 && col < width - 4; col++, tc++) { + for (int d = 0; d < 2; d++) { + auto lix = &lab[d][tr][tc]; + + for (int i = 0; i < 4; i++) { + ldiff[d][i] = std::fabs(lix[0][0] - lix[dir[i]][0]); + abdiff[d][i] = SQR(lix[0][1] - lix[dir[i]][1]) + + SQR(lix[0][2] - lix[dir[i]][2]); + } + } + + float leps = std::min(std::max(ldiff[0][0], ldiff[0][1]), + std::max(ldiff[1][2], ldiff[1][3])); + float abeps = std::min(std::max(abdiff[0][0], abdiff[0][1]), + std::max(abdiff[1][2], abdiff[1][3])); + + for (int d = 0; d < 2; d++) { + homo[d][tr][tc] = 0; + for (int i = 0; i < 4; i++) { + homo[d][tr][tc] += (ldiff[d][i] <= leps) * (abdiff[d][i] <= abeps); + } + } + } + } + + // Combine the most homogenous pixels for the final result: + for (int row = top + 3; row < top + TS - 3 && row < height - 5; row++) { + int tr = row - top; + + for (int col = left + 3, tc = 3; col < std::min(left + TS - 3, width - 5); col++, tc++) { + uint16_t hm0 = 0, hm1 = 0; + for (int i = tr - 1; i <= tr + 1; i++) + for (int j = tc - 1; j <= tc + 1; j++) { + hm0 += homo[0][i][j]; + hm1 += homo[1][i][j]; + } + + if (hm0 != hm1) { + int dir = hm1 > hm0; + red[row][col] = rgb[dir][tr][tc][0]; + green[row][col] = rgb[dir][tr][tc][1]; + blue[row][col] = rgb[dir][tr][tc][2]; + } else { + red[row][col] = 0.5f * (rgb[0][tr][tc][0] + rgb[1][tr][tc][0]); + green[row][col] = 0.5f * (rgb[0][tr][tc][1] + rgb[1][tr][tc][1]); + blue[row][col] = 0.5f * (rgb[0][tr][tc][2] + rgb[1][tr][tc][2]); + } + } + } + + if(plistener) { + progresscounter++; + + if(progresscounter % 32 == 0) { +#ifdef _OPENMP + #pragma omp critical (ahdprogress) +#endif + { + progress += 32.0 * SQR(TS - 6) / (height * width); + progress = std::min(progress, 1.0); + plistener->setProgress(progress); + } + } + } + + } + } + delete [] buffer; +} + if(plistener) { + plistener->setProgress (1.0); + } + +} +#undef TS + +} diff --git a/rtengine/alignedbuffer.h b/rtengine/alignedbuffer.h index 27a376c57..846c4c47d 100644 --- a/rtengine/alignedbuffer.h +++ b/rtengine/alignedbuffer.h @@ -66,7 +66,7 @@ public: return allocatedSize == 0; } - /** @brief Allocate the the "size" amount of elements of "structSize" length each + /** @brief Allocate the "size" amount of elements of "structSize" length each * @param size number of elements to allocate * @param structSize if non null, will let you override the default struct's size (unit: byte) * @return True is everything went fine, including freeing memory when size==0, false if the allocation failed diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 30c673813..2b9775ac0 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -33,14 +33,21 @@ #include "sleef.c" #include "opthelper.h" #include "median.h" +#include "procparams.h" #include "StopWatch.h" 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, const array2D &rawData, array2D &red, array2D &green, array2D &blue, size_t chunkSize, bool measure) { - BENCHFUN + + std::unique_ptr stop; + + if (measure) { + std::cout << "Demosaicing " << W << "x" << H << " image using AMaZE with " << chunkSize << " Tiles per Thread" << std::endl; + stop.reset(new StopWatch("amaze demosaic")); + } volatile double progress = 0.0; @@ -105,7 +112,7 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, }; //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 { @@ -176,7 +183,7 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, // Main algorithm: Tile loop // use collapse(2) to collapse the 2 loops to one large loop, so there is better scaling #ifdef _OPENMP - #pragma omp for schedule(dynamic) collapse(2) nowait + #pragma omp for schedule(dynamic, chunkSize) collapse(2) nowait #endif for (int top = winy - 16; top < winy + height; top += ts - 32) { @@ -1584,6 +1591,9 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, // clean up free(buffer); } + if(border < 4) { + border_interpolate2(W, H, 3, rawData, red, green, blue); + } if(plistener) { plistener->setProgress(1.0); diff --git a/rtengine/array2D.h b/rtengine/array2D.h index 25d644c85..48a789bf8 100644 --- a/rtengine/array2D.h +++ b/rtengine/array2D.h @@ -267,11 +267,11 @@ public: ar_realloc(w, h); memcpy(data, copy, w * h * sizeof(T)); } - int width() + int width() const { return x; } - int height() + int height() const { return y; } diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h index 3356843b2..e754ac891 100644 --- a/rtengine/bilateral2.h +++ b/rtengine/bilateral2.h @@ -152,10 +152,14 @@ template void bilateral05 (T** src, T** dst, T** buffer, int W { BL_BEGIN(318, 1) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER3(1, 7, 7, 55) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(1) } @@ -164,10 +168,14 @@ template void bilateral06 (T** src, T** dst, T** buffer, int W { BL_BEGIN(768, 1) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER3(1, 4, 4, 16) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(1) } @@ -176,10 +184,14 @@ template void bilateral07 (T** src, T** dst, T** buffer, int W { BL_BEGIN(366, 2) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER5(0, 0, 1, 0, 8, 21, 1, 21, 59) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(2) } @@ -188,10 +200,14 @@ template void bilateral08 (T** src, T** dst, T** buffer, int W { BL_BEGIN(753, 2) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER5(0, 0, 1, 0, 5, 10, 1, 10, 23) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(2) } @@ -200,10 +216,14 @@ template void bilateral09 (T** src, T** dst, T** buffer, int W { BL_BEGIN(595, 2) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER5(0, 1, 2, 1, 6, 12, 2, 12, 22) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(2) } @@ -212,10 +232,14 @@ template void bilateral10 (T** src, T** dst, T** buffer, int W { BL_BEGIN(910, 2) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER5(0, 1, 2, 1, 4, 7, 2, 7, 12) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(2) } @@ -224,10 +248,14 @@ template void bilateral11 (T** src, T** dst, T** buffer, int W { BL_BEGIN(209, 3) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER7(0, 0, 1, 1, 0, 2, 5, 8, 1, 5, 18, 27, 1, 8, 27, 41) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(3) } @@ -236,10 +264,14 @@ template void bilateral12 (T** src, T** dst, T** buffer, int W { BL_BEGIN(322, 3) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER7(0, 0, 1, 1, 0, 1, 4, 6, 1, 4, 11, 16, 1, 6, 16, 23) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(3) } @@ -248,10 +280,14 @@ template void bilateral13 (T** src, T** dst, T** buffer, int W { BL_BEGIN(336, 3) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER7(0, 0, 1, 1, 0, 2, 4, 6, 1, 4, 11, 14, 1, 6, 14, 19) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(3) } @@ -260,10 +296,14 @@ template void bilateral14 (T** src, T** dst, T** buffer, int W { BL_BEGIN(195, 3) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER7(0, 1, 2, 3, 1, 4, 8, 10, 2, 8, 17, 21, 3, 10, 21, 28) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(3) } @@ -272,10 +312,14 @@ template void bilateral15 (T** src, T** dst, T** buffer, int W { BL_BEGIN(132, 4) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER9(0, 0, 0, 1, 1, 0, 1, 2, 4, 5, 0, 2, 6, 12, 14, 1, 4, 12, 22, 28, 1, 5, 14, 28, 35) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(4) } @@ -284,10 +328,14 @@ template void bilateral16 (T** src, T** dst, T** buffer, int W { BL_BEGIN(180, 4) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER9(0, 0, 0, 1, 1, 0, 1, 2, 3, 4, 0, 2, 5, 9, 10, 1, 3, 9, 15, 19, 1, 4, 10, 19, 23) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(4) } @@ -296,10 +344,14 @@ template void bilateral17 (T** src, T** dst, T** buffer, int W { BL_BEGIN(195, 4) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER9(0, 0, 1, 1, 1, 0, 1, 2, 3, 4, 1, 2, 5, 8, 9, 1, 3, 8, 13, 16, 1, 4, 9, 16, 19) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(4) } @@ -308,10 +360,14 @@ template void bilateral18 (T** src, T** dst, T** buffer, int W { BL_BEGIN(151, 4) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER9(0, 0, 1, 2, 2, 0, 1, 3, 5, 5, 1, 3, 6, 10, 12, 2, 5, 10, 16, 19, 2, 5, 12, 19, 22) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(4) } @@ -320,10 +376,14 @@ template void bilateral19 (T** src, T** dst, T** buffer, int W { BL_BEGIN(151, 4) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER9(0, 0, 1, 2, 2, 0, 1, 3, 4, 5, 1, 3, 5, 8, 9, 2, 4, 8, 12, 14, 2, 5, 9, 14, 16) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(4) } @@ -332,10 +392,14 @@ template void bilateral20 (T** src, T** dst, T** buffer, int W { BL_BEGIN(116, 5) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER11(0, 0, 0, 1, 1, 1, 0, 0, 1, 2, 3, 3, 0, 1, 2, 4, 7, 7, 1, 2, 4, 8, 12, 14, 1, 3, 7, 12, 18, 20, 1, 3, 7, 14, 20, 23) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(5) } @@ -344,10 +408,14 @@ template void bilateral21 (T** src, T** dst, T** buffer, int W { BL_BEGIN(127, 5) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER11(0, 0, 0, 1, 1, 1, 0, 0, 1, 2, 3, 3, 0, 1, 2, 4, 6, 7, 1, 2, 4, 8, 11, 12, 1, 3, 6, 11, 15, 17, 1, 3, 7, 12, 17, 19) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(5) } @@ -356,10 +424,14 @@ template void bilateral22 (T** src, T** dst, T** buffer, int W { BL_BEGIN(109, 5) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER11(0, 0, 0, 1, 1, 2, 0, 1, 2, 3, 3, 4, 1, 2, 3, 5, 7, 8, 1, 3, 5, 9, 12, 13, 1, 3, 7, 12, 16, 18, 2, 4, 8, 13, 18, 20) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(5) } @@ -368,10 +440,14 @@ template void bilateral23 (T** src, T** dst, T** buffer, int W { BL_BEGIN(132, 5) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER11(0, 0, 1, 1, 1, 1, 0, 1, 1, 2, 3, 3, 1, 1, 3, 5, 6, 7, 1, 2, 5, 7, 10, 11, 1, 3, 6, 10, 13, 14, 1, 3, 7, 11, 14, 16) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(5) } @@ -380,10 +456,14 @@ template void bilateral24 (T** src, T** dst, T** buffer, int W { BL_BEGIN(156, 5) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER11(0, 0, 1, 1, 1, 1, 0, 1, 1, 2, 3, 3, 1, 1, 3, 4, 5, 6, 1, 2, 4, 6, 8, 9, 1, 3, 5, 8, 10, 11, 1, 3, 6, 9, 11, 12) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(5) } @@ -392,10 +472,14 @@ template void bilateral25 (T** src, T** dst, T** buffer, int W { BL_BEGIN(173, 5) +#ifdef _OPENMP #pragma omp for +#endif BL_OPER11(0, 0, 1, 1, 1, 1, 0, 1, 1, 2, 3, 3, 1, 1, 2, 4, 5, 5, 1, 2, 4, 5, 7, 7, 1, 3, 5, 7, 9, 9, 1, 3, 5, 7, 9, 10) BL_FREE +#ifdef _OPENMP #pragma omp for +#endif BL_END(5) } diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 5475e8ffc..d686ad43e 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -19,6 +19,7 @@ #ifndef _BOXBLUR_H_ #define _BOXBLUR_H_ +#include #include #include #include @@ -35,6 +36,8 @@ namespace rtengine template void boxblur (T** src, A** dst, int radx, int rady, int W, int H) { //box blur image; box range = (radx,rady) + assert(2*radx+1 < W); + assert(2*rady+1 < H); AlignedBuffer* buffer = new AlignedBuffer (W * H); float* temp = buffer->data; @@ -121,7 +124,7 @@ template void boxblur (T** src, A** dst, int radx, int rady, i } -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) @@ -309,7 +312,7 @@ template SSEFUNCTION void boxblur (T** src, A** dst, T* buffer } -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) @@ -496,7 +499,7 @@ template SSEFUNCTION void boxblur (T* src, A* dst, A* 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) { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/rtengine/cJSON.c b/rtengine/cJSON.c index 263a45113..fb8ce27e8 100644 --- a/rtengine/cJSON.c +++ b/rtengine/cJSON.c @@ -1,5 +1,5 @@ /* - Copyright (c) 2009 Dave Gamble + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23,6 +23,20 @@ /* cJSON */ /* JSON parser in C. */ +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + #include #include #include @@ -30,585 +44,2890 @@ #include #include #include + +#ifdef ENABLE_LOCALES +#include +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + #include "cJSON.h" -static const char *ep; +/* define our own boolean type */ +#define true ((cJSON_bool)1) +#define false ((cJSON_bool)0) -const char *cJSON_GetErrorPtr(void) {return ep;} +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; -static int cJSON_strcasecmp(const char *s1,const char *s2) +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) { - 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); + return (const char*) (global_error.json + global_error.position); } -static void *(*cJSON_malloc)(size_t sz) = malloc; -static void (*cJSON_free)(void *ptr) = free; +CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item) { + if (!cJSON_IsString(item)) { + return NULL; + } -static char* cJSON_strdup(const char* str) -{ - size_t len; - char* copy; - - len = strlen(str) + 1; - if (!(copy = (char*)cJSON_malloc(len))) return 0; - memcpy(copy,str,len); - return copy; + return item->valuestring; } -void cJSON_InitHooks(cJSON_Hooks* hooks) +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 5) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) { - if (!hooks) { /* Reset hooks */ - cJSON_malloc = malloc; - cJSON_free = free; + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(*allocate)(size_t size); + void (*deallocate)(void *pointer); + void *(*reallocate)(void *pointer, size_t size); +} internal_hooks; + +#if defined(_MSC_VER) +/* work around MSVC error C2322: '...' address of dillimport '...' is not static */ +static void *internal_malloc(size_t size) +{ + return malloc(size); +} +static void internal_free(void *pointer) +{ + free(pointer); +} +static void *internal_realloc(void *pointer, size_t size) +{ + return realloc(pointer, size); +} +#else +#define internal_malloc malloc +#define internal_free free +#define internal_realloc realloc +#endif + +static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; return; } - cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; - cJSON_free = (hooks->free_fn)?hooks->free_fn:free; + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } } /* Internal constructor. */ -static cJSON *cJSON_New_Item(void) +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) { - cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); - if (node) memset(node,0,sizeof(cJSON)); - return node; + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; } /* Delete a cJSON structure. */ -void cJSON_Delete(cJSON *c) +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) { - cJSON *next; - while (c) - { - next=c->next; - if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child); - if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring); - if (c->string) cJSON_free(c->string); - cJSON_free(c); - c=next; - } + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } } -/* Parse the input text to generate a number, and populate the result into item. */ -static const char *parse_number(cJSON *item,const char *num) +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) { - double n=0,sign=1,scale=0;int subscale=0,signsubscale=1; +#ifdef ENABLE_LOCALES + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +#else + return '.'; +#endif +} - if (*num=='-') sign=-1,num++; /* Has sign? */ - if (*num=='0') num++; /* is zero */ - if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* Number? */ - if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* Fractional part? */ - if (*num=='e' || *num=='E') /* Exponent? */ - { num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* With sign? */ - while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */ - } +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; - n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) - item->valuedouble=n; - item->valueint=(int)n; - item->type=cJSON_Number; - return num; +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + if (newbuffer) + { + memcpy(newbuffer, p->buffer, p->offset + 1); + } + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); } /* Render the number nicely from the given item into a string. */ -static char *print_number(cJSON *item) +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) { - char *str; - double d=item->valuedouble; - if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN) - { - str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */ - if (str) sprintf(str,"%d",item->valueint); - } - else - { - str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ - if (str) - { - if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)sprintf(str,"%.0f",d); - else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); - else sprintf(str,"%f",d); - } - } - return str; + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26]; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if ((d * 0) != 0) + { + length = sprintf((char*)number_buffer, "null"); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occurred */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; } -static unsigned parse_hex4(const char *str) +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) { - unsigned h=0; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - return h; + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; } -/* Parse the input text into an unescaped cstring, and populate item. */ -static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; -static const char *parse_string(cJSON *item,const char *str) +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) { - const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2; - if (*str!='\"') {ep=str;return 0;} /* not a string! */ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; - while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */ + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } - out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */ - if (!out) return 0; + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); - ptr=str+1;ptr2=out; - while (*ptr!='\"' && *ptr) - { - if (*ptr!='\\') *ptr2++=*ptr++; - else - { - ptr++; - switch (*ptr) - { - case 'b': *ptr2++='\b'; break; - case 'f': *ptr2++='\f'; break; - case 'n': *ptr2++='\n'; break; - case 'r': *ptr2++='\r'; break; - case 't': *ptr2++='\t'; break; - case 'u': /* transcode utf16 to utf8. */ - uc=parse_hex4(ptr+1);ptr+=4; /* get the unicode char. */ + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } - if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; /* check for invalid. */ + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ - if (uc>=0xD800 && uc<=0xDBFF) /* UTF16 surrogate pairs. */ - { - if (ptr[1]!='\\' || ptr[2]!='u') break; /* missing second-half of surrogate. */ - uc2=parse_hex4(ptr+3);ptr+=6; - if (uc2<0xDC00 || uc2>0xDFFF) break; /* invalid second-half of surrogate. */ - uc=0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF)); - } + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } - len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } -#if defined( __GNUC__ ) && __GNUC__ >= 7// silence warning -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" -#endif + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } - 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; - } - ptr++; - } - } - *ptr2=0; - if (*ptr=='\"') ptr++; - item->valuestring=out; - item->type=cJSON_String; - return ptr; + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; } /* Render the cstring provided to an escaped version that can be printed. */ -static char *print_string_ptr(const char *str) +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) { - const char *ptr;char *ptr2,*out;int len=0;unsigned char token; + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; - 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++;} + if (output_buffer == NULL) + { + return false; + } - out=(char*)cJSON_malloc(len+3); - if (!out) return 0; + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); - ptr2=out;ptr=str; - *ptr2++='\"'; - while (*ptr) - { - if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++; - else - { - *ptr2++='\\'; - switch (token=*ptr++) - { - case '\\': *ptr2++='\\'; break; - case '\"': *ptr2++='\"'; break; - case '\b': *ptr2++='b'; break; - case '\f': *ptr2++='f'; break; - case '\n': *ptr2++='n'; break; - case '\r': *ptr2++='r'; break; - case '\t': *ptr2++='t'; break; - default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */ - } - } - } - *ptr2++='\"';*ptr2++=0; - return out; + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); } -/* Invote print_string_ptr (which is useful) on an item. */ -static char *print_string(cJSON *item) {return print_string_ptr(item->valuestring);} /* Predeclare these prototypes. */ -static const char *parse_value(cJSON *item,const char *value); -static char *print_value(cJSON *item,int depth,int fmt); -static const char *parse_array(cJSON *item,const char *value); -static char *print_array(cJSON *item,int depth,int fmt); -static const char *parse_object(cJSON *item,const char *value); -static char *print_object(cJSON *item,int depth,int fmt); +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); /* Utility to jump whitespace and cr/lf */ -static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;} +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ +static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { + return NULL; + } + + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { + buffer->offset += 3; + } + + return buffer; +} /* Parse an object - create a new root, and populate. */ -cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated) +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) { - const char *end=0; - cJSON *c=cJSON_New_Item(); - ep=0; - if (!c) return 0; /* memory fail */ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; - end=parse_value(c,skip(value)); - if (!end) {cJSON_Delete(c);return 0;} /* parse failure. ep is set. */ + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; - /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ - if (require_null_terminated) {end=skip(end);if (*end) {cJSON_Delete(c);ep=end;return 0;}} - if (return_parse_end) *return_parse_end=end; - return c; + if (value == NULL) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = strlen((const char*)value) + sizeof(""); + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; } + /* Default options for cJSON_Parse */ -cJSON *cJSON_Parse(const char *value) {return cJSON_ParseWithOpts(value,0,0);} +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +#define cjson_min(a, b) ((a < b) ? a : b) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + static const size_t default_buffer_size = 256; + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); + buffer->buffer = NULL; + if (printed == NULL) { + goto fail; + } + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; +} /* Render a cJSON item/entity/structure to text. */ -char *cJSON_Print(cJSON *item) {return print_value(item,0,1);} -char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0);} +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((len < 0) || (buf == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buf; + p.length = (size_t)len; + p.offset = 0; + p.noalloc = true; + p.format = fmt; + p.hooks = global_hooks; + + return print_value(item, &p); +} /* Parser core - when encountering text, process appropriately. */ -static const char *parse_value(cJSON *item,const char *value) +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) { - if (!value) return 0; /* Fail on null. */ - if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; } - if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; } - if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; } - if (*value=='\"') { return parse_string(item,value); } - if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); } - if (*value=='[') { return parse_array(item,value); } - if (*value=='{') { return parse_object(item,value); } + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } - ep=value;return 0; /* failure. */ + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + return false; } /* Render a value to text. */ -static char *print_value(cJSON *item,int depth,int fmt) +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) { - char *out=0; - if (!item) return 0; - switch ((item->type)&255) - { - case cJSON_NULL: out=cJSON_strdup("null"); break; - case cJSON_False: out=cJSON_strdup("false");break; - case cJSON_True: out=cJSON_strdup("true"); break; - case cJSON_Number: out=print_number(item);break; - case cJSON_String: out=print_string(item);break; - case cJSON_Array: out=print_array(item,depth,fmt);break; - case cJSON_Object: out=print_object(item,depth,fmt);break; - } - return out; + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } } /* Build an array from input text. */ -static const char *parse_array(cJSON *item,const char *value) +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) { - cJSON *child; - if (*value!='[') {ep=value;return 0;} /* not an array! */ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; - item->type=cJSON_Array; - value=skip(value+1); - if (*value==']') return value+1; /* empty array. */ + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; - item->child=child=cJSON_New_Item(); - if (!item->child) return 0; /* memory fail */ - value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */ - if (!value) return 0; + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } - while (*value==',') - { - cJSON *new_item; - if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ - child->next=new_item;new_item->prev=child;child=new_item; - value=skip(parse_value(child,skip(value+1))); - if (!value) return 0; /* memory fail */ - } + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } - if (*value==']') return value+1; /* end of array */ - ep=value;return 0; /* malformed. */ + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; } /* Render an array to text */ -static char *print_array(cJSON *item,int depth,int fmt) +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) { - char **entries; - char *out=0,*ptr,*ret;int len=5; - cJSON *child=item->child; - int numentries=0,i=0,fail=0; + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; - /* How many entries in the array? */ - while (child) numentries++,child=child->next; - /* Explicitly handle numentries==0 */ - if (!numentries) - { - out=(char*)cJSON_malloc(3); - if (out) strcpy(out,"[]"); - return out; - } - /* Allocate an array to hold the values for each */ - entries=(char**)cJSON_malloc(numentries*sizeof(char*)); - if (!entries) return 0; - memset(entries,0,numentries*sizeof(char*)); - /* Retrieve all the results: */ - child=item->child; - while (child && !fail) - { - ret=print_value(child,depth+1,fmt); - entries[i++]=ret; - if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; - child=child->next; - } + if (output_buffer == NULL) + { + return false; + } - /* If we didn't fail, try to malloc the output string */ - if (!fail) out=(char*)cJSON_malloc(len); - /* If that fails, we fail. */ - if (!out) fail=1; + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } - /* Handle failure. */ - if (fail) - { - for (i=0;ioffset++; + output_buffer->depth++; - /* Compose the output array. */ - *out='['; - ptr=out+1;*ptr=0; - for (i=0;inext) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; } /* Build an object from the text. */ -static const char *parse_object(cJSON *item,const char *value) +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) { - cJSON *child; - if (*value!='{') {ep=value;return 0;} /* not an object! */ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; - item->type=cJSON_Object; - value=skip(value+1); - if (*value=='}') return value+1; /* empty array. */ + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; - item->child=child=cJSON_New_Item(); - if (!item->child) return 0; - value=skip(parse_string(child,skip(value))); - if (!value) return 0; - child->string=child->valuestring;child->valuestring=0; - 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; + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } - while (*value==',') - { - cJSON *new_item; - if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ - child->next=new_item;new_item->prev=child;child=new_item; - value=skip(parse_string(child,skip(value+1))); - if (!value) return 0; - child->string=child->valuestring;child->valuestring=0; - 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; - } + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } - if (*value=='}') return value+1; /* end of array */ - ep=value;return 0; /* malformed. */ + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* failed to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; } /* Render an object to text. */ -static char *print_object(cJSON *item,int depth,int fmt) +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) { - char **entries=0,**names=0; - char *out=0,*ptr,*ret,*str;int len=7,i=0,j; - cJSON *child=item->child; - int numentries=0,fail=0; - /* Count the number of entries. */ - while (child) numentries++,child=child->next; - /* Explicitly handle empty object case */ - if (!numentries) - { - out=(char*)cJSON_malloc(fmt?depth+4:3); - if (!out) return 0; - ptr=out;*ptr++='{'; - if (fmt) {*ptr++='\n';for (i=0;ichild; - /* Collect all the results into our arrays: */ - child=item->child;depth++;if (fmt) len+=depth; - while (child) - { - names[i]=str=print_string_ptr(child->string); - entries[i++]=ret=print_value(child,depth,fmt); - if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; - child=child->next; - } + if (output_buffer == NULL) + { + return false; + } - /* Try to allocate the output string */ - if (!fail) out=(char*)cJSON_malloc(len); - if (!out) fail=1; + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } - /* Handle failure */ - if (fail) - { - for (i=0;idepth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; - /* Compose the output: */ - *out='{';ptr=out+1;if (fmt)*ptr++='\n';*ptr=0; - for (i=0;iformat) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } - cJSON_free(names);cJSON_free(entries); - if (fmt) for (i=0;istring, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; } /* Get Array size/item / object item. */ -int cJSON_GetArraySize(cJSON *array) {cJSON *c=array->child;int i=0;while(c)i++,c=c->next;return i;} -cJSON *cJSON_GetArrayItem(cJSON *array,int item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} -cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} /* Utility for array list handling. */ -static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;} +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + /* Utility for handling references. */ -static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;} +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL)) + { + return false; + } + + child = array->child; + + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + } + else + { + /* append to the end */ + while (child->next) + { + child = child->next; + } + suffix_object(child, item); + } + + return true; +} /* Add item to array/object. */ -void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}} -void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);} -void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} -void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));} - -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; +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + add_item_to_array(array, item); +} + +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +/* helper function to cast away const */ +static void* cast_away_const(const void* string) +{ + return (void*)string; +} +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + + +static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key) +{ + char *new_key = NULL; + int new_type = cJSON_Invalid; + + if ((object == NULL) || (string == NULL) || (item == NULL)) + { + return false; + } + + if (constant_key) + { + new_key = (char*)cast_away_const(string); + new_type = item->type | cJSON_StringIsConst; + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { + return false; + } + + new_type = item->type & ~cJSON_StringIsConst; + } + + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + hooks->deallocate(item->string); + } + + item->string = new_key; + item->type = new_type; + + return add_item_to_array(object, item); +} + +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + add_item_to_object(object, string, item, &global_hooks, false); +} + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + add_item_to_object(object, string, item, &global_hooks, true); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return; + } + + add_item_to_array(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return; + } + + add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name) +{ + cJSON *null = cJSON_CreateNull(); + if (add_item_to_object(object, name, null, &global_hooks, false)) + { + return null; + } + + cJSON_Delete(null); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name) +{ + cJSON *true_item = cJSON_CreateTrue(); + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { + return true_item; + } + + cJSON_Delete(true_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name) +{ + cJSON *false_item = cJSON_CreateFalse(); + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { + return false_item; + } + + cJSON_Delete(false_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean) +{ + cJSON *bool_item = cJSON_CreateBool(boolean); + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { + return bool_item; + } + + cJSON_Delete(bool_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number) +{ + cJSON *number_item = cJSON_CreateNumber(number); + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { + return number_item; + } + + cJSON_Delete(number_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string) +{ + cJSON *string_item = cJSON_CreateString(string); + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { + return string_item; + } + + cJSON_Delete(string_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw) +{ + cJSON *raw_item = cJSON_CreateRaw(raw); + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { + return raw_item; + } + + cJSON_Delete(raw_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name) +{ + cJSON *object_item = cJSON_CreateObject(); + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { + return object_item; + } + + cJSON_Delete(object_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name) +{ + cJSON *array = cJSON_CreateArray(); + if (add_item_to_object(object, name, array, &global_hooks, false)) + { + return array; + } + + cJSON_Delete(array); + return NULL; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item->prev != NULL) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); } -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));} /* Replace array/object items with new ones. */ -void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return; - newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem; - if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);} -void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}} +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0) + { + return; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + add_item_to_array(array, newitem); + return; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (parent->child == item) + { + parent->child = replacement; + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return; + } + + cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + replacement->type &= ~cJSON_StringIsConst; + + cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, true); +} /* Create basic types: */ -cJSON *cJSON_CreateNull(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;} -cJSON *cJSON_CreateTrue(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;} -cJSON *cJSON_CreateFalse(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;} -cJSON *cJSON_CreateBool(int b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} -cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int)num;}return item;} -cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} -cJSON *cJSON_CreateArray(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} -cJSON *cJSON_CreateObject(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;} +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool b) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = b ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) { + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} /* Create Arrays: */ -cJSON *cJSON_CreateIntArray(const int *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateFloatArray(const float *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateDoubleArray(const double *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0;a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + return a; +} /* Duplication */ -cJSON *cJSON_Duplicate(cJSON *item,int recurse) +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) { - cJSON *newitem,*cptr,*nptr=0,*newchild; - /* Bail on bad ptr */ - if (!item) return 0; - /* Create new item */ - newitem=cJSON_New_Item(); - if (!newitem) return 0; - /* Copy over all vars */ - newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble; - if (item->valuestring) {newitem->valuestring=cJSON_strdup(item->valuestring); if (!newitem->valuestring) {cJSON_Delete(newitem);return 0;}} - if (item->string) {newitem->string=cJSON_strdup(item->string); if (!newitem->string) {cJSON_Delete(newitem);return 0;}} - /* If non-recursive, then we're done! */ - if (!recurse) return newitem; - /* Walk the ->next chain for the child. */ - cptr=item->child; - while (cptr) - { - newchild=cJSON_Duplicate(cptr,1); /* Duplicate (with recurse) each item in the ->next chain */ - if (!newchild) {cJSON_Delete(newitem);return 0;} - if (nptr) {nptr->next=newchild,newchild->prev=nptr;nptr=newchild;} /* If newitem->child already set, then crosswire ->prev and ->next and move on */ - else {newitem->child=newchild;nptr=newchild;} /* Set newitem->child and move to it */ - cptr=cptr->next; - } - return newitem; + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; } -void cJSON_Minify(char *json) +CJSON_PUBLIC(void) cJSON_Minify(char *json) { - char *into=json; - while (*json) - { - if (*json==' ') json++; - else if (*json=='\t') json++; // Whitespace characters. - else if (*json=='\r') json++; - else if (*json=='\n') json++; - else if (*json=='/' && json[1]=='/') while (*json && *json!='\n') json++; // double-slash comments, to end of line. - else if (*json=='/' && json[1]=='*') {while (*json && !(*json=='*' && json[1]=='/')) json++;json+=2;} // multiline comments. - else if (*json=='\"'){*into++=*json++;while (*json && *json!='\"'){if (*json=='\\') *into++=*json++;*into++=*json++;}*into++=*json++;} // string literals, which are \" sensitive. - else *into++=*json++; // All other characters. - } - *into=0; // and null-terminate. + unsigned char *into = (unsigned char*)json; + + if (json == NULL) + { + return; + } + + while (*json) + { + if (*json == ' ') + { + json++; + } + else if (*json == '\t') + { + /* Whitespace characters. */ + json++; + } + else if (*json == '\r') + { + json++; + } + else if (*json=='\n') + { + json++; + } + else if ((*json == '/') && (json[1] == '/')) + { + /* double-slash comments, to end of line. */ + while (*json && (*json != '\n')) + { + json++; + } + } + else if ((*json == '/') && (json[1] == '*')) + { + /* multiline comments. */ + while (*json && !((*json == '*') && (json[1] == '/'))) + { + json++; + } + json += 2; + } + else if (*json == '\"') + { + /* string literals, which are \" sensitive. */ + *into++ = (unsigned char)*json++; + while (*json && (*json != '\"')) + { + if (*json == '\\') + { + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + else + { + /* All other characters. */ + *into++ = (unsigned char)*json++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a)) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (a->valuedouble == b->valuedouble) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); } diff --git a/rtengine/cJSON.h b/rtengine/cJSON.h index b32b6792e..786dd2e0e 100644 --- a/rtengine/cJSON.h +++ b/rtengine/cJSON.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2009 Dave Gamble + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -28,113 +28,247 @@ extern "C" { #endif +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 7 +#define CJSON_VERSION_PATCH 5 + +#include + /* cJSON Types: */ -#define cJSON_False 0 -#define cJSON_True 1 -#define cJSON_NULL 2 -#define cJSON_Number 3 -#define cJSON_String 4 -#define cJSON_Array 5 -#define cJSON_Object 6 +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ #define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 /* The cJSON structure: */ -typedef struct cJSON { - struct cJSON *next, *prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ - struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; - int type; /* The type of the item, as above. */ + /* The type of the item, as above. */ + int type; - char *valuestring; /* The item's string, if type==cJSON_String */ - int valueint; /* The item's number, if type==cJSON_Number */ - double valuedouble; /* The item's number, if type==cJSON_Number */ + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; - char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; } cJSON; -typedef struct cJSON_Hooks { - void *(*malloc_fn)(size_t sz); - void (*free_fn)(void *ptr); +typedef struct cJSON_Hooks +{ + void *(*malloc_fn)(size_t sz); + void (*free_fn)(void *ptr); } cJSON_Hooks; +typedef int cJSON_bool; + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type __stdcall +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall +#endif +#else /* !WIN32 */ +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + /* Supply malloc, realloc and free functions to cJSON */ -extern void cJSON_InitHooks(cJSON_Hooks* hooks); +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); -/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ -extern cJSON *cJSON_Parse(const char *value); -/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ -extern char *cJSON_Print(cJSON *item); -/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ -extern char *cJSON_PrintUnformatted(cJSON *item); +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); /* Delete a cJSON entity and all subentities. */ -extern void cJSON_Delete(cJSON *c); +CJSON_PUBLIC(void) cJSON_Delete(cJSON *c); /* Returns the number of items in an array (or object). */ -extern int cJSON_GetArraySize(cJSON *array); +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ -extern cJSON *cJSON_GetArrayItem(cJSON *array, int item); +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); /* Get item "string" from object. Case insensitive. */ -extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string); - +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ -extern const char *cJSON_GetErrorPtr(void); +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* Check if the item is a string and return its valuestring */ +CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); /* These calls create a cJSON item of the appropriate type. */ -extern cJSON *cJSON_CreateNull(void); -extern cJSON *cJSON_CreateTrue(void); -extern cJSON *cJSON_CreateFalse(void); -extern cJSON *cJSON_CreateBool(int b); -extern cJSON *cJSON_CreateNumber(double num); -extern cJSON *cJSON_CreateString(const char *string); -extern cJSON *cJSON_CreateArray(void); -extern cJSON *cJSON_CreateObject(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string); +/* Create an object/arrray that only references it's elements so + * they will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child); +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child); /* These utilities create an Array of count items. */ -extern cJSON *cJSON_CreateIntArray(const int *numbers, int count); -extern cJSON *cJSON_CreateFloatArray(const float *numbers, int count); -extern cJSON *cJSON_CreateDoubleArray(const double *numbers, int count); -extern cJSON *cJSON_CreateStringArray(const char **strings, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count); /* Append item to the specified array/object. */ -extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); -extern void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ -extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); -extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); -/* Remove/Detatch 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); -extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string); +/* Remove/Detach items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); /* Update array items. */ -extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); -extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem); +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); /* Duplicate a cJSON item */ -extern cJSON *cJSON_Duplicate(cJSON *item, int recurse); +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will need to be released. With recurse!=0, it will duplicate any children connected to the item. The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); -/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ -extern cJSON *cJSON_ParseWithOpts(const char *value, const char **return_parse_end, int require_null_terminated); -extern void cJSON_Minify(char *json); +CJSON_PUBLIC(void) cJSON_Minify(char *json); -/* Macros for creating things quickly. */ -#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) -#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) -#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) -#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) -#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) -#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) +/* Helper functions for creating and adding items to an object at the same time. + * They return the added item or NULL on failure. */ +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean); +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number); +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string); +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw); +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name); /* When assigning an integer value, it needs to be propagated to valuedouble too. */ -#define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); #ifdef __cplusplus } diff --git a/rtengine/camconst.cc b/rtengine/camconst.cc index 469d18571..43de5d688 100644 --- a/rtengine/camconst.cc +++ b/rtengine/camconst.cc @@ -19,12 +19,13 @@ namespace rtengine extern const Settings* settings; -CameraConst::CameraConst() +CameraConst::CameraConst() : pdafOffset(0) { memset(dcraw_matrix, 0, sizeof(dcraw_matrix)); memset(raw_crop, 0, sizeof(raw_crop)); memset(raw_mask, 0, sizeof(raw_mask)); white_max = 0; + globalGreenEquilibration = -1; } @@ -310,6 +311,46 @@ CameraConst::parseEntry(void *cJSON_, const char *make_model) } } + ji = cJSON_GetObjectItem(js, "pdaf_pattern"); + + if (ji) { + if (ji->type != cJSON_Array) { + fprintf(stderr, "\"pdaf_pattern\" must be an array\n"); + goto parse_error; + } + + for (ji = ji->child; ji != nullptr; ji = ji->next) { + if (ji->type != cJSON_Number) { + fprintf(stderr, "\"pdaf_pattern\" array must contain numbers\n"); + goto parse_error; + } + + cc->pdafPattern.push_back(ji->valueint); + } + } + + ji = cJSON_GetObjectItem(js, "pdaf_offset"); + + if (ji) { + if (ji->type != cJSON_Number) { + fprintf(stderr, "\"pdaf_offset\" must contain a number\n"); + goto parse_error; + } + + cc->pdafOffset = ji->valueint; + } + + ji = cJSON_GetObjectItem(js, "global_green_equilibration"); + + if (ji) { + if (ji->type != cJSON_False && ji->type != cJSON_True) { + fprintf(stderr, "\"global_green_equilibration\" must be a boolean\n"); + goto parse_error; + } + + cc->globalGreenEquilibration = (ji->type == cJSON_True); + } + return cc; parse_error: @@ -345,6 +386,36 @@ CameraConst::get_dcrawMatrix() return dcraw_matrix; } +bool +CameraConst::has_pdafPattern() +{ + return pdafPattern.size() > 0; +} + +std::vector +CameraConst::get_pdafPattern() +{ + return pdafPattern; +} + +void +CameraConst::update_pdafPattern(const std::vector &other) +{ + if (other.empty()) { + return; + } + pdafPattern = other; +} + +void +CameraConst::update_pdafOffset(int other) +{ + if (other == 0) { + return; + } + pdafOffset = other; +} + bool CameraConst::has_rawCrop() { @@ -547,6 +618,24 @@ CameraConst::get_WhiteLevel(const int idx, const int iso_speed, const float fnum return lvl.levels[idx]; } +bool +CameraConst::has_globalGreenEquilibration() +{ + return globalGreenEquilibration >= 0; +} + +bool +CameraConst::get_globalGreenEquilibration() +{ + return globalGreenEquilibration > 0; +} + +void +CameraConst::update_globalGreenEquilibration(bool other) +{ + globalGreenEquilibration = (other ? 1 : 0); +} + bool CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) { @@ -678,6 +767,11 @@ CameraConstantsStore::parse_camera_constants_file(Glib::ustring filename_) // deleting all the existing levels, replaced by the new ones existingcc->update_Levels(cc); existingcc->update_Crop(cc); + existingcc->update_pdafPattern(cc->get_pdafPattern()); + existingcc->update_pdafOffset(cc->get_pdafOffset()); + if (cc->has_globalGreenEquilibration()) { + existingcc->update_globalGreenEquilibration(cc->get_globalGreenEquilibration()); + } if (settings->verbose) { printf("Merging camera constants for \"%s\"\n", make_model.c_str()); diff --git a/rtengine/camconst.h b/rtengine/camconst.h index 47c8d8bee..eb43da483 100644 --- a/rtengine/camconst.h +++ b/rtengine/camconst.h @@ -24,7 +24,10 @@ private: int white_max; std::map mLevels[2]; std::map mApertureScaling; - + std::vector pdafPattern; + int pdafOffset; + int globalGreenEquilibration; + CameraConst(); static bool parseLevels(CameraConst *cc, int bw, void *ji); static bool parseApertureScaling(CameraConst *cc, void *ji); @@ -33,16 +36,24 @@ private: public: static CameraConst *parseEntry(void *cJSON, const char *make_model); bool has_dcrawMatrix(void); + bool has_pdafPattern(void); void update_dcrawMatrix(const short *other); const short *get_dcrawMatrix(void); + std::vector get_pdafPattern(); + int get_pdafOffset() {return pdafOffset;} bool has_rawCrop(void); void get_rawCrop(int& left_margin, int& top_margin, int& width, int& height); bool has_rawMask(int idx); void get_rawMask(int idx, int& top, int& left, int& bottom, int& right); int get_BlackLevel(int idx, int iso_speed); int get_WhiteLevel(int idx, int iso_speed, float fnumber); + bool has_globalGreenEquilibration(); + bool get_globalGreenEquilibration(); void update_Levels(const CameraConst *other); void update_Crop(CameraConst *other); + void update_pdafPattern(const std::vector &other); + void update_pdafOffset(int other); + void update_globalGreenEquilibration(bool other); }; class CameraConstantsStore diff --git a/rtengine/camconst.json b/rtengine/camconst.json index 610a22310..4bb0746b5 100644 --- a/rtengine/camconst.json +++ b/rtengine/camconst.json @@ -82,6 +82,11 @@ Examples: // It is useful after detecting the masked areas, to not fully use these areas but leave a border of 2-4 pixels // instead, to take care of possible light leaks from the light sensing area to the optically black (masked) // area or sensor imperfections at the outer borders. + + // list of indices of the rows with on-sensor PDAF pixels, for cameras that have such features. The indices here form a pattern that is repeated for the whole height of the sensor. The values are relative to the "pdaf_offset" value (see below) + "pdaf_pattern" : [ 0,12,36,54,72,90,114,126,144,162,180,204,216,240,252,270,294,306,324,342,366,384,396,414,432,450,474,492,504,522,540,564,576,594,606,630 ], + // index of the first row of the PDAF pattern in the sensor (0 is the topmost row). Allowed to be negative for convenience (this means that the first repetition of the pattern doesn't start from the first row) + "pdaf_offset" : 3 }, { @@ -273,12 +278,15 @@ About black levels: can be derived from masked pixels (typical for Canon cameras) or otherwise be extracted from some tag. Some formats have built-in subtraction information and are pre-processed by dcraw to end up at a black level of - zero (Phase One's IIQ). For Panasonic raws beginning from dcraw v9.21 dcraw/RT reads base BL from Exif data (tags 0x001c - BlackLevelRed, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue) and we define in "ranges": { "black": the needed offset - of around 15. The (total) BL RT displays is base+offset In all, you typically should not care about the black - level in camconst.json, any information that can be derived from the raw file itself should not be specified in - camconst.json! Sony's ARW2 is one of the few exceptions (with single black level around 512, or 800 for - RX10/100 models), but dcraw generally has good constants for these already. + zero (Phase One's IIQ). + + For Panasonic cameras, the black level defined in camconst.json is the black level offset, which comes from + BlackLevel3 + BlackLevel2. RawTherapee then reads the base black levels from Exif data (0x001c BlackLevelRed, + 0x001d BlackLevelGreen and 0x001e BlackLevelBlue) and adds them to the offset. + + In all, you typically should not care about the black level in camconst.json, any information that can be derived from + the raw file itself should not be specified in camconst.json! Sony's ARW2 is one of the few exceptions (with a single + black level around 512, or 800 for RX10/100 models), but dcraw generally has good constants for these already. Currently we have chosen not to provide any guide how to measure black levels as we don't think it will be a common task (it's also more difficult to do than measure white levels). If you experience a black level issue it's more likely due @@ -512,7 +520,7 @@ Camera constants: { // 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": { @@ -652,7 +660,7 @@ Camera constants: } }, - { // Quality A, ISO and aperture WL data copyed from Shalrath's 60D data at RawTherapee forums + { // Quality A, ISO and aperture WL data copied from Shalrath's 60D data at RawTherapee forums "make_model": "Canon EOS 60Da", "dcraw_matrix": [ 17492,-7240,-2023,-1791,10323,1701,-186,1329,5406 ], // 60Da dng d65 "ranges": { @@ -904,7 +912,7 @@ Camera constants: } }, - { // Quality C, white levels and apperture scaling copied from Canon EOS77d + { // Quality C, white levels and aperture scaling copied from Canon EOS77d "make_model": [ "Canon EOS Rebel T7i", "Canon EOS 800D", "Canon EOS Kiss X9i" ], "dcraw_matrix": [ 6970,-512,-968,-4425,12161,2553,-739,1982,5601 ], // DNG_V9.10.1 D65 "raw_crop": [ 264, 36, 6024, 4020 ], // full size 6288x4056, official crop 276,48,6275,4047 @@ -936,7 +944,7 @@ Camera constants: } }, - { // Quality B, apperture scaling copied from Canon EOS77d + { // Quality B, aperture scaling copied from Canon EOS77d "make_model": [ "Canon EOS Rebel SL2", "Canon EOS 200D", "Canon EOS Kiss X9" ], "dcraw_matrix": [ 7377,-742,-998,-4235,11981,2549,-673,1918,5538 ], // DNG_V9.12 D65 "raw_crop": [ 264, 36, 6024, 4020 ], // full size 6288x4056, official crop 276,48,6275,4047 @@ -1123,6 +1131,10 @@ Camera constants: }, // Canon Powershot + { // Quality C, CHDK DNGs, raw frame correction + "make_model": "Canon PowerShot A3100 IS", + "raw_crop": [ 24, 12, 4032, 3024 ] // full size 4036X3026 + }, { // Quality C, CHDK DNGs, raw frame corrections, experimental infrared support commented out "make_model": "Canon PowerShot A480", @@ -1197,6 +1209,11 @@ Camera constants: "ranges": { "white": 4050 } }, + { // Quality C + "make_model": "Canon PowerShot SX50 HS", + "ranges": { "white": 4050 } + }, + { // Quality B "make_model": "Canon PowerShot SX60 HS", "dcraw_matrix": [ 13161,-5451,-1344,-1989,10654,1531,-47,1271,4955 ], // DNG_V8.7 D65 @@ -1205,11 +1222,33 @@ Camera constants: "ranges": { "white": 4050 } // nominal 4080-4093 }, + { // Quality C + "make_model": "Canon PowerShot SX150 IS", + "raw_crop": [ 26, 10, 4364, 3254 ] // cut 2pix left and right + }, + + { // Quality C + "make_model": "Canon PowerShot SX220 HS", + "raw_crop": [ 92, 16, 4072, 3042 ] // Cut 2pix at lower border because of too high values in blue channel + }, + + { // Quality C + "make_model": [ "DJI FC2103" ], + "ranges": { + "black": 4080 + } + }, + + { // Quality C + "make_model": "DJI FC6310", + "ranges": { "white": 64886 } + }, + { // Quality B "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 } }, @@ -1241,7 +1280,8 @@ Camera constants: { // Quality B "make_model": "FUJIFILM X-A3", "dcraw_matrix": [ 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 ], // DNGv9.8 D65 - "ranges": { "white": 4050 } + "raw_crop": [ 0, 0, 6016, 4014 ], // full raw 6016x4014 + "ranges": { "white": 16100 } }, { // Quality B @@ -1272,12 +1312,19 @@ Camera constants: }, { // Quality B - "make_model": [ "FUJIFILM X-PRO2", "FUJIFILM X-T2", "FUJIFILM X100F", "FUJIFILM X-T20" ], + "make_model": [ "FUJIFILM X-T2", "FUJIFILM X-T20", "FUJIFILM X-E3", "FUJIFILM X100F", "FUJIFILM X-PRO2", "FUJIFILM X-H1" ], "dcraw_matrix": [ 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 ], // DNG_v9.4 D65 - //"raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - experimental crop + // "raw_crop": [ 0, 5, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - for lossless compressed files + // "raw_crop": [ 0, 0, 6032, 4032 ], // full raw 6160,4032, Usable 6032,4032 - for uncompressed files + "raw_crop": [ 0, 5, 6032, 4026 ], // full raw 6160,4032, Usable 6032,4026 - for uncompressed and lossless compressed files (but reduces height by 6 pixels) "ranges": { "white": 16100 } }, + { // Quality C, only raw crop + "make_model": [ "FUJIFILM X-T3" ], + "raw_crop": [ 0, 5, 6252, 4176] + }, + { // Quality B "make_model": "FUJIFILM X30", "dcraw_matrix": [ 12328,-5256,-1144,-4469,12927,1675,-87,1291,4351 ], // DNG_v8.7 D65 @@ -1306,13 +1353,14 @@ Camera constants: "make_model": "LG mobile LG-H815", "dcraw_matrix": [ 5859,547,-1250,-6484,15547,547,-2422,5625,3906 ], // DNG D65 //"dcraw_matrix": [ 11563,-2891,-3203,-5313,15625,625,-781,2813,5625 ], // DNG A - "ranges": { "white_max": 1000 } + "raw_crop": [ 0, 0, 5312, 2986 ], // cropped last two rows because last row was garbage + "ranges": { "white": 1000 } }, { // Quality C "make_model": "LG mobile LG-H850", //"dcraw_matrix": [ 10000,-2188,-2813,-5156,15469,625,-703,2734,5078 ], // DNG A "dcraw_matrix": [ 5313,1016,-1172,-6250,15391,547,-2344,5547,3359 ], // DNG D65 - "ranges": { "white_max": 1000 } + "ranges": { "white": 1000 } }, { // Quality A @@ -1546,6 +1594,20 @@ Camera constants: "ranges": { "white": 3980 } // 12-bit files. }, + { // Quality C, only colour matrix and PDAF lines info + "make_model" : "Nikon Z 7", + "dcraw_matrix" : [10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785], // Adobe DNG Converter 11.0 ColorMatrix2 + "pdaf_pattern" : [0, 12], + "pdaf_offset" : 29 + }, + + { // Quality C, only colour matrix and PDAF lines info + "make_model" : "Nikon Z 6", + "dcraw_matrix" : [8210, -2534, -683, -5355, 13338, 2212, -1143, 1929, 6464], // Adobe DNG Converter 11.1 Beta ColorMatrix2 + "pdaf_pattern" : [0, 12], + "pdaf_offset" : 32 + }, + { // Quality B, 16Mp and 64Mp raw frames "make_model": "OLYMPUS E-M5MarkII", "dcraw_matrix": [ 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 ], // DNG_v8.8 D65 @@ -1589,6 +1651,7 @@ Camera constants: { // Quality B, missing per ISO samples "make_model": "OLYMPUS E-M1", + "global_green_equilibration" : true, "dcraw_matrix": [ 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 ], // dng d65 "ranges": { "white": 4080 } // nominal 4095-4094, spread with some settings as long exposure }, @@ -1603,12 +1666,14 @@ Camera constants: { // Quality A, white level correction "make_model": "OLYMPUS E-PM2", + "global_green_equilibration" : true, "dcraw_matrix": [ 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 ], "ranges": { "white": 4040 } // nominal 4056 }, { // Quality B, with long exposure noise reduction White Level gets WL-BL = around 256_12-bit levels less "make_model": [ "OLYMPUS E-PL7", "OLYMPUS E-PL8" ], + "global_green_equilibration" : true, "dcraw_matrix": [ 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 ], // DNG_v9.8 D65 "ranges": { "white": 4080 } // nominal 4093 }, @@ -1625,10 +1690,30 @@ Camera constants: "ranges": { "white": 4050 } // safe for worst case detected, nominal is 4093 }, -/* Since dcraw_v9.21 Panasonic base BL is read from Exif (tags 0x001c BlackLevelRed15 is BL offset. - dcraw/RT read the base black from Exif and calculates total BL = BLbase+BLoffset, 0x001d BlackLevelGreen, 0x001e BlackLevelBlue - and we define here the needed offset of around 15. The total BL is base+offset -*/ + { // Quality C, only green equilibration + "make_model" : ["OLYMPUS E-3", "OLYMPUS E-520"], + "global_green_equilibration" : true + }, + + { // Quality X + "make_model": [ "Panasonic DC-LX100M2" ], + "dcraw_matrix": [ 11577, -4230, -1106, -3967, 12211, 1957, -758, 1762, 5610 ], // Adobe DNG Converter 11.0 ColorMatrix2 + "raw_crop": [ 0, 0, 0, 0 ], + "ranges": { "black": 15 } + }, + + { // Quality C, proper ISO 100-125-160 samples missing, pixelshift files have no black offset etc. #4574 + "make_model": [ "Panasonic DC-G9" ], + "dcraw_matrix": [ 7685, -2375, -634, -3687, 11700, 2249, -748, 1546, 5111 ], // Adobe DNG Converter 10.3 ColorMatrix2 + "ranges": { + "black": 15, // 15 is BL offset. dcraw/RT reads the base black from Exif and calculates total BL = BLbase+BLoffset + "white": [ + { "iso": 100, "levels": 3000 }, // gaussian 3100-3600 Exif_linearitylimit 2111 + { "iso": 125, "levels": 3500 }, // guessed + { "iso": [ 160, 200, 250, 320, 400,500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 12800, 25600 ], "levels": 4080 } // nominal 4095 + ] + } + }, { // Quality B, CameraPhone, some samples are missing but has the same sensor as FZ1000 .. "make_model": [ "Panasonic DMC-CM1", "Panasonic DMC-CM10" ], @@ -1926,6 +2011,15 @@ Camera constants: } }, + { // Quality X, no white-frames nor black-frames yet, see #4550 + "make_model": [ "Panasonic DC-GX9" ], + "dcraw_matrix": [ 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 ], // ColorMatrix2 from Adobe DNG Converter 10.3 + "ranges": { + "black": 16, + "white": 4080 + } + }, + { // Quality B, Same as Panasonic G7 "make_model": [ "Panasonic DMC-G8", "Panasonic DMC-G80", "Panasonic DMC-G81", "Panasonic DMC-G85" ], "dcraw_matrix": [ 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 ], // DNG_v9.7 D65 @@ -1992,11 +2086,16 @@ Camera constants: "ranges": { "white": 4080 } // nominal at ISO200 4094 }, + { + "make_model": [ "PENTAX K-S1" ], + "raw_crop": [ 0, 0, -8, 0 ] + }, + { // Quality B, Intemediate ISO samples missing, Pentax_DNG WLtags are after BL sutraction and not valid "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 +2114,7 @@ Camera constants: { // 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 @@ -2141,9 +2240,8 @@ Camera constants: "make_model": "Sigma SD14", "dcraw_matrix": [ 16411,-4764,-2383,8110,2603,-645,3135,3878,1984 ], // experimental inverted icc wp12 - build with BL=15 //"dcraw_matrix": [ 13804,-4156,-1896,6917,1909,-431,2768,2989,1741 ], // experimental inverted icc wp10 - build with BL=15 - "ranges": { "black": 0, "white": 16383 }, // peripheral black stripes give BL around 37 - "raw_crop": [ 0, 0, -0, -0 ] - //"raw_crop": [ 18, 12, 2652, 1768 ] + "ranges": { "black": 15, "white": 7000 }, + "raw_crop": [ 18, 12, 2652, 1768 ] }, { // Quality C, correction for frame width @@ -2229,20 +2327,21 @@ Camera constants: "make_model": "Sony ILCE-6000", "dcraw_matrix": [ 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 ], // adobe dcp d65 "raw_crop": [ 0, 0, 6024, 4024 ], - "ranges": { "black": 512, "white": 16300 } + "ranges": { "black": 512, "white": 16300 }, + // detected by hand, using the picture from https://www.dpreview.com/forums/thread/3923513 + // P 11 P 23 P 17 P 17 P 17 P 23 P 11 P 17 P 17 P 17 P 23 P 11 P 23 P 11 P 17 P 23 P 11 P 17 P 17 P 23 P 17 P 11 P 17 P 17 P 17 P 23 P 17 P 11 P 17 P 17 P 23 P 11 P 17 P 11 P 23 + "pdaf_pattern" : [ 0,12,36,54,72,90,114,126,144,162,180,204,216,240,252,270,294,306,324,342,366,384,396,414,432,450,474,492,504,522,540,564,576,594,606,630 ], + "pdaf_offset" : 3 }, { // Quality A "make_model": [ "Sony ILCE-6300","Sony ILCE-6500" ], "dcraw_matrix": [ 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 ], // DNG_v9.8 D65 "raw_crop": [ 0, 0, 6024, 4024 ], - "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 } + "ranges": { "black": 512, "white": 16300 }, + // contributed by Horshak from https://www.dpreview.com/forums/post/60873077 + "pdaf_pattern" : [ 0,12,36,54,72,90,114,126,144,162,180,204,216,240,252,270,294,306,324,342,366,384,396,414,432,450,474,492,504,522,540,564,576,594,606,630 ], + "pdaf_offset" : 3 }, { // Quality A, correction for frame width @@ -2252,18 +2351,71 @@ Camera constants: "ranges": { "black": 512, "white": 16300 } }, + { // Quality A + "make_model": "Sony ILCE-7M2", + "raw_crop": [ 0, 0, 6024, 4024 ], + "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 "raw_crop": [ 0, 0, -36, 0 ], // full raw frame 8000x5320 - 36 rightmost columns are garbage - "ranges": { "black": 512, "white": 16300 } + "ranges": { "black": 512, "white": 16300 }, + // PDAF info provided by Horshack with the rawshack tool (http://testcams.com/rawshack/) + "pdaf_pattern" : [ 0,24,36,60,84,120,132,156,192,204,240,252,276,300,324,360,372,396,420 ], + "pdaf_offset" : 31 + }, + + { // 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 + ] + }, + // A7III, from https://www.dpreview.com/forums/post/60843139 + // in the original post: + // P 5 P 17 P 11 P 11 P 17 P 11 P 5 P 11 P 11 P 11 P 17 P 11 P 5 P 11 P 11 P 17 P 5 P 11 P 17 P 5 P 17 P 5 P 11 P 11 P 11 P 17 P 5 P 11 P 11 P 11 P 5 P 17 P 5 P 17 P 11 + // + // rotated to match the start of the frame + // P 11 P 11 P 11 P 17 P 11 P 5 P 11 P 11 P 17 P 5 P 11 P 17 P 5 P 17 P 5 P 11 P 11 P 11 P 17 P 5 P 11 P 11 P 11 P 5 P 17 P 5 P 17 P 11 P 5 P 17 P 11 P 11 P 17 P 11 P 5 + "pdaf_pattern" : [ 0,12,24,36,54,66,72,84,96,114,120,132,150,156,174,180,192,204,216,234,240,252,264,276,282,300,306,324,336,342,360,372,384,402,414,420], + "pdaf_offset" : 9 + }, + + { // 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 }, + "pdaf_pattern" : [0, 24, 36, 60, 84, 120, 132, 156, 192, 204, 240, 252, 276, 300, 324, 360, 372, 396, 420, 444, 480, 492, 504, 540, 564, 576, 612, 636, 660, 696, 720, 732, 756, 780, 804, 840], + "pdaf_offset" : 31 }, { // 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 "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": 16300 }, + // the A9 is the same as the A7III, rotated of 1 position + // source: https://www.dpreview.com/forums/post/60857788 + // P 11 P 11 P 11 P 17 P 11 P 5 P 11 P 11 P 17 P 5 P 11 P 17 P 5 P 17 P 5 P 11 P 11 P 11 P 17 P 5 P 11 P 11 P 11 P 5 P 17 P 5 P 17 P 11 P 5 P 17 P 11 P 11 P 17 P 11 P 5 + "pdaf_pattern" : [ 0,12,24,36,54,66,72,84,96,114,120,132,150,156,174,180,192,204,216,234,240,252,264,276,282,300,306,324,336,342,360,372,384,402,414,420 ], + "pdaf_offset" : -7 }, { // Quality B, correction for frame width @@ -2285,13 +2437,6 @@ Camera constants: "ranges": { "black": 800, "white": 16300 } }, - { // 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 C, No proper color data, beta samples, frame set to official jpeg, "make_model": [ "XIAOYI M1", "YI TECHNOLOGY M1" ], "dcraw_matrix": [ 7158,-1911,-606,-3603,10669,2530,-659,1236,5530 ], // XIAO YI DNG D65 @@ -2400,6 +2545,11 @@ Camera constants: "dcraw_matrix": [ 4932, -835, 141, -4878, 11868, 3437, -1138, 1961, 7067 ] }, + { // Quality C + "make_model": [ "Hasselblad H6D-100cMS" ], + "raw_crop": [ 64, 108, 11608, 8708 ] + }, + // Dummy test entry to test the parser and show the format with all entries active { "make_model": "DummyMake DummyModel", diff --git a/rtengine/cfa_linedn_RT.cc b/rtengine/cfa_linedn_RT.cc index 0f9e27634..f5563e3de 100644 --- a/rtengine/cfa_linedn_RT.cc +++ b/rtengine/cfa_linedn_RT.cc @@ -39,7 +39,7 @@ using namespace rtengine; // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::CLASS cfa_linedn(float noise) +void RawImageSource::CLASS cfa_linedn(float noise, bool horizontal, bool vertical, const CFALineDenoiseRowBlender &rowblender) { // local variables int height = H, width = W; @@ -64,20 +64,23 @@ void RawImageSource::CLASS cfa_linedn(float noise) float noisevarm4 = 4.0f * noisevar; volatile double progress = 0.0; float* RawDataTmp = (float*)malloc( width * height * sizeof(float)); +#ifdef _OPENMP #pragma omp parallel +#endif { // allocate memory and assure the arrays don't have same 64 byte boundary to avoid L1 conflict misses - float *cfain = (float*)malloc(4 * TS * TS * sizeof(float) + 3 * 16 * sizeof(float)); - float *cfablur = (cfain + (TS * TS) + 1 * 16); - float *cfadiff = (cfain + (2 * TS * TS) + 2 * 16); - float *cfadn = (cfain + (3 * TS * TS) + 3 * 16); - + float *cfain = (float*)malloc(3 * TS * TS * sizeof(float) + 2 * 16 * sizeof(float)); + float *cfadiff = (cfain + (1 * TS * TS) + 1 * 16); + float *cfadn = (cfain + (2 * TS * TS) + 2 * 16); + float cfablur[TS]; float linehvar[4], linevvar[4], noisefactor[4][8][2], coeffsq; float dctblock[4][8][8]; +#ifdef _OPENMP #pragma omp for +#endif for(int i = 0; i < height; i++) for(int j = 0; j < width; j++) { @@ -85,7 +88,9 @@ void RawImageSource::CLASS cfa_linedn(float noise) } // Main algorithm: Tile loop +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) +#endif for (int top = 0; top < height - 16; top += TS - 32) for (int left = 0; left < width - 16; left += TS - 32) { @@ -130,19 +135,19 @@ void RawImageSource::CLASS cfa_linedn(float noise) //gaussian blur of CFA data for (int rr = 8; rr < numrows - 8; rr++) { - for (int indx = rr * TS; indx < rr * TS + numcols; indx++) { - cfablur[indx] = gauss[0] * cfain[indx]; + for (int indx = rr * TS, indxb = 0; indx < rr * TS + numcols; indx++, indxb++) { + cfablur[indxb] = gauss[0] * cfain[indx]; for (int i = 1; i < 5; i++) { - cfablur[indx] += gauss[i] * (cfain[indx - (2 * i) * TS] + cfain[indx + (2 * i) * TS]); + cfablur[indxb] += gauss[i] * (cfain[indx - (2 * i) * TS] + cfain[indx + (2 * i) * TS]); } } - for (int indx = rr * TS + 8; indx < rr * TS + numcols - 8; indx++) { - cfadn[indx] = gauss[0] * cfablur[indx]; + for (int indx = rr * TS + 8, indxb = 8; indx < rr * TS + numcols - 8; indx++, indxb++) { + cfadn[indx] = gauss[0] * cfablur[indxb]; for (int i = 1; i < 5; i++) { - cfadn[indx] += gauss[i] * (cfablur[indx - 2 * i] + cfablur[indx + 2 * i]); + cfadn[indx] += gauss[i] * (cfablur[indxb - 2 * i] + cfablur[indxb + 2 * i]); } cfadiff[indx] = cfain[indx] - cfadn[indx]; // hipass cfa data @@ -183,14 +188,14 @@ void RawImageSource::CLASS cfa_linedn(float noise) } //horizontal lines - if (noisevarm4 > (linehvar[0] + linehvar[1])) { //horizontal lines + if (horizontal && noisevarm4 > (linehvar[0] + linehvar[1])) { //horizontal lines for (int i = 1; i < 8; i++) { dctblock[0][0][i] *= 0.5f * (noisefactor[0][i][1] + noisefactor[1][i][1]); //or should we use MIN??? dctblock[1][0][i] *= 0.5f * (noisefactor[0][i][1] + noisefactor[1][i][1]); //or should we use MIN??? } } - if (noisevarm4 > (linehvar[2] + linehvar[3])) { //horizontal lines + if (horizontal && noisevarm4 > (linehvar[2] + linehvar[3])) { //horizontal lines for (int i = 1; i < 8; i++) { dctblock[2][0][i] *= 0.5f * (noisefactor[2][i][1] + noisefactor[3][i][1]); //or should we use MIN??? dctblock[3][0][i] *= 0.5f * (noisefactor[2][i][1] + noisefactor[3][i][1]); //or should we use MIN??? @@ -198,14 +203,14 @@ void RawImageSource::CLASS cfa_linedn(float noise) } //vertical lines - if (noisevarm4 > (linevvar[0] + linevvar[2])) { //vertical lines + if (vertical && noisevarm4 > (linevvar[0] + linevvar[2])) { //vertical lines for (int i = 1; i < 8; i++) { dctblock[0][i][0] *= 0.5f * (noisefactor[0][i][0] + noisefactor[2][i][0]); //or should we use MIN??? dctblock[2][i][0] *= 0.5f * (noisefactor[0][i][0] + noisefactor[2][i][0]); //or should we use MIN??? } } - if (noisevarm4 > (linevvar[1] + linevvar[3])) { //vertical lines + if (vertical && noisevarm4 > (linevvar[1] + linevvar[3])) { //vertical lines for (int i = 1; i < 8; i++) { dctblock[1][i][0] *= 0.5f * (noisefactor[1][i][0] + noisefactor[3][i][0]); //or should we use MIN??? dctblock[3][i][0] *= 0.5f * (noisefactor[1][i][0] + noisefactor[3][i][0]); //or should we use MIN??? @@ -252,12 +257,19 @@ void RawImageSource::CLASS cfa_linedn(float noise) free(cfain); // copy temporary buffer back to image matrix - #pragma omp for +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { - rawData[i][j] = RawDataTmp[i * width + j]; + for(int i = 0; i < height; i++) { + float f = rowblender(i); + if (f > 0.f) { + float f2 = 1.f - f; + for(int j = 0; j < width; j++) { + rawData[i][j] = f * RawDataTmp[i * width + j] + f2 * rawData[i][j]; + } } + } } // end of parallel processing @@ -318,14 +330,14 @@ void RawImageSource::CLASS cfa_linedn(float noise) /* Cn_kI = sqrt(2.0/n) * sin(pi/2*k/n) */ /* Wn_kR = cos(pi/2*k/n) */ /* Wn_kI = sin(pi/2*k/n) */ -#define C8_1R 0.49039264020161522456 -#define C8_1I 0.09754516100806413392 -#define C8_2R 0.46193976625564337806 -#define C8_2I 0.19134171618254488586 -#define C8_3R 0.41573480615127261854 -#define C8_3I 0.27778511650980111237 -#define C8_4R 0.35355339059327376220 -#define W8_4R 0.70710678118654752440 +#define C8_1R 0.49039264020161522456f +#define C8_1I 0.09754516100806413392f +#define C8_2R 0.46193976625564337806f +#define C8_2I 0.19134171618254488586f +#define C8_3R 0.41573480615127261854f +#define C8_3I 0.27778511650980111237f +#define C8_4R 0.35355339059327376220f +#define W8_4R 0.70710678118654752440f void RawImageSource::ddct8x8s(int isgn, float a[8][8]) diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc index 560d5721a..86b67e000 100644 --- a/rtengine/ciecam02.cc +++ b/rtengine/ciecam02.cc @@ -38,25 +38,6 @@ namespace rtengine extern const Settings* settings; #endif -void Ciecam02::curvecolor (double satind, double satval, double &sres, double parsat) -{ - if (satind >= 0.0) { - sres = (1. - (satind) / 100.) * satval + (satind) / 100.* (1. - SQR (SQR (1. - min (satval, 1.0)))); - - if (sres > parsat) { - sres = parsat; - } - - if (sres < 0.) { - sres = 0.; - } - } else { - if (satind < -0.1) { - sres = satval * (1. + (satind) / 100.); - } - } -} - void Ciecam02::curvecolorfloat (float satind, float satval, float &sres, float parsat) { if (satind > 0.f) { @@ -76,111 +57,6 @@ void Ciecam02::curvecolorfloat (float satind, float satval, float &sres, float p } } -void Ciecam02::curveJ (double br, double contr, int db, LUTf & outCurve, LUTu & histogram ) -{ - LUTf dcurve (65536, 0); - int skip = 1; - - // check if brightness curve is needed - if (br > 0.00001 || br < -0.00001) { - - std::vector brightcurvePoints; - brightcurvePoints.resize (9); - brightcurvePoints.at (0) = double (DCT_NURBS); - - brightcurvePoints.at (1) = 0.; // black point. Value in [0 ; 1] range - brightcurvePoints.at (2) = 0.; // black point. Value in [0 ; 1] range - - if (br > 0) { - brightcurvePoints.at (3) = 0.1; // toe point - brightcurvePoints.at (4) = 0.1 + br / 150.0; //value at toe point - - brightcurvePoints.at (5) = 0.7; // shoulder point - brightcurvePoints.at (6) = min (1.0, 0.7 + br / 300.0); //value at shoulder point - } else { - brightcurvePoints.at (3) = 0.1 - br / 150.0; // toe point - brightcurvePoints.at (4) = 0.1; // value at toe point - - brightcurvePoints.at (5) = min (1.0, 0.7 - br / 300.0); // shoulder point - brightcurvePoints.at (6) = 0.7; // value at shoulder point - } - - brightcurvePoints.at (7) = 1.; // white point - brightcurvePoints.at (8) = 1.; // value at white point - - DiagonalCurve* brightcurve = new DiagonalCurve (brightcurvePoints, CURVES_MIN_POLY_POINTS / skip); - - // Applying brightness curve - for (int i = 0; i < 32768; i++) { - - // change to [0,1] range - float val = (float)i / 32767.0; - - // apply brightness curve - val = brightcurve->getVal (val); - - // store result in a temporary array - dcurve[i] = CLIPD (val); - } - - delete brightcurve; - } else { - // for (int i=0; i<32768; i++) { // L values range up to 32767, higher values are for highlight overflow - for (int i = 0; i < (32768 * db); i++) { // L values range up to 32767, higher values are for highlight overflow - - // set the identity curve in the temporary array - dcurve[i] = (float)i / (db * 32768.0f); - } - } - - - if (contr > 0.00001 || contr < -0.00001) { - - // compute mean luminance of the image with the curve applied - int sum = 0; - float avg = 0; - - //float sqavg = 0; - for (int i = 0; i < 32768; i++) { - avg += dcurve[i] * histogram[i];//approximation for average : usage of L (lab) instead of J - sum += histogram[i]; - } - - avg /= sum; - std::vector contrastcurvePoints; - contrastcurvePoints.resize (9); - contrastcurvePoints.at (0) = double (DCT_NURBS); - - contrastcurvePoints.at (1) = 0.; // black point. Value in [0 ; 1] range - contrastcurvePoints.at (2) = 0.; // black point. Value in [0 ; 1] range - - contrastcurvePoints.at (3) = avg - avg * (0.6 - contr / 250.0); // toe point - contrastcurvePoints.at (4) = avg - avg * (0.6 + contr / 250.0); // value at toe point - - contrastcurvePoints.at (5) = avg + (1 - avg) * (0.6 - contr / 250.0); // shoulder point - contrastcurvePoints.at (6) = avg + (1 - avg) * (0.6 + contr / 250.0); // value at shoulder point - - contrastcurvePoints.at (7) = 1.; // white point - contrastcurvePoints.at (8) = 1.; // value at white point - - DiagonalCurve* contrastcurve = new DiagonalCurve (contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip); - - // apply contrast enhancement - for (int i = 0; i < (32768 * db); i++) { - dcurve[i] = contrastcurve->getVal (dcurve[i]); - } - - delete contrastcurve; - } - - // for (int i=0; i<32768; i++) outCurve[i] = 32768.0*dcurve[i]; - for (int i = 0; i < (db * 32768); i++) { - outCurve[i] = db * 32768.0 * dcurve[i]; - } -// printf("double out500=%f out15000=%f\n", outCurve[500], outCurve[15000]); - -} - void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf & outCurve) { @@ -298,28 +174,11 @@ void Ciecam02::curveJfloat (float br, float contr, const LUTu & histogram, LUTf * */ -double Ciecam02::d_factor ( double f, double la ) -{ - return f * (1.0 - ((1.0 / 3.6) * exp ((-la - 42.0) / 92.0))); -} - float Ciecam02::d_factorfloat ( float f, float la ) { return f * (1.0f - ((1.0f / 3.6f) * xexpf ((-la - 42.0f) / 92.0f))); } -double Ciecam02::calculate_fl_from_la_ciecam02 ( double la ) -{ - double la5 = la * 5.0; - double k = 1.0 / (la5 + 1.0); - - /* Calculate k^4. */ - k = k * k; - k = k * k; - - return (0.2 * k * la5) + (0.1 * (1.0 - k) * (1.0 - k) * std::cbrt (la5)); -} - float Ciecam02::calculate_fl_from_la_ciecam02float ( float la ) { float la5 = la * 5.0f; @@ -332,54 +191,26 @@ float Ciecam02::calculate_fl_from_la_ciecam02float ( float la ) return (0.2f * k * la5) + (0.1f * (1.0f - k) * (1.0f - k) * std::cbrt (la5)); } -double Ciecam02::achromatic_response_to_white ( double x, double y, double z, double d, double fl, double nbb, int gamu ) -{ - double r, g, b; - double rc, gc, bc; - double rp, gp, bp; - double rpa, gpa, bpa; - gamu = 1; - xyz_to_cat02 ( r, g, b, x, y, z, gamu ); - - rc = r * (((y * d) / r) + (1.0 - d)); - gc = g * (((y * d) / g) + (1.0 - d)); - bc = b * (((y * d) / b) + (1.0 - d)); - - cat02_to_hpe ( rp, gp, bp, rc, gc, bc, gamu ); - - if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - rp = MAXR (rp, 0.0); - gp = MAXR (gp, 0.0); - bp = MAXR (bp, 0.0); - } - - rpa = nonlinear_adaptation ( rp, fl ); - gpa = nonlinear_adaptation ( gp, fl ); - bpa = nonlinear_adaptation ( bp, fl ); - - return ((2.0 * rpa) + gpa + ((1.0 / 20.0) * bpa) - 0.305) * nbb; -} - -float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int gamu ) +float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb ) { float r, g, b; float rc, gc, bc; float rp, gp, bp; float rpa, gpa, bpa; - gamu = 1; - xyz_to_cat02float ( r, g, b, x, y, z, gamu ); +// gamu = 1; + xyz_to_cat02float ( r, g, b, x, y, z); rc = r * (((y * d) / r) + (1.0f - d)); gc = g * (((y * d) / g) + (1.0f - d)); bc = b * (((y * d) / b) + (1.0f - d)); - cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc, gamu ); + cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc); - if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - rp = MAXR (rp, 0.0f); - gp = MAXR (gp, 0.0f); - bp = MAXR (bp, 0.0f); - } +// if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk + rp = MAXR (rp, 0.0f); + gp = MAXR (gp, 0.0f); + bp = MAXR (bp, 0.0f); +// } rpa = nonlinear_adaptationfloat ( rp, fl ); gpa = nonlinear_adaptationfloat ( gp, fl ); @@ -388,40 +219,22 @@ float Ciecam02::achromatic_response_to_whitefloat ( float x, float y, float z, f return ((2.0f * rpa) + gpa + ((1.0f / 20.0f) * bpa) - 0.305f) * nbb; } -void Ciecam02::xyz_to_cat02 ( double &r, double &g, double &b, double x, double y, double z, int gamu ) +void Ciecam02::xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z) { - gamu = 1; - - if (gamu == 0) { - r = ( 0.7328 * x) + (0.4296 * y) - (0.1624 * z); - g = (-0.7036 * x) + (1.6975 * y) + (0.0061 * z); - b = ( 0.0030 * x) + (0.0136 * y) + (0.9834 * z); - } else if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - //r = ( 0.7328 * x) + (0.4296 * y) - (0.1624 * z); - //g = (-0.7036 * x) + (1.6975 * y) + (0.0061 * z); - //b = ( 0.0000 * x) + (0.0000 * y) + (1.0000 * z); - r = ( 1.007245 * x) + (0.011136 * y) - (0.018381 * z); //Changjun Li - g = (-0.318061 * x) + (1.314589 * y) + (0.003471 * z); - b = ( 0.0000 * x) + (0.0000 * y) + (1.0000 * z); - } -} - -void Ciecam02::xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int gamu ) -{ - gamu = 1; - - if (gamu == 0) { - r = ( 0.7328f * x) + (0.4296f * y) - (0.1624f * z); - g = (-0.7036f * x) + (1.6975f * y) + (0.0061f * z); - b = ( 0.0030f * x) + (0.0136f * y) + (0.9834f * z); - } else if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - //r = ( 0.7328 * x) + (0.4296 * y) - (0.1624 * z); - //g = (-0.7036 * x) + (1.6975 * y) + (0.0061 * z); - //b = ( 0.0000 * x) + (0.0000 * y) + (1.0000 * z); - r = ( 1.007245f * x) + (0.011136f * y) - (0.018381f * z); //Changjun Li - g = (-0.318061f * x) + (1.314589f * y) + (0.003471f * z); - b = ( 0.0000f * x) + (0.0000f * y) + (1.0000f * z); - } +// gamu = 1; +// +// if (gamu == 0) { +// r = ( 0.7328f * x) + (0.4296f * y) - (0.1624f * z); +// g = (-0.7036f * x) + (1.6975f * y) + (0.0061f * z); +// b = ( 0.0030f * x) + (0.0136f * y) + (0.9834f * z); +// } else if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk + //r = ( 0.7328 * x) + (0.4296 * y) - (0.1624 * z); + //g = (-0.7036 * x) + (1.6975 * y) + (0.0061 * z); + //b = ( 0.0000 * x) + (0.0000 * y) + (1.0000 * z); + r = ( 1.007245f * x) + (0.011136f * y) - (0.018381f * z); //Changjun Li + g = (-0.318061f * x) + (1.314589f * y) + (0.003471f * z); + b = ( 0.0000f * x) + (0.0000f * y) + (1.0000f * z); +// } } #ifdef __SSE2__ void Ciecam02::xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z ) @@ -433,40 +246,22 @@ void Ciecam02::xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vf } #endif -void Ciecam02::cat02_to_xyz ( double &x, double &y, double &z, double r, double g, double b, int gamu ) +void Ciecam02::cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b) { - gamu = 1; - - if (gamu == 0) { - x = ( 1.096124 * r) - (0.278869 * g) + (0.182745 * b); - y = ( 0.454369 * r) + (0.473533 * g) + (0.072098 * b); - z = (-0.009628 * r) - (0.005698 * g) + (1.015326 * b); - } else if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - //x = ( 1.0978566 * r) - (0.277843 * g) + (0.179987 * b); - //y = ( 0.455053 * r) + (0.473938 * g) + (0.0710096* b); - //z = ( 0.000000 * r) - (0.000000 * g) + (1.000000 * b); - x = ( 0.99015849 * r) - (0.00838772 * g) + (0.018229217 * b); //Changjun Li - y = ( 0.239565979 * r) + (0.758664642 * g) + (0.001770137 * b); - z = ( 0.000000 * r) - (0.000000 * g) + (1.000000 * b); - } -} - -void Ciecam02::cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int gamu ) -{ - gamu = 1; - - if (gamu == 0) { - x = ( 1.096124f * r) - (0.278869f * g) + (0.182745f * b); - y = ( 0.454369f * r) + (0.473533f * g) + (0.072098f * b); - z = (-0.009628f * r) - (0.005698f * g) + (1.015326f * b); - } else if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - //x = ( 1.0978566 * r) - (0.277843 * g) + (0.179987 * b); - //y = ( 0.455053 * r) + (0.473938 * g) + (0.0710096* b); - //z = ( 0.000000 * r) - (0.000000 * g) + (1.000000 * b); - x = ( 0.99015849f * r) - (0.00838772f * g) + (0.018229217f * b); //Changjun Li - y = ( 0.239565979f * r) + (0.758664642f * g) + (0.001770137f * b); - z = ( 0.000000f * r) - (0.000000f * g) + (1.000000f * b); - } +// gamu = 1; +// +// if (gamu == 0) { +// x = ( 1.096124f * r) - (0.278869f * g) + (0.182745f * b); +// y = ( 0.454369f * r) + (0.473533f * g) + (0.072098f * b); +// z = (-0.009628f * r) - (0.005698f * g) + (1.015326f * b); +// } else if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk + //x = ( 1.0978566 * r) - (0.277843 * g) + (0.179987 * b); + //y = ( 0.455053 * r) + (0.473938 * g) + (0.0710096* b); + //z = ( 0.000000 * r) - (0.000000 * g) + (1.000000 * b); + x = ( 0.99015849f * r) - (0.00838772f * g) + (0.018229217f * b); //Changjun Li + y = ( 0.239565979f * r) + (0.758664642f * g) + (0.001770137f * b); + z = ( 0.000000f * r) - (0.000000f * g) + (1.000000f * b); +// } } #ifdef __SSE2__ void Ciecam02::cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vfloat g, vfloat b ) @@ -478,14 +273,6 @@ void Ciecam02::cat02_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vf } #endif -void Ciecam02::hpe_to_xyz ( double &x, double &y, double &z, double r, double g, double b ) -{ - x = (1.910197 * r) - (1.112124 * g) + (0.201908 * b); - y = (0.370950 * r) + (0.629054 * g) - (0.000008 * b); - z = b; -} - - void Ciecam02::hpe_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b ) { x = (1.910197f * r) - (1.112124f * g) + (0.201908f * b); @@ -501,34 +288,19 @@ void Ciecam02::hpe_to_xyzfloat ( vfloat &x, vfloat &y, vfloat &z, vfloat r, vflo } #endif -void Ciecam02::cat02_to_hpe ( double &rh, double &gh, double &bh, double r, double g, double b, int gamu ) +void Ciecam02::cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b) { - gamu = 1; - - if (gamu == 0) { - rh = ( 0.7409792 * r) + (0.2180250 * g) + (0.0410058 * b); - gh = ( 0.2853532 * r) + (0.6242014 * g) + (0.0904454 * b); - bh = (-0.0096280 * r) - (0.0056980 * g) + (1.0153260 * b); - } else if (gamu == 1) { //Changjun Li - rh = ( 0.550930835 * r) + (0.519435987 * g) - ( 0.070356303 * b); - gh = ( 0.055954056 * r) + (0.89973132 * g) + (0.044315524 * b); - bh = (0.0 * r) - (0.0 * g) + (1.0 * b); - } -} - -void Ciecam02::cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b, int gamu ) -{ - gamu = 1; - - if (gamu == 0) { - rh = ( 0.7409792f * r) + (0.2180250f * g) + (0.0410058f * b); - gh = ( 0.2853532f * r) + (0.6242014f * g) + (0.0904454f * b); - bh = (-0.0096280f * r) - (0.0056980f * g) + (1.0153260f * b); - } else if (gamu == 1) { //Changjun Li - rh = ( 0.550930835f * r) + (0.519435987f * g) - ( 0.070356303f * b); - gh = ( 0.055954056f * r) + (0.89973132f * g) + (0.044315524f * b); - bh = (0.0f * r) - (0.0f * g) + (1.0f * b); - } +// gamu = 1; +// +// if (gamu == 0) { +// rh = ( 0.7409792f * r) + (0.2180250f * g) + (0.0410058f * b); +// gh = ( 0.2853532f * r) + (0.6242014f * g) + (0.0904454f * b); +// bh = (-0.0096280f * r) - (0.0056980f * g) + (1.0153260f * b); +// } else if (gamu == 1) { //Changjun Li + rh = ( 0.550930835f * r) + (0.519435987f * g) - ( 0.070356303f * b); + gh = ( 0.055954056f * r) + (0.89973132f * g) + (0.044315524f * b); + bh = (0.0f * r) - (0.0f * g) + (1.0f * b); +// } } #ifdef __SSE2__ @@ -541,18 +313,6 @@ void Ciecam02::cat02_to_hpefloat ( vfloat &rh, vfloat &gh, vfloat &bh, vfloat r, } #endif -void Ciecam02::Aab_to_rgb ( double &r, double &g, double &b, double A, double aa, double bb, double nbb ) -{ - double x = (A / nbb) + 0.305; - - /* c1 c2 c3 */ - r = (0.32787 * x) + (0.32145 * aa) + (0.20527 * bb); - /* c1 c4 c5 */ - g = (0.32787 * x) - (0.63507 * aa) - (0.18603 * bb); - /* c1 c6 c7 */ - b = (0.32787 * x) - (0.15681 * aa) - (4.49038 * bb); -} - void Ciecam02::Aab_to_rgbfloat ( float &r, float &g, float &b, float A, float aa, float bb, float nbb ) { float x = (A / nbb) + 0.305f; @@ -578,34 +338,6 @@ void Ciecam02::Aab_to_rgbfloat ( vfloat &r, vfloat &g, vfloat &b, vfloat A, vflo } #endif -void Ciecam02::calculate_ab ( double &aa, double &bb, double h, double e, double t, double nbb, double a ) -{ - double hrad = (h * rtengine::RT_PI) / 180.0; - double sinh = sin ( hrad ); - double cosh = cos ( hrad ); - double x = (a / nbb) + 0.305; - double p3 = 21.0 / 20.0; - - if ( fabs ( sinh ) >= fabs ( cosh ) ) { - bb = ((0.32787 * x) * (2.0 + p3)) / - ((e / (t * sinh)) - - // ((0.32145 - 0.63507 - (p3 * 0.15681)) * (cosh / sinh)) - - // (0.20527 - 0.18603 - (p3 * 4.49038))); - ((-0.31362 - (p3 * 0.15681)) * (cosh / sinh)) - - (0.01924 - (p3 * 4.49038))); - - aa = (bb * cosh) / sinh; - } else { - aa = ((0.32787 * x) * (2.0 + p3)) / - ((e / (t * cosh)) - - // (0.32145 - 0.63507 - (p3 * 0.15681)) - - // ((0.20527 - 0.18603 - (p3 * 4.49038)) * (sinh / cosh))); - (-0.31362 - (p3 * 0.15681)) - - ((0.01924 - (p3 * 4.49038)) * (sinh / cosh))); - - bb = (aa * sinh) / cosh; - } -} 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_F_180); @@ -675,33 +407,7 @@ void Ciecam02::calculate_abfloat ( vfloat &aa, vfloat &bb, vfloat h, vfloat e, v #endif -void Ciecam02::initcam1 (double gamu, double yb, double pilotd, double f, double la, double xw, double yw, double zw, double &n, double &d, double &nbb, double &ncb, - double &cz, double &aw, double &wh, double &pfl, double &fl, double &c) -{ - n = yb / yw; - - if (pilotd == 2.0) { - d = d_factor ( f, la ); - } else { - d = pilotd; - } - - fl = calculate_fl_from_la_ciecam02 ( la ); - nbb = ncb = 0.725 * pow ( 1.0 / n, 0.2 ); - cz = 1.48 + sqrt ( n ); - aw = achromatic_response_to_white ( xw, yw, zw, d, fl, nbb, gamu ); - wh = ( 4.0 / c ) * ( aw + 4.0 ) * pow ( fl, 0.25 ); - pfl = pow ( fl, 0.25 ); -#ifdef _DEBUG - - if (settings->verbose) { - printf ("Source double d=%f aw=%f fl=%f wh=%f\n", d, aw, fl, wh); - } - -#endif -} - -void Ciecam02::initcam1float (float gamu, float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, +void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &wh, float &pfl, float &fl, float &c) { n = yb / yw; @@ -715,7 +421,7 @@ void Ciecam02::initcam1float (float gamu, float yb, float pilotd, float f, float fl = calculate_fl_from_la_ciecam02float ( la ); nbb = ncb = 0.725f * pow_F ( 1.0f / n, 0.2f ); cz = 1.48f + sqrt ( n ); - aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, gamu ); + aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb); wh = ( 4.0f / c ) * ( aw + 4.0f ) * pow_F ( fl, 0.25f ); pfl = pow_F ( fl, 0.25f ); #ifdef _DEBUG @@ -727,32 +433,7 @@ void Ciecam02::initcam1float (float gamu, float yb, float pilotd, float f, float #endif } -void Ciecam02::initcam2 (double gamu, double yb, double pilotd, double f, double la, double xw, double yw, double zw, double &n, double &d, double &nbb, double &ncb, - double &cz, double &aw, double &fl) -{ - n = yb / yw; - - if (pilotd == 2.0) { - d = d_factorfloat ( f, la ); - } else { - d = pilotd; - } - -// d = d_factor( f, la ); - fl = calculate_fl_from_la_ciecam02 ( la ); - nbb = ncb = 0.725 * pow ( 1.0 / n, 0.2 ); - cz = 1.48 + sqrt ( n ); - aw = achromatic_response_to_white ( xw, yw, zw, d, fl, nbb, gamu ); -#ifdef _DEBUG - - if (settings->verbose) { - printf ("Viewing double d=%f aw=%f fl=%f n=%f\n", d, aw, fl, n); - } - -#endif -} - -void Ciecam02::initcam2float (float gamu, float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, +void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &fl) { n = yb / yw; @@ -767,7 +448,7 @@ void Ciecam02::initcam2float (float gamu, float yb, float pilotd, float f, float fl = calculate_fl_from_la_ciecam02float ( la ); nbb = ncb = 0.725f * pow_F ( 1.0f / n, 0.2f ); cz = 1.48f + sqrt ( n ); - aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb, gamu ); + aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb); #ifdef _DEBUG if (settings->verbose) { @@ -777,92 +458,9 @@ void Ciecam02::initcam2float (float gamu, float yb, float pilotd, float f, float #endif } -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 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; - double rc, gc, bc; - double rp, gp, bp; - double rpa, gpa, bpa; - double a, ca, cb; - double e, t; - double myh; - gamu = 1; - xyz_to_cat02 ( r, g, b, x, y, z, gamu ); - xyz_to_cat02 ( rw, gw, bw, xw, yw, zw, gamu ); - rc = r * (((yw * d) / rw) + (1.0 - d)); - gc = g * (((yw * d) / gw) + (1.0 - d)); - bc = b * (((yw * d) / bw) + (1.0 - d)); - - cat02_to_hpe ( rp, gp, bp, rc, gc, bc, gamu ); - - if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - rp = MAXR (rp, 0.0); - gp = MAXR (gp, 0.0); - bp = MAXR (bp, 0.0); - } - - rpa = nonlinear_adaptation ( rp, fl ); - gpa = nonlinear_adaptation ( gp, fl ); - bpa = nonlinear_adaptation ( bp, fl ); - - ca = rpa - ((12.0 * gpa) / 11.0) + (bpa / 11.0); - cb = (1.0 / 9.0) * (rpa + gpa - (2.0 * bpa)); - - myh = (180.0 / rtengine::RT_PI) * atan2 ( cb, ca ); - - if ( myh < 0.0 ) { - myh += 360.0; - } - - //we can also calculate H, if necessary...but it's using time...for what usage ? - /*double temp; - if(myh<20.14) { - temp = ((myh + 122.47)/1.2) + ((20.14 - myh)/0.8); - H = 300 + (100*((myh + 122.47)/1.2)) / temp; - } - else if(myh < 90.0) { - temp = ((myh - 20.14)/0.8) + ((90.00 - myh)/0.7); - H = (100*((myh - 20.14)/0.8)) / temp; - } - else if (myh < 164.25) { - temp = ((myh - 90.00)/0.7) + ((164.25 - myh)/1.0); - H = 100 + ((100*((myh - 90.00)/0.7)) / temp); - } - else if (myh < 237.53) { - temp = ((myh - 164.25)/1.0) + ((237.53 - myh)/1.2); - H = 200 + ((100*((myh - 164.25)/1.0)) / temp); - } - else { - temp = ((myh - 237.53)/1.2) + ((360 - myh + 20.14)/0.8); - H = 300 + ((100*((myh - 237.53)/1.2)) / temp); - } - */ - a = ((2.0 * rpa) + gpa + ((1.0 / 20.0) * bpa) - 0.305) * nbb; - - if (gamu == 1) { - a = MAXR (a, 0.0); //gamut correction M.H.Brill S.Susstrunk - } - - J = 100.0 * pow ( a / aw, c * cz ); - - e = ((12500.0 / 13.0) * nc * ncb) * (cos ( ((myh * rtengine::RT_PI) / 180.0) + 2.0 ) + 3.8); - t = (e * sqrt ( (ca * ca) + (cb * cb) )) / (rpa + gpa + ((21.0 / 20.0) * bpa)); - - C = pow ( t, 0.9 ) * sqrt ( J / 100.0 ) - * pow ( 1.64 - pow ( 0.29, n ), 0.73 ); - - Q = wh * sqrt ( J / 100.0 ); - M = C * pfl; - s = 100.0 * sqrt ( M / Q ); - h = myh; -} - void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q, float &M, float &s, float aw, float fl, float wh, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, int gamu, float pow1, float nbb, float ncb, float pfl, float cz, float d) + float c, float nc, float pow1, float nbb, float ncb, float pfl, float cz, float d) { float r, g, b; @@ -873,20 +471,20 @@ void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q float a, ca, cb; float e, t; float myh; - gamu = 1; - xyz_to_cat02float ( r, g, b, x, y, z, gamu ); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, gamu ); +// gamu = 1; + xyz_to_cat02float ( r, g, b, x, y, z); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); rc = r * (((yw * d) / rw) + (1.f - d)); gc = g * (((yw * d) / gw) + (1.f - d)); bc = b * (((yw * d) / bw) + (1.f - d)); - cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc, gamu ); + cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc); - if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - rp = MAXR (rp, 0.0f); - gp = MAXR (gp, 0.0f); - bp = MAXR (bp, 0.0f); - } +// if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk + rp = MAXR (rp, 0.0f); + gp = MAXR (gp, 0.0f); + bp = MAXR (bp, 0.0f); +// } rpa = nonlinear_adaptationfloat ( rp, fl ); gpa = nonlinear_adaptationfloat ( gp, fl ); @@ -903,9 +501,9 @@ void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q a = ((2.0f * rpa) + gpa + (0.05f * bpa) - 0.305f) * nbb; - if (gamu == 1) { - a = MAXR (a, 0.0f); //gamut correction M.H.Brill S.Susstrunk - } +// if (gamu == 1) { + a = MAXR (a, 0.0f); //gamut correction M.H.Brill S.Susstrunk +// } J = pow_F ( a / aw, c * cz * 0.5f); @@ -944,9 +542,9 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc); //gamut correction M.H.Brill S.Susstrunk - rp = _mm_max_ps (rp, ZEROV); - gp = _mm_max_ps (gp, ZEROV); - bp = _mm_max_ps (bp, ZEROV); + rp = vmaxf (rp, ZEROV); + gp = vmaxf (gp, ZEROV); + bp = vmaxf (bp, ZEROV); rpa = nonlinear_adaptationfloat ( rp, fl ); gpa = nonlinear_adaptationfloat ( gp, fl ); bpa = nonlinear_adaptationfloat ( bp, fl ); @@ -961,20 +559,20 @@ void Ciecam02::xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, vfloa myh = vself (vmaskf_lt (myh, ZEROV), temp, myh); a = ((rpa + rpa) + gpa + (F2V (0.05f) * bpa) - F2V (0.305f)) * nbb; - a = _mm_max_ps (a, ZEROV); //gamut correction M.H.Brill S.Susstrunk + a = vmaxf (a, ZEROV); //gamut correction M.H.Brill S.Susstrunk J = pow_F ( a / aw, c * cz * F2V (0.5f)); e = ((F2V (961.53846f)) * nc * ncb) * (xcosf ( myh + F2V (2.0f) ) + F2V (3.8f)); - t = (e * _mm_sqrt_ps ( (ca * ca) + (cb * cb) )) / (rpa + gpa + (F2V (1.05f) * bpa)); + t = (e * vsqrtf ( (ca * ca) + (cb * cb) )) / (rpa + gpa + (F2V (1.05f) * bpa)); C = pow_F ( t, F2V (0.9f) ) * J * pow1; Q = wh * J; J *= J * F2V (100.0f); M = C * pfl; - Q = _mm_max_ps (Q, F2V (0.0001f)); // avoid division by zero - s = F2V (100.0f) * _mm_sqrt_ps ( M / Q ); + Q = vmaxf (Q, F2V (0.0001f)); // avoid division by zero + s = F2V (100.0f) * vsqrtf ( M / Q ); h = (myh * F2V (180.f)) / F2V (rtengine::RT_PI); } #endif @@ -992,20 +590,20 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f float a, ca, cb; float e, t; float myh; - int gamu = 1; - xyz_to_cat02float ( r, g, b, x, y, z, gamu ); - xyz_to_cat02float ( rw, gw, bw, xw, yw, zw, gamu ); +// int gamu = 1; + xyz_to_cat02float ( r, g, b, x, y, z); + xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); rc = r * (((yw * d) / rw) + (1.f - d)); gc = g * (((yw * d) / gw) + (1.f - d)); bc = b * (((yw * d) / bw) + (1.f - d)); - cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc, gamu ); + cat02_to_hpefloat ( rp, gp, bp, rc, gc, bc); - if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk - rp = MAXR (rp, 0.0f); - gp = MAXR (gp, 0.0f); - bp = MAXR (bp, 0.0f); - } +// if (gamu == 1) { //gamut correction M.H.Brill S.Susstrunk + rp = MAXR (rp, 0.0f); + gp = MAXR (gp, 0.0f); + bp = MAXR (bp, 0.0f); +// } #ifdef __SSE2__ vfloat pv = _mm_setr_ps(rp, gp, bp, 1.f); @@ -1031,9 +629,9 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f a = ((2.0f * rpa) + gpa + (0.05f * bpa) - 0.305f) * nbb; - if (gamu == 1) { - a = MAXR (a, 0.0f); //gamut correction M.H.Brill S.Susstrunk - } +// if (gamu == 1) { + a = MAXR (a, 0.0f); //gamut correction M.H.Brill S.Susstrunk +// } J = pow_F ( a / aw, c * cz * 0.5f); @@ -1046,44 +644,9 @@ void Ciecam02::xyz2jch_ciecam02float ( float &J, float &C, float &h, float aw, f h = (myh * 180.f) / (float)rtengine::RT_PI; } - -void Ciecam02::jch2xyz_ciecam02 ( double &x, double &y, double &z, double J, double C, double h, - 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; - double rp, gp, bp; - double rpa, gpa, bpa; - double rw, gw, bw; - double a, ca, cb; - double e, t; - gamu = 1; - xyz_to_cat02 ( rw, gw, bw, xw, yw, zw, gamu ); - e = ((12500.0 / 13.0) * nc * ncb) * (cos ( ((h * rtengine::RT_PI) / 180.0) + 2.0 ) + 3.8); - a = pow ( J / 100.0, 1.0 / (c * cz) ) * aw; - t = pow ( C / (sqrt ( J / 100) * pow ( 1.64 - pow ( 0.29, n ), 0.73 )), 10.0 / 9.0 ); - - calculate_ab ( ca, cb, h, e, t, nbb, a ); - Aab_to_rgb ( rpa, gpa, bpa, a, ca, cb, nbb ); - - rp = inverse_nonlinear_adaptation ( rpa, fl ); - gp = inverse_nonlinear_adaptation ( gpa, fl ); - bp = inverse_nonlinear_adaptation ( bpa, fl ); - - hpe_to_xyz ( x, y, z, rp, gp, bp ); - xyz_to_cat02 ( rc, gc, bc, x, y, z, gamu ); - - r = rc / (((yw * d) / rw) + (1.0 - d)); - g = gc / (((yw * d) / gw) + (1.0 - d)); - b = bc / (((yw * d) / bw) + (1.0 - d)); - - cat02_to_xyz ( x, y, z, r, g, b, gamu ); -} - void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h, float xw, float yw, float zw, - float c, float nc, int gamu, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw) + float c, float nc, float pow1, float nbb, float ncb, float fl, float cz, float d, float aw) { float r, g, b; float rc, gc, bc; @@ -1092,8 +655,8 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, fl float rw, gw, bw; float a, ca, cb; float e, t; - gamu = 1; - xyz_to_cat02float(rw, gw, bw, xw, yw, zw, gamu); +// gamu = 1; + xyz_to_cat02float(rw, gw, bw, xw, yw, zw); e = ((961.53846f) * nc * ncb) * (xcosf(h * rtengine::RT_PI_F_180 + 2.0f) + 3.8f); #ifdef __SSE2__ @@ -1123,13 +686,13 @@ void Ciecam02::jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, 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); + xyz_to_cat02float(rc, gc, bc, x, y, z); 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); } #ifdef __SSE2__ @@ -1147,7 +710,7 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J xyz_to_cat02float ( rw, gw, bw, xw, yw, zw); e = ((F2V (961.53846f)) * nc * ncb) * (xcosf ( ((h * F2V (rtengine::RT_PI)) / F2V (180.0f)) + F2V (2.0f) ) + F2V (3.8f)); a = pow_F ( J / F2V (100.0f), reccmcz ) * aw; - t = pow_F ( F2V (10.f) * C / (_mm_sqrt_ps ( J ) * pow1), F2V (1.1111111f) ); + t = pow_F ( F2V (10.f) * C / (vsqrtf ( J ) * pow1), F2V (1.1111111f) ); calculate_abfloat ( ca, cb, h, e, t, nbb, a ); Aab_to_rgbfloat ( rpa, gpa, bpa, a, ca, cb, nbb ); @@ -1167,19 +730,6 @@ void Ciecam02::jch2xyz_ciecam02float ( vfloat &x, vfloat &y, vfloat &z, vfloat J } #endif -double Ciecam02::nonlinear_adaptation ( double c, double fl ) -{ - double p; - - if (c < 0.0) { - p = pow ( (-1.0 * fl * c) / 100.0, 0.42 ); - return ((-1.0 * 400.0 * p) / (27.13 + p)) + 0.1; - } else { - p = pow ( (fl * c) / 100.0, 0.42 ); - return ((400.0 * p) / (27.13 + p)) + 0.1; - } -} - float Ciecam02::nonlinear_adaptationfloat ( float c, float fl ) { float p; @@ -1207,19 +757,6 @@ vfloat Ciecam02::nonlinear_adaptationfloat ( vfloat c, vfloat fl ) } #endif -double Ciecam02::inverse_nonlinear_adaptation ( double c, double fl ) -{ - int c1; - - if (c - 0.1 < 0.0) { - c1 = -1; - } else { - c1 = 1; - } - - return c1 * (100.0 / fl) * pow ( (27.13 * fabs ( c - 0.1 )) / (400.0 - fabs ( c - 0.1 )), 1.0 / 0.42 ); -} - float Ciecam02::inverse_nonlinear_adaptationfloat ( float c, float fl ) { c -= 0.1f; @@ -1243,7 +780,7 @@ vfloat Ciecam02::inverse_nonlinear_adaptationfloat ( vfloat c, vfloat fl ) c -= F2V (0.1f); fl = vmulsignf (fl, c); c = vabsf (c); - c = _mm_min_ps ( c, F2V (399.99f)); + c = vminf ( c, F2V (399.99f)); return (F2V (100.0f) / fl) * pow_F ( (F2V (27.13f) * c) / (F2V (400.0f) - c), F2V (2.38095238f) ); } #endif diff --git a/rtengine/ciecam02.h b/rtengine/ciecam02.h index 55d807b7e..68763b965 100644 --- a/rtengine/ciecam02.h +++ b/rtengine/ciecam02.h @@ -28,19 +28,11 @@ namespace rtengine class Ciecam02 { private: - static double d_factor ( double f, double la ); static float d_factorfloat ( float f, float la ); - static double calculate_fl_from_la_ciecam02 ( double la ); static float calculate_fl_from_la_ciecam02float ( float la ); - static double achromatic_response_to_white ( double x, double y, double z, double d, double fl, double nbb, int gamu ); - static float achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb, int gamu ); - static void xyz_to_cat02 ( double &r, double &g, double &b, double x, double y, double z, int gamu ); - static void cat02_to_hpe ( double &rh, double &gh, double &bh, double r, double g, double b, int gamu ); - static void cat02_to_xyz ( double &x, double &y, double &z, double r, double g, double b, int gamu ); - static void hpe_to_xyz ( double &x, double &y, double &z, double r, double g, double b ); - - static void xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z, int gamu ); - static void cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b, int gamu ); + static float achromatic_response_to_whitefloat ( float x, float y, float z, float d, float fl, float nbb); + static void xyz_to_cat02float ( float &r, float &g, float &b, float x, float y, float z); + static void cat02_to_hpefloat ( float &rh, float &gh, float &bh, float r, float g, float b); #ifdef __SSE2__ static void xyz_to_cat02float ( vfloat &r, vfloat &g, vfloat &b, vfloat x, vfloat y, vfloat z ); @@ -48,19 +40,13 @@ private: static vfloat nonlinear_adaptationfloat ( vfloat c, vfloat fl ); #endif - static void Aab_to_rgb ( double &r, double &g, double &b, double A, double aa, double bb, double nbb ); - static void calculate_ab ( double &aa, double &bb, double h, double e, double t, double nbb, double a ); - - static double nonlinear_adaptation ( double c, double fl ); static float nonlinear_adaptationfloat ( float c, float fl ); - static double inverse_nonlinear_adaptation ( double c, double fl ); - static float inverse_nonlinear_adaptationfloat ( float c, float fl ); static void calculate_abfloat ( float &aa, float &bb, float h, float e, float t, float nbb, float a ); static void Aab_to_rgbfloat ( float &r, float &g, float &b, float A, float aa, float bb, float nbb ); static void hpe_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b ); - static void cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b, int gamu ); + static void cat02_to_xyzfloat ( float &x, float &y, float &z, float r, float g, float b); #ifdef __SSE2__ static vfloat inverse_nonlinear_adaptationfloat ( vfloat c, vfloat fl ); static void calculate_abfloat ( vfloat &aa, vfloat &bb, vfloat h, vfloat e, vfloat t, vfloat nbb, vfloat a ); @@ -71,24 +57,16 @@ private: public: Ciecam02 () {} - static void curvecolor (double satind, double satval, double &sres, double parsat); static void curvecolorfloat (float satind, float satval, float &sres, float parsat); - static void curveJ (double br, double contr, int db, LUTf & outCurve, LUTu & histogram ) ; static void curveJfloat (float br, float contr, const LUTu & histogram, LUTf & outCurve ) ; /** * Inverse transform from CIECAM02 JCh to XYZ. */ - static void jch2xyz_ciecam02 ( double &x, double &y, double &z, - double J, double C, double h, - 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); - - static void jch2xyz_ciecam02float ( float &x, float &y, float &z, float J, float C, float h, float xw, float yw, float zw, - float c, float nc, int gamu, float n, float nbb, float ncb, float fl, float cz, float d, float aw ); + float c, float nc, 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, @@ -98,24 +76,12 @@ public: /** * Forward transform from XYZ to CIECAM02 JCh. */ - static void initcam1 (double gamu, double yb, double pilotd, double f, double la, double xw, double yw, double zw, double &n, double &d, double &nbb, double &ncb, - double &cz, double &aw, double &wh, double &pfl, double &fl, double &c); - - static void initcam2 (double gamu, double yb, double pilotd, double f, double la, double xw, double yw, double zw, double &n, double &d, double &nbb, double &ncb, - double &cz, double &aw, double &fl); - - static void initcam1float (float gamu, float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, + static void initcam1float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &wh, float &pfl, float &fl, float &c); - static void initcam2float (float gamu, float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, + static void initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb, float &cz, float &aw, float &fl); - static void 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 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, float x, float y, float z, @@ -126,7 +92,7 @@ public: float &Q, float &M, float &s, float aw, float fl, float wh, float x, float y, float z, float xw, float yw, float zw, - float c, float nc, int gamu, float n, float nbb, float ncb, float pfl, float cz, float d ); + float c, float nc, float n, float nbb, float ncb, float pfl, float cz, float d ); #ifdef __SSE2__ static void xyz2jchqms_ciecam02float ( vfloat &J, vfloat &C, vfloat &h, diff --git a/rtengine/clutstore.cc b/rtengine/clutstore.cc index 565db8faa..9ee976907 100644 --- a/rtengine/clutstore.cc +++ b/rtengine/clutstore.cc @@ -5,6 +5,7 @@ #include "iccstore.h" #include "imagefloat.h" #include "opthelper.h" +#include "procparams.h" #include "rt_math.h" #include "stdimagesource.h" @@ -50,7 +51,7 @@ bool loadFile( const PreviewProps pp(0, 0, fw, fh, 1); rtengine::procparams::ColorManagementParams icm; - icm.working = working_color_space; + icm.workingProfile = working_color_space; img_src.getImage(curr_wb, TR_NONE, img_float.get(), pp, rtengine::procparams::ToneCurveParams(), rtengine::procparams::RAWParams()); @@ -226,7 +227,7 @@ void rtengine::HaldCLUT::getRGB( #else const vfloat v_in = _mm_set_ps(0.0f, *b, *g, *r); const vfloat v_tmp = v_in * F2V(flevel_minus_one); - const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(_mm_min_ps(F2V(flevel_minus_two), v_tmp))); + const vfloat v_rgb = v_tmp - _mm_cvtepi32_ps(_mm_cvttps_epi32(vminf(v_tmp, F2V(flevel_minus_two)))); size_t index = color * 4; @@ -286,7 +287,7 @@ void rtengine::HaldCLUT::splitClutFilename( profile_name = "sRGB"; if (!name.empty()) { - for (const auto& working_profile : rtengine::ICCStore::getWorkingProfiles()) { + for (const auto& working_profile : rtengine::ICCStore::getInstance()->getWorkingProfiles()) { if ( !working_profile.empty() // This isn't strictly needed, but an empty wp name should be skipped anyway && std::search(name.rbegin(), name.rend(), working_profile.rbegin(), working_profile.rend()) == name.rbegin() diff --git a/rtengine/color.cc b/rtengine/color.cc index ee63720aa..4ace03bc0 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -34,6 +34,7 @@ extern const Settings* settings; cmsToneCurve* Color::linearGammaTRC; LUTf Color::cachef; +LUTf Color::cachefy; LUTf Color::gamma2curve; LUTf Color::gammatab; @@ -55,21 +56,6 @@ LUTf Color::igammatab_115_2; 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 @@ -137,6 +123,7 @@ void Color::init () constexpr auto maxindex = 65536; cachef(maxindex, LUT_CLIP_BELOW); + cachefy(maxindex, LUT_CLIP_BELOW); gammatab(maxindex, 0); gammatabThumb(maxindex, 0); @@ -180,13 +167,29 @@ void Color::init () } #ifdef _OPENMP #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); } - gammatab_srgb *= 65535.f; gamma2curve.share(gammatab_srgb, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); // shares the buffer with gammatab_srgb but has different clip flags } @@ -360,150 +363,138 @@ void Color::cleanup () } } -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; +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 - double var_R = r / 65535.0; - double var_G = g / 65535.0; - double var_B = b / 65535.0; + Glib::ustring profileCalc = "sRGB"; //default - Glib::ustring profileCalc; - profileCalc = "sRGB"; //default - - 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"; - } - - 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 (profileW == "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 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 { //display output profile + if (profile == settings->srgb) { + // use default "sRGB" + } else if (profile == "ProPhoto" || profile == settings->prophoto) { + profileCalc = "ProPhoto"; + } else if (profile == "AdobeRGB1998" || profile == settings->adobe) { + profileCalc = "Adobe RGB"; + } else if (profile == settings->widegamut) { + profileCalc = "WideGamut"; } - 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); + if (profile == settings->srgb || profile == settings->adobe) { //apply sRGB inverse gamma + if (r > 0.04045f) { + r = pow_F(((r + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_R = var_R / 4.5; + r /= 12.92f; } - if ( var_G > 0.0795 ) { - var_G = pow ( ( ( var_G + 0.0954 ) / 1.0954 ), 2.2); + if (g > 0.04045f) { + g = pow_F(((g + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_G = var_G / 4.5; + g /= 12.92f; } - if ( var_B > 0.0795 ) { - var_B = pow ( ( ( var_B + 0.0954 ) / 1.0954 ), 2.2); + if (b > 0.04045f) { + b = pow_F(((b + 0.055f) / 1.055f), rtengine::Color::sRGBGammaCurve); } else { - var_B = var_B / 4.5; + b /= 12.92f; + } + } else if (profile == settings->prophoto || profile == settings->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 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 {// apply inverse gamma 2.2 - 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); + 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); } @@ -556,8 +547,8 @@ void Color::rgb2hsl(float r, float g, float b, float &h, float &s, float &l) #ifdef __SSE2__ void Color::rgb2hsl(vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l) { - vfloat maxv = _mm_max_ps(r, _mm_max_ps(g, b)); - vfloat minv = _mm_min_ps(r, _mm_min_ps(g, b)); + vfloat maxv = vmaxf(r, vmaxf(g, b)); + vfloat minv = vminf(r, vminf(g, b)); vfloat C = maxv - minv; vfloat tempv = maxv + minv; l = (tempv) * F2V(7.6295109e-6f); @@ -724,7 +715,7 @@ void Color::rgb2hsv(float r, float g, float b, float &h, float &s, float &v) if (del_Max < 0.00001 && del_Max > -0.00001) { // no fabs, slow! s = 0.f; } else { - s = del_Max / var_Max; + s = del_Max / (var_Max == 0.0 ? 1.0 : var_Max); if (var_R == var_Max) { h = (var_G - var_B) / del_Max; @@ -746,6 +737,36 @@ void Color::rgb2hsv(float r, float g, float b, float &h, float &s, float &v) } } +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) { @@ -1569,7 +1590,7 @@ void Color::calcGamma (double pwr, double ts, int mode, GammaValues &gamma) bnd[g[1] >= 1.] = 1.; if (g[1] && (g[1] - 1.) * (g[0] - 1.) <= 0.) { - for (i = 0; i < 48; i++) { + for (i = 0; i < 99; i++) { g[2] = (bnd[0] + bnd[1]) / 2.; if (g[0]) { @@ -1683,7 +1704,7 @@ void Color::Lab2XYZ(float L, float a, float b, float &x, float &y, float &z) 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; @@ -1694,7 +1715,7 @@ void Color::Lab2XYZ(float L, float a, float b, float &x, float &y, float &z) 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; @@ -1709,7 +1730,7 @@ void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat & 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); @@ -1722,18 +1743,42 @@ void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat & } #endif // __SSE2__ +inline float Color::computeXYZ2Lab(float f) +{ + if (f < 0.f) { + return 327.68 * ((kappa * f / MAXVALF + 16.0) / 116.0); + } else if (f > 65535.f) { + return (327.68f * xcbrtf(f / MAXVALF)); + } else { + return cachef[f]; + } +} + + +inline float Color::computeXYZ2LabY(float f) +{ + if (f < 0.f) { + return 327.68 * (kappa * f / MAXVALF); + } else if (f > 65535.f) { + return 327.68f * (116.f * xcbrtf(f / MAXVALF) - 16.f); + } else { + return cachefy[f]; + } +} + + void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const float wp[3][3], int width) { -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ + vfloat minvalfv = F2V(0.f); vfloat maxvalfv = F2V(MAXVALF); - vfloat c116v = F2V(116.f); - vfloat c5242d88v = F2V(5242.88f); vfloat c500v = F2V(500.f); vfloat c200v = F2V(200.f); #endif int i = 0; -#if defined( __SSE2__ ) && defined( __x86_64__ ) + +#ifdef __SSE2__ for(;i < width - 3; i+=4) { const vfloat rv = LVFU(R[i]); const vfloat gv = LVFU(G[i]); @@ -1743,17 +1788,18 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, 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)) { + vmask minMask = vmaskf_lt(vminf(xv, vminf(yv, zv)), minvalfv); + if (_mm_movemask_ps((vfloat)maxMask) || _mm_movemask_ps((vfloat)minMask)) { // 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))); + float fx = computeXYZ2Lab(x); + float fy = computeXYZ2Lab(y); + float fz = computeXYZ2Lab(z); - L[i + k] = (116.f * fy - 5242.88f); //5242.88=16.0*327.68; + L[i + k] = computeXYZ2LabY(y); a[i + k] = (500.f * (fx - fy) ); b[i + k] = (200.f * (fy - fz) ); } @@ -1762,7 +1808,7 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const vfloat fy = cachef[yv]; const vfloat fz = cachef[zv]; - STVFU(L[i], c116v * fy - c5242d88v); //5242.88=16.0*327.68; + STVFU(L[i], cachefy[yv]); STVFU(a[i], c500v * (fx - fy)); STVFU(b[i], c200v * (fy - fz)); } @@ -1777,16 +1823,55 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, 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))); + fx = computeXYZ2Lab(x); + fy = computeXYZ2Lab(y); + fz = computeXYZ2Lab(z); - L[i] = 116.0f * fy - 5242.88f; //5242.88=16.0*327.68; + L[i] = computeXYZ2LabY(y); a[i] = 500.0f * (fx - fy); b[i] = 200.0f * (fy - fz); } } +void Color::RGB2L(float *R, float *G, float *B, float *L, const float wp[3][3], int width) +{ + +#ifdef __SSE2__ + vfloat minvalfv = F2V(0.f); + vfloat maxvalfv = F2V(MAXVALF); +#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 yv = F2V(wp[1][0]) * rv + F2V(wp[1][1]) * gv + F2V(wp[1][2]) * bv; + + vmask maxMask = vmaskf_gt(yv, maxvalfv); + vmask minMask = vmaskf_lt(yv, minvalfv); + if (_mm_movemask_ps((vfloat)vorm(maxMask, minMask))) { + // take slower code path for all 4 pixels if one of the values is > MAXVALF. Still faster than non SSE2 version + for(int k = 0; k < 4; ++k) { + float y = yv[k]; + L[i + k] = computeXYZ2LabY(y); + } + } else { + STVFU(L[i], cachefy[yv]); + } + } +#endif + for(;i < width; ++i) { + const float rv = R[i]; + const float gv = G[i]; + const float bv = B[i]; + float y = wp[1][0] * rv + wp[1][1] * gv + wp[1][2] * bv; + + L[i] = computeXYZ2LabY(y); + } +} + void Color::XYZ2Lab(float X, float Y, float Z, float &L, float &a, float &b) { @@ -1795,18 +1880,18 @@ void Color::XYZ2Lab(float X, float Y, float Z, float &L, float &a, float &b) float y = Y; 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))); + fx = computeXYZ2Lab(x); + fy = computeXYZ2Lab(y); + fz = computeXYZ2Lab(z); - L = (116.0f * fy - 5242.88f); //5242.88=16.0*327.68; + L = computeXYZ2LabY(y); 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; @@ -1831,11 +1916,11 @@ void Color::Yuv2Lab(float Yin, float u, float v, float &L, float &a, float &b, c gamutmap(X, Y, Z, wp); - float fx = (X <= 65535.0 ? cachef[X] : (327.68 * std::cbrt(X / MAXVALF))); - 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))); + float fx = computeXYZ2Lab(X); + float fy = computeXYZ2Lab(Y); + float fz = computeXYZ2Lab(Z); - L = (116.0 * fy - 5242.88); //5242.88=16.0*327.68; + L = computeXYZ2LabY(Y); a = (500.0 * (fx - fy) ); b = (200.0 * (fy - fz) ); } @@ -1846,6 +1931,24 @@ void Color::Lab2Lch(float a, float b, float &c, float &h) h = xatan2f(b, a); } +#ifdef __SSE2__ +void Color::Lab2Lch(float *a, float *b, float *c, float *h, int w) +{ + int i = 0; + vfloat c327d68v = F2V(327.68f); + for (; i < w - 3; i += 4) { + vfloat av = LVFU(a[i]); + vfloat bv = LVFU(b[i]); + STVFU(c[i], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); + STVFU(h[i], xatan2f(bv, av)); + } + for (; i < w; ++i) { + c[i] = sqrtf(SQR(a[i]) + SQR(b[i])) / 327.68f; + h[i] = xatan2f(b[i], a[i]); + } +} +#endif + void Color::Lch2Lab(float c, float h, float &a, float &b) { float2 sincosval = xsincosf(h); @@ -2267,6 +2370,46 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl } +/* + * AllMunsellLch correction + * Copyright (c) 2012 Jacques Desmis + * + * This function corrects the color (hue) for changes in chromaticity and luminance + * to use in a "for" or "do while" statement + * + * Parameters: + * float Lprov1: luminance + * float HH: hue before + * float Chprov1, CC : chroma after and before + * float coorectionHuechroma : correction Hue for chromaticity (saturation) + */ +void Color::AllMunsellLch(float Lprov1, float HH, float Chprov1, float CC, float &correctionHuechroma) +{ + + float correctionHue = 0.f, correctionHueLum = 0.f; + bool correctL; + + if(CC >= 6.f && CC < 140.f) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation) + static const float huelimit[8] = { -2.48f, -0.55f, 0.44f, 1.52f, 1.87f, 3.09f, -0.27f, 0.44f}; //limits hue of blue-purple, red-yellow, green-yellow, red-purple + + if (Chprov1 > 140.f) { + Chprov1 = 139.f; //limits of LUTf + } + + Chprov1 = rtengine::max(Chprov1, 6.f); + + for(int zo = 1; zo <= 4; zo++) { + if(HH > huelimit[2 * zo - 2] && HH < huelimit[2 * zo - 1]) { + //zone=zo; + correctL = false; + MunsellLch (Lprov1, HH, Chprov1, CC, correctionHue, zo, correctionHueLum, correctL); //munsell chroma correction + correctionHuechroma = correctionHue; //preserve + break; + } + } + } +} + /* * GamutLchonly correction * Copyright (c)2012 Jacques Desmis and Jean-Christophe Frisch @@ -2304,7 +2447,7 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo 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); @@ -2363,7 +2506,7 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo } inGamut = false; - } else if (!isHLEnabled && (R > ClipLevel || G > ClipLevel || B > ClipLevel)) { + } else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) { // if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut #ifdef _DEBUG @@ -2424,7 +2567,7 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr 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); @@ -2488,7 +2631,7 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr } inGamut = false; - } else if (!isHLEnabled && (R > ClipLevel || G > ClipLevel || B > ClipLevel)) { + } else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) { // if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut #ifdef _DEBUG @@ -2512,6 +2655,109 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr //end first gamut control } +/* + * GamutLchonly correction + * Copyright (c)2012 Jacques Desmis and Jean-Christophe Frisch + * + * This function puts the data (Lab) in the gamut of "working profile": + * it returns the corrected values of the chromaticity and luminance + * + * float HH : hue + * float2 sincosval : sin and cos of HH + * float Lprov1 : input luminance value, sent back corrected + * float Chprov1: input chroma value, sent back corrected + * float wip : working profile + * bool isHLEnabled : if "highlight reconstruction " is enabled + * float coef : a float number between [0.95 ; 1.0[... the nearest it is from 1.0, the more precise it will be... and the longer too as more iteration will be necessary) + */ +void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &saturation, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef) +{ + constexpr float ClipLevel = 1.f; + bool inGamut; + float R, G, B; + + do { + inGamut = true; + + float aprov1 = Chprov1 * sincosval.y; + float bprov1 = Chprov1 * sincosval.x; + + //conversion Lab RGB to limit Lab values - this conversion is useful before Munsell correction + float fy = c1By116 * Lprov1 + c16By116; + float fx = 0.002f * aprov1 + fy; + float fz = fy - 0.005f * bprov1; + + float x_ = f2xyz(fx) * D50x; + float z_ = f2xyz(fz) * D50z; + float y_ = (Lprov1 > epskap) ? fy * fy * fy : Lprov1 / kappaf; + + xyz2rgb(x_, y_, z_, R, G, B, wip); + + // gamut control before saturation to put Lab values in future gamut, but not RGB + if (rtengine::min(R, G, B) < 0.f) { + + Lprov1 = rtengine::max(Lprov1, 0.1f); + + //gamut for L with ultra blue : we can improve the algorithm ... thinner, and other color ??? + if(HH < -0.9f && HH > -1.55f ) {//ultra blue + if(Chprov1 > 160.f) if (Lprov1 < 5.f) { + Lprov1 = 5.f; //very very very very high chroma + } + + if(Chprov1 > 140.f) if (Lprov1 < 3.5f) { + Lprov1 = 3.5f; + } + + if(Chprov1 > 120.f) if (Lprov1 < 2.f) { + Lprov1 = 2.f; + } + + if(Chprov1 > 105.f) if (Lprov1 < 1.f) { + Lprov1 = 1.f; + } + + if(Chprov1 > 90.f) if (Lprov1 < 0.7f) { + Lprov1 = 0.7f; + } + + if(Chprov1 > 50.f) if (Lprov1 < 0.5f) { + Lprov1 = 0.5f; + } + + if(Chprov1 > 20.f) if (Lprov1 < 0.4f) { + Lprov1 = 0.4f; + } + } + + Chprov1 *= higherCoef; // decrease the chromaticity value + + if (Chprov1 <= 3.f) { + Lprov1 += lowerCoef; + } + + inGamut = false; + } else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) { + + // if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut + + if (Lprov1 > 99.999f) { + Lprov1 = 99.98f; + } + + Chprov1 *= higherCoef; + + if (Chprov1 <= 3.f) { + Lprov1 -= lowerCoef; + } + + inGamut = false; + } + } while (!inGamut); + + saturation = 1.f - (rtengine::min(R, G, B) / rtengine::max(R, G, B)); + //end first gamut control +} + #ifdef _DEBUG void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb) @@ -2533,7 +2779,7 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const 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); @@ -2562,7 +2808,7 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const } inGamut = false; - } else if (!isHLEnabled && (R > ClipLevel || G > ClipLevel || B > ClipLevel)) { + } else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) { // if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut #ifdef _DEBUG @@ -2606,7 +2852,7 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const * 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]) +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; @@ -2633,7 +2879,7 @@ SSEFUNCTION void Color::LabGamutMunsell(float *labL, float *laba, float *labb, av = LVFU(laba[k]); bv = LVFU(labb[k]); _mm_storeu_ps(&HHBuffer[k], xatan2f(bv, av)); - _mm_storeu_ps(&CCBuffer[k], _mm_sqrt_ps(SQRV(av) + SQRV(bv)) / c327d68v); + _mm_storeu_ps(&CCBuffer[k], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); } for(; k < N; k++) { @@ -4137,12 +4383,12 @@ void Color::SkinSat (float lum, float hue, float chrom, float &satreduc) { // to be adapted...by tests - float reduction = 0.3f; // use "reduction" for "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1 - float extendedreduction = 0.4f; // use "extendedreduction" for wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation - float extendedreduction2 = 0.6f; // use "extendedreduction2" for wide area for transition + constexpr float reduction = 0.3f; // use "reduction" for "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1 + constexpr float extendedreduction = 0.4f; // use "extendedreduction" for wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation + constexpr float extendedreduction2 = 0.6f; // use "extendedreduction2" for wide area for transition - float C9 = 8.0, C8 = 15.0, C7 = 12.0, C4 = 7.0, C3 = 5.0, C2 = 5.0, C1 = 5.0; - float H9 = 0.05, H8 = 0.25, H7 = 0.1, H4 = 0.02, H3 = 0.02, H2 = 0.1, H1 = 0.1, H10 = -0.2, H11 = -0.2; //H10 and H11 are curious...H11=-0.8 ?? + constexpr float C9 = 8.f, C8 = 15.f, C7 = 12.f, C4 = 7.f, C3 = 5.f, C2 = 5.f, C1 = 5.f; + constexpr float H9 = 0.05f, H8 = 0.25f, H7 = 0.1f, H4 = 0.02f, H3 = 0.02f, H2 = 0.1f, H1 = 0.1f, H10 = -0.2f, H11 = -0.2f; //H10 and H11 are curious...H11=-0.8 ?? if (lum >= 85.f) { if((hue > (0.78f - H9) && hue < (1.18f + H9)) && (chrom > 8.f && chrom < (14.f + C9))) { diff --git a/rtengine/color.h b/rtengine/color.h index d56b30e52..9f8863343 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -20,11 +20,13 @@ #pragma once #include +#include #include "rt_math.h" #include "LUT.h" #include "labimage.h" #include "iccmatrices.h" +#include "lcms2.h" #include "sleef.c" #define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c) @@ -97,6 +99,10 @@ private: #ifdef __SSE2__ static vfloat hue2rgb(vfloat p, vfloat q, vfloat t); #endif + + static float computeXYZ2Lab(float f); + static float computeXYZ2LabY(float f); + public: typedef enum Channel { @@ -120,15 +126,36 @@ public: 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()) @@ -178,22 +205,26 @@ public: return r * 0.2126729 + g * 0.7151521 + b * 0.0721750; } + static float rgbLuminance(float r, float g, float b, const double workingspace[3][3]) + { + return r * workingspace[1][0] + g * workingspace[1][1] + b * workingspace[1][2]; + } /** * @brief Convert red/green/blue to L*a*b * @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 @@ -327,6 +358,17 @@ public: */ 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); @@ -575,6 +617,7 @@ public: */ 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); + static void RGB2L(float *X, float *Y, float *Z, float *L, const float wp[3][3], int width); /** * @brief Convert Lab in Yuv @@ -608,7 +651,9 @@ public: * @param h 'h' channel return value, in [-PI ; +PI] (return value) */ static void Lab2Lch(float a, float b, float &c, float &h); - +#ifdef __SSE2__ + static void Lab2Lch(float *a, float *b, float *c, float *h, int w); +#endif /** * @brief Convert 'c' and 'h' channels of the Lch color space to the 'a' and 'b' channels of the L*a*b color space (channel 'L' is identical [0 ; 32768]) @@ -675,27 +720,21 @@ public: */ 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 @@ -1043,25 +1082,35 @@ public: /** * @brief sRGB gamma - * See also calcGamma above with the following values: pwr=2.4 ts=12.92 mode=0.003041 imax=0.055011 + * See also calcGamma above with the following values: pwr=2.399 ts=12.92310 mode=0.003041 imax=0.055 * @param x red, green or blue channel's value [0 ; 1] * @return the gamma modified's value [0 ; 1] */ static inline double gamma2 (double x) // g3 1+g4 { - return x <= 0.003041 ? x * 12.92 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011; + // return x <= 0.003041 ? x * 12.92310 : 1.055 * exp(log(x) / 2.39990) - 0.055;//calculate with calcgamma + //return x <= 0.0031308 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//standard discontinuous + //very small differences between the 2 + return x <= 0.003040 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//continuous + // return x <= 0.003041 ? x * 12.92310 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous + } /** * @brief Inverse sRGB gamma - * See also calcGamma above with the following values: pwr=2.4 ts=12.92 mode=0.003041 imax=0.055011 + * See also calcGamma above with the following values: pwr=2.3999 ts=12.92310 mode=0.003041 imax=0.055 * @param x red, green or blue channel's value [0 ; 1] * @return the inverse gamma modified's value [0 ; 1] */ static inline double igamma2 (double x) //g2 { - return x <= 0.039293 ? x / 12.92 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve); + // return x <= 0.039289 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * 2.39990);//calculate with calcgamma + // return x <= 0.04045 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//standard discontinuous + //very small differences between the 4 + return x <= 0.039286 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//continuous + // return x <= 0.039293 ? x / 12.92310 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous + } @@ -1346,7 +1395,7 @@ public: * @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 @@ -1354,6 +1403,7 @@ public: #else static void AllMunsellLch (bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHueChroma, float &correctlum); #endif + static void AllMunsellLch (float Lprov1, float HH, float Chprov1, float CC, float &correctionHueChroma); /** @@ -1386,6 +1436,7 @@ public: static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef); static void gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef); #endif + static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &saturation, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef); /** @@ -1746,7 +1797,7 @@ public: //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 --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index ab318aa73..a7a769d93 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -967,12 +967,12 @@ void ColorTemp::cieCAT02(double Xw, double Yw, double Zw, double &CAM02BB00, dou 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; @@ -1102,7 +1102,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, // 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 + // CRI_color-1 = display Lab values of color CRI_color -1 const double whiteD50[3] = {0.9646019585, 1.0, 0.8244507152}; //calculate with this tool : spect 5nm double CAM02BB00, CAM02BB01, CAM02BB02, CAM02BB10, CAM02BB11, CAM02BB12, CAM02BB20, CAM02BB21, CAM02BB22; //for CIECAT02 double Xchk[50], Ychk[50], Zchk[50]; //50 : I think it's a good limit for number of color : for CRI and Palette @@ -1270,7 +1270,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, } 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!! } @@ -1373,7 +1373,7 @@ void ColorTemp::temp2mul (double temp, double green, double equal, double& rmul, 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 --git a/rtengine/colortemp.h b/rtengine/colortemp.h index 145c8ed20..d529d844e 100644 --- a/rtengine/colortemp.h +++ b/rtengine/colortemp.h @@ -96,8 +96,6 @@ public: 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); - //static void ciecam_02 (LabImage* lab, const ProcParams* params); bool operator== (const ColorTemp& other) const { diff --git a/rtengine/cplx_wavelet_dec.cc b/rtengine/cplx_wavelet_dec.cc index eafadaa54..a43a7b8b6 100644 --- a/rtengine/cplx_wavelet_dec.cc +++ b/rtengine/cplx_wavelet_dec.cc @@ -39,5 +39,5 @@ wavelet_decomposition::~wavelet_decomposition() } } -}; +} diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h index 45e829322..ccecef819 100644 --- a/rtengine/cplx_wavelet_dec.h +++ b/rtengine/cplx_wavelet_dec.h @@ -266,6 +266,6 @@ void wavelet_decomposition::reconstruct(E * dst, const float blend) coeff0 = nullptr; } -}; +} #endif diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h index ff22c9812..bd333d4b9 100644 --- a/rtengine/cplx_wavelet_filter_coeffs.h +++ b/rtengine/cplx_wavelet_filter_coeffs.h @@ -50,5 +50,5 @@ const float Daub4_anal16[2][16] ALIGNED16 = {//Daub 14 }; // if necessary ?? we can add D20 !! -}; +} diff --git a/rtengine/cplx_wavelet_level.h b/rtengine/cplx_wavelet_level.h index 59c206f27..cab0d8e3e 100644 --- a/rtengine/cplx_wavelet_level.h +++ b/rtengine/cplx_wavelet_level.h @@ -244,7 +244,7 @@ template void wavelet_level::SynthesisFilterHaarHorizontal (const * 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 @@ template void wavelet_level::SynthesisFilterHaarVertical (const T * 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 @@ template void wavelet_level::SynthesisFilterHaarVertical (const T } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -328,7 +328,7 @@ void wavelet_level::AnalysisFilterSubsampHorizontal (T * RESTRICT srcbuffer, } #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 @@ template void wavelet_level::SynthesisFilterSubsampHorizontal (T // 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 @@ template void wavelet_level::SynthesisFilterSubsampHorizontal (T } #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 @@ template SSEFUNCTION void wavelet_level::SynthesisFilterSubsampVe __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 @@ template void wavelet_level::SynthesisFilterSubsampVertical (T * // 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 @@ template void wavelet_level::SynthesisFilterSubsampVertical (T * #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 @@ template template SSEFUNCTION void wavelet_level::dec } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel num_threads(numThreads) if(numThreads>1) #endif { @@ -652,7 +652,7 @@ template template SSEFUNCTION void wavelet_level::dec T tmpHi[m_w] ALIGNED64; if(subsamp_out) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -662,7 +662,7 @@ template template SSEFUNCTION void wavelet_level::dec 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 SSEFUNCTION void wavelet_level::dec 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 @@ template template void wavelet_level::decompose_level /* filter along rows and columns */ if(subsamp_out) { -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for #endif @@ -697,7 +697,7 @@ template template void wavelet_level::decompose_level 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 @@ template template void wavelet_level::decompose_level #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; @@ -758,6 +758,6 @@ template template void wavelet_level::reconstruct_lev } } #endif -}; +} #endif diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 8d52782a2..ecd38d4aa 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -45,6 +45,42 @@ using namespace std; namespace rtengine { +bool sanitizeCurve(std::vector& curve) +{ + // A curve is valid under one of the following conditions: + // 1) Curve has exactly one entry which is D(F)CT_Linear + // 2) Number of curve entries is > 3 and odd + // 3) curve[0] == DCT_Parametric and curve size is >= 8 and curve[1] .. curve[3] are ordered ascending and are distinct + if (curve.empty()) { + curve.push_back (DCT_Linear); + return true; + } else if(curve.size() == 1 && curve[0] != DCT_Linear) { + curve[0] = DCT_Linear; + return true; + } else if((curve.size() % 2 == 0 || curve.size() < 5) && curve[0] != DCT_Parametric) { + curve.clear(); + curve.push_back (DCT_Linear); + return true; + } else if(curve[0] == DCT_Parametric) { + if (curve.size() < 8) { + curve.clear(); + curve.push_back (DCT_Linear); + return true; + } else { + // curve[1] to curve[3] must be ordered ascending and distinct + for (int i = 1; i < 3; i++) { + if (curve[i] >= curve[i + 1]) { + curve[1] = 0.25f; + curve[2] = 0.5f; + curve[3] = 0.75f; + break; + } + } + } + } + return false; +} + Curve::Curve () : N(0), ppn(0), x(nullptr), y(nullptr), mc(0.0), mfc(0.0), msc(0.0), mhc(0.0), hashSize(1000 /* has to be initialized to the maximum value */), ypp(nullptr), x1(0.0), y1(0.0), x2(0.0), y2(0.0), x3(0.0), y3(0.0), firstPointIncluded(false), increment(0.0), nbr_points(0) {} void Curve::AddPolygons () @@ -118,7 +154,7 @@ void Curve::fillHash() 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,7 +512,7 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil } -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, const std::vector& curvePoints, const std::vector& curvePoints2, @@ -989,7 +1025,7 @@ void ColorAppearance::Set(const Curve &pCurve) } // -RetinextransmissionCurve::RetinextransmissionCurve() {}; +RetinextransmissionCurve::RetinextransmissionCurve() {} void RetinextransmissionCurve::Reset() { @@ -1022,7 +1058,7 @@ void RetinextransmissionCurve::Set(const std::vector &curvePoints) } -RetinexgaintransmissionCurve::RetinexgaintransmissionCurve() {}; +RetinexgaintransmissionCurve::RetinexgaintransmissionCurve() {} void RetinexgaintransmissionCurve::Reset() { @@ -1132,7 +1168,7 @@ void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili) } -WavCurve::WavCurve() : sum(0.f) {}; +WavCurve::WavCurve() : sum(0.f) {} void WavCurve::Reset() { @@ -1175,7 +1211,7 @@ void WavCurve::Set(const std::vector &curvePoints) } -WavOpacityCurveRG::WavOpacityCurveRG() {}; +WavOpacityCurveRG::WavOpacityCurveRG() {} void WavOpacityCurveRG::Reset() { @@ -1208,7 +1244,7 @@ void WavOpacityCurveRG::Set(const std::vector &curvePoints) } -WavOpacityCurveBY::WavOpacityCurveBY() {}; +WavOpacityCurveBY::WavOpacityCurveBY() {} void WavOpacityCurveBY::Reset() { @@ -1240,7 +1276,7 @@ void WavOpacityCurveBY::Set(const std::vector &curvePoints) } } -WavOpacityCurveW::WavOpacityCurveW() {}; +WavOpacityCurveW::WavOpacityCurveW() {} void WavOpacityCurveW::Reset() { @@ -1272,7 +1308,7 @@ void WavOpacityCurveW::Set(const std::vector &curvePoints) } } -WavOpacityCurveWL::WavOpacityCurveWL() {}; +WavOpacityCurveWL::WavOpacityCurveWL() {} void WavOpacityCurveWL::Reset() { @@ -1305,7 +1341,7 @@ void WavOpacityCurveWL::Set(const std::vector &curvePoints) } -NoiseCurve::NoiseCurve() : sum(0.f) {}; +NoiseCurve::NoiseCurve() : sum(0.f) {} void NoiseCurve::Reset() { @@ -1827,6 +1863,14 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float const AdobeToneCurve& adobeTC = static_cast((const ToneCurve&) * this); for (size_t i = start; i < end; ++i) { + const bool oog_r = OOG(rc[i]); + const bool oog_g = OOG(gc[i]); + const bool oog_b = OOG(bc[i]); + + if (oog_r && oog_g && oog_b) { + continue; + } + float r = CLIP(rc[i]); float g = CLIP(gc[i]); float b = CLIP(bc[i]); @@ -1848,12 +1892,18 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float 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; + //rc[i] = gc[i] = bc[i] = 65535.f; + if (!oog_r) rc[i] = 65535.f; + if (!oog_g) gc[i] = 65535.f; + if (!oog_b) bc[i] = 65535.f; continue; } if (ar <= 0.f && ag <= 0.f && ab <= 0.f) { - rc[i] = gc[i] = bc[i] = 0; + //rc[i] = gc[i] = bc[i] = 0; + if (!oog_r) rc[i] = 0.f; + if (!oog_g) gc[i] = 0.f; + if (!oog_b) bc[i] = 0.f; continue; } @@ -1893,9 +1943,9 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float g = newg; b = newb; } - rc[i] = r; - gc[i] = g; - bc[i] = b; + if (!oog_r) rc[i] = r; + if (!oog_g) gc[i] = g; + if (!oog_b) bc[i] = b; continue; } @@ -1905,7 +1955,7 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float // depending on color, the chroma scaling factor can be fine-tuned below { - // decrease chroma scaling sligthly of extremely saturated colors + // 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 @@ -1990,7 +2040,7 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float Ciecam02::jch2xyz_ciecam02float( x, y, z, J, C, h, xw, yw, zw, - c, nc, 1, pow1, nbb, ncb, fl, cz, d, aw ); + c, nc, 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. @@ -2003,9 +2053,9 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float b = newb; } - rc[i] = r; - gc[i] = g; - bc[i] = b; + if (!oog_r) rc[i] = r; + if (!oog_g) gc[i] = g; + if (!oog_b) bc[i] = b; continue; } @@ -2066,14 +2116,14 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float g = newg; b = newb; } - rc[i] = r; - gc[i] = g; - bc[i] = b; + if (!oog_r) rc[i] = r; + if (!oog_g) gc[i] = g; + if (!oog_b) 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; +float PerceptualToneCurve::f, PerceptualToneCurve::c, PerceptualToneCurve::nc, PerceptualToneCurve::yb, PerceptualToneCurve::la, PerceptualToneCurve::xw, PerceptualToneCurve::yw, PerceptualToneCurve::zw; float PerceptualToneCurve::n, PerceptualToneCurve::d, PerceptualToneCurve::nbb, PerceptualToneCurve::ncb, PerceptualToneCurve::cz, PerceptualToneCurve::aw, PerceptualToneCurve::wh, PerceptualToneCurve::pfl, PerceptualToneCurve::fl, PerceptualToneCurve::pow1; void PerceptualToneCurve::init() @@ -2089,7 +2139,7 @@ void PerceptualToneCurve::init() c = 0.69f; nc = 1.00f; - Ciecam02::initcam1float(gamut, yb, 1.f, f, la, xw, yw, zw, n, d, nbb, ncb, + Ciecam02::initcam1float(yb, 1.f, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); pow1 = pow_F( 1.64f - pow_F( 0.29f, n ), 0.73f ); diff --git a/rtengine/curves.h b/rtengine/curves.h index 6a37b7e46..deed5d0fe 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -19,15 +19,17 @@ #ifndef __CURVES_H__ #define __CURVES_H__ -#include #include #include +#include + +#include + #include "rt_math.h" #include "../rtgui/mycurve.h" #include "../rtgui/myflatcurve.h" #include "../rtgui/mydiagonalcurve.h" #include "color.h" -#include "procparams.h" #include "pipettebuffer.h" #include "LUT.h" @@ -42,9 +44,79 @@ using namespace std; namespace rtengine { + class ToneCurve; class ColorAppearance; +inline void setUnlessOOG(float &r, float &g, float &b, const float &rr, const float &gg, const float &bb) +{ + if (!OOG(r) || !OOG(g) || !OOG(b)) { + r = rr; + g = gg; + b = bb; + } +} + +#ifdef __SSE2__ +inline vmask OOG(const vfloat val) +{ + return vorm(vmaskf_lt(val, ZEROV), vmaskf_gt(val, F2V(65535.f))); +} + + +inline void setUnlessOOG(vfloat &r, vfloat &g, vfloat &b, const vfloat rr, const vfloat gg, const vfloat bb) +{ + vmask cond = vandm(vandm(OOG(r), OOG(g)), OOG(b)); + r = vself(cond, r, rr); + g = vself(cond, g, gg); + b = vself(cond, b, bb); +} +#endif + +bool sanitizeCurve(std::vector& curve); + +namespace curves { + +inline void setLutVal(const LUTf &lut, float &val) +{ + if (!OOG(val)) { + val = lut[std::max(val, 0.f)]; + } else if (val < 0.f) { + float m = lut[0.f]; + val += m; + } else { + float m = lut[MAXVALF]; + val += (m - MAXVALF); + } +} + + +inline void setLutVal(const LUTf &lut, float &rval, float &gval, float &bval) +{ + if (!OOG(rval) || !OOG(gval) || !OOG(bval)) { + rval = lut[std::max(rval, 0.f)]; + gval = lut[std::max(gval, 0.f)]; + bval = lut[std::max(bval, 0.f)]; + } else { + setLutVal(lut, rval); + setLutVal(lut, gval); + setLutVal(lut, bval); + } +} + + +inline void setLutVal(float &val, float lutval, float maxval) +{ + if (!OOG(val)) { + val = lutval; + } else if (val > 0.f) { + val += maxval - MAXVALF; + } +} + + +} // namespace curves + class CurveFactory { @@ -215,19 +287,19 @@ public: // standard srgb gamma and its inverse static inline double gamma2 (double x) { - return x <= 0.00304 ? x * 12.92 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055; + return x <= 0.00304 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055; } static inline double igamma2 (double x) { - return x <= 0.03928 ? x / 12.92 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve); + return x <= 0.03928 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve); } static inline float gamma2 (float x) { - return x <= 0.00304 ? x * 12.92 : 1.055 * expf(logf(x) / sRGBGammaCurve) - 0.055; + return x <= 0.00304 ? x * 12.92310 : 1.055 * expf(logf(x) / sRGBGammaCurve) - 0.055; } static inline float igamma2 (float x) { - return x <= 0.03928 ? x / 12.92 : expf(logf((x + 0.055) / 1.055) * sRGBGammaCurve); + return x <= 0.03928 ? x / 12.92310 : expf(logf((x + 0.055) / 1.055) * sRGBGammaCurve); } // gamma function with adjustable parameters static inline double gamma (double x, double gamma, double start, double slope, double mul, double add) @@ -392,15 +464,16 @@ protected: DiagonalCurveType kind; void spline_cubic_set (); + void catmull_rom_set(); void NURBS_set (); public: DiagonalCurve (const std::vector& points, int ppn = CURVES_MIN_POLY_POINTS); - virtual ~DiagonalCurve (); + ~DiagonalCurve () override; - double getVal (double t) const; - void getVal (const std::vector& t, std::vector& res) const; - bool isIdentity () const + double getVal (double t) const override; + void getVal (const std::vector& t, std::vector& res) const override; + bool isIdentity () const override { return kind == DCT_Empty; }; @@ -421,12 +494,12 @@ private: public: FlatCurve (const std::vector& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS); - virtual ~FlatCurve (); + ~FlatCurve () override; - double getVal (double t) const; - void getVal (const std::vector& t, std::vector& res) const; + double getVal (double t) const override; + void getVal (const std::vector& t, std::vector& res) const override; bool setIdentityValue (double iVal); - bool isIdentity () const + bool isIdentity () const override { return kind == FCT_Empty; }; @@ -733,7 +806,7 @@ inline void Lightcurve::Apply (float& Li) const assert (lutColCurve); - Li = lutColCurve[Li]; + curves::setLutVal(lutColCurve, Li); } class Brightcurve : public ColorAppearance @@ -748,7 +821,7 @@ inline void Brightcurve::Apply (float& Br) const assert (lutColCurve); - Br = lutColCurve[Br]; + curves::setLutVal(lutColCurve, Br); } class Chromacurve : public ColorAppearance @@ -763,7 +836,7 @@ inline void Chromacurve::Apply (float& Cr) const assert (lutColCurve); - Cr = lutColCurve[Cr]; + curves::setLutVal(lutColCurve, Cr); } class Saturcurve : public ColorAppearance { @@ -777,7 +850,7 @@ inline void Saturcurve::Apply (float& Sa) const assert (lutColCurve); - Sa = lutColCurve[Sa]; + curves::setLutVal(lutColCurve, Sa); } class Colorfcurve : public ColorAppearance @@ -792,7 +865,7 @@ inline void Colorfcurve::Apply (float& Cf) const assert (lutColCurve); - Cf = lutColCurve[Cf]; + curves::setLutVal(lutColCurve, Cf); } @@ -813,9 +886,14 @@ class AdobeToneCurve : public ToneCurve { private: void RGBTone(float& r, float& g, float& b) const; // helper for tone curve - +#ifdef __SSE2__ + void RGBTone(vfloat& r, vfloat& g, vfloat& b) const; // helper for tone curve +#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 SatAndValueBlendingToneCurve : public ToneCurve @@ -828,7 +906,7 @@ class WeightedStdToneCurve : public ToneCurve { private: float Triangle(float refX, float refY, float X2) const; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ vfloat Triangle(vfloat refX, vfloat refY, vfloat X2) const; #endif public: @@ -861,7 +939,7 @@ private: static float cf_range[2]; static float cf[1000]; // for ciecam02 - static float f, c, nc, yb, la, xw, yw, zw, gamut; + static float f, c, nc, yb, la, xw, yw, zw; static float n, d, nbb, ncb, cz, aw, wh, pfl, fl, pow1; static void cubic_spline(const float x[], const float y[], const int len, const float out_x[], float out_y[], const int out_len); @@ -881,9 +959,7 @@ inline void StandardToneCurve::Apply (float& r, float& g, float& b) const assert (lutToneCurve); - r = lutToneCurve[r]; - g = lutToneCurve[g]; - b = lutToneCurve[b]; + curves::setLutVal(lutToneCurve, r, g, b); } inline void StandardToneCurve::BatchApply( @@ -904,33 +980,30 @@ inline void StandardToneCurve::BatchApply( // 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; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#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]]; + setUnlessOOG(r[i], g[i], b[i], lutToneCurve[r[i]], lutToneCurve[g[i]], lutToneCurve[b[i]]); i++; } -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#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]); + vfloat r_val = LVF(r[i]); + vfloat g_val = LVF(g[i]); + vfloat b_val = LVF(b[i]); + setUnlessOOG(r_val, g_val, b_val, lutToneCurve[r_val], lutToneCurve[g_val], lutToneCurve[b_val]); + STVF(r[i], r_val); + STVF(g[i], g_val); + STVF(b[i], 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]]; + setUnlessOOG(r[i], g[i], b[i], lutToneCurve[r[i]], lutToneCurve[g[i]], lutToneCurve[b[i]]); } #endif } @@ -938,10 +1011,13 @@ inline void StandardToneCurve::BatchApply( // Tone curve according to Adobe's reference implementation // values in 0xffff space // inlined to make sure there will be no cache flush when used -inline void AdobeToneCurve::Apply (float& r, float& g, float& b) const +inline void AdobeToneCurve::Apply (float& ir, float& ig, float& ib) const { assert (lutToneCurve); + float r = CLIP(ir); + float g = CLIP(ig); + float b = CLIP(ib); if (r >= g) { if (g > b) { @@ -950,7 +1026,7 @@ inline void AdobeToneCurve::Apply (float& r, float& g, float& b) const 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 + } else { // Case 4: r == g == b r = lutToneCurve[r]; g = lutToneCurve[g]; b = g; @@ -964,22 +1040,101 @@ inline void AdobeToneCurve::Apply (float& r, float& g, float& b) const RGBTone (g, b, r); // Case 7: g >= b > r } } + + setUnlessOOG(ir, ig, ib, r, g, b); } -inline void AdobeToneCurve::RGBTone (float& r, float& g, float& b) const +inline void AdobeToneCurve::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); + + // 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++; + } +#ifdef __SSE2__ + const vfloat upperv = F2V(MAXVALF); + for (; i + 3 < end; i += 4) { + + vfloat rc = vclampf(LVF(r[i]), ZEROV, upperv); + vfloat gc = vclampf(LVF(g[i]), ZEROV, upperv); + vfloat bc = vclampf(LVF(b[i]), ZEROV, upperv); + + vfloat minval = vminf(vminf(rc, gc), bc); + vfloat maxval = vmaxf(vmaxf(rc, gc), bc); + vfloat medval = vmaxf(vminf(rc, gc), vminf(bc, vmaxf(rc, gc))); + + const vfloat minvalold = minval; + const vfloat maxvalold = maxval; + + RGBTone(maxval, medval, minval); + + const vfloat nr = vself(vmaskf_eq(rc, maxvalold), maxval, vself(vmaskf_eq(rc, minvalold), minval, medval)); + const vfloat ng = vself(vmaskf_eq(gc, maxvalold), maxval, vself(vmaskf_eq(gc, minvalold), minval, medval)); + const vfloat nb = vself(vmaskf_eq(bc, maxvalold), maxval, vself(vmaskf_eq(bc, minvalold), minval, medval)); + + rc = LVF(r[i]); + gc = LVF(g[i]); + bc = LVF(b[i]); + setUnlessOOG(rc, gc, bc, nr, ng, nb); + STVF(r[i], rc); + STVF(g[i], gc); + STVF(b[i], bc); + } + // Remainder in non-SSE. + for (; i < end; ++i) { + Apply(r[i], g[i], b[i]); + } +#endif +} + +inline void AdobeToneCurve::RGBTone (float& maxval, float& medval, float& minval) const { - float rold = r, gold = g, bold = b; + float minvalold = minval, medvalold = medval, maxvalold = maxval; - r = lutToneCurve[rold]; - b = lutToneCurve[bold]; - g = b + ((r - b) * (gold - bold) / (rold - bold)); + maxval = lutToneCurve[maxvalold]; + minval = lutToneCurve[minvalold]; + medval = minval + ((maxval - minval) * (medvalold - minvalold) / (maxvalold - minvalold)); } +#ifdef __SSE2__ +inline void AdobeToneCurve::RGBTone (vfloat& maxval, vfloat& medval, vfloat& minval) const +{ + const vfloat minvalold = minval, maxvalold = maxval; + maxval = lutToneCurve[maxvalold]; + minval = lutToneCurve[minvalold]; + medval = minval + ((maxval - minval) * (medval - minvalold) / (maxvalold - minvalold)); + medval = vself(vmaskf_eq(minvalold, maxvalold), minval, medval); +} +#endif // Modifying the Luminance channel only -inline void LuminanceToneCurve::Apply(float &r, float &g, float &b) const +inline void LuminanceToneCurve::Apply(float &ir, float &ig, float &ib) const { assert (lutToneCurve); + float r = CLIP(ir); + float g = CLIP(ig); + float b = CLIP(ib); + float currLuminance = r * 0.2126729f + g * 0.7151521f + b * 0.0721750f; const float newLuminance = lutToneCurve[currLuminance]; currLuminance = currLuminance == 0.f ? 0.00001f : currLuminance; @@ -987,6 +1142,8 @@ inline void LuminanceToneCurve::Apply(float &r, float &g, float &b) const r = LIM(r * coef, 0.f, 65535.f); g = LIM(g * coef, 0.f, 65535.f); b = LIM(b * coef, 0.f, 65535.f); + + setUnlessOOG(ir, ig, ib, r, g, b); } inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const @@ -1007,27 +1164,28 @@ inline float WeightedStdToneCurve::Triangle(float a, float a1, float b) const return a1; } -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ inline vfloat WeightedStdToneCurve::Triangle(vfloat a, vfloat a1, vfloat b) const { + vmask eqmask = vmaskf_eq(b, a); 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; + return vself(eqmask, a1, b + a2 * b3 / a3); } #endif // Tone curve modifying the value channel only, preserving hue and saturation // values in 0xffff space -inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const +inline void WeightedStdToneCurve::Apply (float& ir, float& ig, float& ib) const { assert (lutToneCurve); - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + float r = CLIP(ir); + float g = CLIP(ig); + float b = CLIP(ib); float r1 = lutToneCurve[r]; float g1 = Triangle(r, r1, g); float b1 = Triangle(r, r1, b); @@ -1043,6 +1201,8 @@ inline void WeightedStdToneCurve::Apply (float& r, float& g, float& b) const 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); + + setUnlessOOG(ir, ig, ib, r, g, b); } inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t end, float *r, float *g, float *b) const { @@ -1061,7 +1221,7 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en // 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; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ } else if (reinterpret_cast(&r[i]) % 16 == 0) { // Otherwise, we get to the first aligned address; go to the SSE part. break; @@ -1071,15 +1231,15 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en i++; } -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ const vfloat c65535v = F2V(65535.f); const vfloat zd5v = F2V(0.5f); const vfloat zd25v = F2V(0.25f); 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 r_val = vclampf(LVF(r[i]), ZEROV, c65535v); + vfloat g_val = vclampf(LVF(g[i]), ZEROV, c65535v); + vfloat b_val = vclampf(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); @@ -1092,9 +1252,16 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en vfloat r3 = Triangle(b_val, b3, r_val); vfloat g3 = Triangle(b_val, b3, g_val); - 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)); + vfloat r_old = LVF(r[i]); + vfloat g_old = LVF(g[i]); + vfloat b_old = LVF(b[i]); + vfloat r_new = vclampf(r1 * zd5v + r2 * zd25v + r3 * zd25v, ZEROV, c65535v); + vfloat g_new = vclampf(g1 * zd25v + g2 * zd5v + g3 * zd25v, ZEROV, c65535v); + vfloat b_new = vclampf(b1 * zd25v + b2 * zd25v + b3 * zd5v, ZEROV, c65535v); + setUnlessOOG(r_old, g_old, b_old, r_new, g_new, b_new); + STVF(r[i], r_old); + STVF(g[i], g_old); + STVF(b[i], b_old); } // Remainder in non-SSE. @@ -1106,14 +1273,14 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en // 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 +inline void SatAndValueBlendingToneCurve::Apply (float& ir, float& ig, float& ib) const { assert (lutToneCurve); - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + float r = CLIP(ir); + float g = CLIP(ig); + float b = CLIP(ib); const float lum = (r + g + b) / 3.f; const float newLum = lutToneCurve[lum]; @@ -1137,6 +1304,8 @@ inline void SatAndValueBlendingToneCurve::Apply (float& r, float& g, float& b) c dV = v * coef; } Color::hsv2rgbdcp(h, s, v + dV, r, g, b); + + setUnlessOOG(ir, ig, ib, r, g, b); } } diff --git a/rtengine/dcp.cc b/rtengine/dcp.cc index 82ea35f0f..1c99b682c 100644 --- a/rtengine/dcp.cc +++ b/rtengine/dcp.cc @@ -18,15 +18,26 @@ */ #include +#include #include +#include #include "dcp.h" + +#include "cJSON.h" #include "iccmatrices.h" #include "iccstore.h" -#include "rawimagesource.h" #include "improcfun.h" +#include "rawimagesource.h" #include "rt_math.h" +namespace rtengine +{ + +extern const Settings* settings; + +} + using namespace rtengine; using namespace rtexif; @@ -37,30 +48,36 @@ namespace DCPProfile::Matrix invert3x3(const DCPProfile::Matrix& a) { - const double res00 = a[1][1] * a[2][2] - a[2][1] * a[1][2]; - const double res10 = a[2][0] * a[1][2] - a[1][0] * a[2][2]; - const double res20 = a[1][0] * a[2][1] - a[2][0] * a[1][1]; - - const double det = a[0][0] * res00 + a[0][1] * res10 + a[0][2] * res20; - - if (std::fabs(det) < 1.0e-10) { + DCPProfile::Matrix res = a; + if (!invertMatrix(a, res)) { std::cerr << "DCP matrix cannot be inverted! Expect weird output." << std::endl; - return a; } - - DCPProfile::Matrix res; - - res[0][0] = res00 / det; - res[0][1] = (a[2][1] * a[0][2] - a[0][1] * a[2][2]) / det; - res[0][2] = (a[0][1] * a[1][2] - a[1][1] * a[0][2]) / det; - res[1][0] = res10 / det; - res[1][1] = (a[0][0] * a[2][2] - a[2][0] * a[0][2]) / det; - res[1][2] = (a[1][0] * a[0][2] - a[0][0] * a[1][2]) / det; - res[2][0] = res20 / det; - res[2][1] = (a[2][0] * a[0][1] - a[0][0] * a[2][1]) / det; - res[2][2] = (a[0][0] * a[1][1] - a[1][0] * a[0][1]) / det; - return res; + + // const double res00 = a[1][1] * a[2][2] - a[2][1] * a[1][2]; + // const double res10 = a[2][0] * a[1][2] - a[1][0] * a[2][2]; + // const double res20 = a[1][0] * a[2][1] - a[2][0] * a[1][1]; + + // const double det = a[0][0] * res00 + a[0][1] * res10 + a[0][2] * res20; + + // if (std::fabs(det) < 1.0e-10) { + // std::cerr << "DCP matrix cannot be inverted! Expect weird output." << std::endl; + // return a; + // } + + // DCPProfile::Matrix res; + + // res[0][0] = res00 / det; + // res[0][1] = (a[2][1] * a[0][2] - a[0][1] * a[2][2]) / det; + // res[0][2] = (a[0][1] * a[1][2] - a[1][1] * a[0][2]) / det; + // res[1][0] = res10 / det; + // res[1][1] = (a[0][0] * a[2][2] - a[2][0] * a[0][2]) / det; + // res[1][2] = (a[1][0] * a[0][2] - a[0][0] * a[1][2]) / det; + // res[2][0] = res20 / det; + // res[2][1] = (a[2][0] * a[0][1] - a[0][0] * a[2][1]) / det; + // res[2][2] = (a[0][0] * a[1][1] - a[1][0] * a[0][1]) / det; + + // return res; } DCPProfile::Matrix multiply3x3(const DCPProfile::Matrix& a, const DCPProfile::Matrix& b) @@ -376,6 +393,57 @@ double xyCoordToTemperature(const std::array& white_xy) return res; } +std::map getAliases(const Glib::ustring& profile_dir) +{ + const std::unique_ptr> file( + g_fopen(Glib::build_filename(profile_dir, "camera_model_aliases.json").c_str(), "rb"), + [](std::FILE* file) + { + std::fclose(file); + } + ); + + if (!file) { + return {}; + } + + std::fseek(file.get(), 0, SEEK_END); + const long length = std::ftell(file.get()); + if (length <= 0) { + return {}; + } + + std::unique_ptr buffer(new char[length + 1]); + std::fseek(file.get(), 0, SEEK_SET); + const std::size_t read = std::fread(buffer.get(), 1, length, file.get()); + buffer[read] = 0; + + cJSON_Minify(buffer.get()); + const std::unique_ptr root(cJSON_Parse(buffer.get()), cJSON_Delete); + if (!root || !root->child) { + if (settings->verbose) { + std::cout << "Could not parse 'camera_model_aliases.json' file." << std::endl; + } + return {}; + } + + std::map res; + + for (const cJSON* camera = root->child; camera; camera = camera->next) { + if (cJSON_IsArray(camera)) { + const std::size_t array_size = cJSON_GetArraySize(camera); + for (std::size_t index = 0; index < array_size; ++index) { + const cJSON* const alias = cJSON_GetArrayItem(camera, index); + if (cJSON_IsString(alias)) { + res[alias->valuestring] = camera->string; + } + } + } + } + + return res; +} + } struct DCPProfile::ApplyState::Data { @@ -947,9 +1015,7 @@ DCPProfile::DCPProfile(const Glib::ustring& filename) : valid = true; } -DCPProfile::~DCPProfile() -{ -} +DCPProfile::~DCPProfile() = default; DCPProfile::operator bool() const { @@ -1184,13 +1250,22 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int } // with looktable and tonecurve we need to clip - newr = FCLIP(newr); - newg = FCLIP(newg); - newb = FCLIP(newb); + if (as_in.data->apply_look_table || as_in.data->use_tone_curve) { + newr = max(newr, 0.f); + newg = max(newg, 0.f); + newb = max(newb, 0.f); + } + // newr = FCLIP(newr); + // newg = FCLIP(newg); + // newb = FCLIP(newb); if (as_in.data->apply_look_table) { + float cnewr = FCLIP(newr); + float cnewg = FCLIP(newg); + float cnewb = FCLIP(newb); + float h, s, v; - Color::rgb2hsvdcp(newr, newg, newb, h, s, v); + Color::rgb2hsvtc(cnewr, cnewg, cnewb, h, s, v); hsdApply(look_info, look_table, h, s, v); s = CLIP01(s); @@ -1203,7 +1278,9 @@ void DCPProfile::step2ApplyTile(float* rc, float* gc, float* bc, int width, int h -= 6.0f; } - Color::hsv2rgbdcp( h, s, v, newr, newg, newb); + Color::hsv2rgbdcp( h, s, v, cnewr, cnewg, cnewb); + + setUnlessOOG(newr, newg, newb, cnewr, cnewg, cnewb); } if (as_in.data->use_tone_curve) { @@ -1571,7 +1648,7 @@ std::vector DCPProfile::makeHueSatMap(const ColorTemp& wh return res; } -void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const +inline void DCPProfile::hsdApply(const HsdTableInfo& table_info, const std::vector& table_base, float& h, float& s, float& v) const { // Apply the HueSatMap. Ported from Adobes reference implementation. float hue_shift; @@ -1704,7 +1781,6 @@ DCPStore* DCPStore::getInstance() return &instance; } - DCPStore::~DCPStore() { for (auto &p : profile_cache) { @@ -1712,7 +1788,6 @@ DCPStore::~DCPStore() } } - void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) { MyMutex::MyLock lock(mutex); @@ -1720,52 +1795,61 @@ void DCPStore::init(const Glib::ustring& rt_profile_dir, bool loadAll) file_std_profiles.clear(); if (!loadAll) { - profileDir.assign (rt_profile_dir); + profileDir = { rt_profile_dir, Glib::build_filename(options.rtdir, "dcpprofiles") }; return; } - if (!rt_profile_dir.empty()) { - std::deque dirs = { - rt_profile_dir - }; + std::deque dirs = { + rt_profile_dir, + Glib::build_filename(options.rtdir, "dcpprofiles") + }; - while (!dirs.empty()) { - // Process directory - Glib::ustring dirname = dirs.back(); - dirs.pop_back(); + while (!dirs.empty()) { + // Process directory + const Glib::ustring dirname = dirs.back(); + dirs.pop_back(); - std::unique_ptr dir; + std::unique_ptr dir; - try { - if (!Glib::file_test(dirname, Glib::FILE_TEST_IS_DIR)) { - return; - } - - dir.reset(new Glib::Dir(dirname)); - } catch (Glib::Exception& exception) { - return; + try { + if (!Glib::file_test(dirname, Glib::FILE_TEST_IS_DIR)) { + continue; } - for (const Glib::ustring& sname : *dir) { - const Glib::ustring fname = Glib::build_filename(dirname, sname); + dir.reset(new Glib::Dir(dirname)); + } catch (Glib::Exception& exception) { + return; + } - if (!Glib::file_test(fname, Glib::FILE_TEST_IS_DIR)) { - // File - const auto lastdot = sname.rfind('.'); + for (const Glib::ustring& sname : *dir) { + const Glib::ustring fname = Glib::build_filename(dirname, sname); - if ( - lastdot != Glib::ustring::npos - && lastdot <= sname.size() - 4 - && !sname.casefold().compare(lastdot, 4, ".dcp") + if (!Glib::file_test(fname, Glib::FILE_TEST_IS_DIR)) { + // File + const auto lastdot = sname.rfind('.'); + + if ( + lastdot != Glib::ustring::npos + && lastdot <= sname.size() - 4 + && !sname.casefold().compare(lastdot, 4, ".dcp") ) { - const Glib::ustring cam_short_name = sname.substr(0, lastdot).uppercase(); - file_std_profiles[cam_short_name] = fname; // They will be loaded and cached on demand - } - } else { - // Directory - dirs.push_front(fname); + const Glib::ustring cam_short_name = sname.substr(0, lastdot).uppercase(); + file_std_profiles[cam_short_name] = fname; // They will be loaded and cached on demand } + } else { + // Directory + dirs.push_front(fname); } + } + } + + for (const auto& alias : getAliases(rt_profile_dir)) { + const Glib::ustring alias_name = Glib::ustring(alias.first).uppercase(); + const Glib::ustring real_name = Glib::ustring(alias.second).uppercase(); + const std::map::const_iterator real = file_std_profiles.find(real_name); + + if (real != file_std_profiles.end()) { + file_std_profiles[alias_name] = real->second; } } } @@ -1822,11 +1906,13 @@ DCPProfile* DCPStore::getStdProfile(const Glib::ustring& requested_cam_short_nam } // profile not found, looking if we're in loadAll=false mode - if (!profileDir.empty()) { - const Glib::ustring fname = Glib::build_filename(profileDir, requested_cam_short_name + Glib::ustring(".dcp")); + for (const auto &dir : profileDir) { + if (!dir.empty()) { + const Glib::ustring fname = Glib::build_filename(dir, requested_cam_short_name + Glib::ustring(".dcp")); - if (Glib::file_test(fname, Glib::FILE_TEST_EXISTS)) { - return getProfile(fname); + if (Glib::file_test(fname, Glib::FILE_TEST_EXISTS)) { + return getProfile(fname); + } } } diff --git a/rtengine/dcp.h b/rtengine/dcp.h index 10bbf8f7e..dc6915d26 100644 --- a/rtengine/dcp.h +++ b/rtengine/dcp.h @@ -48,7 +48,7 @@ public: private: struct Data; - std::unique_ptr data; + const std::unique_ptr data; friend class DCPProfile; }; @@ -166,7 +166,7 @@ private: DCPStore() = default; mutable MyMutex mutex; - Glib::ustring profileDir; + std::vector profileDir; // these contain standard profiles from RT. keys are all in uppercase, file path is value std::map file_std_profiles; diff --git a/rtengine/dcraw.c b/rtengine/dcraw.c index 441f967da..e2e502b10 100644 --- a/rtengine/dcraw.c +++ b/rtengine/dcraw.c @@ -3826,7 +3826,7 @@ void CLASS remove_zeroes() } /* - 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) diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 4786000bb..22ee660e2 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -1,13 +1,8 @@ #ifdef __GNUC__ #pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Warray-bounds" #pragma GCC diagnostic ignored "-Wsign-compare" -#pragma GCC diagnostic ignored "-Wparentheses" #if (__GNUC__ >= 6) #pragma GCC diagnostic ignored "-Wmisleading-indentation" -#if (__GNUC__ >= 7) -#pragma GCC diagnostic ignored "-Wdangling-else" -#endif #endif #endif @@ -23,12 +18,24 @@ /*RT*/#define LOCALTIME /*RT*/#define DJGPP /*RT*/#include "jpeg.h" +/*RT*/#include "lj92.h" +/*RT*/#ifdef _OPENMP +/*RT*/#include +/*RT*/#endif +#include +#include #include "opthelper.h" +//#define BENCHMARK +#include "StopWatch.h" + +#include +#include + /* dcraw.c -- Dave Coffin's raw photo decoder - Copyright 1997-2016 by Dave Coffin, dcoffin a cybercom o net + Copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net This is a command-line ANSI C program to convert raw photos from any digital camera on any computer running any operating system. @@ -47,11 +54,11 @@ *If you have not modified dcraw.c in any way, a link to my homepage qualifies as "full source code". - $Revision: 1.477 $ - $Date: 2016/05/10 21:30:43 $ + $Revision: 1.478 $ + $Date: 2018/06/01 20:36:25 $ */ -#define DCRAW_VERSION "9.27" +#define DCRAW_VERSION "9.28" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -600,6 +607,36 @@ inline unsigned CLASS getbithuff_t::operator() (int nbits, ushort *huff) #define getbits(n) getbithuff(n,0) #define gethuff(h) getbithuff(*h,h+1) +inline unsigned CLASS nikbithuff_t::operator() (int nbits, ushort *huff) +{ + unsigned c; + + if (UNLIKELY(nbits == 0)) { + return 0; + } + if (vbits < nbits && LIKELY((c = fgetc(ifp)) != EOF)) { + bitbuf = (bitbuf << 8) | c; + vbits += 8; + if (vbits < nbits && LIKELY((c = fgetc(ifp)) != EOF)) { + bitbuf = (bitbuf << 8) | c; + vbits += 8; + } + } + c = bitbuf << (32-vbits) >> (32-nbits); + if (huff) { + vbits -= huff[c] >> 8; + c = (uchar) huff[c]; + derror(vbits < 0); + } else { + vbits -= nbits; + } + return c; +} + +#define nikinit(n) nikbithuff() +#define nikbits(n) nikbithuff(n,0) +#define nikhuff(h) nikbithuff(*h,h+1) + /* Construct a decode tree according the specification in *source. The first 16 bytes specify how many codes should be 1-bit, 2-bit @@ -1003,10 +1040,11 @@ void CLASS canon_sraw_load_raw() for (row=0; row < height; row++, ip+=width) { if (row & (jh.sraw >> 1)) for (col=0; col < width; col+=2) - for (c=1; c < 3; c++) + for (c=1; c < 3; c++) { if (row == height-1) ip[col][c] = ip[col-width][c]; else ip[col][c] = (ip[col-width][c] + ip[col+width][c] + 1) >> 1; + } for (col=1; col < width; col+=2) for (c=1; c < 3; c++) if (col == width-1) @@ -1090,6 +1128,61 @@ void CLASS ljpeg_idct (struct jhead *jh) FORC(64) jh->idct[c] = CLIP(((float *)work[2])[c]+0.5); } +void CLASS lossless_dnglj92_load_raw() +{ + BENCHFUN + + tiff_bps = 16; + + int save = ifp->pos; + uint16_t *lincurve = !strncmp(make,"Blackmagic",10) ? curve : nullptr; + tile_width = tile_length < INT_MAX ? tile_width : raw_width; + size_t tileCount = raw_width / tile_width; + + size_t dataOffset[tileCount]; + if(tile_length < INT_MAX) { + for (size_t t = 0; t < tileCount; ++t) { + dataOffset[t] = get4(); + } + } else { + dataOffset[0] = ifp->pos; + } + const int data_length = ifp->size; + const std::unique_ptr data(new uint8_t[data_length]); + fseek(ifp, 0, SEEK_SET); + // read whole file + fread(data.get(), 1, data_length, ifp); + lj92 lj; + int newwidth, newheight, newbps; + lj92_open(&lj, &data[dataOffset[0]], data_length, &newwidth, &newheight, &newbps); + lj92_close(lj); + if (newwidth * newheight * tileCount != raw_width * raw_height) { + // not a lj92 file + fseek(ifp, save, SEEK_SET); + lossless_dng_load_raw(); + return; + } + +#ifdef _OPENMP + #pragma omp parallel for num_threads(std::min(tileCount, omp_get_max_threads())) +#endif + for (size_t t = 0; t < tileCount; ++t) { + size_t tcol = t * tile_width; + lj92 lj; + int newwidth, newheight, newbps; + lj92_open(&lj, &data[dataOffset[t]], data_length, &newwidth, &newheight, &newbps); + + const std::unique_ptr target(new uint16_t[newwidth * newheight]); + lj92_decode(lj, target.get(), tile_width, 0, lincurve, 0x1000); + for (int y = 0; y < height; ++y) { + for(int x = 0; x < tile_width; ++x) { + RAW(y, x + tcol) = target[y * tile_width + x]; + } + } + lj92_close(lj); + } +} + void CLASS lossless_dng_load_raw() { unsigned save, trow=0, tcol=0, jwide, jrow, jcol, row, col, i, j; @@ -1102,7 +1195,7 @@ void CLASS lossless_dng_load_raw() fseek (ifp, get4(), SEEK_SET); if (!ljpeg_start (&jh, 0)) break; jwide = jh.wide; - if (filters) jwide *= jh.clrs; + if (filters || (colors == 1 && jh.clrs > 1)) jwide *= jh.clrs; jwide /= MIN (is_raw, tiff_samples); switch (jh.algo) { case 0xc1: @@ -1136,23 +1229,46 @@ void CLASS lossless_dng_load_raw() } } +static uint32_t DNG_HalfToFloat(uint16_t halfValue); + void CLASS packed_dng_load_raw() { ushort *pixel, *rp; int row, col; + int isfloat = (tiff_nifds == 1 && tiff_ifd[0].sample_format == 3 && (tiff_bps == 16 || tiff_bps == 32)); + if (isfloat) { + float_raw_image = new float[raw_width * raw_height]; + } pixel = (ushort *) calloc (raw_width, tiff_samples*sizeof *pixel); merror (pixel, "packed_dng_load_raw()"); for (row=0; row < raw_height; row++) { - if (tiff_bps == 16) + if (tiff_bps == 16) { read_shorts (pixel, raw_width * tiff_samples); - else { + if (isfloat) { + uint32_t *dst = reinterpret_cast(&float_raw_image[row*raw_width]); + for (col = 0; col < raw_width; col++) { + uint32_t f = DNG_HalfToFloat(pixel[col]); + dst[col] = f; + } + } + } else if (isfloat) { + if (fread(&float_raw_image[row*raw_width], sizeof(float), raw_width, ifp) != raw_width) { + derror(); + } + if ((order == 0x4949) == (ntohs(0x1234) == 0x1234)) { + char *d = reinterpret_cast(float_raw_image); + rtengine::swab(d, d, sizeof(float)*raw_width); + } + } else { getbits(-1); for (col=0; col < raw_width * tiff_samples; col++) pixel[col] = getbits(tiff_bps); } - for (rp=pixel, col=0; col < raw_width; col++) - adobe_copy_pixel (row, col, &rp); + if (!isfloat) { + for (rp=pixel, col=0; col < raw_width; col++) + adobe_copy_pixel (row, col, &rp); + } } free (pixel); } @@ -1186,67 +1302,101 @@ void CLASS pentax_load_raw() void CLASS nikon_load_raw() { - static const uchar nikon_tree[][32] = { - { 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy */ - 5,4,3,6,2,7,1,0,8,9,11,10,12 }, - { 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy after split */ - 0x39,0x5a,0x38,0x27,0x16,5,4,3,2,1,0,11,12,12 }, - { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0, /* 12-bit lossless */ - 5,4,6,3,7,2,8,1,9,0,10,11,12 }, - { 0,1,4,3,1,1,1,1,1,2,0,0,0,0,0,0, /* 14-bit lossy */ - 5,6,4,7,8,3,9,2,1,0,10,11,12,13,14 }, - { 0,1,5,1,1,1,1,1,1,1,2,0,0,0,0,0, /* 14-bit lossy after split */ - 8,0x5c,0x4b,0x3a,0x29,7,6,5,4,3,2,1,0,13,14 }, - { 0,1,4,2,2,3,1,2,0,0,0,0,0,0,0,0, /* 14-bit lossless */ - 7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 } }; - ushort *huff, ver0, ver1, vpred[2][2], hpred[2], csize; - int i, min, max, step=0, tree=0, split=0, row, col, len, shl, diff; + static const uchar nikon_tree[][32] = { + { 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy */ + 5,4,3,6,2,7,1,0,8,9,11,10,12 }, + { 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy after split */ + 0x39,0x5a,0x38,0x27,0x16,5,4,3,2,1,0,11,12,12 }, + { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0, /* 12-bit lossless */ + 5,4,6,3,7,2,8,1,9,0,10,11,12 }, + { 0,1,4,3,1,1,1,1,1,2,0,0,0,0,0,0, /* 14-bit lossy */ + 5,6,4,7,8,3,9,2,1,0,10,11,12,13,14 }, + { 0,1,5,1,1,1,1,1,1,1,2,0,0,0,0,0, /* 14-bit lossy after split */ + 8,0x5c,0x4b,0x3a,0x29,7,6,5,4,3,2,1,0,13,14 }, + { 0,1,4,2,2,3,1,2,0,0,0,0,0,0,0,0, /* 14-bit lossless */ + 7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 } }; + ushort *huff, ver0, ver1, vpred[2][2], hpred[2], csize; + int max, step=0, tree=0, split=0; - fseek (ifp, meta_offset, SEEK_SET); - ver0 = fgetc(ifp); - ver1 = fgetc(ifp); - if (ver0 == 0x49 || ver1 == 0x58) - fseek (ifp, 2110, SEEK_CUR); - if (ver0 == 0x46) tree = 2; - if (tiff_bps == 14) tree += 3; - read_shorts (vpred[0], 4); - max = 1 << tiff_bps & 0x7fff; - if ((csize = get2()) > 1) - step = max / (csize-1); - if (ver0 == 0x44 && ver1 == 0x20 && step > 0) { - for (i=0; i < csize; i++) - curve[i*step] = get2(); - for (i=0; i < max; i++) - curve[i] = ( curve[i-i%step]*(step-i%step) + - curve[i-i%step+step]*(i%step) ) / step; - fseek (ifp, meta_offset+562, SEEK_SET); - split = get2(); - } else if (ver0 != 0x46 && csize <= 0x4001) - read_shorts (curve, max=csize); - while (curve[max-2] == curve[max-1]) max--; - huff = make_decoder (nikon_tree[tree]); - fseek (ifp, data_offset, SEEK_SET); - getbits(-1); - for (min=row=0; row < height; row++) { - if (split && row == split) { - free (huff); - huff = make_decoder (nikon_tree[tree+1]); - max += (min = 16) << 1; + fseek (ifp, meta_offset, SEEK_SET); + ver0 = fgetc(ifp); + ver1 = fgetc(ifp); + if (ver0 == 0x49 || ver1 == 0x58) + fseek (ifp, 2110, SEEK_CUR); + if (ver0 == 0x46) tree = 2; + if (tiff_bps == 14) tree += 3; + read_shorts (vpred[0], 4); + max = 1 << (tiff_bps - (ver0 == 0x44 && ver1 == 0x40 ? 2 : 0)) & 0x7fff; + if ((csize = get2()) > 1) + step = max / (csize-1); + if (ver0 == 0x44 && (ver1 == 0x20 || ver1 == 0x40) && step > 0) { + for (int i=0; i < csize; i++) + curve[i*step] = get2(); + for (int i=0; i < max; i++) + curve[i] = ( curve[i-i%step]*(step-i%step) + + curve[i-i%step+step]*(i%step) ) / step; + fseek (ifp, meta_offset+562, SEEK_SET); + split = get2(); + } else if (ver0 != 0x46 && csize <= 0x4001) + read_shorts (curve, max=csize); + while (curve[max-2] == curve[max-1]) max--; + + // instead of accessing curve[LIM((short)hpred[col & 1],0,0x3fff)] in the inner loop, we just fill the curve with the correct values and access curve[hpred[col & 1]] + for(int i = 0x4000; i < 0x8000; ++i) + curve[i] = curve[0x3fff]; + for(int i = 0x8000; i < 0x10000; ++i) + curve[i] = curve[0]; + + huff = make_decoder (nikon_tree[tree]); + fseek (ifp, data_offset, SEEK_SET); + nikinit(); + if (split) { + for (int min = 0, row = 0; row < height; row++) { + if (row == split) { + free (huff); + huff = make_decoder (nikon_tree[tree+1]); + max += (min = 16) << 1; + } + for (int col=0; col < raw_width; col++) { + int i = nikhuff(huff); + int len = i & 15; + int shl = i >> 4; + int diff = ((nikbits(len-shl) << 1) + 1) << shl >> 1; + if ((diff & (1 << (len-1))) == 0) + diff -= (1 << len) - !shl; + if (col < 2) hpred[col] = vpred[row & 1][col] += diff; + else hpred[col & 1] += diff; + derror((ushort)(hpred[col & 1] + min) >= max); + RAW(row,col) = curve[hpred[col & 1]]; + } + } + } else { + for (int row=0; row < height; row++) { + for (int col=0; col < 2; col++) { + int len = nikhuff(huff); + int diff = nikbits(len); + if ((diff & (1 << (len-1))) == 0) + diff -= (1 << len) - 1; + hpred[col] = vpred[row & 1][col] += diff; + derror(hpred[col] >= max); + RAW(row,col) = curve[hpred[col]]; + } + for (int col=2; col < raw_width; col++) { + int len = nikhuff(huff); + int diff = nikbits(len); + if ((diff & (1 << (len-1))) == 0) + diff -= (1 << len) - 1; + hpred[col & 1] += diff; + derror(hpred[col & 1] >= max); + RAW(row,col) = curve[hpred[col & 1]]; + } + } } - for (col=0; col < raw_width; col++) { - i = gethuff(huff); - len = i & 15; - shl = i >> 4; - diff = ((getbits(len-shl) << 1) + 1) << shl >> 1; - if ((diff & (1 << (len-1))) == 0) - diff -= (1 << len) - !shl; - if (col < 2) hpred[col] = vpred[row & 1][col] += diff; - else hpred[col & 1] += diff; - if ((ushort)(hpred[col & 1] + min) >= max) derror(); - RAW(row,col) = curve[LIM((short)hpred[col & 1],0,0x3fff)]; + free (huff); + data_error += nikbithuff.errorCount(); + if(data_error) { + std::cerr << ifname << " decoded with " << data_error << " errors. File possibly corrupted." << std::endl; } - } - free (huff); } void CLASS nikon_yuv_load_raw() @@ -1545,7 +1695,9 @@ void CLASS phase_one_correct() curve[i] = LIM(num+i,0,65535); } apply: /* apply to whole image */ +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) +#endif 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)]; @@ -1620,8 +1772,10 @@ void CLASS phase_one_correct() cx[17] = cf[17] = ((unsigned) ref[15] * 65535) / lc[qr][qc][15]; cx[18] = cf[18] = 65535; cubic_spline(cx, cf, 19); +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) - for (int row = (qr ? ph1.split_row : 0); row < (qr ? raw_height : ph1.split_row); row++) +#endif + 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)]; } @@ -1637,7 +1791,9 @@ void CLASS phase_one_correct() qmult[1][0] = 1.0 + getreal(11); get4(); get4(); get4(); qmult[1][1] = 1.0 + getreal(11); +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) +#endif 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); @@ -1951,7 +2107,7 @@ void CLASS parse_hasselblad_gain() 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. @@ -2008,7 +2164,7 @@ void CLASS parse_hasselblad_gain() hbd.unknown1 = offset ? base + offset : 0; fseek(ifp, 32, SEEK_CUR); offset = get4(); - hbd.flatfield = offset ? base + offset : 0; + hbd.flatfield = (offset && (base + offset < ifp->size)) ? base + offset : 0; } void CLASS hasselblad_correct() @@ -2023,7 +2179,7 @@ void CLASS hasselblad_correct() 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) @@ -2078,8 +2234,12 @@ void CLASS hasselblad_correct() ffcols = get2(); ffrows = get2(); fseek(ifp, hbd.flatfield + 16 * 2, SEEK_SET); + unsigned toRead = sizeof(ushort) * 4 * ffcols * ffrows; + if (toRead > ifp->size) { // there must be something wrong, see Issue #4748 + return; + } - ushort *ffmap = (ushort *)malloc(sizeof(*ffmap) * 4 * ffcols * ffrows); + ushort *ffmap = (ushort *)malloc(toRead); 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, @@ -2175,7 +2335,9 @@ void CLASS hasselblad_correct() } // apply flatfield +#ifdef _OPENMP #pragma omp parallel for +#endif for (int row = 0; row < raw_height; row++) { int ffs, cur_ffr, i, c; if (row < row_offset) { @@ -2353,30 +2515,34 @@ void CLASS unpacked_load_raw() // 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]; + constexpr unsigned frame2pos[] = { 0, 1, 3, 2 }; + const 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; + // allocate memory for a row of pixels + ushort *samples = new ushort[4 * raw_width]; + + int bits = 0; + while (1 << ++bits < maximum) + ; + bits = (1 << bits) - 1; + + for (int row = 0; row < ((frame < 2) ? 1 : raw_height); row++) { + for (int 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(); - } + + for (int row = 0; row < raw_height; ++row) { + int r = row + (frame & 1); + read_shorts(samples, 4 * raw_width); + if (r < raw_height) { + int offset = 2 * (r & 1); + for (int c = (frame >> 1) & 1; c < raw_width; ++c, offset += 4) { + RAW(r, c) = samples[offset + (c & 1)] & bits; + } + } } - } + delete [] samples; } @@ -2426,10 +2592,11 @@ void CLASS packed_load_raw() UINT64 bitbuf=0; bwide = raw_width * tiff_bps / 8; - bwide += bwide & load_flags >> 7; + bwide += bwide & load_flags >> 9; + bwide += row_padding; rbits = bwide * 8 - raw_width * tiff_bps; if (load_flags & 1) bwide = bwide * 16 / 15; - bite = 8 + (load_flags & 24); + bite = 8 + (load_flags & 56); half = (raw_height+1) >> 1; for (irow=0; irow < raw_height; irow++) { row = irow; @@ -2447,10 +2614,10 @@ void CLASS packed_load_raw() for (vbits -= tiff_bps; vbits < 0; vbits += bite) { bitbuf <<= bite; for (i=0; i < bite; i+=8) - bitbuf |= (unsigned) (fgetc(ifp) << i); + bitbuf |= ((UINT64) fgetc(ifp) << i); } val = bitbuf << (64-tiff_bps-vbits) >> (64-tiff_bps); - RAW(row,col ^ (load_flags >> 6 & 1)) = val; + RAW(row,col ^ (load_flags >> 6 & 3)) = val; if (load_flags & 1 && (col % 10) == 9 && fgetc(ifp) && row < height+top_margin && col < width+left_margin) derror(); } @@ -2505,43 +2672,92 @@ void CLASS canon_rmf_load_raw() maximum = curve[0x3ff]; } -unsigned CLASS pana_bits_t::operator() (int nbits) +unsigned CLASS pana_bits_t::operator() (int nbits, unsigned *bytes) { /*RT static uchar buf[0x4000]; */ /*RT static int vbits;*/ int byte; - if (!nbits) return vbits=0; + if (!nbits && !bytes) return vbits=0; if (!vbits) { fread (buf+load_flags, 1, 0x4000-load_flags, ifp); fread (buf, 1, load_flags, ifp); } - vbits = (vbits - nbits) & 0x1ffff; - byte = vbits >> 3 ^ 0x3ff0; - return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits); + if (encoding == 5) { + for (byte = 0; byte < 16; byte++) + { + bytes[byte] = buf[vbits++]; + vbits &= 0x3FFF; + } + return 0; + } else { + vbits = (vbits - nbits) & 0x1ffff; + byte = vbits >> 3 ^ 0x3ff0; + return (buf[byte] | buf[byte+1] << 8) >> (vbits & 7) & ~(-1 << nbits); + } } void CLASS panasonic_load_raw() { - pana_bits_t pana_bits(ifp,load_flags); + pana_bits_t pana_bits(ifp,load_flags, RT_pana_info.encoding); int row, col, i, j, sh=0, pred[2], nonz[2]; + unsigned bytes[16] = {}; + ushort *raw_block_data; - pana_bits(0); - for (row=0; row < height; row++) - for (col=0; col < raw_width; col++) { - if ((i = col % 14) == 0) - pred[0] = pred[1] = nonz[0] = nonz[1] = 0; - if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2)); - if (nonz[i & 1]) { - if ((j = pana_bits(8))) { - if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) - pred[i & 1] &= ~(-1 << sh); - pred[i & 1] += j << sh; - } - } else if ((nonz[i & 1] = pana_bits(8)) || i > 11) - pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4); - if ((RAW(row,col) = pred[col & 1]) > 4098 && col < width) derror(); + pana_bits(0, 0); + int enc_blck_size = RT_pana_info.bpp == 12 ? 10 : 9; + if (RT_pana_info.encoding == 5) { + for (row = 0; row < raw_height; row++) + { + raw_block_data = raw_image + row * raw_width; + + for (col = 0; col < raw_width; col += enc_blck_size) { + pana_bits(0, bytes); + + if (RT_pana_info.bpp == 12) { + raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; + raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); + raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; + raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); + raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; + raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); + raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; + raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); + raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; + raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); + } + else if (RT_pana_info.bpp == 14) { + raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); + raw_block_data[col + 1] = (bytes[1] >> 6) + 4 * (bytes[2]) + + ((bytes[3] & 0xF) << 10); + raw_block_data[col + 2] = (bytes[3] >> 4) + 16 * (bytes[4]) + + ((bytes[5] & 3) << 12); + raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); + raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); + raw_block_data[col + 5] = (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); + raw_block_data[col + 6] = (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); + raw_block_data[col + 7] = ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); + raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); + } + } } + } else { + for (row=0; row < height; row++) + for (col=0; col < raw_width; col++) { + if ((i = col % 14) == 0) + pred[0] = pred[1] = nonz[0] = nonz[1] = 0; + if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2)); + if (nonz[i & 1]) { + if ((j = pana_bits(8))) { + if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) + pred[i & 1] &= ~(-1 << sh); + pred[i & 1] += j << sh; + } + } else if ((nonz[i & 1] = pana_bits(8)) || i > 11) + pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4); + if ((RAW(row,col) = pred[col & 1]) > 4098 && col < width) derror(); + } + } } void CLASS olympus_load_raw() @@ -2890,7 +3106,7 @@ void CLASS lossy_dng_load_raw() } order = sorder; } else { - gamma_curve (1/2.4, 12.92, 1, 255); + gamma_curve (1/2.4, 12.92310, 1, 255); FORC3 memcpy (cur[c], curve, sizeof cur[0]); } cinfo.err = jpeg_std_error (&jerr); @@ -4311,7 +4527,9 @@ void CLASS crop_masked_pixels() } } } else { +#ifdef _OPENMP #pragma omp parallel for +#endif for (int row=0; row < height; row++) for (int col=0; col < width; col++) BAYER2(row,col) = RAW(row+top_margin,col+left_margin); @@ -4328,7 +4546,7 @@ void CLASS crop_masked_pixels() load_raw == &CLASS sony_load_raw || (load_raw == &CLASS eight_bit_load_raw && strncmp(model,"DC2",3)) || load_raw == &CLASS kodak_262_load_raw || - (load_raw == &CLASS packed_load_raw && (load_flags & 32))) { + (load_raw == &CLASS packed_load_raw && (load_flags & 256))) { sides: mask[0][0] = mask[1][0] = top_margin; mask[0][2] = mask[1][2] = top_margin+height; @@ -4378,7 +4596,7 @@ mask_set: //} /* - 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) @@ -5905,13 +6123,14 @@ int CLASS parse_tiff_ifd (int base) char software[64], *cbuf, *cp; uchar cfa_pat[16], cfa_pc[] = { 0,1,2,3 }, tab[256]; 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 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; /*RT*/ IMFILE *sfp; +/*RT*/ int pana_raw = 0; if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0]) return 1; @@ -5927,10 +6146,16 @@ int CLASS parse_tiff_ifd (int base) while (entries--) { tiff_get (base, &tag, &type, &len, &save); switch (tag) { + case 1: if (len == 4) pana_raw = get4(); break; case 5: width = get2(); break; case 6: height = get2(); break; case 7: width += get2(); break; case 9: if ((i = get2())) filters = i; break; + case 10: + if (pana_raw && len == 1 && type == 3) { + RT_pana_info.bpp = get2(); + } + break; case 17: case 18: if (type == 3 && len == 1) cam_mul[(tag-17)*2] = get2() / 256.0; @@ -5950,6 +6175,12 @@ int CLASS parse_tiff_ifd (int base) fseek (ifp, 12, SEEK_CUR); FORC3 cam_mul[c] = get2(); break; + case 45: + if (pana_raw && len == 1 && type == 3) + { + RT_pana_info.encoding = get2(); + } + break; case 46: if (type != 7 || fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) break; thumb_offset = ftell(ifp) - 2; @@ -5968,14 +6199,13 @@ int CLASS parse_tiff_ifd (int base) case 258: /* BitsPerSample */ case 61443: tiff_ifd[ifd].samples = len & 7; - tiff_ifd[ifd].bps = getint(type); + if ((tiff_ifd[ifd].bps = getint(type)) > 32) + tiff_ifd[ifd].bps = 8; if (tiff_bps < tiff_ifd[ifd].bps) tiff_bps = tiff_ifd[ifd].bps; break; case 61446: raw_height = 0; - if (tiff_ifd[ifd].bps > 12) break; - load_raw = &CLASS packed_load_raw; load_flags = get4() ? 24:80; break; case 259: /* Compression */ @@ -6038,6 +6268,7 @@ int CLASS parse_tiff_ifd (int base) break; case 305: case 11: /* Software */ fgets (software, 64, ifp); + RT_software = software; if (!strncmp(software,"Adobe",5) || !strncmp(software,"dcraw",5) || !strncmp(software,"UFRaw",5) || @@ -6306,6 +6537,7 @@ guess_cfa_pc: case 61450: cblack[4] = cblack[5] = MIN(sqrt(len),64); case 50714: /* BlackLevel */ + RT_blacklevel_from_constant = ThreeValBool::F; if(cblack[4] * cblack[5] == 0) { int dblack[] = { 0,0,0,0 }; black = getreal(type); @@ -6326,9 +6558,11 @@ guess_cfa_pc: for (num=i=0; i < (len & 0xffff); i++) num += getreal(type); black += num/len + 0.5; + RT_blacklevel_from_constant = ThreeValBool::F; break; case 50717: /* WhiteLevel */ maximum = getint(type); + RT_whitelevel_from_constant = ThreeValBool::F; break; case 50718: /* DefaultScale */ pixel_aspect = getreal(type); @@ -6357,6 +6591,14 @@ guess_cfa_pc: xyz[2] = 1 - xyz[0] - xyz[1]; FORC3 xyz[c] /= d65_white[c]; break; + case 50730: /* BaselineExposure */ + if (dng_version) { + double be = getreal(type); + if (!std::isnan(be)) { + RT_baseline_exposure = be; + } + } + break; case 50740: /* DNGPrivateData */ if (dng_version) break; parse_minolta (j = get4()+base); @@ -6382,6 +6624,29 @@ guess_cfa_pc: ((int *)mask)[i] = getint(type); black = 0; break; + case 51008: /* OpcodeList1 */ + { + unsigned oldOrder = order; + order = 0x4d4d; // always big endian per definition in https://www.adobe.com/content/dam/acom/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf chapter 7 + unsigned ntags = get4(); // read the number of opcodes + + if (ntags < ifp->size / 12) { // rough check for wrong value (happens for example with DNG files from DJI FC6310) + while (ntags-- && !ifp->eof) { + unsigned opcode = get4(); + fseek (ifp, 8, SEEK_CUR); // skip 8 bytes as they don't interest us currently + if (opcode == 4) { // FixBadPixelsConstant + fseek (ifp, 4, SEEK_CUR); // skip 4 bytes as we know that the opcode 4 takes 4 byte + if(get4() == 0) { // if raw 0 values should be treated as bad pixels, set zero_is_bad to true (1). That's the only value currently supported by rt + zero_is_bad = 1; + } + } else { + fseek (ifp, get4(), SEEK_CUR); + } + } + } + order = oldOrder; + break; + } case 51009: /* OpcodeList2 */ meta_offset = ftell(ifp); break; @@ -6443,8 +6708,6 @@ guess_cfa_pc: 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; } @@ -6522,6 +6785,7 @@ void CLASS apply_tiff() case 32767: if (tiff_ifd[raw].bytes == raw_width*raw_height) { tiff_bps = 12; + maximum = 4095; load_raw = &CLASS sony_arw2_load_raw; break; } if (tiff_ifd[raw].bytes*8 != raw_width*raw_height*tiff_bps) { @@ -6537,7 +6801,9 @@ void CLASS apply_tiff() if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*2 == raw_width*raw_height*3) load_flags = 24; - if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { + if (!strcmp(make,"SONY") && tiff_bps < 14 && + tiff_ifd[raw].bytes == raw_width*raw_height*2) + tiff_bps = 14; if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8) { load_flags = 81; tiff_bps = 12; } slr: @@ -6551,7 +6817,9 @@ void CLASS apply_tiff() load_raw = &CLASS packed_load_raw; break; } - case 14: load_flags = 0; + case 14: load_raw = &CLASS packed_load_raw; + if (tiff_ifd[raw].bytes*4 == raw_width*raw_height*7) break; + load_flags = 0; case 16: load_raw = &CLASS unpacked_load_raw; if (!strncmp(make,"OLYMPUS",7) && tiff_ifd[raw].bytes*7 > raw_width*raw_height) @@ -6568,6 +6836,9 @@ void CLASS apply_tiff() } // ------------------ } +// if (filters == 9 && tiff_ifd[raw].bytes*8 < raw_width*raw_height*tiff_bps) +// load_raw = &CLASS fuji_xtrans_load_raw; + break; case 6: case 7: case 99: load_raw = &CLASS lossless_jpeg_load_raw; break; @@ -6582,13 +6853,28 @@ void CLASS apply_tiff() if (model[0] == 'N') load_flags = 80; } else if (raw_width*raw_height*3 == tiff_ifd[raw].bytes) { load_raw = &CLASS nikon_yuv_load_raw; - gamma_curve (1/2.4, 12.92, 1, 4095); + gamma_curve (1/2.4, 12.92310, 1, 4095); memset (cblack, 0, sizeof cblack); filters = 0; } else if (raw_width*raw_height*2 == tiff_ifd[raw].bytes) { load_raw = &CLASS unpacked_load_raw; load_flags = 4; order = 0x4d4d; + } else if ((raw_width * raw_height * 2 * tiff_bps) / 16 == tiff_ifd[raw].bytes) { + // 12 bit uncompressed from Nikon Z7 + load_raw = &CLASS packed_load_raw; + } else if ((raw_width * 2 * tiff_bps / 16 + 8) * raw_height == tiff_ifd[raw].bytes) { + // 14 bit uncompressed from Nikon Z7, still wrong + // each line has 8 padding byte. + //row_padding = 8; + //load_raw = &CLASS packed_load_raw; + load_raw = &CLASS nikon_14bit_load_raw; + } else if ((raw_width * 2 * tiff_bps / 16 + 12) * raw_height == tiff_ifd[raw].bytes) { + // 14 bit uncompressed from Nikon Z6, still wrong + // each line has 12 padding byte. + // row_padding = 12; + // load_raw = &CLASS packed_load_raw; + load_raw = &CLASS nikon_14bit_load_raw; } else load_raw = &CLASS nikon_load_raw; break; case 65535: @@ -7026,7 +7312,7 @@ void CLASS parse_fuji (int offset) FORC(36) xtrans_abs[0][35-c] = fgetc(ifp) & 3; } else if (tag == 0x2ff0) { FORC4 cam_mul[c ^ 1] = get2(); - } else if (tag == 0xc000) { + } else if (tag == 0xc000 && len > 20000) { c = order; order = 0x4949; while ((tag = get4()) > raw_width); @@ -7352,12 +7638,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6188,-1341,-890,-7168,14489,2937,-2640,3228,8483 } }, { "Canon EOS 5DS", 0, 0x3c96, { 6250,-711,-808,-5153,12794,2636,-1249,2198,5610 } }, + { "Canon EOS 5D Mark IV", 0, 0, + { 6446,-366,-864,-4436,12204,2513,-952,2496,6348 } }, { "Canon EOS 5D Mark III", 0, 0x3c80, { 6722,-635,-963,-4287,12460,2028,-908,2162,5668 } }, { "Canon EOS 5D Mark II", 0, 0x3cf0, { 4716,603,-830,-7798,15474,2480,-1496,1937,6651 } }, { "Canon EOS 5D", 0, 0xe6c, { 6347,-479,-972,-8297,15954,2480,-1968,2131,7649 } }, + { "Canon EOS 6D Mark II", 0, 0, + { 6875,-970,-932,-4691,12459,2501,-874,1953,5809 } }, { "Canon EOS 6D", 0, 0x3c82, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, { "Canon EOS 7D Mark II", 0, 0x3510, @@ -7380,10 +7670,14 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6719,-994,-925,-4408,12426,2211,-887,2129,6051 } }, { "Canon EOS 70D", 0, 0x3bc7, { 7034,-804,-1014,-4420,12564,2058,-851,1994,5758 } }, + { "Canon EOS 77D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 80D", 0, 0, { 7457,-671,-937,-4849,12495,2643,-1213,2354,5492 } }, { "Canon EOS 100D", 0, 0x350f, { 6602,-841,-939,-4472,12458,2247,-975,2039,6148 } }, + { "Canon EOS 200D", 0, 0, + { 7377,-742,-998,-4235,11981,2549,-673,1918,5538 } }, { "Canon EOS 300D", 0, 0xfa0, { 8197,-2000,-1118,-6714,14335,2592,-2536,3178,8266 } }, { "Canon EOS 350D", 0, 0xfff, @@ -7406,6 +7700,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, { "Canon EOS 760D", 0, 0x350f, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS 800D", 0, 0, + { 6970,-512,-968,-4425,12161,2553,-739,1982,5601 } }, { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, { "Canon EOS 1100D", 0, 0x3510, @@ -7414,8 +7710,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6461,-907,-882,-4300,12184,2378,-819,1944,5931 } }, { "Canon EOS 1300D", 0, 0x3510, { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS 1500D", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS 3000D", 0, 0, + { 6939,-1016,-866,-4428,12473,2177,-1175,2178,6162 } }, + { "Canon EOS M6", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, + { "Canon EOS M5", 0, 0, /* also M50 */ + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M3", 0, 0, { 6362,-823,-847,-4426,12109,2616,-743,1857,5635 } }, + { "Canon EOS M100", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon EOS M10", 0, 0, { 6400,-480,-888,-5294,13416,2047,-1296,2203,6137 } }, { "Canon EOS M", 0, 0, @@ -7460,6 +7766,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7474,-2301,-567,-4056,11456,2975,-222,716,4181 } }, { "Canon PowerShot G16", 0, 0, { 8020,-2687,-682,-3704,11879,2052,-965,1921,5556 } }, + { "Canon PowerShot G1 X Mark III", 0, 0, + { 8532,-701,-1167,-4095,11879,2508,-797,2424,7010 } }, { "Canon PowerShot G1 X", 0, 0, { 7378,-1255,-1043,-4088,12251,2048,-876,1946,5805 } }, { "Canon PowerShot G1", 0, 0, @@ -7478,6 +7786,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 9877,-3775,-871,-7613,14807,3072,-1448,1305,7485 } }, { "Canon PowerShot G7 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, + { "Canon PowerShot G9 X Mark II", 0, 0, + { 10056,-4131,-944,-2576,11143,1625,-238,1294,5179 } }, { "Canon PowerShot G9 X", 0, 0, { 9602,-3823,-937,-2984,11495,1675,-407,1415,5049 } }, { "Canon PowerShot G9", 0, 0, @@ -7572,6 +7882,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, { "Fujifilm F8", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, + { "Fujifilm GFX 50S", 0, 0, + { 11756,-4754,-874,-3056,11045,2305,-381,1457,6006 } }, { "Fujifilm S100FS", 514, 0, { 11521,-4355,-1065,-6524,13767,3058,-1466,1984,6045 } }, { "Fujifilm S1", 0, 0, @@ -7580,9 +7892,9 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10004,-3219,-1201,-7036,15047,2107,-1863,2565,7736 } }, { "Fujifilm S20", 512, 0x3fff, { 11401,-4498,-1312,-5088,12751,2613,-838,1568,5941 } }, - { "Fujifilm S2Pro", 128, 0, + { "Fujifilm S2Pro", 128, 0xf15, { 12492,-4690,-1402,-7033,15423,1647,-1507,2111,7697 } }, - { "Fujifilm S3Pro", 0, 0, + { "Fujifilm S3Pro", 0, 0x3dff, { 11807,-4612,-1294,-8927,16968,1988,-2120,2741,8006 } }, { "Fujifilm S5Pro", 0, 0, { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, @@ -7616,7 +7928,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 12300,-5110,-1304,-9117,17143,1998,-1947,2448,8100 } }, { "Fujifilm HS10 HS11", 0, 0xf68, { 12440,-3954,-1183,-1123,9674,1708,-83,1614,4086 } }, - { "Fujifilm HS2", 0, 0, + { "Fujifilm HS2", 0, 0xfef, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, { "Fujifilm HS3", 0, 0, { 13690,-5358,-1474,-3369,11600,1998,-132,1554,4395 } }, @@ -7624,6 +7936,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, { "Fujifilm F900EXR", 0, 0, { 12085,-4727,-953,-3257,11489,2002,-511,2046,4592 } }, + { "Fujifilm X100F", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X100S", 0, 0, { 10592,-4262,-1008,-3514,11355,2465,-870,2025,6386 } }, { "Fujifilm X100T", 0, 0, @@ -7642,26 +7956,42 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-Pro2", 0, 0, { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-A10", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, + { "Fujifilm X-A20", 0, 0, + { 11540,-4999,-991,-2949,10963,2278,-382,1049,5605 } }, { "Fujifilm X-A1", 0, 0, { 11086,-4555,-839,-3512,11310,2517,-815,1341,5940 } }, { "Fujifilm X-A2", 0, 0, { 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 } }, + { "Fujifilm X-A3", 0, 0, + { 12407,-5222,-1086,-2971,11116,2120,-294,1029,5284 } }, + { "Fujifilm X-A5", 0, 0, + { 11673,-4760,-1041,-3988,12058,2166,-771,1417,5569 } }, { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-E2S", 0, 0, { 11562,-5118,-961,-3022,11007,2311,-525,1569,6097 } }, { "Fujifilm X-E2", 0, 0, { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-E3", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, + { "Fujifilm X-H1", 0, 0, + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm X-M1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-S1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, { "Fujifilm X-T1", 0, 0, /* also X-T10 */ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, + { "Fujifilm X-T2", 0, 0, /* also X-T20 */ + { 11434,-4948,-1210,-3746,12042,1903,-666,1479,5235 } }, { "Fujifilm XF1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, { "Fujifilm XQ", 0, 0, /* XQ1 and XQ2 */ { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, + { "GoPro HERO5 Black", 0, 0, + { 10344,-4210,-620,-2315,10625,1948,93,1058,5541 } }, { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, { "Kodak NC2000", 0, 0, @@ -7774,6 +8104,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7013,-1408,-635,-5268,12902,2640,-1470,2801,7379 } }, { "Nikon D3300", 0, 0, { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, + { "Nikon D3400", 0, 0, + { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D300", 0, 0, { 9030,-1992,-715,-8465,16302,2255,-2689,3217,8069 } }, { "Nikon D3X", 0, 0, @@ -7802,6 +8134,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, { "Nikon D5500", 0, 0, { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, + { "Nikon D5600", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, { "Nikon D500", 0, 0, { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D50", 0, 0, @@ -7820,12 +8154,16 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D7200", 0, 0, { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, + { "Nikon D7500", 0, 0, + { 8813,-3210,-1036,-4703,12868,2021,-1054,1940,6129 } }, { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, { 8139,-2171,-663,-8747,16541,2295,-1925,2008,8093 } }, { "Nikon D70", 0, 0, { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, + { "Nikon D850", 0, 0, + { 10405,-3755,-1270,-5461,13787,1793,-1040,2015,6785 } }, { "Nikon D810", 0, 0, { 9369,-3195,-791,-4488,12430,2301,-893,1796,6872 } }, { "Nikon D800", 0, 0, @@ -7866,6 +8204,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7971,-2314,-913,-8451,15762,2894,-1442,1520,7610 } }, { "Nikon COOLPIX A", 0, 0, { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, + { "Nikon COOLPIX B700", 200, 0, + { 14387,-6014,-1299,-1357,9975,1616,467,1047,4744 } }, { "Nikon COOLPIX P330", 200, 0, { 10321,-3920,-931,-2750,11146,1824,-442,1545,5539 } }, { "Nikon COOLPIX P340", 200, 0, @@ -7964,12 +8304,18 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-PL7", 0, 0, { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { "Olympus E-PL8", 0, 0, + { 9197,-3190,-659,-2606,10830,2039,-458,1250,5458 } }, + { "Olympus E-PL9", 0, 0, + { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-PM1", 0, 0, { 7575,-2159,-571,-3722,11341,2725,-1434,2819,6271 } }, { "Olympus E-PM2", 0, 0, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, - { "Olympus E-M10", 0, 0, /* also E-M10 Mark II */ + { "Olympus E-M10", 0, 0, /* also E-M10 Mark II & III */ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, + { "Olympus E-M1Mark II", 0, 0, + { 9383,-3170,-763,-2457,10702,2020,-384,1236,5552 } }, { "Olympus E-M1", 0, 0, { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, { "Olympus E-M5MarkII", 0, 0, @@ -7998,6 +8344,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8360,-2420,-880,-3928,12353,1739,-1381,2416,5173 } }, { "Olympus TG-4", 0, 0, { 11426,-4159,-1126,-2066,10678,1593,-120,1327,4998 } }, + { "Olympus TG-5", 0, 0, + { 10899,-3833,-1082,-2112,10736,1575,-267,1452,5269 } }, { "Olympus XZ-10", 0, 0, { 9777,-3483,-925,-2886,11297,1800,-602,1663,5134 } }, { "Olympus XZ-1", 0, 0, @@ -8033,7 +8381,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { "Pentax K-r", 0, 0, { 9895,-3077,-850,-5304,13035,2521,-883,1768,6936 } }, { "Pentax K-1", 0, 0, - { 8566,-2746,-1201,-3612,12204,1550,-893,1680,6264 } }, + { 8596,-2981,-639,-4202,12046,2431,-685,1424,6122 } }, { "Pentax K-30", 0, 0, { 8710,-2632,-1167,-3995,12301,1881,-981,1719,6535 } }, { "Pentax K-3 II", 0, 0, @@ -8044,37 +8392,45 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8170,-2725,-639,-4440,12017,2744,-771,1465,6599 } }, { "Pentax K-5", 0, 0, { 8713,-2833,-743,-4342,11900,2772,-722,1543,6247 } }, + { "Pentax K-70", 0, 0, + { 8270,-2117,-1299,-4359,12953,1515,-1078,1933,5975 } }, { "Pentax K-7", 0, 0, { 9142,-2947,-678,-8648,16967,1663,-2224,2898,8615 } }, { "Pentax K-S1", 0, 0, { 8512,-3211,-787,-4167,11966,2487,-638,1288,6054 } }, { "Pentax K-S2", 0, 0, { 8662,-3280,-798,-3928,11771,2444,-586,1232,6054 } }, + { "Pentax KP", 0, 0, + { 8617,-3228,-1034,-4674,12821,2044,-803,1577,5728 } }, { "Pentax Q-S1", 0, 0, { 12995,-5593,-1107,-1879,10139,2027,-64,1233,4919 } }, { "Pentax 645D", 0, 0x3e00, { 10646,-3593,-1158,-3329,11699,1831,-667,2874,6287 } }, { "Panasonic DMC-CM1", 15, 0, { 8770,-3194,-820,-2871,11281,1803,-513,1552,4434 } }, + { "Panasonic DC-FZ80", 0, 0, + { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-FZ8", 0, 0xf7f, { 8986,-2755,-802,-6341,13575,3077,-1476,2144,6379 } }, { "Panasonic DMC-FZ18", 0, 0, { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } }, { "Panasonic DMC-FZ28", 15, 0xf96, { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } }, + { "Panasonic DMC-FZ2500", 15, 0, + { 7386,-2443,-743,-3437,11864,1757,-608,1660,4766 } }, { "Panasonic DMC-FZ330", 15, 0, { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ300", 15, 0, { 8378,-2798,-769,-3068,11410,1877,-538,1792,4623 } }, { "Panasonic DMC-FZ30", 0, 0xf94, { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } }, - { "Panasonic DMC-FZ3", 15, 0, + { "Panasonic DMC-FZ3", 15, 0, /* FZ35, FZ38 */ { 9938,-2780,-890,-4604,12393,2480,-1117,2304,4620 } }, - { "Panasonic DMC-FZ4", 15, 0, + { "Panasonic DMC-FZ4", 15, 0, /* FZ40, FZ45 */ { 13639,-5535,-1371,-1698,9633,2430,316,1152,4108 } }, { "Panasonic DMC-FZ50", 0, 0, { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } }, - { "Panasonic DMC-FZ7", 15, 0, + { "Panasonic DMC-FZ7", 15, 0, /* FZ70, FZ72 */ { 11532,-4324,-1066,-2375,10847,1749,-564,1699,4351 } }, { "Leica V-LUX1", 0, 0, { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } }, @@ -8116,6 +8472,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, { "Leica D-LUX 6", 15, 0, { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } }, + { "Panasonic DMC-LX9", 15, 0, + { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, { "Panasonic DMC-FZ1000", 15, 0, { 7830,-2696,-763,-3325,11667,1866,-641,1712,4824 } }, { "Leica V-LUX (Typ 114)", 15, 0, @@ -8148,6 +8506,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8294,-2891,-651,-3869,11590,2595,-1183,2267,5352 } }, { "Panasonic DMC-G7", 15, 0xfff, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-G8", 15, 0xfff, /* G8, G80, G81, G85 */ + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DC-G9", 15, 0xfff, + { 7685,-2375,-634,-3687,11700,2249,-748,1546,5111 } }, { "Panasonic DMC-GF1", 15, 0xf92, { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } }, { "Panasonic DMC-GF2", 15, 0xfff, @@ -8162,6 +8524,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GF8", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DC-GF9", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GH1", 15, 0xf92, { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } }, { "Panasonic DMC-GH2", 15, 0xf95, @@ -8170,6 +8534,10 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } }, { "Panasonic DMC-GH4", 15, 0, { 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 } }, + { "Panasonic DC-GH5S", 15, 0, + { 6929,-2355,-708,-4192,12534,1828,-1097,1989,5195 } }, + { "Panasonic DC-GH5", 15, 0, + { 7641,-2336,-605,-3218,11299,2187,-485,1338,5121 } }, { "Panasonic DMC-GM1", 15, 0, { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } }, { "Panasonic DMC-GM5", 15, 0, @@ -8178,24 +8546,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } }, { "Panasonic DMC-GX7", 15, 0, { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, + { "Panasonic DMC-GX85", 15, 0, + { 7771,-3020,-629,-4029,11950,2345,-821,1977,6119 } }, { "Panasonic DMC-GX8", 15, 0, { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, - { "Panasonic DMC-TZ1", 15, 0, + { "Panasonic DC-GX9", 15, 0, + { 7564,-2263,-606,-3148,11239,2177,-540,1435,4853 } }, + { "Panasonic DMC-ZS100", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, - { "Panasonic DMC-ZS1", 15, 0, + { "Panasonic DC-ZS200", 15, 0, { 7790,-2736,-755,-3452,11870,1769,-628,1647,4898 } }, - { "Panasonic DMC-TZ6", 15, 0, + { "Panasonic DMC-ZS40", 15, 0, { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, - { "Panasonic DMC-ZS4", 15, 0, - { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, - { "Panasonic DMC-TZ7", 15, 0, + { "Panasonic DMC-ZS50", 15, 0, { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, - { "Panasonic DMC-ZS5", 15, 0, - { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, - { "Panasonic DMC-TZ8", 15, 0, + { "Panasonic DMC-TZ82", 15, 0, { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, { "Panasonic DMC-ZS6", 15, 0, { 8550,-2908,-842,-3195,11529,1881,-338,1603,4631 } }, + { "Panasonic DMC-ZS70", 15, 0, + { 9052,-3117,-883,-3045,11346,1927,-205,1520,4730 } }, { "Leica S (Typ 007)", 0, 0, { 6063,-2234,-231,-5210,13787,1500,-1043,2866,6997 } }, { "Leica X", 0, 0, /* X and X-U, both (Typ 113) */ @@ -8205,7 +8575,15 @@ void CLASS adobe_coeff (const char *make, const char *model) { "Leica M (Typ 262)", 0, 0, { 6653,-1486,-611,-4221,13303,929,-881,2416,7226 } }, { "Leica SL (Typ 601)", 0, 0, - { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830} }, + { 11865,-4523,-1441,-5423,14458,935,-1587,2687,4830 } }, + { "Leica TL2", 0, 0, + { 5836,-1626,-647,-5384,13326,2261,-1207,2129,5861 } }, + { "Leica TL", 0, 0, + { 5463,-988,-364,-4634,12036,2946,-766,1389,6522 } }, + { "Leica CL", 0, 0, + { 7414,-2393,-840,-5127,13180,2138,-1585,2468,5064 } }, + { "Leica M10", 0, 0, + { 8249,-2849,-620,-5415,14756,565,-957,3074,6517 } }, { "Phase One H 20", 0, 0, /* DJC */ { 1313,1855,-109,-6715,15908,808,-327,1840,6020 } }, { "Phase One H 25", 0, 0, @@ -8276,16 +8654,20 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8512,-2641,-694,-8042,15670,2526,-1821,2117,7414 } }, { "Sony DSC-V3", 0, 0, { 7511,-2571,-692,-7894,15088,3060,-948,1111,8128 } }, - { "Sony DSC-RX100M", 0, 0, /* M2, M3, and M4 */ + { "Sony DSC-RX100M", 0, 0, /* M2, M3, M4, and M5 */ { 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, + { "Sony DSC-RX10M4", 0, 0, + { 7699,-2566,-629,-2967,11270,1928,-378,1286,4807 } }, + { "Sony DSC-RX10", 0, 0, /* also RX10M2, RX10M3 */ { 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 } }, + { "Sony DSC-RX0", 200, 0, + { 9396,-3507,-843,-2497,11111,1572,-343,1355,5089 } }, { "Sony DSLR-A100", 0, 0xfeb, { 9437,-2811,-774,-8405,16215,2290,-710,596,7181 } }, { "Sony DSLR-A290", 0, 0, @@ -8302,13 +8684,13 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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 } }, @@ -8320,18 +8702,26 @@ void CLASS adobe_coeff (const char *make, const char *model) { 6435,-1903,-536,-4722,12449,2550,-663,1363,6517 } }, { "Sony ILCA-77M2", 0, 0, { 5991,-1732,-443,-4100,11989,2381,-704,1467,5992 } }, - { "Sony ILCE-6300", 0, 0, + { "Sony ILCA-99M2", 0, 0, + { 6660,-1918,-471,-4613,12398,2485,-649,1433,6447 } }, + { "Sony ILCE-6", 0, 0, /* 6300, 6500 */ { 5973,-1695,-419,-3826,11797,2293,-639,1398,5789 } }, { "Sony ILCE-7M2", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, + { "Sony ILCE-7M3", 0, 0, + { 7374,-2389,-551,-5435,13162,2519,-1006,1795,6552 } }, { "Sony ILCE-7S", 0, 0, /* also ILCE-7SM2 */ { 5838,-1430,-246,-3497,11477,2297,-748,1885,5778 } }, + { "Sony ILCE-7RM3", 0, 0, + { 6640,-1847,-503,-5238,13010,2474,-993,1673,6527 } }, { "Sony ILCE-7RM2", 0, 0, { 6629,-1900,-483,-4618,12349,2550,-622,1381,6514 } }, { "Sony ILCE-7R", 0, 0, { 4913,-541,-202,-6130,13513,2906,-1564,2151,7183 } }, { "Sony ILCE-7", 0, 0, { 5271,-712,-347,-6153,13653,2763,-1601,2366,7242 } }, + { "Sony ILCE-9", 0, 0, + { 6389,-1703,-378,-4562,12265,2587,-670,1489,6550 } }, { "Sony ILCE", 0, 0, /* 3000, 5000, 5100, 6000, and QX1 */ { 5991,-1456,-455,-4764,12135,2980,-707,1425,6701 } }, { "Sony NEX-5N", 0, 0, @@ -8374,17 +8764,39 @@ void CLASS adobe_coeff (const char *make, const char *model) { 5491,-1192,-363,-4951,12342,2948,-911,1722,7192 } }, { "Sony SLT-A99", 0, 0, { 6344,-1612,-462,-4863,12477,2681,-865,1786,6899 } }, + { "YI M1", 0, 0, + { 7712,-2059,-653,-3882,11494,2726,-710,1332,5958 } }, }; double cam_xyz[4][3]; char name[130]; int i, j; sprintf (name, "%s %s", make, model); + + + // -- RT -------------------------------------------------------------------- + const bool is_pentax_dng = dng_version && !strncmp(RT_software.c_str(), "PENTAX", 6); + // indicate that DCRAW wants these from constants (rather than having loaded these from RAW file + // note: this is simplified so far, in some cases dcraw calls this when it has say the black level + // from file, but then we will not provide any black level in the tables. This case is mainly just + // to avoid loading table values if we have loaded a DNG conversion of a raw file (which already + // have constants stored in the file). + if (RT_whitelevel_from_constant == ThreeValBool::X || is_pentax_dng) { + RT_whitelevel_from_constant = ThreeValBool::T; + } + if (RT_blacklevel_from_constant == ThreeValBool::X || is_pentax_dng) { + RT_blacklevel_from_constant = ThreeValBool::T; + } + if (RT_matrix_from_constant == ThreeValBool::X) { + RT_matrix_from_constant = ThreeValBool::T; + } + // -- RT -------------------------------------------------------------------- + for (i=0; i < sizeof table / sizeof *table; i++) if (!strncmp (name, table[i].prefix, strlen(table[i].prefix))) { - if (table[i].black) black = (ushort) table[i].black; - if (table[i].maximum) maximum = (ushort) table[i].maximum; - if (table[i].trans[0]) { + if (RT_blacklevel_from_constant == ThreeValBool::T && table[i].black) black = (ushort) table[i].black; + if (RT_whitelevel_from_constant == ThreeValBool::T && table[i].maximum) maximum = (ushort) table[i].maximum; + if (RT_matrix_from_constant == ThreeValBool::T && table[i].trans[0]) { for (raw_color = j=0; j < 12; j++) ((double *)cam_xyz)[j] = table[i].trans[j] / 10000.0; cam_xyz_coeff (rgb_cam, cam_xyz); @@ -8556,8 +8968,11 @@ void CLASS identify() { 5712, 3774, 62, 20, 10, 2 }, { 5792, 3804, 158, 51, 0, 0 }, { 5920, 3950, 122, 80, 2, 0 }, + { 6096, 4051, 76, 35, 0, 0 }, { 6096, 4056, 72, 34, 0, 0 }, - { 6288, 4056, 264, 34, 0, 0 }, + { 6288, 4056, 264, 36, 0, 0 }, + { 6384, 4224, 120, 44, 0, 0 }, + { 6880, 4544, 136, 42, 0, 0 }, { 8896, 5920, 160, 64, 0, 0 }, }; static const struct { @@ -8571,7 +8986,10 @@ void CLASS identify() { 0x261, "EOS 50D" }, { 0x281, "EOS-1D Mark IV" }, { 0x287, "EOS 60D" }, { 0x167, "EOS-1DS" }, { 0x325, "EOS 70D" }, + { 0x408, "EOS 77D" }, { 0x331, "EOS M" }, { 0x350, "EOS 80D" }, { 0x328, "EOS-1D X Mark II" }, + { 0x346, "EOS 100D" }, + { 0x417, "EOS 200D" }, { 0x170, "EOS 300D" }, { 0x188, "EOS-1Ds Mark II" }, { 0x176, "EOS 450D" }, { 0x215, "EOS-1Ds Mark III" }, { 0x189, "EOS 350D" }, { 0x324, "EOS-1D C" }, @@ -8582,12 +9000,14 @@ void CLASS identify() { 0x301, "EOS 650D" }, { 0x302, "EOS 6D" }, { 0x326, "EOS 700D" }, { 0x250, "EOS 7D" }, { 0x393, "EOS 750D" }, { 0x289, "EOS 7D Mark II" }, - { 0x347, "EOS 760D" }, + { 0x347, "EOS 760D" }, { 0x406, "EOS 6D Mark II" }, + { 0x405, "EOS 800D" }, { 0x349, "EOS 5D Mark IV" }, { 0x254, "EOS 1000D" }, { 0x288, "EOS 1100D" }, - { 0x327, "EOS 1200D" }, { 0x382, "Canon EOS 5DS" }, - { 0x404, "EOS 1300D" }, { 0x401, "Canon EOS 5DS R" }, - { 0x346, "EOS 100D" }, + { 0x327, "EOS 1200D" }, { 0x382, "EOS 5DS" }, + { 0x404, "EOS 1300D" }, { 0x401, "EOS 5DS R" }, + { 0x422, "EOS 1500D" }, + { 0x432, "EOS 3000D" }, }, sonique[] = { { 0x002, "DSC-R1" }, { 0x100, "DSLR-A100" }, { 0x101, "DSLR-A900" }, { 0x102, "DSLR-A700" }, @@ -8617,7 +9037,30 @@ void CLASS identify() { 0x155, "DSC-RX100M4" },{ 0x156, "DSC-RX10M2" }, { 0x158, "DSC-RX1RM2" }, { 0x15a, "ILCE-QX1" }, { 0x15b, "ILCE-7RM2" }, { 0x15e, "ILCE-7SM2" }, - { 0x161, "ILCA-68" }, { 0x165, "ILCE-6300" }, + { 0x161, "ILCA-68" }, { 0x162, "ILCA-99M2" }, + { 0x163, "DSC-RX10M3" }, { 0x164, "DSC-RX100M5" }, + { 0x165, "ILCE-6300" }, { 0x166, "ILCE-9" }, + { 0x168, "ILCE-6500" }, { 0x16a, "ILCE-7RM3" }, + { 0x16b, "ILCE-7M3" }, { 0x16c, "DSC-RX0" }, + { 0x16d, "DSC-RX10M4" }, + }; + static const char *orig, panalias[][12] = { + "@DC-FZ80", "DC-FZ82", "DC-FZ85", + "@DC-FZ81", "DC-FZ83", + "@DC-GF9", "DC-GX800", "DC-GX850", + "@DC-GF10", "DC-GF90", + "@DC-GX9", "DC-GX7MK3", + "@DC-ZS70", "DC-TZ90", "DC-TZ91", "DC-TZ92", "DC-TZ93", + "@DMC-FZ40", "DMC-FZ45", + "@DMC-FZ2500", "DMC-FZ2000", "DMC-FZH1", + "@DMC-G8", "DMC-G80", "DMC-G81", "DMC-G85", + "@DMC-GX85", "DMC-GX80", "DMC-GX7MK2", + "@DMC-LX9", "DMC-LX10", "DMC-LX15", + "@DMC-ZS40", "DMC-TZ60", "DMC-TZ61", + "@DMC-ZS50", "DMC-TZ70", "DMC-TZ71", + "@DMC-ZS60", "DMC-TZ80", "DMC-TZ81", "DMC-TZ85", + "@DMC-ZS100", "DMC-ZS110", "DMC-TZ100", "DMC-TZ101", "DMC-TZ110", "DMC-TX1", + "@DC-ZS200", "DC-TX2", "DC-TZ200", "DC-TZ202", "DC-TZ220", "DC-ZS220", }; static const struct { unsigned fsize; @@ -8637,25 +9080,24 @@ void CLASS identify() { 15980544,3264,2448, 0, 0, 0, 0, 8,0x61,0,1,"AgfaPhoto","DC-833m" }, { 9631728,2532,1902, 0, 0, 0, 0,96,0x61,0,0,"Alcatel","5035D" }, { 2868726,1384,1036, 0, 0, 0, 0,64,0x49,0,8,"Baumer","TXG14",1078 }, - { 5298000,2400,1766,12,12,44, 2,40,0x94,0,2,"Canon","PowerShot SD300" }, - { 6553440,2664,1968, 4, 4,44, 4,40,0x94,0,2,"Canon","PowerShot A460" }, - { 6573120,2672,1968,12, 8,44, 0,40,0x94,0,2,"Canon","PowerShot A610" }, - { 6653280,2672,1992,10, 6,42, 2,40,0x94,0,2,"Canon","PowerShot A530" }, - { 7710960,2888,2136,44, 8, 4, 0,40,0x94,0,2,"Canon","PowerShot S3 IS" }, - { 9219600,3152,2340,36,12, 4, 0,40,0x94,0,2,"Canon","PowerShot A620" }, - { 9243240,3152,2346,12, 7,44,13,40,0x49,0,2,"Canon","PowerShot A470" }, - { 10341600,3336,2480, 6, 5,32, 3,40,0x94,0,2,"Canon","PowerShot A720 IS" }, - { 10383120,3344,2484,12, 6,44, 6,40,0x94,0,2,"Canon","PowerShot A630" }, - { 12945240,3736,2772,12, 6,52, 6,40,0x94,0,2,"Canon","PowerShot A640" }, - { 15636240,4104,3048,48,12,24,12,40,0x94,0,2,"Canon","PowerShot A650" }, - { 15467760,3720,2772, 6,12,30, 0,40,0x94,0,2,"Canon","PowerShot SX110 IS" }, - { 15534576,3728,2778,12, 9,44, 9,40,0x94,0,2,"Canon","PowerShot SX120 IS" }, - { 18653760,4080,3048,24,12,24,12,40,0x94,0,2,"Canon","PowerShot SX20 IS" }, - { 19131120,4168,3060,92,16, 4, 1,40,0x94,0,2,"Canon","PowerShot SX220 HS" }, - { 21936096,4464,3276,25,10,73,12,40,0x16,0,2,"Canon","PowerShot SX30 IS" }, - { 24724224,4704,3504, 8,16,56, 8,40,0x94,0,2,"Canon","PowerShot A3300 IS" }, - { 30858240,5248,3920, 8,16,56,16,40,0x94,0,2,"Canon","IXUS 160" }, - { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, + { 5298000,2400,1766,12,12,44, 2, 8,0x94,0,2,"Canon","PowerShot SD300" }, + { 6553440,2664,1968, 4, 4,44, 4, 8,0x94,0,2,"Canon","PowerShot A460" }, + { 6573120,2672,1968,12, 8,44, 0, 8,0x94,0,2,"Canon","PowerShot A610" }, + { 6653280,2672,1992,10, 6,42, 2, 8,0x94,0,2,"Canon","PowerShot A530" }, + { 7710960,2888,2136,44, 8, 4, 0, 8,0x94,0,2,"Canon","PowerShot S3 IS" }, + { 9219600,3152,2340,36,12, 4, 0, 8,0x94,0,2,"Canon","PowerShot A620" }, + { 9243240,3152,2346,12, 7,44,13, 8,0x49,0,2,"Canon","PowerShot A470" }, + { 10341600,3336,2480, 6, 5,32, 3, 8,0x94,0,2,"Canon","PowerShot A720 IS" }, + { 10383120,3344,2484,12, 6,44, 6, 8,0x94,0,2,"Canon","PowerShot A630" }, + { 12945240,3736,2772,12, 6,52, 6, 8,0x94,0,2,"Canon","PowerShot A640" }, + { 15636240,4104,3048,48,12,24,12, 8,0x94,0,2,"Canon","PowerShot A650" }, + { 15467760,3720,2772, 6,12,30, 0, 8,0x94,0,2,"Canon","PowerShot SX110 IS" }, + { 15534576,3728,2778,12, 9,44, 9, 8,0x94,0,2,"Canon","PowerShot SX120 IS" }, + { 18653760,4080,3048,24,12,24,12, 8,0x94,0,2,"Canon","PowerShot SX20 IS" }, + { 19131120,4168,3060,92,16, 4, 1, 8,0x94,0,2,"Canon","PowerShot SX220 HS" }, + { 21936096,4464,3276,25,10,73,12, 8,0x16,0,2,"Canon","PowerShot SX30 IS" }, + { 24724224,4704,3504, 8,16,56, 8, 8,0x94,0,2,"Canon","PowerShot A3300 IS" }, + { 30858240,5248,3920, 8,16,56,16, 8,0x94,0,2,"Canon","IXUS 160" }, { 1976352,1632,1211, 0, 2, 0, 1, 0,0x94,0,1,"Casio","QV-2000UX" }, { 3217760,2080,1547, 0, 0,10, 1, 0,0x94,0,1,"Casio","QV-3*00EX" }, { 6218368,2585,1924, 0, 0, 9, 0, 0,0x94,0,1,"Casio","QV-5700" }, { 7816704,2867,2181, 0, 0,34,36, 0,0x16,0,1,"Casio","EX-Z60" }, @@ -8727,12 +9169,13 @@ void CLASS identify() { 44390468,4080,5440, 0, 0, 0, 0,33,0x61,0,0,"Sinar","",68 }, { 1409024,1376,1024, 0, 0, 1, 0, 0,0x49,0,0,"Sony","XCD-SX910CR" }, { 2818048,1376,1024, 0, 0, 1, 0,97,0x49,0,0,"Sony","XCD-SX910CR" }, + { 17496000,4320,3240, 0, 0, 0,0,224,0x94,0,0,"Xiro","Xplorer V" }, }; static const char *corp[] = { "AgfaPhoto", "Canon", "Casio", "Epson", "Fujifilm", "Mamiya", "Minolta", "Motorola", "Kodak", "Konica", "Leica", "Nikon", "Nokia", "Olympus", "Ricoh", "Pentax", "Phase One", - "Samsung", "Sigma", "Sinar", "Sony" }; + "Samsung", "Sigma", "Sinar", "Sony", "YI" }; char head[32], *cp; int hlen, flen, fsize, zero_fsize=1, i, c; struct jhead jh; @@ -8766,16 +9209,18 @@ void CLASS identify() colors = 3; for (i=0; i < 0x10000; i++) curve[i] = i; - order = get2(); - hlen = get4(); - fseek (ifp, 0, SEEK_SET); - fread (head, 1, 32, ifp); - fseek (ifp, 0, SEEK_END); - flen = fsize = ftell(ifp); + flen = fsize = ifp->size; + + // currently fsize is of type signed int which means for files larger than 0x7fffffff byte fsize will be < 0. We need to check for large files if we change the type to unsigned int /*RT*/ if (fsize<100000) { is_raw = 0; return; } + + order = get2(); + hlen = get4(); + fseek (ifp, 0, SEEK_SET); + fread (head, 1, 32, ifp); /* RT: changed string constant */ if ((cp = (char *) memmem (head, 32, (char*)"MMMM", 4)) || (cp = (char *) memmem (head, 32, (char*)"IIII", 4))) { @@ -8823,16 +9268,22 @@ void CLASS identify() parse_fuji (get4()); if (thumb_offset > 120) { fseek (ifp, 120, SEEK_SET); - is_raw += (i = get4()) && 1; + is_raw += (i = get4()) != 0 ? 1 : 0; if (is_raw == 2 && shot_select) parse_fuji (i); } - load_raw = &CLASS unpacked_load_raw; 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(); + if (!strcmp(model, "X-T3")) { + height = raw_height - 2; + } + if (!load_raw) { + load_raw = &CLASS unpacked_load_raw; + tiff_bps = 14; + } } else if (!memcmp (head,"RIFF",4)) { fseek (ifp, 0, SEEK_SET); parse_riff(); @@ -8894,7 +9345,7 @@ void CLASS identify() strcpy (model,"One"); parse_redcine(); load_raw = &CLASS redcine_load_raw; - gamma_curve (1/2.4, 12.92, 1, 4095); + gamma_curve (1/2.4, 12.92310, 1, 4095); filters = 0x49494949; } else if (!memcmp (head,"DSC-Image",9)) parse_rollei(); @@ -8931,7 +9382,8 @@ void CLASS identify() case 8: load_raw = &CLASS eight_bit_load_raw; break; case 10: case 12: - load_flags |= 128; + load_flags |= 512; + if (!strcmp(make,"Canon")) load_flags |= 256; load_raw = &CLASS packed_load_raw; break; case 16: order = 0x4949 | 0x404 * (load_flags & 1); @@ -8988,17 +9440,25 @@ void CLASS identify() { height = 2616; width = 3896; } 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"))) + if (raw_height == 2868 && (!strcmp(model,"K-r") || !strcmp(model,"K-x"))) /*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")) + if (raw_height == 3136 && !strcmp(model,"K-7")) { height = 3122; width = 4684; filters = 0x16161616; top_margin = 2; } - if (width == 6080 && !strcmp(model,"K-3")) - { left_margin = 4; width = 6040; } - if (width == 7424 && !strcmp(model,"645D")) - { height = 5502; width = 7328; filters = 0x61616161; top_margin = 29; - left_margin = 48; } + if (raw_height == 3284 && !strncmp(model,"K-5",3)) + { left_margin = 10; width = 4950; filters = 0x16161616; } + if (raw_height == 3300 && !strncmp(model,"K-50",4)) + { height = 3288, width = 4952; left_margin = 0; top_margin = 12; } + if (raw_height == 3664 && !strncmp(model,"K-S",3)) + { width = 5492; left_margin = 0; } + if (raw_height == 4032 && !strcmp(model,"K-3")) + { height = 4032; width = 6040; left_margin = 4; } + if (raw_height == 4060 && !strcmp(model,"KP")) + { height = 4032; width = 6032; left_margin = 52; top_margin = 28; } + if (raw_height == 4950 && !strcmp(model,"K-1")) + { height = 4932; width = 7380; left_margin = 4; top_margin = 18; } + if (raw_height == 5552 && !strcmp(model,"645D")) + { height = 5502; width = 7328; left_margin = 48; top_margin = 29; + filters = 0x61616161; } if (width == 7392 && !strncmp(model,"K-1",3)) { left_margin = 6; width = 7376; if(!dng_version) {top_margin = 18; height -= top_margin; }} if (width == 4832 && !strncmp(model,"K-1",3)) // K-1 APS-C format @@ -9012,7 +9472,7 @@ void CLASS identify() switch (tiff_compress) { case 0: case 1: load_raw = &CLASS packed_dng_load_raw; break; - case 7: load_raw = &CLASS lossless_dng_load_raw; break; + case 7: load_raw = (!strncmp(make,"Blackmagic",10) || !strncmp(make,"Canon",5)) ? &CLASS lossless_dnglj92_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; @@ -9048,6 +9508,10 @@ void CLASS identify() for (i=0; i < sizeof sonique / sizeof *sonique; i++) if (unique_id == sonique[i].id) strcpy (model, sonique[i].model); + for (i=0; i < sizeof panalias / sizeof *panalias; i++) + if (panalias[i][0] == '@') orig = panalias[i]+1; + else if (!strcmp(model,panalias[i])) + adobe_coeff ("Panasonic", orig); if (!strcmp(make,"Nikon")) { if (!load_raw) load_raw = &CLASS packed_load_raw; @@ -9071,7 +9535,7 @@ void CLASS identify() filters = 0; simple_coeff(0); adobe_coeff (make, model); - } else if (!strcmp(make,"Canon") && tiff_bps == 15) { + } else if (!strcmp(make,"Canon") && tiff_bps == 15) { // Canon mRaw/sRaw switch (width) { case 3344: width -= 66; case 3872: width -= 6; @@ -9080,9 +9544,27 @@ void CLASS identify() SWAP(height,width); SWAP(raw_height,raw_width); } - if (width == 7200 && height == 3888) { - raw_width = width = 6480; - raw_height = height = 4320; + + if(std::fabs(static_cast(width) / height - 1.5f) > 0.02f) { + // wrong image dimensions. Calculate correct dimensions. width / height should be close to 1.5 + std::vector> dimensions; + + int size = width * height; + int newHeight = sqrt(size / 1.48f); + while (--newHeight && std::fabs(static_cast(size) / (newHeight * newHeight) - 1.5f) <= 0.02f) { + if(size % newHeight == 0) { + dimensions.emplace_back(std::fabs(static_cast(size) / (newHeight * newHeight) - 1.5f), newHeight); + } + } + // find ratio closest to 1.5 + float val = 1.f; + while(!dimensions.empty()) { + if(dimensions.back().first < val) { + raw_height = height = dimensions.back().second; + raw_width = width = size / raw_height; + } + dimensions.pop_back(); + } } filters = 0; tiff_samples = colors = 3; @@ -9116,7 +9598,7 @@ canon_a5: colors = 4; tiff_bps = 10; load_raw = &CLASS packed_load_raw; - load_flags = 40; + load_flags = 264; } else if (!strcmp(model,"PowerShot Pro90 IS") || !strcmp(model,"PowerShot G1")) { colors = 4; @@ -9128,6 +9610,9 @@ canon_a5: } else if (!strcmp(model,"EOS D2000C")) { filters = 0x61616161; black = curve[200]; + } else if (!strcmp(model,"EOS 80D")) { + top_margin -= 2; + height += 2; } else if (!strcmp(model,"D1")) { cam_mul[0] *= 256/527.0; cam_mul[2] *= 256/317.0; @@ -9182,6 +9667,8 @@ canon_a5: else width -= 8; } else if (!strncmp(model,"D300",4)) { width -= 32; + } else if (!strncmp(model,"COOLPIX B",9)) { + load_flags = 24; } else if (!strncmp(model,"COOLPIX P",9) && raw_width != 4032) { load_flags = 24; filters = 0x94949494; @@ -9254,16 +9741,18 @@ canon_a5: height = 2144; width = 2880; flip = 6; - } else if (load_raw != &CLASS packed_load_raw) - maximum = (is_raw == 2 && shot_select) ? 0x2f00 : 0x3e00; + } if (!strncmp(model,"X-A10",5)) { - raw_width = 4912; - raw_height = 3278; + width = raw_width = 4912; + height = raw_height = 3278; + } else if (!strncmp(model, "X-A3", 4) || !strncmp(model, "X-A5", 4)) { + width = raw_width = 6016; + height = raw_height = 4014; } top_margin = (raw_height - height) >> 2 << 1; left_margin = (raw_width - width ) >> 2 << 1; if (width == 2848 || width == 3664) filters = 0x16161616; - if (width == 4032 || width == 4952 || width == 6032) left_margin = 0; + if (width == 4032 || width == 4952 || width == 6032 || width == 8280) left_margin = 0; if (width == 3328 && (width -= 66)) left_margin = 34; if (width == 4936) left_margin = 4; if (!strcmp(model,"HS50EXR") || @@ -9325,7 +9814,7 @@ konica_400z: } else if (!strcmp(make,"Samsung") && raw_width == 4704) { height -= top_margin = 8; width -= 2 * (left_margin = 8); - load_flags = 32; + load_flags = 256; } else if (!strcmp(make,"Samsung") && raw_height == 3714) { height -= top_margin = 18; left_margin = raw_width - (width = 5536); @@ -9397,6 +9886,11 @@ konica_400z: top_margin = 4; left_margin = 41; filters = 0x61616161; + } else if (raw_width == 8384) { + height = 6208; + width = 8280; + top_margin = 96; + left_margin = 46; } 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"); @@ -9539,6 +10033,8 @@ konica_400z: thumb_width = 640; } else if (!strcmp(model,"TG-4")) { width -= 16; + } else if (!strcmp(model,"TG-5")) { + width -= 6; } } else if (!strcmp(model,"N Digital")) { height = 2047; @@ -9576,7 +10072,8 @@ konica_400z: width -= height > 3664 ? 8 : 32; if (!strncmp(model,"DSC",3)) black = 200 << (tiff_bps - 12); - } else if (!strcmp(make,"Sony") && raw_width == 6048) { + } else if (!strcmp(make,"Sony") && strcmp(model,"ILCE-7M2") && raw_width == 6048) { + // for Sony ILCE-7M2 the raw crop is defined in camconst.json width -= 24; if (strstr(model,"RX1") || strstr(model,"A99")) width -= 6; @@ -9737,14 +10234,16 @@ bw: colors = 1; dng_skip: if ((use_camera_matrix & (use_camera_wb || dng_version)) && 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 */) { + && strncmp(RT_software.c_str(), "Adobe DNG Converter", 19) != 0 + /* 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; +// raw_color = 0; + RT_matrix_from_constant = ThreeValBool::F; } if(!strncmp(make, "Panasonic", 9) && !strncmp(model, "DMC-LX100",9)) adobe_coeff (make, model); @@ -9760,6 +10259,10 @@ dng_skip: adobe_coeff (make, model); if((!strncmp(make, "XIAOYI", 6) || !strncmp(make, "YI", 2)) && !strncmp(model, "M1",2)) adobe_coeff (make, model); + if(!strncmp(make, "DJI", 3) && !strncmp(model, "FC6310", 6)) // DNG files from this camera have wrong (too high) white level + adobe_coeff (make, model); + if (!strncmp(make, "LG", 2) && (!strncmp(model, "LG-H850",7) || !strncmp(model, "LG-H815",7))) + 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"); @@ -9774,7 +10277,14 @@ dng_skip: if (raw_width < width ) raw_width = width; } if (!tiff_bps) tiff_bps = 12; - if (!maximum) maximum = ((uint64_t)1 << tiff_bps) - 1; // use uint64_t to avoid overflow if tiff_bps == 32 + if (!maximum) { + if (tiff_nifds == 1 && tiff_ifd[0].sample_format == 3) { + // float DNG, default white level is 1.0 + maximum = 1; + } else { + 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_samples > 6 || colors > 4) is_raw = 0; @@ -9857,8 +10367,8 @@ notraw: /* RT: DNG Float */ -#include -#include +// #include +// #include static void decodeFPDeltaRow(Bytef * src, Bytef * dst, size_t tileWidth, size_t realTileWidth, int bytesps, int factor) { // DecodeDeltaBytes @@ -9890,8 +10400,10 @@ static void decodeFPDeltaRow(Bytef * src, Bytef * dst, size_t tileWidth, size_t } +#if 1 //ndef __F16C__ // From DNG SDK dng_utils.h -static inline uint32_t DNG_HalfToFloat(uint16_t halfValue) { +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; @@ -9923,6 +10435,7 @@ static inline uint32_t DNG_HalfToFloat(uint16_t halfValue) { // Assemble sign, exponent and mantissa. return (uint32_t) ((sign << 31) | (exponent << 23) | mantissa); } +#endif static inline uint32_t DNG_FP24ToFloat(const uint8_t * input) { int32_t sign = (input [0] >> 7) & 0x01; @@ -9959,11 +10472,32 @@ static inline uint32_t DNG_FP24ToFloat(const uint8_t * input) { static void expandFloats(Bytef * dst, int tileWidth, int bytesps) { if (bytesps == 2) { - uint16_t * dst16 = (uint16_t *) dst; - uint32_t * dst32 = (uint32_t *) dst; + uint16_t* const dst16 = reinterpret_cast(dst); +#ifndef __F16C__ + uint32_t* const dst32 = reinterpret_cast(dst); for (int index = tileWidth - 1; index >= 0; --index) { - dst32[index] = DNG_HalfToFloat(dst16[index]); + dst32[index] = DNG_HalfToFloat(dst16[index]); } +#else + float* const dst32 = reinterpret_cast(dst); + int index = tileWidth - 8; + for (; index >= 0; index -= 8) { + __m128i halfFloatv = _mm_loadu_si128((__m128i*)&dst16[index]); + STVFU(dst32[index], _mm_cvtph_ps(halfFloatv)); + STVFU(dst32[index + 4], _mm_cvtph_ps(_mm_shuffle_epi32(halfFloatv, _MM_SHUFFLE(0,0,3,2)))); + } + index += 4; + if(index >= 0) { + __m128i halfFloatv = _mm_loadu_si128((__m128i*)&dst16[index]); + STVFU(dst32[index], _mm_cvtph_ps(halfFloatv)); + index--; + } else { + index += 3; + } + for (; index >= 0; --index) { + dst32[index] = _cvtsh_ss(dst16[index]); + } +#endif } else if (bytesps == 3) { uint8_t * dst8 = ((uint8_t *) dst) + (tileWidth - 1) * 3; uint32_t * dst32 = (uint32_t *) dst; @@ -9973,29 +10507,6 @@ static void expandFloats(Bytef * dst, int tileWidth, int bytesps) { } } -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"); -} - static int decompress(size_t srcLen, size_t dstLen, unsigned char *in, unsigned char *out) { // At least in zlib 1.2.11 the uncompress function is not thread save while it is thread save in zlib 1.2.8 // This simple replacement is thread save. Used example code from https://zlib.net/zlib_how.html @@ -10137,9 +10648,6 @@ void CLASS deflate_dng_load_raw() { } } - if (ifd->sample_format == 3) { // Floating point data - copyFloatDataToInt(float_raw_image, raw_image, raw_width*raw_height, maximum); - } } /* RT: removed unused functions */ @@ -10168,6 +10676,48 @@ struct tiff_hdr { #include "fujicompressed.cc" +//----------------------------------------------------------------------------- +/* Taken from LibRaw + +LibRaw is free software; you can redistribute it and/or modify +it under the terms of the one of two licenses as you choose: +1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 + (See file LICENSE.LGPL provided in LibRaw distribution archive for details). +2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + (See file LICENSE.CDDL provided in LibRaw distribution archive for details). + */ + +namespace { + +inline void unpack7bytesto4x16_nikon(unsigned char *src, unsigned short *dest) +{ + dest[3] = (src[6] << 6) | (src[5] >> 2); + dest[2] = ((src[5] & 0x3) << 12) | (src[4] << 4) | (src[3] >> 4); + dest[1] = (src[3] & 0xf) << 10 | (src[2] << 2) | (src[1] >> 6); + dest[0] = ((src[1] & 0x3f) << 8) | src[0]; +} + +} // namespace + +void CLASS nikon_14bit_load_raw() +{ + const unsigned linelen = (unsigned)(ceilf((float)(raw_width * 7 / 4) / 16.0)) * 16; // 14512; // S.raw_width * 7 / 4; + const unsigned pitch = raw_width; //S.raw_pitch ? S.raw_pitch / 2 : S.raw_width; + unsigned char *buf = (unsigned char *)malloc(linelen); + merror(buf, "nikon_14bit_load_raw()"); + for (int row = 0; row < raw_height; row++) + { + unsigned bytesread = fread(buf, 1, linelen, ifp); + unsigned short *dest = &raw_image[pitch * row]; + //swab32arr((unsigned *)buf, bytesread / 4); + for (int sp = 0, dp = 0; dp < pitch - 3 && sp < linelen - 6 && sp < bytesread - 6; sp += 7, dp += 4) + unpack7bytesto4x16_nikon(buf + sp, dest + dp); + } + free(buf); +} + +//----------------------------------------------------------------------------- + /* RT: Delete from here */ /*RT*/#undef SQR /*RT*/#undef MAX diff --git a/rtengine/dcraw.h b/rtengine/dcraw.h index 5a2790801..81da41718 100644 --- a/rtengine/dcraw.h +++ b/rtengine/dcraw.h @@ -47,7 +47,9 @@ public: ,order(0x4949) ,ifname(nullptr) ,meta_data(nullptr) - ,shot_select(0),multi_out(0) + ,shot_select(0) + ,multi_out(0) + ,row_padding(0) ,float_raw_image(nullptr) ,image(nullptr) ,bright(1.) @@ -55,11 +57,12 @@ public: ,verbose(0) ,use_auto_wb(0),use_camera_wb(0),use_camera_matrix(1) ,output_color(1),output_bps(8),output_tiff(0),med_passes(0),no_auto_bright(0) - ,RT_whitelevel_from_constant(0) - ,RT_blacklevel_from_constant(0) - ,RT_matrix_from_constant(0) - ,RT_from_adobe_dng_converter(false) + ,RT_whitelevel_from_constant(ThreeValBool::X) + ,RT_blacklevel_from_constant(ThreeValBool::X) + ,RT_matrix_from_constant(ThreeValBool::X) + ,RT_baseline_exposure(0) ,getbithuff(this,ifp,zero_after_ff) + ,nikbithuff(ifp) { memset(&hbd, 0, sizeof(hbd)); aber[0]=aber[1]=aber[2]=aber[3]=1; @@ -87,7 +90,7 @@ protected: unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress; unsigned black, cblack[4102], 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 tile_width, tile_length, gpsdata[32], load_flags, row_padding; bool xtransCompressed = false; struct fuji_compressed_params { @@ -149,10 +152,19 @@ protected: int output_color, output_bps, output_tiff, med_passes; int no_auto_bright; unsigned greybox[4] ; - int RT_whitelevel_from_constant; - int RT_blacklevel_from_constant; - int RT_matrix_from_constant; - bool RT_from_adobe_dng_converter; + enum class ThreeValBool { X = -1, F, T }; + ThreeValBool RT_whitelevel_from_constant; + ThreeValBool RT_blacklevel_from_constant; + ThreeValBool RT_matrix_from_constant; + std::string RT_software; + double RT_baseline_exposure; + + struct PanasonicRW2Info { + ushort bpp; + ushort encoding; + PanasonicRW2Info(): bpp(0), encoding(0) {} + }; + PanasonicRW2Info RT_pana_info; float cam_mul[4], pre_mul[4], cmatrix[3][4], rgb_cam[3][4]; @@ -214,6 +226,7 @@ protected: int fcol (int row, int col); void merror (void *ptr, const char *where); void derror(); +inline void derror(bool condition) {if(UNLIKELY(condition)) ++data_error;} ushort sget2 (uchar *s); ushort get2(); unsigned sget4 (uchar *s); @@ -252,6 +265,26 @@ private: }; getbithuff_t getbithuff; +class nikbithuff_t +{ +public: + explicit nikbithuff_t(IMFILE *&i):bitbuf(0),errors(0),vbits(0),ifp(i){} + void operator()() {bitbuf = vbits = 0;}; + unsigned operator()(int nbits, ushort *huff); + unsigned errorCount() { return errors; } +private: + inline bool derror(bool condition){ + if (UNLIKELY(condition)) { + ++errors; + } + return condition; + } + unsigned bitbuf, errors; + int vbits; + IMFILE *&ifp; +}; +nikbithuff_t nikbithuff; + ushort * make_decoder_ref (const uchar **source); ushort * make_decoder (const uchar *source); void crw_init_tables (unsigned table, ushort *huff[2]); @@ -268,6 +301,7 @@ void ljpeg_idct (struct jhead *jh); void canon_sraw_load_raw(); void adobe_copy_pixel (unsigned row, unsigned col, ushort **rp); void lossless_dng_load_raw(); +void lossless_dnglj92_load_raw(); void packed_dng_load_raw(); void deflate_dng_load_raw(); void init_fuji_compr(struct fuji_compressed_params* info); @@ -290,6 +324,7 @@ void fuji_decode_strip(const struct fuji_compressed_params* info_common, int cur 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); void parse_fuji_compressed_header(); +void fuji_14bit_load_raw(); void pentax_load_raw(); void nikon_load_raw(); int nikon_is_compressed(); @@ -315,7 +350,7 @@ void parse_qt (int end); // 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):order(o),ifp(i),bitbuf(0),vbits(0){} unsigned operator()(int nbits, ushort *huff); unsigned operator()(int nbits); unsigned operator()(); @@ -348,7 +383,6 @@ private: } } - DCraw *parent; short ℴ IMFILE* const ifp; UINT64 bitbuf; @@ -368,13 +402,15 @@ void nokia_load_raw(); class pana_bits_t{ public: - pana_bits_t(IMFILE *i, unsigned &u): ifp(i), load_flags(u), vbits(0) {} - unsigned operator()(int nbits); + pana_bits_t(IMFILE *i, unsigned &u, unsigned enc): + ifp(i), load_flags(u), vbits(0), encoding(enc) {} + unsigned operator()(int nbits, unsigned *bytes=nullptr); private: IMFILE *ifp; unsigned &load_flags; uchar buf[0x4000]; int vbits; + unsigned encoding; }; void canon_rmf_load_raw(); @@ -400,6 +436,7 @@ void kodak_thumb_load_raw(); // sony_decrypt(unsigned *data, int len, int start, int key); class sony_decrypt_t{ public: + explicit sony_decrypt_t() : p(0) {} void operator()(unsigned *data, int len, int start, int key); private: unsigned pad[128], p; @@ -489,6 +526,8 @@ void shiftXtransMatrix( const int offsy, const int offsx) { } } +void nikon_14bit_load_raw(); // ported from LibRaw + }; diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch deleted file mode 100644 index 43f9e12eb..000000000 --- a/rtengine/dcraw.patch +++ /dev/null @@ -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 --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 40e74a662..0445e64a6 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -17,9 +17,10 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "dcrop.h" #include "curves.h" +#include "dcrop.h" #include "mytime.h" +#include "procparams.h" #include "refreshmap.h" #include "rt_math.h" @@ -28,9 +29,9 @@ namespace // "ceil" rounding template -constexpr T skips (T a, T b) +constexpr T skips(T a, T b) { - return a / b + static_cast (a % b); + return a / b + static_cast(a % b); } } @@ -40,47 +41,47 @@ namespace rtengine extern const Settings* settings; -Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow) - : PipetteBuffer (editDataProvider), origCrop (nullptr), spotCrop(nullptr), laboCrop (nullptr), labnCrop (nullptr), - cropImg (nullptr), cbuf_real (nullptr), cshmap (nullptr), transCrop (nullptr), cieCrop (nullptr), cbuffer (nullptr), - updating (false), newUpdatePending (false), skip (10),/* padding(0),*/ - cropx (0), cropy (0), cropw (-1), croph (-1), - trafx (0), trafy (0), trafw (-1), trafh (-1), - rqcropx (0), rqcropy (0), rqcropw (-1), rqcroph (-1), - borderRequested (32), upperBorder (0), leftBorder (0), - cropAllocated (false), - cropImageListener (nullptr), parent (parent), isDetailWindow (isDetailWindow) +Crop::Crop(ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow) + : PipetteBuffer(editDataProvider), origCrop(nullptr), spotCrop(nullptr), laboCrop(nullptr), + labnCrop(nullptr), cropImg (nullptr), transCrop (nullptr), cieCrop (nullptr), + updating(false), newUpdatePending(false), skip(10), + cropx(0), cropy(0), cropw(-1), croph(-1), + trafx(0), trafy(0), trafw(-1), trafh(-1), + rqcropx(0), rqcropy(0), rqcropw(-1), rqcroph(-1), + borderRequested(32), upperBorder(0), leftBorder(0), + cropAllocated(false), + cropImageListener(nullptr), parent(parent), isDetailWindow(isDetailWindow) { - parent->crops.push_back (this); + parent->crops.push_back(this); } -Crop::~Crop () +Crop::~Crop() { - MyMutex::MyLock cropLock (cropMutex); + MyMutex::MyLock cropLock(cropMutex); - std::vector::iterator i = std::find (parent->crops.begin(), parent->crops.end(), this); + std::vector::iterator i = std::find(parent->crops.begin(), parent->crops.end(), this); - if (i != parent->crops.end ()) { - parent->crops.erase (i); + if (i != parent->crops.end()) { + parent->crops.erase(i); } - MyMutex::MyLock processingLock (parent->mProcessing); - freeAll (); -} - -void Crop::destroy () -{ - MyMutex::MyLock lock (cropMutex); - MyMutex::MyLock processingLock (parent->mProcessing); + MyMutex::MyLock processingLock(parent->mProcessing); freeAll(); } -void Crop::setListener (DetailedCropListener* il) +void Crop::destroy() +{ + MyMutex::MyLock lock(cropMutex); + MyMutex::MyLock processingLock(parent->mProcessing); + freeAll(); +} + +void Crop::setListener(DetailedCropListener* il) { // We can make reads in the IF, because the mProcessing lock is only needed for change if (cropImageListener != il) { - MyMutex::MyLock lock (cropMutex); + MyMutex::MyLock lock(cropMutex); cropImageListener = il; } } @@ -95,9 +96,9 @@ EditUniqueID Crop::getCurrEditID() * Delete the edit image buffer if there's no subscriber anymore. * If allocation has to be done, it is deferred to Crop::update */ -void Crop::setEditSubscriber (EditSubscriber* newSubscriber) +void Crop::setEditSubscriber(EditSubscriber* newSubscriber) { - MyMutex::MyLock lock (cropMutex); + MyMutex::MyLock lock(cropMutex); // At this point, editCrop.dataProvider->currSubscriber is the old subscriber EditSubscriber *oldSubscriber = PipetteBuffer::dataProvider ? PipetteBuffer::dataProvider->getCurrSubscriber() : nullptr; @@ -123,15 +124,15 @@ void Crop::setEditSubscriber (EditSubscriber* newSubscriber) bool Crop::hasListener() { - MyMutex::MyLock cropLock (cropMutex); + MyMutex::MyLock cropLock(cropMutex); return cropImageListener; } -void Crop::update (int todo) +void Crop::update(int todo) { - MyMutex::MyLock cropLock (cropMutex); + MyMutex::MyLock cropLock(cropMutex); - ProcParams& params = parent->params; + ProcParams& params = *parent->params; // CropGUIListener* cropgl; // No need to update todo here, since it has already been changed in ImprocCoordinator::updatePreviewImage, @@ -139,19 +140,19 @@ void Crop::update (int todo) // give possibility to the listener to modify crop window (as the full image dimensions are already known at this point) int wx, wy, ww, wh, ws; - bool overrideWindow = false; + const bool overrideWindow = cropImageListener; - if (cropImageListener) { - overrideWindow = cropImageListener->getWindow (wx, wy, ww, wh, ws); + if (overrideWindow) { + cropImageListener->getWindow(wx, wy, ww, wh, ws); } // re-allocate sub-images and arrays if their dimensions changed bool needsinitupdate = false; if (!overrideWindow) { - needsinitupdate = setCropSizes (rqcropx, rqcropy, rqcropw, rqcroph, skip, true); + needsinitupdate = setCropSizes(rqcropx, rqcropy, rqcropw, rqcroph, skip, true); } else { - needsinitupdate = setCropSizes (wx, wy, ww, wh, ws, true); // this set skip=ws + needsinitupdate = setCropSizes(wx, wy, ww, wh, ws, true); // this set skip=ws } // it something has been reallocated, all processing steps have to be performed @@ -160,7 +161,7 @@ void Crop::update (int todo) } // Tells to the ImProcFunctions' tool what is the preview scale, which may lead to some simplifications - parent->ipf.setScale (skip); + parent->ipf.setScale(skip); Imagefloat* baseCrop = origCrop; int widIm = parent->fw;//full image @@ -169,12 +170,12 @@ void Crop::update (int todo) bool needstransform = parent->ipf.needsTransform(); if (todo & (M_INIT | M_LINDENOISE | M_HDR)) { - MyMutex::MyLock lock (parent->minit); // Also used in improccoord + MyMutex::MyLock lock(parent->minit); // Also used in improccoord - int tr = getCoarseBitMask (params.coarse); + int tr = getCoarseBitMask(params.coarse); if (!needsinitupdate) { - setCropSizes (rqcropx, rqcropy, rqcropw, rqcroph, skip, true); + setCropSizes(rqcropx, rqcropy, rqcropw, rqcroph, skip, true); } // printf("x=%d y=%d crow=%d croh=%d skip=%d\n",rqcropx, rqcropy, rqcropw, rqcroph, skip); @@ -186,7 +187,7 @@ void Crop::update (int todo) float autoNR = (float) settings->nrauto;// float autoNRmax = (float) settings->nrautomax;// - params.dirpyrDenoise.getCurves (noiseLCurve, noiseCCurve); + params.dirpyrDenoise.getCurves(noiseLCurve, noiseCCurve); int tilesize; int overlap; @@ -204,7 +205,7 @@ void Crop::update (int todo) int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; int kall = 2; - parent->ipf.Tile_calc (tilesize, overlap, kall, widIm, heiIm, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + parent->ipf.Tile_calc(tilesize, overlap, kall, widIm, heiIm, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); kall = 0; float *min_b = new float [9]; @@ -226,20 +227,20 @@ void Crop::update (int todo) } 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.raw ); + 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.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.raw ); + PreviewProps pp(trafx, trafy, trafw * skip, trafh * skip, skip); + 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.raw ); + PreviewProps pp(trafx, trafy, trafw * skip, trafh * skip, skip); + 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; @@ -257,15 +258,15 @@ void Crop::update (int todo) int poscenterY = 0; for (int cc = 0; cc < numtiles_W; cc++) { - if (abs (centerTile_X[cc] - CenterPreview_X) < minimuX) { - minimuX = abs (centerTile_X[cc] - CenterPreview_X); + if (abs(centerTile_X[cc] - CenterPreview_X) < minimuX) { + minimuX = abs(centerTile_X[cc] - CenterPreview_X); poscenterX = cc; } } for (int cc = 0; cc < numtiles_H; cc++) { - if (abs (centerTile_Y[cc] - CenterPreview_Y) < minimuY) { - minimuY = abs (centerTile_Y[cc] - CenterPreview_Y); + if (abs(centerTile_Y[cc] - CenterPreview_Y) < minimuY) { + minimuY = abs(centerTile_Y[cc] - CenterPreview_Y); poscenterY = cc; } } @@ -292,24 +293,24 @@ void Crop::update (int todo) float adjustr = 1.f; - if (params.icm.working == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; - } else if (params.icm.working == "Adobe RGB") { + } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "sRGB") { + } else if (params.icm.workingProfile == "sRGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "WideGamut") { + } else if (params.icm.workingProfile == "WideGamut") { adjustr = 1.f / 1.1f; - } else if (params.icm.working == "Beta RGB") { + } else if (params.icm.workingProfile == "Beta RGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BestRGB") { + } else if (params.icm.workingProfile == "BestRGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BruceRGB") { + } else if (params.icm.workingProfile == "BruceRGB") { adjustr = 1.f / 1.2f; } if (parent->adnListener) { - parent->adnListener->noiseTilePrev (centerTile_X[poscenterX], centerTile_Y[poscenterY], CenterPreview_X, CenterPreview_Y, crW, trafw * skip); + parent->adnListener->noiseTilePrev(centerTile_X[poscenterX], centerTile_Y[poscenterY], CenterPreview_X, CenterPreview_Y, crW, trafw * skip); } // I have tried "blind" some solutions..to move review ...but GUI is not my truc ! @@ -323,17 +324,17 @@ void Crop::update (int todo) // we only need image reduced to 1/4 here int W = origCrop->getWidth(); int H = origCrop->getHeight(); - Imagefloat *provicalc = new Imagefloat ((W + 1) / 2, (H + 1) / 2); //for denoise curves + Imagefloat *provicalc = new Imagefloat((W + 1) / 2, (H + 1) / 2); //for denoise curves for (int ii = 0; ii < H; ii += 2) { for (int jj = 0; jj < W; jj += 2) { - provicalc->r (ii >> 1, jj >> 1) = origCrop->r (ii, jj); - provicalc->g (ii >> 1, jj >> 1) = origCrop->g (ii, jj); - provicalc->b (ii >> 1, jj >> 1) = origCrop->b (ii, jj); + provicalc->r(ii >> 1, jj >> 1) = origCrop->r(ii, jj); + provicalc->g(ii >> 1, jj >> 1) = origCrop->g(ii, jj); + provicalc->b(ii >> 1, jj >> 1) = origCrop->b(ii, jj); } } - parent->imgsrc->convertColorSpace (provicalc, params.icm, parent->currWB); //for denoise luminance curve + parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB); //for denoise luminance curve float maxr = 0.f; float maxb = 0.f; @@ -347,10 +348,10 @@ void Crop::update (int todo) maxblueaut = 0.f; minredaut = 0.f; minblueaut = 0.f; - LUTf gamcurve (65536, 0); + LUTf gamcurve(65536, 0); float gam, gamthresh, gamslope; - parent->ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); - parent->ipf.RGB_denoise_info (origCrop, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, true); + parent->ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); + parent->ipf.RGB_denoise_info(origCrop, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, true); // printf("redy=%f skin=%f pcskin=%f\n",redyel, skinc,nsknc); // printf("DCROP skip=%d cha=%4.0f Nb=%d red=%4.0f bl=%4.0f redM=%4.0f bluM=%4.0f L=%4.0f sigL=%4.0f Ch=%4.0f Si=%4.0f\n",skip, chaut,Nb, redaut,blueaut, maxredaut, maxblueaut, lumema, sigma_L, chromina, sigma); float multip = 1.f; @@ -359,12 +360,12 @@ void Crop::update (int todo) multip = 2.f; //take into account gamma for TIF / JPG approximate value...not good for gamma=1 } - float maxmax = max (maxredaut, maxblueaut); + float maxmax = max(maxredaut, maxblueaut); float delta; int mode = 0; // float redyel, skinc, nsknc; int lissage = settings->leveldnliss; - parent->ipf.calcautodn_info (chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc); + parent->ipf.calcautodn_info(chaut, delta, Nb, levaut, maxmax, lumema, chromina, mode, lissage, redyel, skinc, nsknc); if (maxredaut > maxblueaut) { @@ -387,7 +388,7 @@ void Crop::update (int todo) params.dirpyrDenoise.chroma = chaut / (autoNR * multip * adjustr * lowdenoise); params.dirpyrDenoise.redchro = maxr; params.dirpyrDenoise.bluechro = maxb; - parent->adnListener->chromaChanged (params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro); + parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro); delete provicalc; } @@ -423,18 +424,18 @@ void Crop::update (int todo) lowdenoise = 0.7f; } - LUTf gamcurve (65536, 0); + LUTf gamcurve(65536, 0); float gam, gamthresh, gamslope; - parent->ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); + parent->ipf.RGB_denoise_infoGamCurve(params.dirpyrDenoise, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); int Nb[9]; #ifdef _OPENMP #pragma omp parallel #endif { - Imagefloat *origCropPart = new Imagefloat (crW, crH);//allocate memory - Imagefloat *provicalc = new Imagefloat ((crW + 1) / 2, (crH + 1) / 2); //for denoise curves + 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; @@ -450,24 +451,24 @@ void Crop::update (int todo) 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.raw ); + PreviewProps ppP(coordW[wcr], coordH[hcr], crW, crH, 1); + 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) { for (int jj = 0; jj < crW; jj += 2) { - provicalc->r (ii >> 1, jj >> 1) = origCropPart->r (ii, jj); - provicalc->g (ii >> 1, jj >> 1) = origCropPart->g (ii, jj); - provicalc->b (ii >> 1, jj >> 1) = origCropPart->b (ii, jj); + provicalc->r(ii >> 1, jj >> 1) = origCropPart->r(ii, jj); + provicalc->g(ii >> 1, jj >> 1) = origCropPart->g(ii, jj); + provicalc->b(ii >> 1, jj >> 1) = origCropPart->b(ii, jj); } } - parent->imgsrc->convertColorSpace (provicalc, params.icm, parent->currWB); //for denoise luminance curve + parent->imgsrc->convertColorSpace(provicalc, params.icm, parent->currWB); //for denoise luminance curve float pondcorrec = 1.0f; float chaut = 0.f, redaut = 0.f, blueaut = 0.f, maxredaut = 0.f, maxblueaut = 0.f, minredaut = 0.f, minblueaut = 0.f, chromina = 0.f, sigma = 0.f, lumema = 0.f, sigma_L = 0.f, redyel = 0.f, skinc = 0.f, nsknc = 0.f; int nb = 0; - parent->ipf.RGB_denoise_info (origCropPart, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); + parent->ipf.RGB_denoise_info(origCropPart, provicalc, parent->imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope, params.dirpyrDenoise, parent->imgsrc->getDirPyrDenoiseExpComp(), chaut, nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc); //printf("DCROP skip=%d cha=%f red=%f bl=%f redM=%f bluM=%f chrom=%f sigm=%f lum=%f\n",skip, chaut,redaut,blueaut, maxredaut, maxblueaut, chromina, sigma, lumema); Nb[hcr * 3 + wcr] = nb; @@ -507,24 +508,24 @@ void Crop::update (int todo) 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; - if (params.icm.working == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; // - } else if (params.icm.working == "Adobe RGB") { + } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "sRGB") { + } else if (params.icm.workingProfile == "sRGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "WideGamut") { + } else if (params.icm.workingProfile == "WideGamut") { adjustr = 1.f / 1.1f; - } else if (params.icm.working == "Beta RGB") { + } else if (params.icm.workingProfile == "Beta RGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BestRGB") { + } else if (params.icm.workingProfile == "BestRGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BruceRGB") { + } else if (params.icm.workingProfile == "BruceRGB") { adjustr = 1.f / 1.2f; } @@ -533,8 +534,8 @@ void Crop::update (int todo) int lissage = settings->leveldnliss; for (int k = 0; k < 9; k++) { - float maxmax = max (parent->denoiseInfoStore.max_r[k], parent->denoiseInfoStore.max_b[k]); - parent->ipf.calcautodn_info (parent->denoiseInfoStore.ch_M[k], delta[k], Nb[k], levaut, maxmax, lumL[k], chromC[k], mode, lissage, ry[k], sk[k], pcsk[k]); + float maxmax = max(parent->denoiseInfoStore.max_r[k], parent->denoiseInfoStore.max_b[k]); + parent->ipf.calcautodn_info(parent->denoiseInfoStore.ch_M[k], delta[k], Nb[k], levaut, maxmax, lumL[k], chromC[k], mode, lissage, ry[k], sk[k], pcsk[k]); // printf("ch_M=%f delta=%f\n",ch_M[k], delta[k]); } @@ -599,12 +600,12 @@ void Crop::update (int todo) parent->denoiseInfoStore.valid = true; if (parent->adnListener) { - parent->adnListener->chromaChanged (params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro); + parent->adnListener->chromaChanged(params.dirpyrDenoise.chroma, params.dirpyrDenoise.redchro, params.dirpyrDenoise.bluechro); } if (settings->verbose) { t2aue.set(); - printf ("Info denoise auto performed in %d usec:\n", t2aue.etime (t1aue)); + printf("Info denoise auto performed in %d usec:\n", t2aue.etime(t1aue)); } //end evaluate noise @@ -612,8 +613,8 @@ void Crop::update (int todo) // 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.raw ); + PreviewProps pp(trafx, trafy, trafw * skip, trafh * skip, skip); + parent->imgsrc->getImage(parent->currWB, tr, origCrop, pp, params.toneCurve, params.raw); } DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; @@ -628,25 +629,25 @@ void Crop::update (int todo) noiseLCurve.Reset(); } - if ((noiseLCurve || noiseCCurve ) && skip == 1 && denoiseParams.enabled) { //only allocate memory if enabled and skip + if ((noiseLCurve || noiseCCurve) && skip == 1 && denoiseParams.enabled) { //only allocate memory if enabled and skip // we only need image reduced to 1/4 here int W = origCrop->getWidth(); int H = origCrop->getHeight(); - calclum = new Imagefloat ((W + 1) / 2, (H + 1) / 2); //for denoise curves + calclum = new Imagefloat((W + 1) / 2, (H + 1) / 2); //for denoise curves for (int ii = 0; ii < H; ii += 2) { for (int jj = 0; jj < W; jj += 2) { - calclum->r (ii >> 1, jj >> 1) = origCrop->r (ii, jj); - calclum->g (ii >> 1, jj >> 1) = origCrop->g (ii, jj); - calclum->b (ii >> 1, jj >> 1) = origCrop->b (ii, jj); + calclum->r(ii >> 1, jj >> 1) = origCrop->r(ii, jj); + calclum->g(ii >> 1, jj >> 1) = origCrop->g(ii, jj); + calclum->b(ii >> 1, jj >> 1) = origCrop->b(ii, jj); } } - parent->imgsrc->convertColorSpace (calclum, params.icm, parent->currWB); //for denoise luminance curve + parent->imgsrc->convertColorSpace(calclum, params.icm, parent->currWB); //for denoise luminance curve } if (skip != 1) if (parent->adnListener) { - parent->adnListener->noiseChanged (0.f, 0.f); + parent->adnListener->noiseChanged(0.f, 0.f); } if (todo & M_LINDENOISE) { @@ -654,26 +655,26 @@ void Crop::update (int todo) int kall = 0; float nresi, highresi; - parent->ipf.RGB_denoise (kall, origCrop, origCrop, calclum, parent->denoiseInfoStore.ch_M, parent->denoiseInfoStore.max_r, parent->denoiseInfoStore.max_b, parent->imgsrc->isRAW(), /*Roffset,*/ denoiseParams, parent->imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, nresi, highresi); + parent->ipf.RGB_denoise(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); + parent->adnListener->noiseChanged(nresi, highresi); } if (settings->leveldnautsimpl == 1) { if ((denoiseParams.Cmethod == "AUT" || denoiseParams.Cmethod == "PRE") && (parent->adnListener)) { // force display value of sliders - parent->adnListener->chromaChanged (denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); + parent->adnListener->chromaChanged(denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); } } else { if ((denoiseParams.C2method == "AUTO" || denoiseParams.C2method == "PREV") && (parent->adnListener)) { // force display value of sliders - parent->adnListener->chromaChanged (denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); + parent->adnListener->chromaChanged(denoiseParams.chroma, denoiseParams.redchro, denoiseParams.bluechro); } } } } - parent->imgsrc->convertColorSpace (origCrop, params.icm, parent->currWB); + parent->imgsrc->convertColorSpace(origCrop, params.icm, parent->currWB); delete [] min_r; delete [] min_b; @@ -688,10 +689,11 @@ void Crop::update (int todo) } // 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); + createBuffer(cropw, croph); std::unique_ptr fattalCrop; - if ((todo & M_HDR) && params.fattal.enabled) { + + if ((todo & M_HDR) && (params.fattal.enabled || params.dehaze.enabled)) { Imagefloat *f = origCrop; int fw = skips(parent->fw, skip); int fh = skips(parent->fh, skip); @@ -700,6 +702,7 @@ void Crop::update (int todo) 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) { @@ -708,7 +711,7 @@ void Crop::update (int todo) } else { f = new Imagefloat(fw, fh); fattalCrop.reset(f); - PreviewProps pp (0, 0, parent->fw, parent->fh, skip); + 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); @@ -720,8 +723,10 @@ void Crop::update (int todo) #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); @@ -735,7 +740,9 @@ void Crop::update (int todo) } } } + if (need_fattal) { + parent->ipf.dehaze(f); parent->ipf.ToneMapFattal02(f); } @@ -748,8 +755,10 @@ void Crop::update (int todo) #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); @@ -757,24 +766,25 @@ void Crop::update (int todo) 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) { - transCrop = new Imagefloat (cropw, croph); + transCrop = new Imagefloat(cropw, croph); } if (needstransform) - parent->ipf.transform (baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, skips (parent->fw, skip), skips (parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(), - parent->imgsrc->getMetaData(), - parent->imgsrc->getRotateDegree(), false); + parent->ipf.transform(baseCrop, transCrop, cropx / skip, cropy / skip, trafx / skip, trafy / skip, skips(parent->fw, skip), skips(parent->fh, skip), parent->getFullWidth(), parent->getFullHeight(), + parent->imgsrc->getMetaData(), + parent->imgsrc->getRotateDegree(), false); else { - baseCrop->copyData (transCrop); + baseCrop->copyData(transCrop); } if (transCrop) { @@ -814,57 +824,41 @@ void Crop::update (int todo) const int W = baseCrop->getWidth(); const int H = baseCrop->getHeight(); - LabImage labcbdl (W, H); - parent->ipf.rgb2lab (*baseCrop, labcbdl, params.icm.working); - parent->ipf.dirpyrequalizer (&labcbdl, skip); - parent->ipf.lab2rgb (labcbdl, *baseCrop, params.icm.working); + LabImage labcbdl(W, H); + parent->ipf.rgb2lab(*baseCrop, labcbdl, params.icm.workingProfile); + parent->ipf.dirpyrequalizer(&labcbdl, skip); + parent->ipf.lab2rgb(labcbdl, *baseCrop, params.icm.workingProfile); } - // blurmap for shadow & highlights - if ((todo & M_BLURMAP) && params.sh.enabled) { - double radius = sqrt (double (skips (parent->fw, skip) * skips (parent->fw, skip) + skips (parent->fh, skip) * skips (parent->fh, skip))) / 2.0; - double shradius = params.sh.radius; - - if (!params.sh.hq) { - shradius *= radius / 1800.0; - } - - if (!cshmap) { - cshmap = new SHMap (cropw, croph, true); - } - - cshmap->update (baseCrop, shradius, parent->ipf.lumimul, params.sh.hq, skip); - - if (parent->shmap->min_f < 65535.f) { // don't call forceStat with wrong values - cshmap->forceStat (parent->shmap->max_f, parent->shmap->min_f, parent->shmap->avg); - } - } - - - // shadows & highlights & tone curve & convert to cielab - /*int xref,yref; - xref=000;yref=000; - if (colortest && cropw>115 && croph>115) - for(int j=1;j<5;j++){ - xref+=j*30;yref+=j*30; - if (settings->verbose) printf("before rgbProc RGB Xr%i Yr%i Skip=%d R=%f G=%f B=%f gamma=%f \n",xref,yref,skip, - baseCrop->r[(int)(xref/skip)][(int)(yref/skip)]/256, - baseCrop->g[(int)(xref/skip)][(int)(yref/skip)]/256, - baseCrop->b[(int)(xref/skip)][(int)(yref/skip)]/256, - parent->imgsrc->getGamma()); - }*/ - if (todo & M_RGBCURVE) { + Imagefloat *workingCrop = baseCrop; + + if (params.icm.workingTRC == "Custom") { //exec TRC IN free + const Glib::ustring profile = params.icm.workingProfile; + + if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1") { + const int cw = baseCrop->getWidth(); + const int ch = baseCrop->getHeight(); + workingCrop = new Imagefloat(cw, ch); + //first put gamma TRC to 1 + parent->ipf.workingtrc(baseCrop, workingCrop, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, parent->getCustomTransformIn(), true, false, true); + //adjust gamma TRC + parent->ipf.workingtrc(workingCrop, workingCrop, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, parent->getCustomTransformOut(), false, true, true); + } + } double rrm, ggm, bbm; DCPProfile::ApplyState as; - DCPProfile *dcpProf = parent->imgsrc->getDCP (params.icm, as); + DCPProfile *dcpProf = parent->imgsrc->getDCP(params.icm, as); LUTu histToneCurve; - parent->ipf.rgbProc (baseCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, cshmap, - params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, parent->colourToningSatLimit, parent->colourToningSatLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve, - parent->customToneCurve1, parent->customToneCurve2, parent->beforeToneCurveBW, parent->afterToneCurveBW, rrm, ggm, bbm, - parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as, histToneCurve); + parent->ipf.rgbProc (workingCrop, laboCrop, this, parent->hltonecurve, parent->shtonecurve, parent->tonecurve, + params.toneCurve.saturation, parent->rCurve, parent->gCurve, parent->bCurve, parent->colourToningSatLimit, parent->colourToningSatLimitOpacity, parent->ctColorCurve, parent->ctOpacityCurve, parent->opautili, parent->clToningcurve, parent->cl2Toningcurve, + parent->customToneCurve1, parent->customToneCurve2, parent->beforeToneCurveBW, parent->afterToneCurveBW, rrm, ggm, bbm, + parent->bwAutoR, parent->bwAutoG, parent->bwAutoB, dcpProf, as, histToneCurve); + if (workingCrop != baseCrop) { + delete workingCrop; + } } /*xref=000;yref=000; @@ -886,7 +880,7 @@ void Crop::update (int todo) // apply luminance operations if (todo & (M_LUMINANCE + M_COLOR)) { //I made a little change here. Rather than have luminanceCurve (and others) use in/out lab images, we can do more if we copy right here. - labnCrop->CopyFrom (laboCrop); + labnCrop->CopyFrom(laboCrop); //parent->ipf.luminanceCurve (labnCrop, labnCrop, parent->lumacurve); @@ -898,30 +892,31 @@ void Crop::update (int todo) bool cclutili = parent->cclutili; LUTu dummy; - // parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1); - parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); - parent->ipf.vibrance (labnCrop); - if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { - parent->ipf.EPDToneMap (labnCrop, 5, skip); + parent->ipf.chromiLuminanceCurve(this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); + parent->ipf.vibrance(labnCrop); + parent->ipf.labColorCorrectionRegions(labnCrop); + + if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { + parent->ipf.EPDToneMap(labnCrop, 5, skip); } //parent->ipf.EPDToneMap(labnCrop, 5, 1); //Go with much fewer than normal iterates for fast redisplay. // for all treatments Defringe, Sharpening, Contrast detail , Microcontrast they are activated if "CIECAM" function are disabled if (skip == 1) { if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { - parent->ipf.impulsedenoise (labnCrop); + parent->ipf.impulsedenoise(labnCrop); } - if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled) ) { - parent->ipf.defringe (labnCrop); + if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { + parent->ipf.defringe(labnCrop); } - parent->ipf.MLsharpen (labnCrop); + parent->ipf.MLsharpen(labnCrop); if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { parent->ipf.MLmicrocontrast (labnCrop); - parent->ipf.sharpening (labnCrop, (float**)cbuffer, params.sharpening); + parent->ipf.sharpening (labnCrop, params.sharpening, parent->sharpMask); } } @@ -930,13 +925,13 @@ void Crop::update (int todo) if (params.dirpyrequalizer.cbdlMethod == "aft") { if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled))) { - parent->ipf.dirpyrequalizer (labnCrop, skip); + parent->ipf.dirpyrequalizer(labnCrop, skip); // parent->ipf.Lanczoslab (labnCrop,labnCrop , 1.f/skip); } } int kall = 0; - int minwin = min (labnCrop->W, labnCrop->H); + int minwin = min(labnCrop->W, labnCrop->H); int maxlevelcrop = 10; // if(cp.mul[9]!=0)maxlevelcrop=10; @@ -965,9 +960,7 @@ void Crop::update (int todo) if (params.wavelet.Tilesmethod == "big") { realtile = 22; - } - - if (params.wavelet.Tilesmethod == "lit") { + } else /*if (params.wavelet.Tilesmethod == "lit")*/ { realtile = 12; } @@ -976,10 +969,10 @@ void Crop::update (int todo) int numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip; - parent->ipf.Tile_calc (tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); + parent->ipf.Tile_calc(tilesize, overlap, kall, labnCrop->W, labnCrop->H, numtiles_W, numtiles_H, tilewidth, tileheight, tileWskip, tileHskip); //now we have tile dimensions, overlaps //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - int minsizetile = min (tilewidth, tileheight); + int minsizetile = min(tilewidth, tileheight); int maxlev2 = 10; if (minsizetile < 1024 && maxlevelcrop == 10) { @@ -998,10 +991,10 @@ void Crop::update (int todo) maxlev2 = 6; } - int maxL = min (maxlev2, maxlevelcrop); + int maxL = min(maxlev2, maxlevelcrop); if (parent->awavListener) { - parent->awavListener->wavChanged (float (maxL)); + parent->awavListener->wavChanged(float (maxL)); } if ((params.wavelet.enabled)) { @@ -1013,28 +1006,30 @@ void Crop::update (int todo) LUTf wavclCurve; LUTu dummy; - params.wavelet.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + params.wavelet.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - parent->ipf.ip_wavelet (labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); + parent->ipf.ip_wavelet(labnCrop, labnCrop, kall, WaveParams, wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL, parent->wavclCurve, skip); } + parent->ipf.softLight(labnCrop); + // } // } if (params.colorappearance.enabled) { - float fnum = parent->imgsrc->getMetaData()->getFNumber (); // F number - float fiso = parent->imgsrc->getMetaData()->getISOSpeed () ; // ISO - float fspeed = parent->imgsrc->getMetaData()->getShutterSpeed () ; // Speed - double fcomp = parent->imgsrc->getMetaData()->getExpComp (); // Compensation +/- + float fnum = parent->imgsrc->getMetaData()->getFNumber(); // F number + float fiso = parent->imgsrc->getMetaData()->getISOSpeed() ; // ISO + float fspeed = parent->imgsrc->getMetaData()->getShutterSpeed() ; // Speed + double fcomp = parent->imgsrc->getMetaData()->getExpComp(); // Compensation +/- double adap; // Scene's luminosity adaptation factor if (fnum < 0.3f || fiso < 5.f || fspeed < 0.00001f) { //if no exif data or wrong adap = 2000.; } else { - double E_V = fcomp + log2 (double ((fnum * fnum) / fspeed / (fiso / 100.f))); + double E_V = fcomp + log2(double ((fnum * fnum) / fspeed / (fiso / 100.f))); E_V += params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV - E_V += log2 (params.raw.expos); // exposure raw white point ; log2 ==> linear to EV - adap = pow (2., E_V - 3.); // cd / m2 + E_V += log2(params.raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = pow(2., E_V - 3.); // cd / m2 // end calculation adaptation scene luminosity } @@ -1045,21 +1040,14 @@ void Crop::update (int todo) } if (!cieCrop) { - cieCrop = new CieImage (cropw, croph); + cieCrop = new CieImage(cropw, croph); } - if (settings->ciecamfloat) { - float d, dj, yb; // not used after this block - 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; // not used after this block - - 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); - } + float d, dj, yb; // not used after this block + 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, parent->sharpMask); } 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; } @@ -1072,13 +1060,13 @@ void Crop::update (int todo) PipetteBuffer::setReady(); // Computing the preview image, i.e. converting from lab->Monitor color space (soft-proofing disabled) or lab->Output profile->Monitor color space (soft-proofing enabled) - parent->ipf.lab2monitorRgb (labnCrop, cropImg); + parent->ipf.lab2monitorRgb(labnCrop, cropImg); if (cropImageListener) { // Computing the internal image for analysis, i.e. conversion from lab->Output profile (rtSettings.HistogramWorking disabled) or lab->WCS (rtSettings.HistogramWorking enabled) // internal image in output color space for analysis - Image8 *cropImgtrue = parent->ipf.lab2rgb (labnCrop, 0, 0, cropw, croph, params.icm); + Image8 *cropImgtrue = parent->ipf.lab2rgb(labnCrop, 0, 0, cropw, croph, params.icm); int finalW = rqcropw; @@ -1092,30 +1080,26 @@ void Crop::update (int todo) finalH = cropImg->getHeight() - upperBorder; } - Image8* final = new Image8 (finalW, finalH); - Image8* finaltrue = new Image8 (finalW, finalH); + Image8* final = new Image8(finalW, finalH); + Image8* finaltrue = new Image8(finalW, finalH); for (int i = 0; i < finalH; i++) { - memcpy (final->data + 3 * i * finalW, cropImg->data + 3 * (i + upperBorder)*cropw + 3 * leftBorder, 3 * finalW); - memcpy (finaltrue->data + 3 * i * finalW, cropImgtrue->data + 3 * (i + upperBorder)*cropw + 3 * leftBorder, 3 * finalW); + memcpy(final->data + 3 * i * finalW, cropImg->data + 3 * (i + upperBorder)*cropw + 3 * leftBorder, 3 * finalW); + memcpy(finaltrue->data + 3 * i * finalW, cropImgtrue->data + 3 * (i + upperBorder)*cropw + 3 * leftBorder, 3 * finalW); } - cropImageListener->setDetailedCrop (final, finaltrue, params.icm, params.crop, rqcropx, rqcropy, rqcropw, rqcroph, skip); + cropImageListener->setDetailedCrop(final, finaltrue, params.icm, params.crop, rqcropx, rqcropy, rqcropw, rqcroph, skip); delete final; delete finaltrue; delete cropImgtrue; } } -void Crop::freeAll () +void Crop::freeAll() { - if (settings->verbose) { - printf ("freeallcrop starts %d\n", (int)cropAllocated); - } - if (cropAllocated) { - if (origCrop ) { + if (origCrop) { delete origCrop; origCrop = nullptr; } @@ -1125,41 +1109,26 @@ void Crop::freeAll () transCrop = nullptr; } - if (laboCrop ) { + if (laboCrop) { delete laboCrop; laboCrop = nullptr; } - if (labnCrop ) { + if (labnCrop) { delete labnCrop; labnCrop = nullptr; } - if (cropImg ) { + if (cropImg) { delete cropImg; cropImg = nullptr; } - if (cieCrop ) { + if (cieCrop) { delete cieCrop; cieCrop = nullptr; } - if (cbuf_real) { - delete [] cbuf_real; - cbuf_real = nullptr; - } - - if (cbuffer ) { - delete [] cbuffer; - cbuffer = nullptr; - } - - if (cshmap ) { - delete cshmap; - cshmap = nullptr; - } - PipetteBuffer::flush(); } @@ -1170,7 +1139,7 @@ void Crop::freeAll () namespace { -bool check_need_larger_crop_for_lcp_distortion (int fw, int fh, int x, int y, int w, int h, const ProcParams ¶ms) +bool check_need_larger_crop_for_lcp_distortion(int fw, int fh, int x, int y, int w, int h, const procparams::ProcParams ¶ms) { if (x == 0 && y == 0 && w == fw && h == fh) { return false; @@ -1185,15 +1154,11 @@ bool check_need_larger_crop_for_lcp_distortion (int fw, int fh, int x, int y, in * If the scale changes, this method will free all buffers and reallocate ones of the new size. * It will then tell to the SizeListener that size has changed (sizeChanged) */ -bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool internal) +bool Crop::setCropSizes(int rcx, int rcy, int rcw, int rch, int skip, bool internal) { - if (settings->verbose) { - printf ("setcropsizes before lock\n"); - } - if (!internal) { - cropMutex.lock (); + cropMutex.lock(); } bool changed = false; @@ -1204,12 +1169,12 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte rqcroph = rch; // store and set requested crop size - int rqx1 = LIM (rqcropx, 0, parent->fullw - 1); - int rqy1 = LIM (rqcropy, 0, parent->fullh - 1); + int rqx1 = LIM(rqcropx, 0, parent->fullw - 1); + int rqy1 = LIM(rqcropy, 0, parent->fullh - 1); int rqx2 = rqx1 + rqcropw - 1; int rqy2 = rqy1 + rqcroph - 1; - rqx2 = LIM (rqx2, 0, parent->fullw - 1); - rqy2 = LIM (rqy2, 0, parent->fullh - 1); + rqx2 = LIM(rqx2, 0, parent->fullw - 1); + rqy2 = LIM(rqy2, 0, parent->fullh - 1); this->skip = skip; @@ -1219,10 +1184,10 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte int bx2 = rqx2 + skip * borderRequested; int by2 = rqy2 + skip * borderRequested; // clip it to fit into image area - bx1 = LIM (bx1, 0, parent->fullw - 1); - by1 = LIM (by1, 0, parent->fullh - 1); - bx2 = LIM (bx2, 0, parent->fullw - 1); - by2 = LIM (by2, 0, parent->fullh - 1); + bx1 = LIM(bx1, 0, parent->fullw - 1); + by1 = LIM(by1, 0, parent->fullh - 1); + bx2 = LIM(bx2, 0, parent->fullw - 1); + by2 = LIM(by2, 0, parent->fullh - 1); int bw = bx2 - bx1 + 1; int bh = by2 - by1 + 1; @@ -1233,11 +1198,9 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte orw = bw; orh = bh; - ProcParams& params = parent->params; + parent->ipf.transCoord(parent->fw, parent->fh, bx1, by1, bw, bh, orx, ory, orw, orh); - parent->ipf.transCoord (parent->fw, parent->fh, bx1, by1, bw, bh, orx, ory, orw, orh); - - if (check_need_larger_crop_for_lcp_distortion (parent->fw, parent->fh, orx, ory, orw, orh, parent->params)) { + if (check_need_larger_crop_for_lcp_distortion(parent->fw, parent->fh, orx, ory, orw, orh, *parent->params)) { // TODO - this is an estimate of the max distortion relative to the image size. ATM it is hardcoded to be 15%, which seems enough. If not, need to revise int dW = int (double (parent->fw) * 0.15 / (2 * skip)); int dH = int (double (parent->fh) * 0.15 / (2 * skip)); @@ -1266,34 +1229,30 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte y2 = parent->fh; } - orx = max (x1, 0); - ory = max (y1, 0); - orw = min (x2 - x1, parent->fw - orx); - orh = min (y2 - y1, parent->fh - ory); + orx = max(x1, 0); + ory = max(y1, 0); + orw = min(x2 - x1, parent->fw - orx); + orh = min(y2 - y1, parent->fh - ory); } - leftBorder = skips (rqx1 - bx1, skip); - upperBorder = skips (rqy1 - by1, skip); + leftBorder = skips(rqx1 - bx1, skip); + upperBorder = skips(rqy1 - by1, skip); - PreviewProps cp (orx, ory, orw, orh, skip); + PreviewProps cp(orx, ory, orw, orh, skip); int orW, orH; - parent->imgsrc->getSize (cp, orW, orH); + parent->imgsrc->getSize(cp, orW, orH); trafx = orx; trafy = ory; - int cw = skips (bw, skip); - int ch = skips (bh, skip); - - if (settings->verbose) { - printf ("setsizes starts (%d, %d, %d, %d, %d, %d)\n", orW, orH, trafw, trafh, cw, ch); - } + int cw = skips(bw, skip); + int ch = skips(bh, skip); EditType editType = ET_PIPETTE; - if (const auto editProvider = PipetteBuffer::getDataProvider ()) { - if (const auto editSubscriber = editProvider->getCurrSubscriber ()) { - editType = editSubscriber->getEditingType (); + if (const auto editProvider = PipetteBuffer::getDataProvider()) { + if (const auto editSubscriber = editProvider->getCurrSubscriber()) { + editType = editSubscriber->getEditingType(); } } @@ -1308,30 +1267,30 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte origCrop = new Imagefloat; } - origCrop->allocate (trafw, trafh); // Resizing the buffer (optimization) + origCrop->allocate(trafw, trafh); // Resizing the buffer (optimization) // if transCrop doesn't exist yet, it'll be created where necessary if (transCrop) { - transCrop->allocate (cropw, croph); + transCrop->allocate(cropw, croph); } if (laboCrop) { delete laboCrop; // laboCrop can't be resized } - laboCrop = new LabImage (cropw, croph); + laboCrop = new LabImage(cropw, croph); if (labnCrop) { delete labnCrop; // labnCrop can't be resized } - labnCrop = new LabImage (cropw, croph); + labnCrop = new LabImage(cropw, croph); if (!cropImg) { cropImg = new Image8; } - cropImg->allocate (cropw, croph); // Resizing the buffer (optimization) + cropImg->allocate(cropw, croph); // Resizing the buffer (optimization) //cieCrop is only used in Crop::update, it is destroyed now but will be allocated on first use if (cieCrop) { @@ -1339,32 +1298,8 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte cieCrop = nullptr; } - if (cbuffer ) { - delete [] cbuffer; - } - - if (cbuf_real) { - delete [] cbuf_real; - } - - if (cshmap ) { - delete cshmap; - cshmap = nullptr; - } - - cbuffer = new float*[croph]; - cbuf_real = new float[ (croph + 2)*cropw]; - - for (int i = 0; i < croph; i++) { - cbuffer[i] = cbuf_real + cropw * i + cropw; - } - - if (params.sh.enabled) { - cshmap = new SHMap (cropw, croph, true); - } - if (editType == ET_PIPETTE) { - PipetteBuffer::resize (cropw, croph); + PipetteBuffer::resize(cropw, croph); } else if (PipetteBuffer::bufferCreated()) { PipetteBuffer::flush(); } @@ -1377,12 +1312,8 @@ bool Crop::setCropSizes (int rcx, int rcy, int rcw, int rch, int skip, bool inte cropx = bx1; cropy = by1; - if (settings->verbose) { - printf ("setsizes ends\n"); - } - if (!internal) { - cropMutex.unlock (); + cropMutex.unlock(); } return changed; @@ -1417,20 +1348,20 @@ bool Crop::tryUpdate() * * This method is called when the visible part of the crop has changed (resize, zoom, etc..), so it needs a full update */ -void Crop::fullUpdate () +void Crop::fullUpdate() { - parent->updaterThreadStart.lock (); + parent->updaterThreadStart.lock(); if (parent->updaterRunning && parent->thread) { // Do NOT reset changes here, since in a long chain of events it will lead to chroma_scale not being updated, // causing Color::lab2rgb to return a black image on some opens //parent->changeSinceLast = 0; - parent->thread->join (); + parent->thread->join(); } if (parent->plistener) { - parent->plistener->setProgressState (true); + parent->plistener->setProgressState(true); } // If there are more update request, the following WHILE will collect it @@ -1438,33 +1369,33 @@ void Crop::fullUpdate () while (newUpdatePending) { newUpdatePending = false; - update (ALL); + update(ALL); } updating = false; // end of crop update if (parent->plistener) { - parent->plistener->setProgressState (false); + parent->plistener->setProgressState(false); } - parent->updaterThreadStart.unlock (); + parent->updaterThreadStart.unlock(); } int Crop::get_skip() { - MyMutex::MyLock lock (cropMutex); + MyMutex::MyLock lock(cropMutex); return skip; } int Crop::getLeftBorder() { - MyMutex::MyLock lock (cropMutex); + MyMutex::MyLock lock(cropMutex); return leftBorder; } int Crop::getUpperBorder() { - MyMutex::MyLock lock (cropMutex); + MyMutex::MyLock lock(cropMutex); return upperBorder; } diff --git a/rtengine/dcrop.h b/rtengine/dcrop.h index 36ea81b1b..4fc02da28 100644 --- a/rtengine/dcrop.h +++ b/rtengine/dcrop.h @@ -45,14 +45,11 @@ protected: LabImage* laboCrop; // "one chunk" allocation LabImage* labnCrop; // "one chunk" allocation Image8* cropImg; // "one chunk" allocation ; displayed image in monitor color space, showing the output profile as well (soft-proofing enabled, which then correspond to workimg) or not - float * cbuf_real; // "one chunk" allocation - SHMap* cshmap; // per line allocation // --- automatically allocated and deleted when necessary, and only renewed on size changes Imagefloat* transCrop; // "one chunk" allocation, allocated if necessary CieImage* cieCrop; // allocating 6 images, each in "one chunk" allocation // ----------------------------------------------------------------- - float** cbuffer; bool updating; /// Flag telling if an updater thread is currently processing bool newUpdatePending; /// Flag telling the updater thread that a new update is pending @@ -75,12 +72,12 @@ protected: public: Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow); - virtual ~Crop (); + ~Crop () override; void setEditSubscriber(EditSubscriber* newSubscriber); bool hasListener(); void update (int todo); - void setWindow (int cropX, int cropY, int cropW, int cropH, int skip) + void setWindow (int cropX, int cropY, int cropW, int cropH, int skip) override { setCropSizes (cropX, cropY, cropW, cropH, skip, false); } @@ -88,12 +85,12 @@ public: /** @brief Synchronously look out if a full update is necessary * First try, only make fullUpdate if this returns false */ - bool tryUpdate (); + bool tryUpdate () override; /** @brief Asynchronously reprocess the detailed crop */ - void fullUpdate (); // called via thread + void fullUpdate () override; // called via thread - void setListener (DetailedCropListener* il); - void destroy (); + void setListener (DetailedCropListener* il) override; + void destroy () override; int get_skip(); int getLeftBorder(); int getUpperBorder(); diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 68b2ad8bb..e8ab4fd5c 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -20,16 +20,9 @@ #include #include "rawimagesource.h" -#include "rawimagesource_i.h" -#include "jaggedarray.h" #include "rawimage.h" #include "mytime.h" -#include "iccmatrices.h" -#include "iccstore.h" #include "image8.h" -#include "curves.h" -#include "dfmanager.h" -#include "slicer.h" #include "rt_math.h" #include "color.h" #include "../rtgui/multilangmgr.h" @@ -37,6 +30,7 @@ #include "sleef.c" #include "opthelper.h" #include "median.h" +//#define BENCHMARK #include "StopWatch.h" #ifdef _OPENMP #include @@ -46,11 +40,12 @@ using namespace std; namespace rtengine { + +extern const Settings* settings; + #undef ABS -#undef DIST #define ABS(a) ((a)<0?-(a):(a)) -#define DIST(a,b) (ABS(a-b)) #define CLIREF(x) LIM(x,-200000.0f,200000.0f) // avoid overflow : do not act directly on image[] or pix[] #define x1125(a) (a + xdivf(a, 3)) #define x0875(a) (a - xdivf(a, 3)) @@ -58,820 +53,6 @@ namespace rtengine #define x00625(a) xdivf(a, 4) #define x0125(a) xdivf(a, 3) -extern const Settings* settings; -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void RawImageSource::eahd_demosaic () -{ - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); - plistener->setProgress (0.0); - } - - // prepare cache and constants for cielab conversion - //TODO: revisit after conversion to D50 illuminant - lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; - lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; - lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; - - lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; - lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; - lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; - - lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; - lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; - lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; - - int maxindex = 3 * 65536; //2*65536 3 = avoid crash 3/2013 J.Desmis - cache = new double[maxindex]; - threshold = (int)(0.008856 * MAXVALD); - - for (int i = 0; i < maxindex; i++) { - cache[i] = std::cbrt(double(i) / MAXVALD); - } - - // end of cielab preparation - - const JaggedArray - rh (W, 3), gh (W, 4), bh (W, 3), - rv (W, 3), gv (W, 4), bv (W, 3), - lLh (W, 3), lah (W, 3), lbh (W, 3), - lLv (W, 3), lav (W, 3), lbv (W, 3), - homh (W, 3), homv (W, 3); - - // interpolate first two lines - interpolate_row_g (gh[0], gv[0], 0); - interpolate_row_g (gh[1], gv[1], 1); - interpolate_row_g (gh[2], gv[2], 2); - interpolate_row_rb (rh[0], bh[0], nullptr, gh[0], gh[1], 0); - interpolate_row_rb (rv[0], bv[0], nullptr, gv[0], gv[1], 0); - interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); - interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); - - convert_to_cielab_row (rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0]); - convert_to_cielab_row (rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0]); - convert_to_cielab_row (rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1]); - convert_to_cielab_row (rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1]); - - for (int j = 0; j < W; j++) { - homh[0][j] = 0; - homv[0][j] = 0; - homh[1][j] = 0; - homv[1][j] = 0; - } - - int dLmaph[9]; - int dLmapv[9]; - int dCamaph[9]; - int dCamapv[9]; - int dCbmaph[9]; - int dCbmapv[9]; - - for (int i = 1; i < H - 1; i++) { - int ix = i % 3; - int imx = (i - 1) % 3; - int ipx = (i + 1) % 3; - - if (i < H - 2) { - interpolate_row_g (gh[(i + 2) % 4], gv[(i + 2) % 4], i + 2); - interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], gh[(i + 2) % 4], i + 1); - interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], gv[(i + 2) % 4], i + 1); - } else { - interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], nullptr, i + 1); - interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); - } - - convert_to_cielab_row (rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3]); - convert_to_cielab_row (rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3]); - - for (int j = 0; j < W; j++) { - homh[ipx][j] = 0; - homv[ipx][j] = 0; - } - - int sh, sv, idx; - - for (int j = 1; j < W - 1; j++) { - int dmi = 0; - - for (int x = -1; x <= 1; x++) { - idx = (i + x) % 3; - - for (int y = -1; y <= 1; y++) { - // compute distance in a, b, and L - if (dmi < 4) { - sh = homh[idx][j + y]; - sv = homv[idx][j + y]; - - if (sh > sv) { // fixate horizontal pixel - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLh[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lah[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbh[idx][j + y]); - } else if (sh < sv) { - dLmaph[dmi] = DIST(lLh[ix][j], lLv[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lav[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbv[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } else { - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } - } else { - dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); - dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); - dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); - dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); - dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); - dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); - } - - dmi++; - } - } - - // compute eL & eC - int eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); - int eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); - int eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); - - int wh = 0; - - for (int dmi = 0; dmi < 9; dmi++) - if (dLmaph[dmi] <= eL && dCamaph[dmi] <= eCa && dCbmaph[dmi] <= eCb) { - wh++; - } - - int wv = 0; - - for (int dmi = 0; dmi < 9; dmi++) - if (dLmapv[dmi] <= eL && dCamapv[dmi] <= eCa && dCbmapv[dmi] <= eCb) { - wv++; - } - - homh[imx][j - 1] += wh; - homh[imx][j] += wh; - homh[imx][j + 1] += wh; - homh[ix][j - 1] += wh; - homh[ix][j] += wh; - homh[ix][j + 1] += wh; - homh[ipx][j - 1] += wh; - homh[ipx][j] += wh; - homh[ipx][j + 1] += wh; - - homv[imx][j - 1] += wv; - homv[imx][j] += wv; - homv[imx][j + 1] += wv; - homv[ix][j - 1] += wv; - homv[ix][j] += wv; - homv[ix][j + 1] += wv; - homv[ipx][j - 1] += wv; - homv[ipx][j] += wv; - homv[ipx][j + 1] += wv; - } - -//} - // finalize image - int hc, vc; - - for (int j = 0; j < W; j++) { - if (ri->ISGREEN(i - 1, j)) { - green[i - 1][j] = rawData[i - 1][j]; - } else { - hc = homh[imx][j]; - vc = homv[imx][j]; - - if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; - } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; - } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; - } - } - } - - if (!(i % 20) && plistener) { - plistener->setProgress ((double)i / (H - 2)); - } - } - - // finish H-2th and H-1th row, homogenity value is still valailable - int hc, vc; - - for (int i = H - 1; i < H + 1; i++) - for (int j = 0; j < W; j++) { - hc = homh[(i - 1) % 3][j]; - vc = homv[(i - 1) % 3][j]; - - if (hc > vc) { - green[i - 1][j] = gh[(i - 1) % 4][j]; - } else if (hc < vc) { - green[i - 1][j] = gv[(i - 1) % 4][j]; - } else { - green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; - } - } - - // Interpolate R and B - for (int i = 0; i < H; i++) { - if (i == 0) { - interpolate_row_rb_mul_pp (red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } else if (i == H - 1) { - interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } - } -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void RawImageSource::hphd_vertical (float** hpmap, int col_from, int col_to) -{ - float* temp = new float[max(W, H)]; - float* avg = new float[max(W, H)]; - float* dev = new float[max(W, H)]; - - memset (temp, 0, max(W, H)*sizeof(float)); - memset (avg, 0, max(W, H)*sizeof(float)); - memset (dev, 0, max(W, H)*sizeof(float)); - - for (int k = col_from; k < col_to; k++) { - for (int i = 5; i < H - 5; i++) { - temp[i] = (rawData[i - 5][k] - 8 * rawData[i - 4][k] + 27 * rawData[i - 3][k] - 48 * rawData[i - 2][k] + 42 * rawData[i - 1][k] - - (rawData[i + 5][k] - 8 * rawData[i + 4][k] + 27 * rawData[i + 3][k] - 48 * rawData[i + 2][k] + 42 * rawData[i + 1][k])) / 100.0; - temp[i] = ABS(temp[i]); - } - - for (int j = 4; j < H - 4; j++) { - float avgL = (temp[j - 4] + temp[j - 3] + temp[j - 2] + temp[j - 1] + temp[j] + temp[j + 1] + temp[j + 2] + temp[j + 3] + temp[j + 4]) / 9.0; - avg[j] = avgL; - float devL = ((temp[j - 4] - avgL) * (temp[j - 4] - avgL) + (temp[j - 3] - avgL) * (temp[j - 3] - avgL) + (temp[j - 2] - avgL) * (temp[j - 2] - avgL) + (temp[j - 1] - avgL) * (temp[j - 1] - avgL) + (temp[j] - avgL) * (temp[j] - avgL) + (temp[j + 1] - avgL) * (temp[j + 1] - avgL) + (temp[j + 2] - avgL) * (temp[j + 2] - avgL) + (temp[j + 3] - avgL) * (temp[j + 3] - avgL) + (temp[j + 4] - avgL) * (temp[j + 4] - avgL)) / 9.0; - - if (devL < 0.001) { - devL = 0.001; - } - - dev[j] = devL; - } - - for (int j = 5; j < H - 5; j++) { - float avgL = avg[j - 1]; - float avgR = avg[j + 1]; - float devL = dev[j - 1]; - float devR = dev[j + 1]; - hpmap[j][k] = avgL + (avgR - avgL) * devL / (devL + devR); - } - } - - delete [] temp; - delete [] avg; - delete [] dev; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void RawImageSource::hphd_horizontal (float** hpmap, int row_from, int row_to) -{ - float* temp = new float[max(W, H)]; - float* avg = new float[max(W, H)]; - float* dev = new float[max(W, H)]; - - memset (temp, 0, max(W, H)*sizeof(float)); - memset (avg, 0, max(W, H)*sizeof(float)); - memset (dev, 0, max(W, H)*sizeof(float)); - - for (int i = row_from; i < row_to; i++) { - for (int j = 5; j < W - 5; j++) { - temp[j] = (rawData[i][j - 5] - 8 * rawData[i][j - 4] + 27 * rawData[i][j - 3] - 48 * rawData[i][j - 2] + 42 * rawData[i][j - 1] - - (rawData[i][j + 5] - 8 * rawData[i][j + 4] + 27 * rawData[i][j + 3] - 48 * rawData[i][j + 2] + 42 * rawData[i][j + 1])) / 100; - temp[j] = ABS(temp[j]); - } - - for (int j = 4; j < W - 4; j++) { - float avgL = (temp[j - 4] + temp[j - 3] + temp[j - 2] + temp[j - 1] + temp[j] + temp[j + 1] + temp[j + 2] + temp[j + 3] + temp[j + 4]) / 9.0; - avg[j] = avgL; - float devL = ((temp[j - 4] - avgL) * (temp[j - 4] - avgL) + (temp[j - 3] - avgL) * (temp[j - 3] - avgL) + (temp[j - 2] - avgL) * (temp[j - 2] - avgL) + (temp[j - 1] - avgL) * (temp[j - 1] - avgL) + (temp[j] - avgL) * (temp[j] - avgL) + (temp[j + 1] - avgL) * (temp[j + 1] - avgL) + (temp[j + 2] - avgL) * (temp[j + 2] - avgL) + (temp[j + 3] - avgL) * (temp[j + 3] - avgL) + (temp[j + 4] - avgL) * (temp[j + 4] - avgL)) / 9.0; - - if (devL < 0.001) { - devL = 0.001; - } - - dev[j] = devL; - } - - for (int j = 5; j < W - 5; j++) { - float avgL = avg[j - 1]; - float avgR = avg[j + 1]; - float devL = dev[j - 1]; - float devR = dev[j + 1]; - float hpv = avgL + (avgR - avgL) * devL / (devL + devR); - - if (hpmap[i][j] < 0.8 * hpv) { - hpmap[i][j] = 2; - } else if (hpv < 0.8 * hpmap[i][j]) { - hpmap[i][j] = 1; - } else { - hpmap[i][j] = 0; - } - } - } - - delete [] temp; - delete [] avg; - delete [] dev; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void RawImageSource::hphd_green (float** hpmap) -{ -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = 3; i < H - 3; i++) { - for (int j = 3; j < W - 3; j++) { - if (ri->ISGREEN(i, j)) { - green[i][j] = rawData[i][j]; - } else { - if (hpmap[i][j] == 1) { - int g2 = rawData[i][j + 1] + ((rawData[i][j] - rawData[i][j + 2]) / 2); - int g4 = rawData[i][j - 1] + ((rawData[i][j] - rawData[i][j - 2]) / 2); - - int dx = rawData[i][j + 1] - rawData[i][j - 1]; - int d1 = rawData[i][j + 3] - rawData[i][j + 1]; - int d2 = rawData[i][j + 2] - rawData[i][j]; - int d3 = (rawData[i - 1][j + 2] - rawData[i - 1][j]) / 2; - int d4 = (rawData[i + 1][j + 2] - rawData[i + 1][j]) / 2; - - double e2 = 1.0 / (1.0 + ABS(dx) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - d1 = rawData[i][j - 3] - rawData[i][j - 1]; - d2 = rawData[i][j - 2] - rawData[i][j]; - d3 = (rawData[i - 1][j - 2] - rawData[i - 1][j]) / 2; - d4 = (rawData[i + 1][j - 2] - rawData[i + 1][j]) / 2; - - double e4 = 1.0 / (1.0 + ABS(dx) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - green[i][j] = (e2 * g2 + e4 * g4) / (e2 + e4); - } else if (hpmap[i][j] == 2) { - int g1 = rawData[i - 1][j] + ((rawData[i][j] - rawData[i - 2][j]) / 2); - int g3 = rawData[i + 1][j] + ((rawData[i][j] - rawData[i + 2][j]) / 2); - - int dy = rawData[i + 1][j] - rawData[i - 1][j]; - int d1 = rawData[i - 1][j] - rawData[i - 3][j]; - int d2 = rawData[i][j] - rawData[i - 2][j]; - int d3 = (rawData[i][j - 1] - rawData[i - 2][j - 1]) / 2; - int d4 = (rawData[i][j + 1] - rawData[i - 2][j + 1]) / 2; - - double e1 = 1.0 / (1.0 + ABS(dy) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - d1 = rawData[i + 1][j] - rawData[i + 3][j]; - d2 = rawData[i][j] - rawData[i + 2][j]; - d3 = (rawData[i][j - 1] - rawData[i + 2][j - 1]) / 2; - d4 = (rawData[i][j + 1] - rawData[i + 2][j + 1]) / 2; - - double e3 = 1.0 / (1.0 + ABS(dy) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - green[i][j] = (e1 * g1 + e3 * g3) / (e1 + e3); - } else { - int g1 = rawData[i - 1][j] + ((rawData[i][j] - rawData[i - 2][j]) / 2); - int g2 = rawData[i][j + 1] + ((rawData[i][j] - rawData[i][j + 2]) / 2); - int g3 = rawData[i + 1][j] + ((rawData[i][j] - rawData[i + 2][j]) / 2); - int g4 = rawData[i][j - 1] + ((rawData[i][j] - rawData[i][j - 2]) / 2); - - int dx = rawData[i][j + 1] - rawData[i][j - 1]; - int dy = rawData[i + 1][j] - rawData[i - 1][j]; - - int d1 = rawData[i - 1][j] - rawData[i - 3][j]; - int d2 = rawData[i][j] - rawData[i - 2][j]; - int d3 = (rawData[i][j - 1] - rawData[i - 2][j - 1]) / 2; - int d4 = (rawData[i][j + 1] - rawData[i - 2][j + 1]) / 2; - - double e1 = 1.0 / (1.0 + ABS(dy) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - d1 = rawData[i][j + 3] - rawData[i][j + 1]; - d2 = rawData[i][j + 2] - rawData[i][j]; - d3 = (rawData[i - 1][j + 2] - rawData[i - 1][j]) / 2; - d4 = (rawData[i + 1][j + 2] - rawData[i + 1][j]) / 2; - - double e2 = 1.0 / (1.0 + ABS(dx) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - d1 = rawData[i + 1][j] - rawData[i + 3][j]; - d2 = rawData[i][j] - rawData[i + 2][j]; - d3 = (rawData[i][j - 1] - rawData[i + 2][j - 1]) / 2; - d4 = (rawData[i][j + 1] - rawData[i + 2][j + 1]) / 2; - - double e3 = 1.0 / (1.0 + ABS(dy) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - d1 = rawData[i][j - 3] - rawData[i][j - 1]; - d2 = rawData[i][j - 2] - rawData[i][j]; - d3 = (rawData[i - 1][j - 2] - rawData[i - 1][j]) / 2; - d4 = (rawData[i + 1][j - 2] - rawData[i + 1][j]) / 2; - - double e4 = 1.0 / (1.0 + ABS(dx) + ABS(d1) + ABS(d2) + ABS(d3) + ABS(d4)); - - green[i][j] = (e1 * g1 + e2 * g2 + e3 * g3 + e4 * g4) / (e1 + e2 + e3 + e4); - } - } - } - } -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void RawImageSource::hphd_demosaic () -{ - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD))); - plistener->setProgress (0.0); - } - - const JaggedArray hpmap (W, H, true); - -#ifdef _OPENMP - #pragma omp parallel - { - int tid = omp_get_thread_num(); - int nthreads = omp_get_num_threads(); - int blk = W / nthreads; - - if (tid < nthreads - 1) { - hphd_vertical (hpmap, tid * blk, (tid + 1)*blk); - } else { - hphd_vertical (hpmap, tid * blk, W); - } - } -#else - hphd_vertical (hpmap, 0, W); -#endif - - if (plistener) { - plistener->setProgress (0.33); - } - -#ifdef _OPENMP - #pragma omp parallel - { - int tid = omp_get_thread_num(); - int nthreads = omp_get_num_threads(); - int blk = H / nthreads; - - if (tid < nthreads - 1) { - hphd_horizontal (hpmap, tid * blk, (tid + 1)*blk); - } else { - hphd_horizontal (hpmap, tid * blk, H); - } - } -#else - hphd_horizontal (hpmap, 0, H); -#endif - - hphd_green (hpmap); - - if (plistener) { - plistener->setProgress (0.66); - } - - for (int i = 0; i < H; i++) { - if (i == 0) { - interpolate_row_rb_mul_pp (red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } else if (i == H - 1) { - interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } - } - - if (plistener) { - plistener->setProgress (1.0); - } -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) -typedef unsigned short ushort; -void RawImageSource::vng4_demosaic () -{ - const signed short int *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 }; - - double progress = 0.0; - const bool plistenerActive = plistener; - - if (plistenerActive) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4))); - plistener->setProgress (progress); - } - - const unsigned prefilters = ri->prefilters; - const int width = W, height = H; - constexpr unsigned int colors = 4; - float (*image)[4]; - - image = (float (*)[4]) calloc (height * width, sizeof * image); - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int ii = 0; ii < H; ii++) - for (int jj = 0; jj < W; jj++) { - image[ii * W + jj][fc(ii, jj)] = rawData[ii][jj]; - } - - { - int lcode[16][16][32]; - float mul[16][16][8]; - float csum[16][16][4]; - -// first linear interpolation - for (int row = 0; row < 16; row++) - for (int col = 0; col < 16; col++) { - int * ip = lcode[row][col]; - int mulcount = 0; - float sum[4]; - memset (sum, 0, sizeof sum); - - for (int y = -1; y <= 1; y++) - for (int x = -1; x <= 1; x++) { - int shift = (y == 0) + (x == 0); - - if (shift == 2) { - continue; - } - - int color = fc(row + y, col + x); - *ip++ = (width * y + x) * 4 + color; - - mul[row][col][mulcount] = (1 << shift); - *ip++ = color; - sum[color] += (1 << shift); - mulcount++; - } - - int colcount = 0; - - for (unsigned int c = 0; c < colors; c++) - if (c != fc(row, col)) { - *ip++ = c; - csum[row][col][colcount] = sum[c]; - colcount ++; - } - } - -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int row = 1; row < height - 1; row++) { - for (int col = 1; col < width - 1; col++) { - float * pix = image[row * width + col]; - int * ip = lcode[row & 15][col & 15]; - float sum[4]; - memset (sum, 0, sizeof sum); - - for (int i = 0; i < 8; i++, ip += 2) { - sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; - } - - for (unsigned int i = 0; i < colors - 1; i++, ip++) { - pix[ip[0]] = sum[ip[0]] / csum[row & 15][col & 15][i]; - } - } - } - } - - const int prow = 7, pcol = 1; - int *code[8][2]; - int t, g; - int * ip = (int *) calloc ((prow + 1) * (pcol + 1), 1280); - - for (int row = 0; row <= prow; row++) /* Precalculate for VNG */ - for (int col = 0; col <= pcol; col++) { - code[row][col] = ip; - - for (cp = terms, t = 0; t < 64; t++) { - int y1 = *cp++; - int x1 = *cp++; - int y2 = *cp++; - int x2 = *cp++; - int weight = *cp++; - int grads = *cp++; - unsigned int color = fc(row + y1, col + x1); - - if (fc(row + y2, col + x2) != color) { - continue; - } - - int diag = (fc(row, col + 1) == color && fc(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 << g)) { - *ip++ = g; - } - - *ip++ = -1; - } - - *ip++ = INT_MAX; - - for (cp = chood, g = 0; g < 8; g++) { - int y = *cp++; - int x = *cp++; - *ip++ = (y * width + x) * 4; - unsigned int color = fc(row, col); - - if (fc(row + y, col + x) != color && fc(row + y * 2, col + x * 2) == color) { - *ip++ = (y * width + x) * 8 + color; - } else { - *ip++ = 0; - } - } - } - - if(plistenerActive) { - progress = 0.1; - plistener->setProgress (progress); - } - - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - float gval[8], thold, sum[3]; - int g; - const int progressStep = 64; - const double progressInc = (0.98 - progress) / ((height - 2) / progressStep); -#ifdef _OPENMP - #pragma omp for nowait -#endif - - for (int row = 2; row < height - 2; row++) { /* Do VNG interpolation */ - for (int col = 2; col < width - 2; col++) { - float * pix = image[row * width + col]; - int * ip = code[row & prow][col & pcol]; - memset (gval, 0, sizeof gval); - - while ((g = ip[0]) != INT_MAX) { /* Calculate gradients */ - float diff = fabsf(pix[g] - pix[ip[1]]) * (1 << ip[2]); - gval[ip[3]] += diff; - ip += 4; - - while ((g = *ip++) != -1) { - gval[g] += diff; - } - } - - ip++; - { - float gmin, gmax; - gmin = gmax = gval[0]; /* Choose a threshold */ - - for (g = 1; g < 8; g++) { - if (gmin > gval[g]) { - gmin = gval[g]; - } - - if (gmax < gval[g]) { - gmax = gval[g]; - } - } - - thold = gmin + (gmax / 2); - } - memset (sum, 0, sizeof sum); - float t1, t2; - int color = fc(row, col); - t1 = t2 = pix[color]; - - if(color & 1) { - int num = 0; - - for (g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */ - if (gval[g] <= thold) { - if(ip[1]) { - sum[0] += (t1 + pix[ip[1]]) * 0.5f; - } - - sum[1] += pix[ip[0] + (color ^ 2)]; - num++; - } - } - - t1 += (sum[1] - sum[0]) / num; - } else { - int num = 0; - - for (g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */ - if (gval[g] <= thold) { - sum[1] += pix[ip[0] + 1]; - sum[2] += pix[ip[0] + 3]; - - if(ip[1]) { - sum[0] += (t1 + pix[ip[1]]) * 0.5f; - } - - num++; - } - } - - t1 += (sum[1] - sum[0]) / num; - t2 += (sum[2] - sum[0]) / num; - } - - green[row][col] = 0.5f * (t1 + t2); - } - - if(plistenerActive) { - if((row % progressStep) == 0) -#ifdef _OPENMP - #pragma omp critical (updateprogress) -#endif - { - progress += progressInc; - plistener->setProgress (progress); - } - } - } - - } - free (code[0][0]); - free (image); - - if(plistenerActive) { - plistener->setProgress (0.98); - } - - // Interpolate R and B -#ifdef _OPENMP - #pragma omp parallel for -#endif - - for (int i = 0; i < H; i++) { - if (i == 0) - // rm, gm, bm must be recovered - //interpolate_row_rb_mul_pp (red, blue, NULL, green[i], green[i+1], i, rm, gm, bm, 0, W, 1); - { - interpolate_row_rb_mul_pp (red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } else if (i == H - 1) { - interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); - } else { - interpolate_row_rb_mul_pp (red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); - } - } - - if(plistenerActive) { - plistener->setProgress (1.0); - } -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - #undef fc #define fc(row,col) \ (ri->get_filters() >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) @@ -996,7 +177,8 @@ void RawImageSource::ppg_demosaic() void RawImageSource::border_interpolate(unsigned int border, float (*image)[4], unsigned int start, unsigned int end) { - unsigned row, col, y, x, f, sum[8]; + unsigned row, col, y, x, f; + float sum[8]; unsigned int width = W, height = H; unsigned int colors = 3; @@ -1028,7 +210,7 @@ void RawImageSource::border_interpolate(unsigned int border, float (*image)[4], } } -void RawImageSource::border_interpolate2( int winw, int winh, int lborders) +void RawImageSource::border_interpolate2( int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue) { int bord = lborders; int width = winw; @@ -1206,7 +388,7 @@ void RawImageSource::jdl_interpolate_omp() // from "Lassus" } #ifdef _OPENMP - #pragma omp parallel default(none) shared(image,width,height,u,w,v,y,x,z,dif,chr) private(row,col,f,g,indx,c,d,i) + #pragma omp parallel shared(image,width,height,u,w,v,y,x,z,dif,chr) private(row,col,f,g,indx,c,d,i) #endif { #ifdef _OPENMP @@ -1314,7 +496,7 @@ void RawImageSource::jdl_interpolate_omp() // from "Lassus" // 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; @@ -1496,7 +678,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array // apply low pass filter on differential colors #ifdef _OPENMP - #pragma omp for + #pragma omp for #endif for (int rr = 4; rr < rr1 - 4; rr++) @@ -1722,7 +904,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array // interpolate R/B at B/R location #ifdef _OPENMP - #pragma omp for + #pragma omp for #endif for (int rr = 1; rr < rr1 - 1; rr++) @@ -1880,7 +1062,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array gamtab->makeIdentity(); } - array2D (*rgb[3]); + array2D* rgb[3]; rgb[0] = &red; rgb[1] = &green; rgb[2] = &blue; @@ -1945,8 +1127,8 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array // Adapted to RawTherapee by Jacques Desmis 3/2013 // 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) +#define CLIPV(a) vclampf(a,zerov,c65535v) +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) @@ -1971,15 +1153,13 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) chr[2] = hdif; chr[3] = vdif; - border_interpolate2(winw, winh, 7); - if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV))); plistener->setProgress (0.0); } #ifdef _OPENMP - #pragma omp parallel default(none) shared(rgb,vdif,hdif,chr) + #pragma omp parallel shared(rgb,vdif,hdif,chr) #endif { __m128 ngv, egv, wgv, sgv, nvv, evv, wvv, svv, nwgv, negv, swgv, segv, nwvv, nevv, swvv, sevv, tempv, temp1v, temp2v, temp3v, temp4v, temp5v, temp6v, temp7v, temp8v; @@ -2059,10 +1239,10 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) //N,E,W,S Hamilton Adams Interpolation // (48.f * 65535.f) = 3145680.f tempv = c40v * LVFU(rgb[0][indx1]); - nvv = LIMV(((c23v * LVFU(rgb[1][(indx - v1) >> 1]) + c23v * LVFU(rgb[1][(indx - v3) >> 1]) + LVFU(rgb[1][(indx - v5) >> 1]) + LVFU(rgb[1][(indx + v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - v1)]) - c8v * LVFU(rgb[0][(indx1 - v2)]))) / c3145680v, zerov, onev); - evv = LIMV(((c23v * LVFU(rgb[1][(indx + h1) >> 1]) + c23v * LVFU(rgb[1][(indx + h3) >> 1]) + LVFU(rgb[1][(indx + h5) >> 1]) + LVFU(rgb[1][(indx - h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + h1)]) - c8v * LVFU(rgb[0][(indx1 + h2)]))) / c3145680v, zerov, onev); - wvv = LIMV(((c23v * LVFU(rgb[1][(indx - h1) >> 1]) + c23v * LVFU(rgb[1][(indx - h3) >> 1]) + LVFU(rgb[1][(indx - h5) >> 1]) + LVFU(rgb[1][(indx + h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - h1)]) - c8v * LVFU(rgb[0][(indx1 - h2)]))) / c3145680v, zerov, onev); - svv = LIMV(((c23v * LVFU(rgb[1][(indx + v1) >> 1]) + c23v * LVFU(rgb[1][(indx + v3) >> 1]) + LVFU(rgb[1][(indx + v5) >> 1]) + LVFU(rgb[1][(indx - v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + v1)]) - c8v * LVFU(rgb[0][(indx1 + v2)]))) / c3145680v, zerov, onev); + nvv = vclampf(((c23v * LVFU(rgb[1][(indx - v1) >> 1]) + c23v * LVFU(rgb[1][(indx - v3) >> 1]) + LVFU(rgb[1][(indx - v5) >> 1]) + LVFU(rgb[1][(indx + v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - v1)]) - c8v * LVFU(rgb[0][(indx1 - v2)]))) / c3145680v, zerov, onev); + evv = vclampf(((c23v * LVFU(rgb[1][(indx + h1) >> 1]) + c23v * LVFU(rgb[1][(indx + h3) >> 1]) + LVFU(rgb[1][(indx + h5) >> 1]) + LVFU(rgb[1][(indx - h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + h1)]) - c8v * LVFU(rgb[0][(indx1 + h2)]))) / c3145680v, zerov, onev); + wvv = vclampf(((c23v * LVFU(rgb[1][(indx - h1) >> 1]) + c23v * LVFU(rgb[1][(indx - h3) >> 1]) + LVFU(rgb[1][(indx - h5) >> 1]) + LVFU(rgb[1][(indx + h1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 - h1)]) - c8v * LVFU(rgb[0][(indx1 - h2)]))) / c3145680v, zerov, onev); + svv = vclampf(((c23v * LVFU(rgb[1][(indx + v1) >> 1]) + c23v * LVFU(rgb[1][(indx + v3) >> 1]) + LVFU(rgb[1][(indx + v5) >> 1]) + LVFU(rgb[1][(indx - v1) >> 1]) + tempv - c32v * LVFU(rgb[0][(indx1 + v1)]) - c8v * LVFU(rgb[0][(indx1 + v2)]))) / c3145680v, zerov, onev); //Horizontal and vertical color differences tempv = LVFU( rgb[0][indx1] ) / c65535v; _mm_storeu_ps( &vdif[indx1], (sgv * nvv + ngv * svv) / (ngv + sgv) - tempv ); @@ -2107,9 +1287,9 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) for (col = 7 + (FC(row, 1) & 1), indx1 = (row * width + col) >> 1, d = FC(row, col) / 2; col < width - 14; col += 8, indx1 += 4) { //H&V integrated gaussian vector over variance on color differences //Mod Jacques 3/2013 - ngv = LIMV(epssqv + c78v * SQRV(LVFU(vdif[indx1])) + c69v * (SQRV(LVFU(vdif[indx1 - v1])) + SQRV(LVFU(vdif[indx1 + v1]))) + c51v * (SQRV(LVFU(vdif[indx1 - v2])) + SQRV(LVFU(vdif[indx1 + v2]))) + c21v * (SQRV(LVFU(vdif[indx1 - v3])) + SQRV(LVFU(vdif[indx1 + v3]))) - c6v * SQRV(LVFU(vdif[indx1 - v1]) + LVFU(vdif[indx1]) + LVFU(vdif[indx1 + v1])) + ngv = vclampf(epssqv + c78v * SQRV(LVFU(vdif[indx1])) + c69v * (SQRV(LVFU(vdif[indx1 - v1])) + SQRV(LVFU(vdif[indx1 + v1]))) + c51v * (SQRV(LVFU(vdif[indx1 - v2])) + SQRV(LVFU(vdif[indx1 + v2]))) + c21v * (SQRV(LVFU(vdif[indx1 - v3])) + SQRV(LVFU(vdif[indx1 + v3]))) - c6v * SQRV(LVFU(vdif[indx1 - v1]) + LVFU(vdif[indx1]) + LVFU(vdif[indx1 + v1])) - c10v * (SQRV(LVFU(vdif[indx1 - v2]) + LVFU(vdif[indx1 - v1]) + LVFU(vdif[indx1])) + SQRV(LVFU(vdif[indx1]) + LVFU(vdif[indx1 + v1]) + LVFU(vdif[indx1 + v2]))) - c7v * (SQRV(LVFU(vdif[indx1 - v3]) + LVFU(vdif[indx1 - v2]) + LVFU(vdif[indx1 - v1])) + SQRV(LVFU(vdif[indx1 + v1]) + LVFU(vdif[indx1 + v2]) + LVFU(vdif[indx1 + v3]))), zerov, onev); - egv = LIMV(epssqv + c78v * SQRV(LVFU(hdif[indx1])) + c69v * (SQRV(LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]))) + c51v * (SQRV(LVFU(hdif[indx1 - h2])) + SQRV(LVFU(hdif[indx1 + h2]))) + c21v * (SQRV(LVFU(hdif[indx1 - h3])) + SQRV(LVFU(hdif[indx1 + h3]))) - c6v * SQRV(LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1])) + egv = vclampf(epssqv + c78v * SQRV(LVFU(hdif[indx1])) + c69v * (SQRV(LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]))) + c51v * (SQRV(LVFU(hdif[indx1 - h2])) + SQRV(LVFU(hdif[indx1 + h2]))) + c21v * (SQRV(LVFU(hdif[indx1 - h3])) + SQRV(LVFU(hdif[indx1 + h3]))) - c6v * SQRV(LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1])) - c10v * (SQRV(LVFU(hdif[indx1 - h2]) + LVFU(hdif[indx1 - h1]) + LVFU(hdif[indx1])) + SQRV(LVFU(hdif[indx1]) + LVFU(hdif[indx1 + h1]) + LVFU(hdif[indx1 + h2]))) - c7v * (SQRV(LVFU(hdif[indx1 - h3]) + LVFU(hdif[indx1 - h2]) + LVFU(hdif[indx1 - h1])) + SQRV(LVFU(hdif[indx1 + h1]) + LVFU(hdif[indx1 + h2]) + LVFU(hdif[indx1 + h3]))), zerov, onev); //Limit chrominance using H/V neighbourhood nvv = median(d725v * LVFU(vdif[indx1]) + d1375v * LVFU(vdif[indx1 - v1]) + d1375v * LVFU(vdif[indx1 + v1]), LVFU(vdif[indx1 - v1]), LVFU(vdif[indx1 + v1])); @@ -2327,6 +1507,7 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) } } }// End of parallelization + border_interpolate2(winw, winh, 8, rawData, red, green, blue); if (plistener) { plistener->setProgress (1.0); @@ -2347,7 +1528,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) const int v1 = 1 * width, v2 = 2 * width, v3 = 3 * width, v4 = 4 * width, v5 = 5 * width, v6 = 6 * width; float* rgb[3]; float* chr[2]; - float (*rgbarray), *vdif, *hdif, (*chrarray); + float *rgbarray, *vdif, *hdif, *chrarray; rgbarray = (float (*)) calloc(width * height * 3, sizeof( float)); rgb[0] = rgbarray; @@ -2361,15 +1542,13 @@ void RawImageSource::igv_interpolate(int winw, int winh) vdif = (float (*)) calloc(width * height / 2, sizeof * vdif); hdif = (float (*)) calloc(width * height / 2, sizeof * hdif); - border_interpolate2(winw, winh, 7); - if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV))); plistener->setProgress (0.0); } #ifdef _OPENMP - #pragma omp parallel default(none) shared(rgb,vdif,hdif,chr) + #pragma omp parallel shared(rgb,vdif,hdif,chr) #endif { @@ -2591,6 +1770,8 @@ void RawImageSource::igv_interpolate(int winw, int winh) blue [row][col] = CLIP(rgb[1][indx] - 65535.f * chr[1][indx]); } }// End of parallelization + border_interpolate2(winw, winh, 8, rawData, red, green, blue); + if (plistener) { plistener->setProgress (1.0); @@ -2603,223 +1784,14 @@ void RawImageSource::igv_interpolate(int winw, int winh) } #endif - -/* - Adaptive Homogeneity-Directed interpolation is based on - the work of Keigo Hirakawa, Thomas Parks, and Paul Lee. - */ -#define TS 256 /* Tile Size */ -#define FORC(cnt) for (c=0; c < cnt; c++) -#define FORC3 FORC(3) - -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 (*rgb)[TS][TS][3]; - float (*lab)[TS][TS][3]; - float (*lix)[3]; - char (*homo)[TS][TS], *buffer; - double r; - - int width = W, height = H; - float (*image)[4]; - unsigned int colors = 3; - - 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 }; - - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AHD))); - plistener->setProgress (0.0); - } - - image = (float (*)[4]) calloc (H * W, sizeof * image); - - for (int ii = 0; ii < H; ii++) - for (int jj = 0; jj < W; jj++) { - image[ii * W + jj][fc(ii, jj)] = rawData[ii][jj]; - } - - cbrt = (float (*)) calloc (0x10000, sizeof * cbrt); - - for (i = 0; i < 0x10000; i++) { - r = (double)i / 65535.0; - cbrt[i] = r > 0.008856 ? std::cbrt(r) : 7.787 * r + 16 / 116.0; - } - - for (i = 0; i < 3; i++) - for (unsigned int j = 0; j < colors; j++) - for (xyz_cam[i][j] = k = 0; k < 3; k++) { - xyz_cam[i][j] += xyz_rgb[i][k] * imatrices.rgb_cam[k][j] / d65_white[i]; - } - - border_interpolate(5, image); - buffer = (char *) malloc (13 * TS * TS * sizeof(float)); /* 1664 kB */ - //merror (buffer, "ahd_interpolate()"); - rgb = (float(*)[TS][TS][3]) buffer; - lab = (float(*)[TS][TS][3])(buffer + 6 * TS * TS * sizeof(float)); - homo = (char (*)[TS][TS]) (buffer + 12 * TS * TS * sizeof(float)); - - // helper variables for progress indication - int n_tiles = ((height - 7 + (TS - 7)) / (TS - 6)) * ((width - 7 + (TS - 7)) / (TS - 6)); - int tile = 0; - - 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 = 0.25 * ((pix[-1][1] + pix[0][c] + pix[1][1]) * 2 - - pix[-2][c] - pix[2][c]) ; - rgb[0][row - top][col - left][1] = median(static_cast(val), pix[-1][1], pix[1][1]); - val = 0.25 * ((pix[-width][1] + pix[0][c] + pix[width][1]) * 2 - - pix[-2 * width][c] - pix[2 * width][c]) ; - rgb[1][row - top][col - left][1] = median(static_cast(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] + (0.5 * ( pix[-1][2 - c] + pix[1][2 - c] - - rix[-1][1] - rix[1][1] ) ); - rix[0][2 - c] = CLIP(val); - val = pix[0][1] + (0.5 * ( pix[-width][c] + pix[width][c] - - rix[-TS][1] - rix[TS][1] ) ); - } else - val = rix[0][1] + (0.25 * ( 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]) ); - - rix[0][c] = CLIP(val); - c = FC(row, col); - rix[0][c] = pix[0][c]; - xyz[0] = xyz[1] = xyz[2] = 0.0; - FORCC { - xyz[0] += xyz_cam[0][c] * rix[0][c]; - xyz[1] += xyz_cam[1][c] * rix[0][c]; - xyz[2] += xyz_cam[2][c] * rix[0][c]; - } - - xyz[0] = CurveFactory::flinterp(cbrt, xyz[0]); - xyz[1] = CurveFactory::flinterp(cbrt, xyz[1]); - xyz[2] = CurveFactory::flinterp(cbrt, xyz[2]); - - //xyz[0] = xyz[0] > 0.008856 ? pow(xyz[0]/65535,1/3.0) : 7.787*xyz[0] + 16/116.0; - //xyz[1] = xyz[1] > 0.008856 ? pow(xyz[1]/65535,1/3.0) : 7.787*xyz[1] + 16/116.0; - //xyz[2] = xyz[2] > 0.008856 ? pow(xyz[2]/65535,1/3.0) : 7.787*xyz[2] + 16/116.0; - - lix[0][0] = (116 * xyz[1] - 16); - lix[0][1] = 500 * (xyz[0] - xyz[1]); - lix[0][2] = 200 * (xyz[1] - xyz[2]); - } - - /* 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] = - 0.5 * (rgb[0][tr][tc][c] + rgb[1][tr][tc][c]) ; - } - } - - tile++; - - if(plistener) { - plistener->setProgress((double)tile / n_tiles); - } - } - - if(plistener) { - plistener->setProgress (1.0); - } - - free (buffer); - - for (int i = 0; i < H; i++) { - for (int j = 0; j < W; j++) { - red[i][j] = image[i * W + j][0]; - green[i][j] = image[i * W + j][1]; - blue[i][j] = image[i * W + j][2]; - } - } - - free (image); - free (cbrt); -} -#undef TS - void RawImageSource::nodemosaic(bool bw) { red(W, H); green(W, H); blue(W, H); +#ifdef _OPENMP #pragma omp parallel for +#endif for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { @@ -2871,9 +1843,9 @@ void RawImageSource::nodemosaic(bool bw) */ #ifdef __SSE2__ -#define CLIPV(a) LIMV(a,ZEROV,c65535v) +#define CLIPV(a) vclampf(a,ZEROV,c65535v) #endif -SSEFUNCTION void RawImageSource::refinement(int PassCount) +void RawImageSource::refinement(int PassCount) { MyTime t1e, t2e; t1e.set(); @@ -3840,1292 +2812,12 @@ BENCHFUN free(buffer0); } + border_interpolate2(W, H, 1, rawData, red, green, blue); if(plistener) { plistener->setProgress (1.0); } } -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 }; - -void RawImageSource::cielab (const float (*rgb)[3], float* l, float* a, float *b, const int width, const int height, const int labWidth, const float xyz_cam[3][3]) -{ - static LUTf cbrt(0x14000); - static bool cbrtinit = false; - - if (!rgb) { - 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; - } - - cbrtinit = true; - } - - return; - } - -#if defined( __SSE2__ ) && defined( __x86_64__ ) - vfloat zd5v = F2V(0.5f); - vfloat c116v = F2V(116.f); - vfloat c16v = F2V(16.f); - vfloat c500v = F2V(500.f); - vfloat c200v = F2V(200.f); - vfloat xyz_camv[3][3]; - - for(int i = 0; i < 3; i++) - for(int j = 0; j < 3; j++) { - xyz_camv[i][j] = F2V(xyz_cam[i][j]); - } - -#endif // __SSE2__ - - 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 - - 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)]; - - STVFU(l[i * labWidth + j], c116v * xyz1v - c16v); - STVFU(a[i * labWidth + j], c500v * (xyz0v - xyz1v)); - STVFU(b[i * labWidth + j], c200v * (xyz1v - xyz2v)); - } - -#endif - - for(; j < labWidth; j++) { - float xyz[3] = {0.5f, 0.5f, 0.5f}; - - for(int c = 0; c < 3; c++) { - float val = rgb[i * width + j][c]; - xyz[0] += xyz_cam[0][c] * val; - xyz[1] += xyz_cam[1][c] * val; - xyz[2] += xyz_cam[2][c] * val; - } - - xyz[0] = cbrt[(int) xyz[0]]; - xyz[1] = cbrt[(int) xyz[1]]; - xyz[2] = cbrt[(int) xyz[2]]; - - l[i * labWidth + j] = 116 * xyz[1] - 16; - a[i * labWidth + j] = 500 * (xyz[0] - xyz[1]); - b[i * labWidth + j] = 200 * (xyz[1] - xyz[2]); - } - } -} - - -/** -* 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) - -void RawImageSource::xtransborder_interpolate (int border) -{ - const int height = H, width = W; - - int xtrans[6][6]; - ri->getXtransMatrix(xtrans); - - for (int row = 0; row < height; row++) - for (int col = 0; col < width; col++) { - if (col == border && row >= border && row < height - border) { - col = width - border; - } - - float sum[6] = {0.f}; - - for (int y = MAX(0, row - 1); y <= MIN(row + 1, height - 1); y++) - for (int x = MAX(0, col - 1); x <= MIN(col + 1, width - 1); x++) { - int f = fcol(y, x); - sum[f] += rawData[y][x]; - sum[f + 3]++; - } - - switch(fcol(row, col)) { - case 0: - red[row][col] = rawData[row][col]; - green[row][col] = (sum[1] / sum[4]); - blue[row][col] = (sum[2] / sum[5]); - break; - - case 1: - if(sum[3] == 0.f) { // at the 4 corner pixels it can happen, that we have only green pixels in 2x2 area - red[row][col] = green[row][col] = blue[row][col] = rawData[row][col]; - } else { - red[row][col] = (sum[0] / sum[3]); - green[row][col] = rawData[row][col]; - blue[row][col] = (sum[2] / sum[5]); - } - - break; - - case 2: - red[row][col] = (sum[0] / sum[3]); - green[row][col] = (sum[1] / sum[4]); - blue[row][col] = rawData[row][col]; - } - } -} - -/* - Frank Markesteijn's algorithm for Fuji X-Trans sensors - adapted to RT by Ingo Weyrich 2014 -*/ -// override CLIP function to test unclipped output -#define CLIP(x) (x) -void RawImageSource::xtrans_interpolate (const int passes, const bool useCieLab) -{ - BENCHFUN - constexpr int ts = 114; /* Tile Size */ - constexpr int tsh = ts / 2; /* half of Tile Size */ - - double progress = 0.0; - const bool plistenerActive = plistener; - - if (plistenerActive) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), "Xtrans")); - plistener->setProgress (progress); - } - - int xtrans[6][6]; - ri->getXtransMatrix(xtrans); - - constexpr 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 }; - - // sgrow/sgcol is the offset in the sensor matrix of the solitary - // green pixels - ushort sgrow = 0, sgcol = 0; - - const int height = H, width = W; - - if (settings->verbose) { - printf("%d-pass X-Trans interpolation using %s conversion...\n", passes, useCieLab ? "lab" : "yuv"); - } - - xtransborder_interpolate(6); - - float xyz_cam[3][3]; - { - float rgb_cam[3][4]; - ri->getRgbCam(rgb_cam); - int k; - - for (int i = 0; i < 3; i++) - for (int j = 0; j < 3; 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]; - } - } - - /* Map a green hexagon around each non-green pixel and vice versa: */ - short allhex[2][3][3][8]; - { - int gint, d, h, v, ng, row, col, c; - - for (row = 0; row < 3; row++) - for (col = 0; col < 3; col++) { - gint = isgreen(row, col); - - for (ng = d = 0; d < 10; d += 2) { - if (isgreen(row + orth[d] + 6, col + orth[d + 2] + 6)) { - ng = 0; - } else { - ng++; - } - - if (ng == 4) { - // if there are four non-green pixels adjacent in cardinal - // directions, this is the solitary green pixel - sgrow = row; - sgcol = col; - } - - if (ng == gint + 1) - FORC(8) { - v = orth[d] * patt[gint][c * 2] + orth[d + 1] * patt[gint][c * 2 + 1]; - h = orth[d + 2] * patt[gint][c * 2] + orth[d + 3] * patt[gint][c * 2 + 1]; - allhex[0][row][col][c ^ (gint * 2 & d)] = h + v * width; - allhex[1][row][col][c ^ (gint * 2 & d)] = h + v * ts; - } - } - } - - } - - if(plistenerActive) { - progress += 0.05; - plistener->setProgress(progress); - } - - - double progressInc = 36.0 * (1.0 - progress) / ((H * W) / ((ts - 16) * (ts - 16))); - const int ndir = 4 << (passes > 1); - cielab (nullptr, nullptr, nullptr, nullptr, 0, 0, 0, nullptr); - struct s_minmaxgreen { - float min; - float max; - }; - - int RightShift[3]; - - for(int row = 0; row < 3; row++) { - // count number of green pixels in three cols - int greencount = 0; - - for(int col = 0; col < 3; col++) { - greencount += isgreen(row, col); - } - - RightShift[row] = (greencount == 2); - } - -#ifdef _OPENMP - #pragma omp parallel -#endif - { - int progressCounter = 0; - int c; - float color[3][6]; - - float *buffer = (float *) malloc ((ts * ts * (ndir * 4 + 3) + 128) * sizeof(float)); - float (*rgb)[ts][ts][3] = (float(*)[ts][ts][3]) buffer; - float (*lab)[ts - 8][ts - 8] = (float (*)[ts - 8][ts - 8])(buffer + ts * ts * (ndir * 3)); - float (*drv)[ts - 10][ts - 10] = (float (*)[ts - 10][ts - 10]) (buffer + ts * ts * (ndir * 3 + 3)); - uint8_t (*homo)[ts][ts] = (uint8_t (*)[ts][ts]) (lab); // we can reuse the lab-buffer because they are not used together - s_minmaxgreen (*greenminmaxtile)[tsh] = (s_minmaxgreen(*)[tsh]) (lab); // we can reuse the lab-buffer because they are not used together - uint8_t (*homosum)[ts][ts] = (uint8_t (*)[ts][ts]) (drv); // we can reuse the drv-buffer because they are not used together - uint8_t (*homosummax)[ts] = (uint8_t (*)[ts]) homo[ndir - 1]; // we can reuse the homo-buffer because they are not used together - -#ifdef _OPENMP - #pragma omp for collapse(2) schedule(dynamic) nowait -#endif - - for (int top = 3; top < height - 19; top += ts - 16) - for (int left = 3; left < width - 19; left += ts - 16) { - int mrow = MIN (top + ts, height - 3); - int mcol = MIN (left + ts, width - 3); - - /* Set greenmin and greenmax to the minimum and maximum allowed values: */ - for (int row = top; row < mrow; row++) { - // find first non-green pixel - int leftstart = left; - - for(; leftstart < mcol; leftstart++) - if(!isgreen(row, leftstart)) { - break; - } - - int coloffset = (RightShift[row % 3] == 1 ? 3 : 1 + (fcol(row, leftstart + 1) & 1)); - - if(coloffset == 3) { - short *hex = allhex[0][row % 3][leftstart % 3]; - - for (int col = leftstart; col < mcol; col += coloffset) { - float minval = FLT_MAX; - float maxval = 0.f; - float *pix = &rawData[row][col]; - - for(int c = 0; c < 6; c++) { - float val = pix[hex[c]]; - - minval = minval < val ? minval : val; - maxval = maxval > val ? maxval : val; - } - - greenminmaxtile[row - top][(col - left) >> 1].min = minval; - greenminmaxtile[row - top][(col - left) >> 1].max = maxval; - } - } else { - float minval = FLT_MAX; - float maxval = 0.f; - int col = leftstart; - - if(coloffset == 2) { - minval = FLT_MAX; - maxval = 0.f; - float *pix = &rawData[row][col]; - short *hex = allhex[0][row % 3][col % 3]; - - for(int c = 0; c < 6; c++) { - float val = pix[hex[c]]; - - minval = minval < val ? minval : val; - maxval = maxval > val ? maxval : val; - } - - greenminmaxtile[row - top][(col - left) >> 1].min = minval; - greenminmaxtile[row - top][(col - left) >> 1].max = maxval; - col += 2; - } - - short *hex = allhex[0][row % 3][col % 3]; - - for (; col < mcol - 1; col += 3) { - minval = FLT_MAX; - maxval = 0.f; - float *pix = &rawData[row][col]; - - for(int c = 0; c < 6; c++) { - float val = pix[hex[c]]; - - minval = minval < val ? minval : val; - maxval = maxval > val ? maxval : val; - } - - greenminmaxtile[row - top][(col - left) >> 1].min = minval; - greenminmaxtile[row - top][(col - left) >> 1].max = maxval; - greenminmaxtile[row - top][(col + 1 - left) >> 1].min = minval; - greenminmaxtile[row - top][(col + 1 - left) >> 1].max = maxval; - } - - if(col < mcol) { - minval = FLT_MAX; - maxval = 0.f; - float *pix = &rawData[row][col]; - - for(int c = 0; c < 6; c++) { - float val = pix[hex[c]]; - - minval = minval < val ? minval : val; - maxval = maxval > val ? maxval : val; - } - - greenminmaxtile[row - top][(col - left) >> 1].min = minval; - greenminmaxtile[row - top][(col - left) >> 1].max = maxval; - } - } - } - - memset(rgb, 0, ts * ts * 3 * sizeof(float)); - - for (int row = top; row < mrow; row++) - for (int col = left; col < mcol; col++) { - rgb[0][row - top][col - left][fcol(row, col)] = rawData[row][col]; - } - - for(int c = 0; c < 3; c++) { - memcpy (rgb[c + 1], rgb[0], sizeof * rgb); - } - - /* Interpolate green horizontally, vertically, and along both diagonals: */ - for (int row = top; row < mrow; row++) { - // find first non-green pixel - int leftstart = left; - - for(; leftstart < mcol; leftstart++) - if(!isgreen(row, leftstart)) { - break; - } - - int coloffset = (RightShift[row % 3] == 1 ? 3 : 1 + (fcol(row, leftstart + 1) & 1)); - - if(coloffset == 3) { - short *hex = allhex[0][row % 3][leftstart % 3]; - - for (int col = leftstart; col < mcol; col += coloffset) { - float *pix = &rawData[row][col]; - float color[4]; - color[0] = 0.6796875f * (pix[hex[1]] + pix[hex[0]]) - - 0.1796875f * (pix[2 * hex[1]] + pix[2 * hex[0]]); - color[1] = 0.87109375f * pix[hex[3]] + pix[hex[2]] * 0.12890625f + - 0.359375f * (pix[0] - pix[-hex[2]]); - - for(int c = 0; c < 2; c++) - color[2 + c] = 0.640625f * pix[hex[4 + c]] + 0.359375f * pix[-2 * hex[4 + c]] + 0.12890625f * - (2.f * pix[0] - pix[3 * hex[4 + c]] - pix[-3 * hex[4 + c]]); - - for(int c = 0; c < 4; c++) { - rgb[c][row - top][col - left][1] = LIM(color[c], greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); - } - } - } else { - short *hexmod[2]; - hexmod[0] = allhex[0][row % 3][leftstart % 3]; - hexmod[1] = allhex[0][row % 3][(leftstart + coloffset) % 3]; - - for (int col = leftstart, hexindex = 0; col < mcol; col += coloffset, coloffset ^= 3, hexindex ^= 1) { - float *pix = &rawData[row][col]; - short *hex = hexmod[hexindex]; - float color[4]; - color[0] = 0.6796875f * (pix[hex[1]] + pix[hex[0]]) - - 0.1796875f * (pix[2 * hex[1]] + pix[2 * hex[0]]); - color[1] = 0.87109375f * pix[hex[3]] + pix[hex[2]] * 0.12890625f + - 0.359375f * (pix[0] - pix[-hex[2]]); - - for(int c = 0; c < 2; c++) - color[2 + c] = 0.640625f * pix[hex[4 + c]] + 0.359375f * pix[-2 * hex[4 + c]] + 0.12890625f * - (2.f * pix[0] - pix[3 * hex[4 + c]] - pix[-3 * hex[4 + c]]); - - for(int c = 0; c < 4; c++) { - rgb[c ^ 1][row - top][col - left][1] = LIM(color[c], greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); - } - } - } - } - - for (int 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 (int row = top + 2; row < mrow - 2; row++) { - int leftstart = left + 2; - - for(; leftstart < mcol - 2; leftstart++) - if(!isgreen(row, leftstart)) { - break; - } - - int coloffset = (RightShift[row % 3] == 1 ? 3 : 1 + (fcol(row, leftstart + 1) & 1)); - - if(coloffset == 3) { - int f = fcol(row, leftstart); - short *hex = allhex[1][row % 3][leftstart % 3]; - - for (int col = leftstart; col < mcol - 2; col += coloffset, f ^= 2) { - for (int d = 3; d < 6; d++) { - float (*rix)[3] = &rgb[(d - 2)][row - top][col - left]; - float val = 0.33333333f * (rix[-2 * hex[d]][1] + 2 * (rix[hex[d]][1] - rix[hex[d]][f]) - - rix[-2 * hex[d]][f]) + rix[0][f]; - rix[0][1] = LIM(val, greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); - } - } - } else { - int f = fcol(row, leftstart); - short *hexmod[2]; - hexmod[0] = allhex[1][row % 3][leftstart % 3]; - hexmod[1] = allhex[1][row % 3][(leftstart + coloffset) % 3]; - - for (int col = leftstart, hexindex = 0; col < mcol - 2; col += coloffset, coloffset ^= 3, f = f ^ (coloffset & 2), hexindex ^= 1 ) { - short *hex = hexmod[hexindex]; - - for (int d = 3; d < 6; d++) { - float (*rix)[3] = &rgb[(d - 2) ^ 1][row - top][col - left]; - float val = 0.33333333f * (rix[-2 * hex[d]][1] + 2 * (rix[hex[d]][1] - rix[hex[d]][f]) - - rix[-2 * hex[d]][f]) + rix[0][f]; - rix[0][1] = LIM(val, greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); - } - } - } - } - } - - /* Interpolate red and blue values for solitary green pixels: */ - int sgstartcol = (left - sgcol + 4) / 3 * 3 + sgcol; - - for (int row = (top - sgrow + 4) / 3 * 3 + sgrow; row < mrow - 2; row += 3) { - for (int col = sgstartcol, h = fcol(row, col + 1); col < mcol - 2; col += 3, h ^= 2) { - float (*rix)[3] = &rgb[0][row - top][col - left]; - float diff[6] = {0.f}; - - for (int i = 1, d = 0; d < 6; d++, i ^= ts ^ 1, h ^= 2) { - for (int c = 0; c < 2; c++, h ^= 2) { - float g = rix[0][1] + rix[0][1] - rix[i << c][1] - rix[-i << c][1]; - color[h][d] = g + rix[i << c][h] + rix[-i << c][h]; - - if (d > 1) - diff[d] += SQR (rix[i << c][1] - rix[-i << c][1] - - rix[i << c][h] + rix[-i << c][h]) + SQR(g); - } - - if (d > 2 && (d & 1)) // 3, 5 - if (diff[d - 1] < diff[d]) - for(int c = 0; c < 2; c++) { - color[c * 2][d] = color[c * 2][d - 1]; - } - - if ((d & 1) || d < 2) { // d: 0, 1, 3, 5 - for(int c = 0; c < 2; c++) { - rix[0][c * 2] = CLIP(0.5f * color[c * 2][d]); - } - - rix += ts * ts; - } - } - } - } - - /* Interpolate red for blue pixels and vice versa: */ - for (int row = top + 3; row < mrow - 3; row++) { - int leftstart = left + 3; - - for(; leftstart < mcol - 1; leftstart++) - if(!isgreen(row, leftstart)) { - break; - } - - int coloffset = (RightShift[row % 3] == 1 ? 3 : 1); - c = (row - sgrow) % 3 ? ts : 1; - int h = 3 * (c ^ ts ^ 1); - - if(coloffset == 3) { - int f = 2 - fcol(row, leftstart); - - for (int col = leftstart; col < mcol - 3; col += coloffset, f ^= 2) { - float (*rix)[3] = &rgb[0][row - top][col - left]; - - for (int d = 0; d < 4; d++, rix += ts * ts) { - int i = d > 1 || ((d ^ c) & 1) || - ((fabsf(rix[0][1] - rix[c][1]) + fabsf(rix[0][1] - rix[-c][1])) < 2.f * (fabsf(rix[0][1] - rix[h][1]) + fabsf(rix[0][1] - rix[-h][1]))) ? c : h; - - rix[0][f] = CLIP(rix[0][1] + 0.5f * (rix[i][f] + rix[-i][f] - rix[i][1] - rix[-i][1])); - } - } - } else { - coloffset = fcol(row, leftstart + 1) == 1 ? 2 : 1; - int f = 2 - fcol(row, leftstart); - - for (int col = leftstart; col < mcol - 3; col += coloffset, coloffset ^= 3, f = f ^ (coloffset & 2) ) { - float (*rix)[3] = &rgb[0][row - top][col - left]; - - for (int d = 0; d < 4; d++, rix += ts * ts) { - int i = d > 1 || ((d ^ c) & 1) || - ((fabsf(rix[0][1] - rix[c][1]) + fabsf(rix[0][1] - rix[-c][1])) < 2.f * (fabsf(rix[0][1] - rix[h][1]) + fabsf(rix[0][1] - rix[-h][1]))) ? c : h; - - rix[0][f] = CLIP(rix[0][1] + 0.5f * (rix[i][f] + rix[-i][f] - rix[i][1] - rix[-i][1])); - } - } - } - } - - /* Fill in red and blue for 2x2 blocks of green: */ - // Find first row of 2x2 green - int topstart = top + 2; - - for(; topstart < mrow - 2; topstart++) - if((topstart - sgrow) % 3) { - break; - } - - int leftstart = left + 2; - - for(; leftstart < mcol - 2; leftstart++) - if((leftstart - sgcol) % 3) { - break; - } - - int coloffsetstart = 2 - (fcol(topstart, leftstart + 1) & 1); - - for (int row = topstart; row < mrow - 2; row++) { - if ((row - sgrow) % 3) { - short *hexmod[2]; - hexmod[0] = allhex[1][row % 3][leftstart % 3]; - hexmod[1] = allhex[1][row % 3][(leftstart + coloffsetstart) % 3]; - - for (int col = leftstart, coloffset = coloffsetstart, hexindex = 0; col < mcol - 2; col += coloffset, coloffset ^= 3, hexindex ^= 1) { - float (*rix)[3] = &rgb[0][row - top][col - left]; - short *hex = hexmod[hexindex]; - - for (int d = 0; d < ndir; d += 2, rix += ts * ts) { - if (hex[d] + hex[d + 1]) { - float 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]) * 0.33333333f); - } - } else { - float 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]) * 0.5f); - } - } - } - } - } - } - } - -// end of multipass part - rgb = (float(*)[ts][ts][3]) buffer; - mrow -= top; - mcol -= left; - - if(useCieLab) { - /* Convert to CIELab and differentiate in all directions: */ - // Original dcraw algorithm uses CIELab as perceptual space - // (presumably coming from original AHD) and converts taking - // camera matrix into account. We use this in RT. - for (int d = 0; d < ndir; d++) { - float *l = &lab[0][0][0]; - float *a = &lab[1][0][0]; - float *b = &lab[2][0][0]; - cielab(&rgb[d][4][4], l, a, b, ts, mrow - 8, ts - 8, xyz_cam); - int f = dir[d & 3]; - f = f == 1 ? 1 : f - 8; - - for (int row = 5; row < mrow - 5; row++) -#ifdef _OPENMP - #pragma omp simd -#endif - for (int col = 5; col < mcol - 5; col++) { - float *l = &lab[0][row - 4][col - 4]; - float *a = &lab[1][row - 4][col - 4]; - float *b = &lab[2][row - 4][col - 4]; - - float g = 2 * l[0] - l[f] - l[-f]; - drv[d][row - 5][col - 5] = SQR(g) - + SQR((2 * a[0] - a[f] - a[-f] + g * 2.1551724f)) - + SQR((2 * b[0] - b[f] - b[-f] - g * 0.86206896f)); - } - - } - } else { - // For 1-pass demosaic we use YPbPr which requires much - // less code and is nearly indistinguishable. It assumes the - // camera RGB is roughly linear. - for (int d = 0; d < ndir; d++) { - float (*yuv)[ts - 8][ts - 8] = lab; // we use the lab buffer, which has the same dimensions -#ifdef __SSE2__ - vfloat zd2627v = F2V(0.2627f); - vfloat zd6780v = F2V(0.6780f); - vfloat zd0593v = F2V(0.0593f); - vfloat zd56433v = F2V(0.56433f); - vfloat zd67815v = F2V(0.67815f); -#endif - - for (int row = 4; row < mrow - 4; row++) { - int col = 4; -#ifdef __SSE2__ - - for (; col < mcol - 7; col += 4) { - // use ITU-R BT.2020 YPbPr, which is great, but could use - // a better/simpler choice? note that imageop.h provides - // dt_iop_RGB_to_YCbCr which uses Rec. 601 conversion, - // which appears less good with specular highlights - vfloat redv, greenv, bluev; - vconvertrgbrgbrgbrgb2rrrrggggbbbb(rgb[d][row][col], redv, greenv, bluev); - vfloat yv = zd2627v * redv + zd6780v * bluev + zd0593v * greenv; - STVFU(yuv[0][row - 4][col - 4], yv); - STVFU(yuv[1][row - 4][col - 4], (bluev - yv) * zd56433v); - STVFU(yuv[2][row - 4][col - 4], (redv - yv) * zd67815v); - } - -#endif - - for (; col < mcol - 4; col++) { - // use ITU-R BT.2020 YPbPr, which is great, but could use - // a better/simpler choice? note that imageop.h provides - // dt_iop_RGB_to_YCbCr which uses Rec. 601 conversion, - // which appears less good with specular highlights - float y = 0.2627f * rgb[d][row][col][0] + 0.6780f * rgb[d][row][col][1] + 0.0593f * rgb[d][row][col][2]; - yuv[0][row - 4][col - 4] = y; - yuv[1][row - 4][col - 4] = (rgb[d][row][col][2] - y) * 0.56433f; - yuv[2][row - 4][col - 4] = (rgb[d][row][col][0] - y) * 0.67815f; - } - } - - int f = dir[d & 3]; - f = f == 1 ? 1 : f - 8; - - for (int row = 5; row < mrow - 5; row++) - for (int col = 5; col < mcol - 5; col++) { - float *y = &yuv[0][row - 4][col - 4]; - float *u = &yuv[1][row - 4][col - 4]; - float *v = &yuv[2][row - 4][col - 4]; - drv[d][row - 5][col - 5] = SQR(2 * y[0] - y[f] - y[-f]) - + SQR(2 * u[0] - u[f] - u[-f]) - + SQR(2 * v[0] - v[f] - v[-f]); - } - } - } - - /* Build homogeneity maps from the derivatives: */ -#ifdef __SSE2__ - vfloat eightv = F2V(8.f); - vfloat zerov = F2V(0.f); - vfloat onev = F2V(1.f); -#endif - - for (int row = 6; row < mrow - 6; row++) { - int col = 6; -#ifdef __SSE2__ - - for (; col < mcol - 9; col += 4) { - vfloat tr1v = vminf(LVFU(drv[0][row - 5][col - 5]), LVFU(drv[1][row - 5][col - 5])); - vfloat tr2v = vminf(LVFU(drv[2][row - 5][col - 5]), LVFU(drv[3][row - 5][col - 5])); - - if(ndir > 4) { - vfloat tr3v = vminf(LVFU(drv[4][row - 5][col - 5]), LVFU(drv[5][row - 5][col - 5])); - vfloat tr4v = vminf(LVFU(drv[6][row - 5][col - 5]), LVFU(drv[7][row - 5][col - 5])); - tr1v = vminf(tr1v, tr3v); - tr1v = vminf(tr1v, tr4v); - } - - tr1v = vminf(tr1v, tr2v); - tr1v = tr1v * eightv; - - for (int d = 0; d < ndir; d++) { - uint8_t tempstore[16]; - vfloat tempv = zerov; - - for (int v = -1; v <= 1; v++) { - for (int h = -1; h <= 1; h++) { - tempv += vselfzero(vmaskf_le(LVFU(drv[d][row + v - 5][col + h - 5]), tr1v), onev); - } - } - - _mm_storeu_si128((__m128i*)&tempstore, _mm_cvtps_epi32(tempv)); - homo[d][row][col] = tempstore[0]; - homo[d][row][col + 1] = tempstore[4]; - homo[d][row][col + 2] = tempstore[8]; - homo[d][row][col + 3] = tempstore[12]; - - } - } - -#endif - - for (; col < mcol - 6; col++) { - float tr = drv[0][row - 5][col - 5] < drv[1][row - 5][col - 5] ? drv[0][row - 5][col - 5] : drv[1][row - 5][col - 5]; - - for (int d = 2; d < ndir; d++) { - tr = (drv[d][row - 5][col - 5] < tr ? drv[d][row - 5][col - 5] : tr); - } - - tr *= 8; - - for (int d = 0; d < ndir; d++) { - uint8_t temp = 0; - - for (int v = -1; v <= 1; v++) { - for (int h = -1; h <= 1; h++) { - temp += (drv[d][row + v - 5][col + h - 5] <= tr ? 1 : 0); - } - } - - homo[d][row][col] = temp; - } - } - } - - if (height - top < ts + 4) { - mrow = height - top + 2; - } - - if (width - left < ts + 4) { - mcol = width - left + 2; - } - - - /* Build 5x5 sum of homogeneity maps */ - const int startcol = MIN(left, 8); - - for(int d = 0; d < ndir; d++) { - for (int row = MIN(top, 8); row < mrow - 8; row++) { - int col = startcol; -#ifdef __SSE2__ - int endcol = row < mrow - 9 ? mcol - 8 : mcol - 23; - - // crunching 16 values at once is faster than summing up column sums - for (; col < endcol; col += 16) { - vint v5sumv = (vint)ZEROV; - - for(int v = -2; v <= 2; v++) - for(int h = -2; h <= 2; h++) { - v5sumv = _mm_adds_epu8( _mm_loadu_si128((vint*)&homo[d][row + v][col + h]), v5sumv); - } - - _mm_storeu_si128((vint*)&homosum[d][row][col], v5sumv); - } - -#endif - - if(col < mcol - 8) { - int v5sum[5] = {0}; - - for(int v = -2; v <= 2; v++) - for(int h = -2; h <= 2; h++) { - v5sum[2 + h] += homo[d][row + v][col + h]; - } - - int blocksum = v5sum[0] + v5sum[1] + v5sum[2] + v5sum[3] + v5sum[4]; - homosum[d][row][col] = blocksum; - col++; - - // now we can subtract a column of five from blocksum and get new colsum of 5 - for (int voffset = 0; col < mcol - 8; col++, voffset++) { - int colsum = homo[d][row - 2][col + 2] + homo[d][row - 1][col + 2] + homo[d][row][col + 2] + homo[d][row + 1][col + 2] + homo[d][row + 2][col + 2]; - voffset = voffset == 5 ? 0 : voffset; // faster than voffset %= 5; - blocksum -= v5sum[voffset]; - blocksum += colsum; - v5sum[voffset] = colsum; - homosum[d][row][col] = blocksum; - } - } - } - } - - // calculate maximum of homogeneity maps per pixel. Vectorized calculation is a tiny bit faster than on the fly calculation in next step -#ifdef __SSE2__ - vint maskv = _mm_set1_epi8(31); -#endif - - for (int row = MIN(top, 8); row < mrow - 8; row++) { - int col = startcol; -#ifdef __SSE2__ - int endcol = row < mrow - 9 ? mcol - 8 : mcol - 23; - - for (; col < endcol; col += 16) { - vint maxval1 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[0][row][col]), _mm_loadu_si128((vint*)&homosum[1][row][col])); - vint maxval2 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[2][row][col]), _mm_loadu_si128((vint*)&homosum[3][row][col])); - - if(ndir > 4) { - vint maxval3 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[4][row][col]), _mm_loadu_si128((vint*)&homosum[5][row][col])); - vint maxval4 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[6][row][col]), _mm_loadu_si128((vint*)&homosum[7][row][col])); - maxval1 = _mm_max_epu8(maxval1, maxval3); - maxval1 = _mm_max_epu8(maxval1, maxval4); - } - - maxval1 = _mm_max_epu8(maxval1, maxval2); - // there is no shift intrinsic for epu8. Shift using epi32 and mask the wrong bits out - vint subv = _mm_srli_epi32( maxval1, 3 ); - subv = _mm_and_si128(subv, maskv); - maxval1 = _mm_subs_epu8(maxval1, subv); - _mm_storeu_si128((vint*)&homosummax[row][col], maxval1); - } - -#endif - - for (; col < mcol - 8; col ++) { - uint8_t maxval = homosum[0][row][col]; - - for(int d = 1; d < ndir; d++) { - maxval = maxval < homosum[d][row][col] ? homosum[d][row][col] : maxval; - } - - maxval -= maxval >> 3; - homosummax[row][col] = maxval; - } - } - - - /* Average the most homogeneous pixels for the final result: */ - uint8_t hm[8] = {}; - - for (int row = MIN(top, 8); row < mrow - 8; row++) - for (int col = MIN(left, 8); col < mcol - 8; col++) { - - for (int d = 0; d < 4; d++) { - hm[d] = homosum[d][row][col]; - } - - for (int d = 4; d < ndir; d++) { - hm[d] = homosum[d][row][col]; - - if (hm[d - 4] < hm[d]) { - hm[d - 4] = 0; - } else if (hm[d - 4] > hm[d]) { - hm[d] = 0; - } - } - - float avg[4] = {0.f}; - - uint8_t maxval = homosummax[row][col]; - - for (int d = 0; d < ndir; d++) - if (hm[d] >= maxval) { - FORC3 avg[c] += rgb[d][row][col][c]; - avg[3]++; - } - - red[row + top][col + left] = avg[0] / avg[3]; - green[row + top][col + left] = avg[1] / avg[3]; - blue[row + top][col + left] = avg[2] / avg[3]; - } - - if(plistenerActive && ((++progressCounter) % 32 == 0)) { -#ifdef _OPENMP - #pragma omp critical (xtransdemosaic) -#endif - { - progress += progressInc; - progress = min(1.0, progress); - plistener->setProgress (progress); - } - } - - - } - - free(buffer); - } - -} -#undef CLIP -void RawImageSource::fast_xtrans_interpolate () -{ - if (settings->verbose) { - printf("fast X-Trans interpolation...\n"); - } - - double progress = 0.0; - const bool plistenerActive = plistener; - - if (plistenerActive) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), "fast Xtrans")); - plistener->setProgress (progress); - } - - const int height = H, width = W; - - xtransborder_interpolate (1); - int xtrans[6][6]; - ri->getXtransMatrix(xtrans); - - #pragma omp parallel for - - for(int row = 1; row < height - 1; row++) { - for(int col = 1; col < width - 1; col++) { - float sum[3] = {0.f}; - - for(int v = -1; v <= 1; v++) { - for(int h = -1; h <= 1; h++) { - sum[fcol(row + v, col + h)] += rawData[row + v][(col + h)]; - } - } - - switch(fcol(row, col)) { - case 0: - red[row][col] = rawData[row][col]; - green[row][col] = sum[1] * 0.2f; - blue[row][col] = sum[2] * 0.33333333f; - break; - - case 1: - red[row][col] = sum[0] * 0.5f; - green[row][col] = rawData[row][col]; - blue[row][col] = sum[2] * 0.5f; - break; - - case 2: - red[row][col] = sum[0] * 0.33333333f; - green[row][col] = sum[1] * 0.2f; - blue[row][col] = rawData[row][col]; - break; - } - } - } - - if (plistenerActive) { - plistener->setProgress (1.0); - } -} -#undef fcol -#undef isgreen - - #undef TILEBORDER #undef TILESIZE #undef CACHESIZE diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index a8d31f0ac..5f1035a8e 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -136,7 +136,7 @@ void dfInfo::updateRawImage() 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; @@ -219,10 +219,14 @@ void dfInfo::updateBadPixelList( RawImage *df ) if( df->getSensorType() == ST_BAYER || df->getSensorType() == ST_FUJI_XTRANS ) { std::vector badPixelsTemp; +#ifdef _OPENMP #pragma omp parallel +#endif { std::vector badPixelsThread; +#ifdef _OPENMP #pragma omp for nowait +#endif for( int row = 2; row < df->get_height() - 2; row++) for( int col = 2; col < df->get_width() - 2; col++) { @@ -235,7 +239,9 @@ void dfInfo::updateBadPixelList( RawImage *df ) } } +#ifdef _OPENMP #pragma omp critical +#endif badPixelsTemp.insert(badPixelsTemp.end(), badPixelsThread.begin(), badPixelsThread.end()); } badPixels.insert(badPixels.end(), badPixelsTemp.begin(), badPixelsTemp.end()); @@ -363,7 +369,7 @@ dfInfo* DFManager::addFileInfo (const Glib::ustring& filename, bool pool) } RawImage ri(filename); - int res = ri.loadRaw(false); // Read informations about shot + int res = ri.loadRaw(false); // Read information about shot if (res != 0) { return nullptr; diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc index 3f885782c..b4c88fd68 100644 --- a/rtengine/diagonalcurves.cc +++ b/rtengine/diagonalcurves.cc @@ -35,11 +35,11 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) 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) { @@ -48,7 +48,7 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) bool identity = true; kind = (DiagonalCurveType)p[0]; - if (kind == DCT_Linear || kind == DCT_Spline || kind == DCT_NURBS) { + if (kind == DCT_Linear || kind == DCT_Spline || kind == DCT_NURBS || kind == DCT_CatumullRom) { N = (p.size() - 1) / 2; x = new double[N]; y = new double[N]; @@ -90,6 +90,8 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn) } else if (kind == DCT_NURBS && N > 2) { NURBS_set (); fillHash(); + } else if (kind == DCT_CatumullRom && N > 2) { + catmull_rom_set(); } else { kind = DCT_Linear; } @@ -270,6 +272,167 @@ void DiagonalCurve::NURBS_set () fillDyByDx(); } + +/***************************************************************************** + * Catmull Rom Spline + * (https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline) + *****************************************************************************/ + +namespace { + +inline double pow2(double x) +{ + return x*x; +} + + +inline double catmull_rom_tj(double ti, + double xi, double yi, + double xj, double yj) +{ + // see https://github.com/Beep6581/RawTherapee/pull/4701#issuecomment-414054187 + static constexpr double alpha = 0.375; + return pow(sqrt(pow2(xj-xi) + pow2(yj-yi)), alpha) + ti; +} + + +inline void catmull_rom_spline(int n_points, + double p0_x, double p0_y, + double p1_x, double p1_y, + double p2_x, double p2_y, + double p3_x, double p3_y, + std::vector &res_x, + std::vector &res_y) +{ + res_x.reserve(n_points); + res_y.reserve(n_points); + + double t0 = 0; + double t1 = catmull_rom_tj(t0, p0_x, p0_y, p1_x, p1_y); + double t2 = catmull_rom_tj(t1, p1_x, p1_y, p2_x, p2_y); + double t3 = catmull_rom_tj(t2, p2_x, p2_y, p3_x, p3_y); + + double space = (t2-t1) / n_points; + + double t; + int i; + double c, d, A1_x, A1_y, A2_x, A2_y, A3_x, A3_y; + double B1_x, B1_y, B2_x, B2_y, C_x, C_y; + + res_x.push_back(p1_x); + res_y.push_back(p1_y); + + // special case, a segment at 0 or 1 is computed exactly + if (p1_y == p2_y && (p1_y == 0 || p1_y == 1)) { + for (i = 1; i < n_points-1; ++i) { + t = p1_x + space * i; + if (t >= p2_x) { + break; + } + res_x.push_back(t); + res_y.push_back(p1_y); + } + } else { + for (i = 1; i < n_points-1; ++i) { + t = t1 + space * i; + + c = (t1 - t)/(t1 - t0); + d = (t - t0)/(t1 - t0); + A1_x = c * p0_x + d * p1_x; + A1_y = c * p0_y + d * p1_y; + + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + A2_x = c * p1_x + d * p2_x; + A2_y = c * p1_y + d * p2_y; + + c = (t3 - t)/(t3 - t2); + d = (t - t2)/(t3 - t2); + A3_x = c * p2_x + d * p3_x; + A3_y = c * p2_y + d * p3_y; + + c = (t2 - t)/(t2 - t0); + d = (t - t0)/(t2 - t0); + B1_x = c * A1_x + d * A2_x; + B1_y = c * A1_y + d * A2_y; + + c = (t3 - t)/(t3 - t1); + d = (t - t1)/(t3 - t1); + B2_x = c * A2_x + d * A3_x; + B2_y = c * A2_y + d * A3_y; + + c = (t2 - t)/(t2 - t1); + d = (t - t1)/(t2 - t1); + C_x = c * B1_x + d * B2_x; + C_y = c * B1_y + d * B2_y; + + res_x.push_back(C_x); + res_y.push_back(C_y); + } + } + + res_x.push_back(p2_x); + res_y.push_back(p2_y); +} + + +inline void catmull_rom_reflect(double px, double py, double cx, double cy, + double &rx, double &ry) +{ +#if 0 + double dx = px - cx; + double dy = py - cy; + rx = cx - dx; + ry = cy - dy; +#else + // see https://github.com/Beep6581/RawTherapee/pull/4701#issuecomment-414054187 + static constexpr double epsilon = 1e-5; + double dx = px - cx; + double dy = py - cy; + rx = cx - dx * 0.01; + ry = dx > epsilon ? (dy / dx) * (rx - cx) + cy : cy; +#endif +} + + +void catmull_rom_chain(int n_points, int n_cp, double *x, double *y, + std::vector &res_x, std::vector &res_y) +{ + double x_first, y_first; + double x_last, y_last; + catmull_rom_reflect(x[1], y[1], x[0], y[0], x_first, y_first); + catmull_rom_reflect(x[n_cp-2], y[n_cp-2], x[n_cp-1], y[n_cp-1], x_last, y_last); + + int segments = n_cp - 1; + + res_x.reserve(n_points); + res_y.reserve(n_points); + + for (int i = 0; i < segments; ++i) { + int n = max(int(n_points * (x[i+1] - x[i]) + 0.5), 2); + catmull_rom_spline( + n, i == 0 ? x_first : x[i-1], i == 0 ? y_first : y[i-1], + x[i], y[i], x[i+1], y[i+1], + i == segments-1 ? x_last : x[i+2], + i == segments-1 ? y_last : y[i+2], + res_x, res_y); + } +} + +} // namespace + + +void DiagonalCurve::catmull_rom_set() +{ + int n_points = max(ppn * 65, 65000); + poly_x.clear(); + poly_y.clear(); + catmull_rom_chain(n_points, N, x, y, poly_x, poly_y); +} + +/*****************************************************************************/ + + double DiagonalCurve::getVal (double t) const { @@ -300,7 +463,8 @@ double DiagonalCurve::getVal (double t) const } case DCT_Linear : - case DCT_Spline : { + case DCT_Spline : + { // values under and over the first and last point if (t > x[N - 1]) { return y[N - 1]; @@ -338,6 +502,19 @@ double DiagonalCurve::getVal (double t) const break; } + case DCT_CatumullRom: { + auto it = std::lower_bound(poly_x.begin(), poly_x.end(), t); + if (it == poly_x.end()) { + return poly_y.back(); + } + auto d = it - poly_x.begin(); + if (it+1 < poly_x.end() && t - *it > *(it+1) - t) { + ++d; + } + return LIM01(*(poly_y.begin() + d)); + break; + } + case DCT_NURBS : { // get the hash table entry by rounding the value (previously multiplied by "hashSize") unsigned short int i = (unsigned short int)(t * hashSize); diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc index e20bc04e7..4a30b48a8 100644 --- a/rtengine/dirpyr_equalizer.cc +++ b/rtengine/dirpyr_equalizer.cc @@ -40,14 +40,10 @@ 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, const double * mult, const double dirpyrThreshold, const double skinprot, float b_l, float t_l, float t_r, 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; - if(settings->verbose) { - printf("Dirpyr scaleprev=%i\n", scaleprev); - } - float atten123 = (float) settings->level123_cbdl; if(atten123 > 50.f) { @@ -105,10 +101,6 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, } - if(settings->verbose) { - printf("CbDL mult0=%f 1=%f 2=%f 3=%f 4=%f 5=%f\n", multi[0], multi[1], multi[2], multi[3], multi[4], multi[5]); - } - multi_array2D dirpyrlo (srcwidth, srcheight); level = 0; @@ -151,7 +143,9 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, } #ifdef __SSE2__ +#ifdef _OPENMP #pragma omp parallel for +#endif for(int i = 0; i < srcheight; i++) { int j; @@ -166,7 +160,9 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, } #else +#ifdef _OPENMP #pragma omp parallel for +#endif for(int i = 0; i < srcheight; i++) { for(int j = 0; j < srcwidth; j++) { @@ -182,16 +178,20 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, } #ifdef __SSE2__ +#ifdef _OPENMP #pragma omp parallel +#endif { __m128 div = _mm_set1_ps(327.68f); +#ifdef _OPENMP #pragma omp for +#endif for(int i = 0; i < srcheight; i++) { int j; for(j = 0; j < srcwidth - 3; j += 4) { - _mm_storeu_ps(&tmpChr[i][j], _mm_sqrt_ps(SQRV(LVFU(l_b[i][j])) + SQRV(LVFU(l_a[i][j]))) / div); + _mm_storeu_ps(&tmpChr[i][j], vsqrtf(SQRV(LVFU(l_b[i][j])) + SQRV(LVFU(l_a[i][j]))) / div); } for(; j < srcwidth; j++) { @@ -200,7 +200,9 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, } } #else +#ifdef _OPENMP #pragma omp parallel for +#endif for(int i = 0; i < srcheight; i++) { for(int j = 0; j < srcwidth; j++) { @@ -236,11 +238,13 @@ SSEFUNCTION void ImProcFunctions :: dirpyr_equalizer(float ** src, float ** dst, delete [] tmpHue; } +#ifdef _OPENMP #pragma omp parallel for +#endif 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? + dst[i][j] = /*CLIP*/(buffer[i][j]); // TODO: Really a clip necessary? } } @@ -367,7 +371,7 @@ void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float for (int i = 0; i < srcheight; i++) for (int j = 0; j < srcwidth; j++) { if(ncie->J_p[i][j] > 8.f && ncie->J_p[i][j] < 92.f) { - dst[i][j] = CLIP( buffer[i][j] ); // TODO: Really a clip necessary? + dst[i][j] = /*CLIP*/( buffer[i][j] ); // TODO: Really a clip necessary? } else { dst[i][j] = src[i][j]; } @@ -375,12 +379,12 @@ void ImProcFunctions :: dirpyr_equalizercam (CieImage *ncie, float ** src, float } 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? + 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 // calculate weights, compute directionally weighted average diff --git a/rtengine/dual_demosaic_RT.cc b/rtengine/dual_demosaic_RT.cc new file mode 100644 index 000000000..4873ee670 --- /dev/null +++ b/rtengine/dual_demosaic_RT.cc @@ -0,0 +1,140 @@ +//////////////////////////////////////////////////////////////// +// +// combine demosaic algorithms +// +// +// copyright (c) 2018 Ingo Weyrich +// +// blends output of two demosaicers based on contrast +// +// +// dual_demosaic_RT.cc 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. +// +// 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, see . +// +//////////////////////////////////////////////////////////////// + +#include "jaggedarray.h" +#include "rtengine.h" +#include "rawimagesource.h" +#include "rt_math.h" +#include "procparams.h" +//#define BENCHMARK +#include "StopWatch.h" +#include "rt_algo.h" + +using namespace std; + +namespace rtengine +{ + +void RawImageSource::dual_demosaic_RT(bool isBayer, const RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast) +{ + BENCHFUN + + if (contrast == 0.f && !autoContrast) { + // contrast == 0.0 means only first demosaicer will be used + if(isBayer) { + if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) ) { + amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) ) { + dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4) ) { + rcd_demosaic(options.chunkSizeRCD, options.measure); + } + } else { + if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) ) { + xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); + } else { + xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); + } + } + + return; + } + + array2D redTmp(winw, winh); + array2D greenTmp(winw, winh); + array2D blueTmp(winw, winh); + array2D L(winw, winh); + + if (isBayer) { + vng4_demosaic(rawData, redTmp, greenTmp, blueTmp); + + if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + amaze_demosaic_RT(0, 0, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) ) { + dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4) ) { + rcd_demosaic(options.chunkSizeRCD, options.measure); + } + } else { + if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) ) { + xtrans_interpolate (3, true, options.chunkSizeXT, options.measure); + } else { + xtrans_interpolate (1, false, options.chunkSizeXT, options.measure); + } + fast_xtrans_interpolate(rawData, redTmp, greenTmp, blueTmp); + } + + const float xyz_rgb[3][3] = { // XYZ from RGB + { 0.412453, 0.357580, 0.180423 }, + { 0.212671, 0.715160, 0.072169 }, + { 0.019334, 0.119193, 0.950227 } + }; + +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef _OPENMP + #pragma omp for +#endif + for(int i = 0; i < winh; ++i) { + Color::RGB2L(red[i], green[i], blue[i], L[i], xyz_rgb, winw); + } + } + // calculate contrast based blend factors to use vng4 in regions with low contrast + JaggedArray blend(winw, winh); + float contrastf = contrast / 100.f; + + buildBlendMask(L, blend, winw, winh, contrastf, 1.f, autoContrast); + contrast = contrastf * 100.f; + + // the following is split into 3 loops intentionally to avoid cache conflicts on CPUs with only 4-way cache +#ifdef _OPENMP + #pragma omp parallel for +#endif + for(int i = 0; i < winh; ++i) { + for(int j = 0; j < winw; ++j) { + red[i][j] = intp(blend[i][j], red[i][j], redTmp[i][j]); + } + } +#ifdef _OPENMP + #pragma omp parallel for +#endif + for(int i = 0; i < winh; ++i) { + for(int j = 0; j < winw; ++j) { + green[i][j] = intp(blend[i][j], green[i][j], greenTmp[i][j]); + } + } +#ifdef _OPENMP + #pragma omp parallel for +#endif + for(int i = 0; i < winh; ++i) { + for(int j = 0; j < winw; ++j) { + blue[i][j] = intp(blend[i][j], blue[i][j], blueTmp[i][j]); + } + } + +} +} diff --git a/rtengine/dynamicprofile.cc b/rtengine/dynamicprofile.cc index 1afc04446..7b7f2a517 100644 --- a/rtengine/dynamicprofile.cc +++ b/rtengine/dynamicprofile.cc @@ -80,7 +80,8 @@ bool DynamicProfileRule::matches (const rtengine::FramesMetaData *im) const && shutterspeed (im->getShutterSpeed()) && expcomp (im->getExpComp()) && camera (im->getCamera()) - && lens (im->getLens())); + && lens (im->getLens()) + && imagetype(im->getImageType(0))); } namespace @@ -208,6 +209,7 @@ bool DynamicProfileRules::loadRules() get_double_range (rule.expcomp, kf, group, "expcomp"); get_optional (rule.camera, kf, group, "camera"); get_optional (rule.lens, kf, group, "lens"); + get_optional (rule.imagetype, kf, group, "imagetype"); try { rule.profilepath = kf.get_string (group, "profilepath"); @@ -240,6 +242,7 @@ bool DynamicProfileRules::storeRules() set_double_range (kf, group, "expcomp", rule.expcomp); set_optional (kf, group, "camera", rule.camera); set_optional (kf, group, "lens", rule.lens); + set_optional (kf, group, "imagetype", rule.imagetype); kf.set_string (group, "profilepath", rule.profilepath); } diff --git a/rtengine/dynamicprofile.h b/rtengine/dynamicprofile.h index 4e6bbbba9..fc5c85e4c 100644 --- a/rtengine/dynamicprofile.h +++ b/rtengine/dynamicprofile.h @@ -59,6 +59,7 @@ public: Range expcomp; Optional camera; Optional lens; + Optional imagetype; Glib::ustring profilepath; }; diff --git a/rtengine/eahd_demosaic.cc b/rtengine/eahd_demosaic.cc new file mode 100644 index 000000000..18883586c --- /dev/null +++ b/rtengine/eahd_demosaic.cc @@ -0,0 +1,448 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2018 Gabor Horvath and other RawTherapee contributors + * Split out to own compilation unit and made speedup 2018 Ingo Weyrich (heckflosse67@gmx.de) + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include + +#include "color.h" +#include "rawimagesource.h" +#include "rawimagesource_i.h" +#include "jaggedarray.h" +#include "rawimage.h" +#include "iccmatrices.h" +#include "rt_math.h" +#include "../rtgui/multilangmgr.h" +#include "procparams.h" +//#define BENCHMARK +#include "StopWatch.h" + +using namespace std; + +namespace rtengine +{ + + +inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i) +{ + + for (int j = 0; j < W; j++) { + if (ri->ISGREEN(i, j)) { + agh[j] = rawData[i][j]; + agv[j] = rawData[i][j]; + } else { + int gh = 0; + int gv = 0; + + if (j > 1 && j < W - 2) { + gh = (-rawData[i][j - 2] + 2 * rawData[i][j - 1] + 2 * rawData[i][j] + 2 * rawData[i][j + 1] - rawData[i][j + 2]) / 4; + int maxgh = max(rawData[i][j - 1], rawData[i][j + 1]); + int mingh = min(rawData[i][j - 1], rawData[i][j + 1]); + + if (gh > maxgh) { + gh = maxgh; + } else if (gh < mingh) { + gh = mingh; + } + } else if (j == 0) { + gh = rawData[i][1]; + } else if (j == 1) { + gh = (rawData[i][0] + rawData[i][2]) / 2; + } else if (j == W - 1) { + gh = rawData[i][W - 2]; + } else if (j == W - 2) { + gh = (rawData[i][W - 1] + rawData[i][W - 3]) / 2; + } + + if (i > 1 && i < H - 2) { + gv = (-rawData[i - 2][j] + 2 * rawData[i - 1][j] + 2 * rawData[i][j] + 2 * rawData[i + 1][j] - rawData[i + 2][j]) / 4; + int maxgv = max(rawData[i - 1][j], rawData[i + 1][j]); + int mingv = min(rawData[i - 1][j], rawData[i + 1][j]); + + if (gv > maxgv) { + gv = maxgv; + } else if (gv < mingv) { + gv = mingv; + } + } else if (i == 0) { + gv = rawData[1][j]; + } else if (i == 1) { + gv = (rawData[0][j] + rawData[2][j]) / 2; + } else if (i == H - 1) { + gv = rawData[H - 2][j]; + } else if (i == H - 2) { + gv = (rawData[H - 1][j] + rawData[H - 3][j]) / 2; + } + + agh[j] = gh; + agv[j] = gv; + } + } +} + +inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i) +{ + const auto getPg = [pg](int index) { + return + pg + ? pg[index] + : 0.f; + }; + + const auto getNg = [ng](int index) { + return + ng + ? ng[index] + : 0.f; + }; + + float *nonGreen1 = ar; + float *nonGreen2 = ab; + + if ((ri->ISBLUE(i, 0) || ri->ISBLUE(i, 1))) { + std::swap(nonGreen1, nonGreen2); + } + int j = FC(i, 0) & 1; + if (j) { + // linear R-G interp. horizontally + float val1; + + val1 = cg[0] + rawData[i][1] - cg[1]; + + nonGreen1[0] = CLIP(val1); + // linear B-G interp. vertically + float val2; + + if (i == 0) { + val2 = getNg(0) + rawData[1][0] - cg[0]; + } else if (i == H - 1) { + val2 = getPg(0) + rawData[H - 2][0] - cg[0]; + } else { + val2 = cg[0] + (rawData[i - 1][0] - getPg(0) + rawData[i + 1][0] - getNg(0)) / 2; + } + + nonGreen2[0] = val2; + } + // RGRGR or GRGRGR line + for (; j < W - 1; j += 2) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; + + if (i > 0) { + if (j > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; + } + nonGreen += rawData[i - 1][j + 1] - getPg(j + 1); + n++; + } + + if (i < H - 1) { + if (j > 0) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + nonGreen += rawData[i + 1][j + 1] - getNg(j + 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / std::max(n, 1); + + // linear R-G interp. horizontally + float val1; + + if (j == W - 2) { + val1 = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; + } else { + val1 = cg[j + 1] + (rawData[i][j] - cg[j] + rawData[i][j + 2] - cg[j + 2]) / 2; + } + + nonGreen1[j + 1] = CLIP(val1); + // linear B-G interp. vertically + float val2; + + if (i == 0) { + val2 = getNg(j + 1) + rawData[1][j + 1] - cg[j + 1]; + } else if (i == H - 1) { + val2 = getPg(j + 1) + rawData[H - 2][j + 1] - cg[j + 1]; + } else { + val2 = cg[j + 1] + (rawData[i - 1][j + 1] - getPg(j + 1) + rawData[i + 1][j + 1] - getNg(j + 1)) / 2; + } + + nonGreen2[j + 1] = val2; + } + + if(j == W - 1) { + // nonGreen of row is simple + nonGreen1[j] = rawData[i][j]; + // non green of next row: cross interpolation + float nonGreen = 0.f; + int n = 0; + + if (i > 0) { + nonGreen += rawData[i - 1][j - 1] - getPg(j - 1); + n++; + } + + if (i < H - 1) { + nonGreen += rawData[i + 1][j - 1] - getNg(j - 1); + n++; + } + + nonGreen2[j] = cg[j] + nonGreen / std::max(n, 1); + } +} + +#define DIST(a,b) (std::fabs(a-b)) + +void RawImageSource::eahd_demosaic () +{ + BENCHFUN + if (plistener) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::EAHD))); + plistener->setProgress (0.0); + } + + // prepare constants for cielab conversion + //TODO: revisit after conversion to D50 illuminant + const float lc00 = (0.412453 * imatrices.rgb_cam[0][0] + 0.357580 * imatrices.rgb_cam[0][1] + 0.180423 * imatrices.rgb_cam[0][2]) ;// / 0.950456; + const float lc01 = (0.412453 * imatrices.rgb_cam[1][0] + 0.357580 * imatrices.rgb_cam[1][1] + 0.180423 * imatrices.rgb_cam[1][2]) ;// / 0.950456; + const float lc02 = (0.412453 * imatrices.rgb_cam[2][0] + 0.357580 * imatrices.rgb_cam[2][1] + 0.180423 * imatrices.rgb_cam[2][2]) ;// / 0.950456; + + const float lc10 = 0.212671 * imatrices.rgb_cam[0][0] + 0.715160 * imatrices.rgb_cam[0][1] + 0.072169 * imatrices.rgb_cam[0][2]; + const float lc11 = 0.212671 * imatrices.rgb_cam[1][0] + 0.715160 * imatrices.rgb_cam[1][1] + 0.072169 * imatrices.rgb_cam[1][2]; + const float lc12 = 0.212671 * imatrices.rgb_cam[2][0] + 0.715160 * imatrices.rgb_cam[2][1] + 0.072169 * imatrices.rgb_cam[2][2]; + + const float lc20 = (0.019334 * imatrices.rgb_cam[0][0] + 0.119193 * imatrices.rgb_cam[0][1] + 0.950227 * imatrices.rgb_cam[0][2]) ;// / 1.088754; + const float lc21 = (0.019334 * imatrices.rgb_cam[1][0] + 0.119193 * imatrices.rgb_cam[1][1] + 0.950227 * imatrices.rgb_cam[1][2]) ;// / 1.088754; + const float lc22 = (0.019334 * imatrices.rgb_cam[2][0] + 0.119193 * imatrices.rgb_cam[2][1] + 0.950227 * imatrices.rgb_cam[2][2]) ;// / 1.088754; + + const float wp[3][3] = {{lc00, lc01, lc02}, {lc10, lc11, lc12}, {lc20, lc21, lc22}}; + + // end of cielab preparation + + JaggedArray + rh (W, 3), gh (W, 4), bh (W, 3), + rv (W, 3), gv (W, 4), bv (W, 3), + lLh (W, 3), lah (W, 3), lbh (W, 3), + lLv (W, 3), lav (W, 3), lbv (W, 3); + JaggedArray homh (W, 3), homv (W, 3); + + // interpolate first two lines + interpolate_row_g (gh[0], gv[0], 0); + interpolate_row_g (gh[1], gv[1], 1); + interpolate_row_g (gh[2], gv[2], 2); + interpolate_row_rb (rh[0], bh[0], nullptr, gh[0], gh[1], 0); + interpolate_row_rb (rv[0], bv[0], nullptr, gv[0], gv[1], 0); + interpolate_row_rb (rh[1], bh[1], gh[0], gh[1], gh[2], 1); + interpolate_row_rb (rv[1], bv[1], gv[0], gv[1], gv[2], 1); + + Color::RGB2Lab(rh[0], gh[0], bh[0], lLh[0], lah[0], lbh[0], wp, W); + Color::RGB2Lab(rv[0], gv[0], bv[0], lLv[0], lav[0], lbv[0], wp, W); + Color::RGB2Lab(rh[1], gh[1], bh[1], lLh[1], lah[1], lbh[1], wp, W); + Color::RGB2Lab(rv[1], gv[1], bv[1], lLv[1], lav[1], lbv[1], wp, W); + + for (int j = 0; j < W; j++) { + homh[0][j] = 0; + homv[0][j] = 0; + homh[1][j] = 0; + homv[1][j] = 0; + } + + float dLmaph[9]; + float dLmapv[9]; + float dCamaph[9]; + float dCamapv[9]; + float dCbmaph[9]; + float dCbmapv[9]; + + for (int i = 1; i < H - 1; i++) { + int mod[3] = {(i-1) % 3, i % 3, (i+1) %3}; + int ix = i % 3; + int imx = (i - 1) % 3; + int ipx = (i + 1) % 3; + + if (i < H - 2) { + interpolate_row_g (gh[(i + 2) % 4], gv[(i + 2) % 4], i + 2); + interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], gh[(i + 2) % 4], i + 1); + interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], gv[(i + 2) % 4], i + 1); + } else { + interpolate_row_rb (rh[(i + 1) % 3], bh[(i + 1) % 3], gh[i % 4], gh[(i + 1) % 4], nullptr, i + 1); + interpolate_row_rb (rv[(i + 1) % 3], bv[(i + 1) % 3], gv[i % 4], gv[(i + 1) % 4], nullptr, i + 1); + } + + Color::RGB2Lab(rh[(i + 1) % 3], gh[(i + 1) % 4], bh[(i + 1) % 3], lLh[(i + 1) % 3], lah[(i + 1) % 3], lbh[(i + 1) % 3], wp, W); + Color::RGB2Lab(rv[(i + 1) % 3], gv[(i + 1) % 4], bv[(i + 1) % 3], lLv[(i + 1) % 3], lav[(i + 1) % 3], lbv[(i + 1) % 3], wp, W); + + for (int j = 0; j < W; j++) { + homh[ipx][j] = 0; + homv[ipx][j] = 0; + } + + for (int j = 1; j < W - 1; j++) { + int dmi = 0; + for (int x = -1; x <= 0; x++) { + int idx = mod[x + 1]; + + for (int y = -1; y <= 1; y++) { + // compute distance in a, b, and L + if (dmi < 4) { + int sh = homh[idx][j + y]; + int sv = homv[idx][j + y]; + + if (sh > sv) { // fixate horizontal pixel + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLh[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lah[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbh[idx][j + y]); + } else if (sh < sv) { + dLmaph[dmi] = DIST(lLh[ix][j], lLv[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lav[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbv[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } else { + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } + } else { + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + } + + dmi++; + } + } + int idx = mod[2]; + + for (int y = -1; y <= 1; y++) { + // compute distance in a, b, and L + dLmaph[dmi] = DIST(lLh[ix][j], lLh[idx][j + y]); + dCamaph[dmi] = DIST(lah[ix][j], lah[idx][j + y]); + dCbmaph[dmi] = DIST(lbh[ix][j], lbh[idx][j + y]); + dLmapv[dmi] = DIST(lLv[ix][j], lLv[idx][j + y]); + dCamapv[dmi] = DIST(lav[ix][j], lav[idx][j + y]); + dCbmapv[dmi] = DIST(lbv[ix][j], lbv[idx][j + y]); + dmi++; + } + + // compute eL & eC + float eL = min(max(dLmaph[3], dLmaph[5]), max(dLmapv[1], dLmapv[7])); + float eCa = min(max(dCamaph[3], dCamaph[5]), max(dCamapv[1], dCamapv[7])); + float eCb = min(max(dCbmaph[3], dCbmaph[5]), max(dCbmapv[1], dCbmapv[7])); + + int wh = 0; + + for (int dmi = 0; dmi < 9; dmi++) { + wh += (dLmaph[dmi] <= eL) * (dCamaph[dmi] <= eCa) * (dCbmaph[dmi] <= eCb); + } + + homh[imx][j - 1] += wh; + homh[imx][j] += wh; + homh[imx][j + 1] += wh; + homh[ix][j - 1] += wh; + homh[ix][j] += wh; + homh[ix][j + 1] += wh; + homh[ipx][j - 1] += wh; + homh[ipx][j] += wh; + homh[ipx][j + 1] += wh; + + int wv = 0; + + for (int dmi = 0; dmi < 9; dmi++) { + wv += (dLmapv[dmi] <= eL) * (dCamapv[dmi] <= eCa) * (dCbmapv[dmi] <= eCb); + } + + homv[imx][j - 1] += wv; + homv[imx][j] += wv; + homv[imx][j + 1] += wv; + homv[ix][j - 1] += wv; + homv[ix][j] += wv; + homv[ix][j + 1] += wv; + homv[ipx][j - 1] += wv; + homv[ipx][j] += wv; + homv[ipx][j + 1] += wv; + } + + // finalize image + for (int j = 0; j < W; j++) { + if (ri->ISGREEN(i - 1, j)) { + green[i - 1][j] = rawData[i - 1][j]; + } else { + int hc = homh[imx][j]; + int vc = homv[imx][j]; + + if (hc > vc) { + green[i - 1][j] = gh[(i - 1) % 4][j]; + } else if (hc < vc) { + green[i - 1][j] = gv[(i - 1) % 4][j]; + } else { + green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + } + } + } + + if (!(i % 20) && plistener) { + plistener->setProgress ((double)i / (H - 2)); + } + } + + // finish H-2th and H-1th row, homogenity value is still valailable + for (int i = H - 1; i < H + 1; i++) + for (int j = 0; j < W; j++) { + int hc = homh[(i - 1) % 3][j]; + int vc = homv[(i - 1) % 3][j]; + + if (hc > vc) { + green[i - 1][j] = gh[(i - 1) % 4][j]; + } else if (hc < vc) { + green[i - 1][j] = gv[(i - 1) % 4][j]; + } else { + green[i - 1][j] = (gh[(i - 1) % 4][j] + gv[(i - 1) % 4][j]) / 2; + } + } + + // Interpolate R and B +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 0; i < H; i++) { + if (i == 0) { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], nullptr, green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); + } else if (i == H - 1) { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], nullptr, i, 1.0, 1.0, 1.0, 0, W, 1); + } else { + interpolate_row_rb_mul_pp (rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); + } + } +} + +} diff --git a/rtengine/ex1simple.cc b/rtengine/ex1simple.cc index 0768a97e7..ddaa89177 100644 --- a/rtengine/ex1simple.cc +++ b/rtengine/ex1simple.cc @@ -21,11 +21,11 @@ //#include #include -class PListener : public rtengine::ProgressListener +class PListener : + public rtengine::ProgressListener { - public: - void setProgressStr (Glib::ustring str) + void setProgressStr(const Glib::ustring& str) { std::cout << str << std::endl; } @@ -33,11 +33,16 @@ public: { std::cout << p << std::endl; } + void setProgressState(bool inProcessing) + { + } + void error(const Glib::ustring& descr) + { + } }; int main (int argc, char* argv[]) { - if (argc < 4) { std::cout << "Usage: rtcmd " << std::endl; exit(1); @@ -77,7 +82,7 @@ int main (int argc, char* argv[]) 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 --git a/rtengine/expo_before_b.cc b/rtengine/expo_before_b.cc deleted file mode 100644 index f94b2c292..000000000 --- a/rtengine/expo_before_b.cc +++ /dev/null @@ -1,171 +0,0 @@ - -//////////////////////////////////////////////////////////////// -// -// //exposure correction before interpolation -// -// code dated: December 27, 2010 -// -// Expo_before.cc 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. -// -// 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, see . -// -//////////////////////////////////////////////////////////////// - - - -// Jacques Desmis -// use fast-demo(provisional) from Emil Martinec -// inspired from work Guillermo Luijk and Manuel LLorens(Perfectraw) -// Ingo Weyrich (2014-07-07) -// optimized the highlight protection case -// needs 2*width*height*sizeof(float) byte less memory than before -// needs about 60% less processing time than before -// -// This function uses parameters: -// exposure (linear): 2^(-8..0..8): currently 0.5 +3 -// preserve (log) : 0..8 : currently 0.1 1 - -#include "rtengine.h" -#include "rawimagesource.h" -#include "mytime.h" -#include "rt_math.h" - -namespace rtengine -{ - -extern const Settings* settings; - -void RawImageSource::processRawWhitepoint(float expos, float preser, array2D &rawData) -{ - MyTime t1e, t2e; - - if (settings->verbose) { - t1e.set(); - } - - int width = W, height = H; - // exposure correction inspired from G.Luijk - - for (int c = 0; c < 4; c++) { - chmax[c] *= expos; - } - - if (fabs(preser) < 0.001f) { - // No highlight protection - simple mutiplication - - if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) - #pragma omp parallel for - for (int row = 0; row < height; row++) - for (int col = 0; col < width; col++) { - rawData[row][col] *= expos; - } - else - #pragma omp parallel for - for (int row = 0; row < height; row++) - for (int col = 0; col < width; col++) { - rawData[row][col * 3] *= expos; - rawData[row][col * 3 + 1] *= expos; - rawData[row][col * 3 + 2] *= expos; - } - } else { - if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) { - // Demosaic to allow calculation of luminosity. - if(ri->getSensorType() == ST_BAYER) { - fast_demosaic(); - } else { - fast_xtrans_interpolate(); - } - } - - // Find maximum to adjust LUTs. New float engines clips only at the very end - float maxValFloat = 0.f; - #pragma omp parallel - { - float maxValFloatThr = 0.f; - - if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) - #pragma omp for schedule(dynamic,16) nowait - for(int row = 0; row < height; row++) - for (int col = 0; col < width; col++) { - if (rawData[row][col] > maxValFloatThr) { - maxValFloatThr = rawData[row][col]; - } - } - else - #pragma omp for schedule(dynamic,16) nowait - for(int row = 0; row < height; row++) - for (int col = 0; col < width; col++) { - for (int c = 0; c < 3; c++) - if (rawData[row][col * 3 + c] > maxValFloatThr) { - maxValFloatThr = rawData[row][col * 3 + c]; - } - } - - #pragma omp critical - { - if(maxValFloatThr > maxValFloat) { - maxValFloat = maxValFloatThr; - } - } - } - - // Exposure correction with highlight preservation - int maxVal = maxValFloat; - LUTf lut(maxVal + 1); - float K; - - if(expos > 1) { - // Positive exposure - K = (float) maxVal / expos * exp(-preser * log(2.0)); - - for (int j = max(1, (int)K); j <= maxVal; j++) { - lut[(int)j] = (((float)maxVal - K * expos) / ((float)maxVal - K) * (j - maxVal) + (float) maxVal) / j; - } - } else { - // Negative exposure - float EV = log(expos) / log(2.0); // Convert exp. linear to EV - K = (float)maxVal * exp(-preser * log(2.0)); - - for (int j = 0; j <= maxVal; j++) { - lut[(int)j] = exp(EV * ((float)maxVal - j) / ((float)maxVal - K) * log(2.0)); - } - } - - if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) - #pragma omp parallel for schedule(dynamic,16) - for(int row = 0; row < height; row++) - for(int col = 0; col < width; col++) { - float lumi = 0.299f * red[row][col] + 0.587f * green[row][col] + 0.114f * blue[row][col]; - rawData[row][col] *= lumi < K ? expos : lut[lumi]; - } - else - #pragma omp parallel for - for(int row = 0; row < height; row++) - for(int col = 0; col < width; col++) { - float lumi = 0.299f * rawData[row][col * 3] + 0.587f * rawData[row][col * 3 + 1] + 0.114f * rawData[row][col * 3 + 2]; - float fac = lumi < K ? expos : lut[lumi]; - - for (int c = 0; c < 3; c++) { - rawData[row][col * 3 + c] *= fac; - } - } - - } - - if (settings->verbose) { - t2e.set(); - printf("Exposure before %d usec\n", t2e.etime(t1e)); - } - -} - -} //namespace diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index 8d02bafb2..1584c4ca2 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////// // -// Fast demosaicing algorythm +// Fast demosaicing algorithm // // copyright (c) 2008-2010 Emil Martinec // @@ -52,7 +52,7 @@ LUTf RawImageSource::initInvGrad() #endif //LUTf RawImageSource::invGrad = RawImageSource::initInvGrad(); -SSEFUNCTION void RawImageSource::fast_demosaic() +void RawImageSource::fast_demosaic() { double progress = 0.0; @@ -77,10 +77,10 @@ SSEFUNCTION void RawImageSource::fast_demosaic() #endif { - char (*buffer); - float (*greentile); - float (*redtile); - float (*bluetile); + char *buffer; + float *greentile; + float *redtile; + float *bluetile; #define CLF 1 // assign working space buffer = (char *) calloc(3 * sizeof(float) * TS * TS + 3 * CLF * 64 + 63, 1); @@ -364,7 +364,7 @@ SSEFUNCTION void RawImageSource::fast_demosaic() for (int j = left + 1, cc = 1; j < right - 1; j += 4, cc += 4) { //interpolate B/R colors at R/B sites _mm_storeu_ps(&bluetile[rr * TS + cc], LVFU(greentile[rr * TS + cc]) - zd25v * ((LVFU(greentile[(rr - 1)*TS + (cc - 1)]) + LVFU(greentile[(rr - 1)*TS + (cc + 1)]) + LVFU(greentile[(rr + 1)*TS + cc + 1]) + LVFU(greentile[(rr + 1)*TS + cc - 1])) - - _mm_min_ps(clip_ptv, LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1])))); + vminf(LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1]), clip_ptv))); } #else @@ -381,7 +381,7 @@ SSEFUNCTION void RawImageSource::fast_demosaic() for (int j = left + 1, cc = 1; j < right - 1; j += 4, cc += 4) { //interpolate B/R colors at R/B sites _mm_storeu_ps(&redtile[rr * TS + cc], LVFU(greentile[rr * TS + cc]) - zd25v * ((LVFU(greentile[(rr - 1)*TS + cc - 1]) + LVFU(greentile[(rr - 1)*TS + cc + 1]) + LVFU(greentile[(rr + 1)*TS + cc + 1]) + LVFU(greentile[(rr + 1)*TS + cc - 1])) - - _mm_min_ps(clip_ptv, LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1])))); + vminf(LVFU(rawData[i - 1][j - 1]) + LVFU(rawData[i - 1][j + 1]) + LVFU(rawData[i + 1][j + 1]) + LVFU(rawData[i + 1][j - 1]), clip_ptv))); } #else diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 028b8a79a..6b0302d1e 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -130,7 +130,7 @@ void ffInfo::updateRawImage() // 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; @@ -138,7 +138,7 @@ void ffInfo::updateRawImage() int H = ri->get_height(); int W = ri->get_width(); ri->compress_image(0); - int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS) ? 1 : 3); + int rSize = W * ((ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) ? 1 : 3); acc_t **acc = new acc_t*[H]; for( int row = 0; row < H; row++) { @@ -160,7 +160,7 @@ void ffInfo::updateRawImage() temp->compress_image(0); //\ TODO would be better working on original, because is temporary nFiles++; - if( ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS ) { + if( ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1 ) { for( int row = 0; row < H; row++) { for( int col = 0; col < W; col++) { acc[row][col] += temp->data[row][col]; @@ -318,7 +318,7 @@ ffInfo* FFManager::addFileInfo (const Glib::ustring& filename, bool pool) } RawImage ri(filename); - int res = ri.loadRaw(false); // Read informations about shot + int res = ri.loadRaw(false); // Read information about shot if (res != 0) { return nullptr; diff --git a/rtengine/fujicompressed.cc b/rtengine/fujicompressed.cc index e00e037fc..45622eb7f 100644 --- a/rtengine/fujicompressed.cc +++ b/rtengine/fujicompressed.cc @@ -1034,3 +1034,89 @@ void CLASS parse_fuji_compressed_header() data_offset += 16; load_raw = &CLASS fuji_compressed_load_raw; } + + +//----------------------------------------------------------------------------- +// Fuji 14-bit compressed code taken from LibRaw 0.19 +// +// Copyright 2008-2018 LibRaw LLC (info@libraw.org) + +// LibRaw is free software; you can redistribute it and/or modify +// it under the terms of the one of two licenses as you choose: + +// 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 +// (See file LICENSE.LGPL provided in LibRaw distribution archive for details). + +// 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 +// (See file LICENSE.CDDL provided in LibRaw distribution archive for details). +//----------------------------------------------------------------------------- +namespace { + +inline void unpack7bytesto4x16(unsigned char *src, unsigned short *dest) +{ + dest[0] = (src[0] << 6) | (src[1] >> 2); + dest[1] = ((src[1] & 0x3) << 12) | (src[2] << 4) | (src[3] >> 4); + dest[2] = (src[3] & 0xf) << 10 | (src[4] << 2) | (src[5] >> 6); + dest[3] = ((src[5] & 0x3f) << 8) | src[6]; +} + +inline void unpack28bytesto16x16ns(unsigned char *src, unsigned short *dest) +{ + dest[0] = (src[3] << 6) | (src[2] >> 2); + dest[1] = ((src[2] & 0x3) << 12) | (src[1] << 4) | (src[0] >> 4); + dest[2] = (src[0] & 0xf) << 10 | (src[7] << 2) | (src[6] >> 6); + dest[3] = ((src[6] & 0x3f) << 8) | src[5]; + dest[4] = (src[4] << 6) | (src[11] >> 2); + dest[5] = ((src[11] & 0x3) << 12) | (src[10] << 4) | (src[9] >> 4); + dest[6] = (src[9] & 0xf) << 10 | (src[8] << 2) | (src[15] >> 6); + dest[7] = ((src[15] & 0x3f) << 8) | src[14]; + dest[8] = (src[13] << 6) | (src[12] >> 2); + dest[9] = ((src[12] & 0x3) << 12) | (src[19] << 4) | (src[18] >> 4); + dest[10] = (src[18] & 0xf) << 10 | (src[17] << 2) | (src[16] >> 6); + dest[11] = ((src[16] & 0x3f) << 8) | src[23]; + dest[12] = (src[22] << 6) | (src[21] >> 2); + dest[13] = ((src[21] & 0x3) << 12) | (src[20] << 4) | (src[27] >> 4); + dest[14] = (src[27] & 0xf) << 10 | (src[26] << 2) | (src[25] >> 6); + dest[15] = ((src[25] & 0x3f) << 8) | src[24]; +} + +#define swab32(x) \ + ((unsigned int)((((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \ + (((unsigned int)(x) & (unsigned int)0x0000ff00UL) << 8) | \ + (((unsigned int)(x) & (unsigned int)0x00ff0000UL) >> 8) | \ + (((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24))) + +inline void swab32arr(unsigned *arr, unsigned len) +{ + for (unsigned i = 0; i < len; i++) + arr[i] = swab32(arr[i]); +} +#undef swab32 + +} // namespace + +void CLASS fuji_14bit_load_raw() +{ + const unsigned linelen = raw_width * 7 / 4; + const unsigned pitch = raw_width; + unsigned char *buf = (unsigned char *)malloc(linelen); + merror(buf, "fuji_14bit_load_raw()"); + + for (int row = 0; row < raw_height; row++) + { + unsigned bytesread = fread(buf, 1, linelen, ifp); + unsigned short *dest = &raw_image[pitch * row]; + if (bytesread % 28) + { + swab32arr((unsigned *)buf, bytesread / 4); + for (int sp = 0, dp = 0; dp < pitch - 3 && sp < linelen - 6 && sp < bytesread - 6; sp += 7, dp += 4) + unpack7bytesto4x16(buf + sp, dest + dp); + } + else + for (int sp = 0, dp = 0; dp < pitch - 15 && sp < linelen - 27 && sp < bytesread - 27; sp += 28, dp += 16) + unpack28bytesto16x16ns(buf + sp, dest + dp); + } + free(buf); +} + +//----------------------------------------------------------------------------- diff --git a/rtengine/gamutwarning.cc b/rtengine/gamutwarning.cc new file mode 100644 index 000000000..c76e2a285 --- /dev/null +++ b/rtengine/gamutwarning.cc @@ -0,0 +1,130 @@ +/* -*- 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 . + */ + +/** + * Adapted from PhotoFlow, Copyright (C) 2014 Ferrero Andrea + * also distributed under the GPL V3+ + */ + +#include "gamutwarning.h" +#include + +namespace rtengine { + +GamutWarning::GamutWarning(cmsHPROFILE iprof, cmsHPROFILE gamutprof, RenderingIntent intent, bool gamutbpc): + lab2ref(nullptr), + lab2softproof(nullptr), + softproof2ref(nullptr) +{ + if (cmsIsMatrixShaper(gamutprof) && !cmsIsCLUT(gamutprof, intent, LCMS_USED_AS_OUTPUT)) { + cmsHPROFILE aces = ICCStore::getInstance()->workingSpace("ACESp0"); + if (aces) { + lab2ref = cmsCreateTransform(iprof, TYPE_Lab_FLT, aces, TYPE_RGB_FLT, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); + lab2softproof = cmsCreateTransform(iprof, TYPE_Lab_FLT, gamutprof, TYPE_RGB_FLT, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); + softproof2ref = cmsCreateTransform(gamutprof, TYPE_RGB_FLT, aces, TYPE_RGB_FLT, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE | (gamutbpc ? cmsFLAGS_BLACKPOINTCOMPENSATION : 0)); + } + } else { + lab2ref = nullptr; + lab2softproof = cmsCreateTransform(iprof, TYPE_Lab_FLT, gamutprof, TYPE_RGB_FLT, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); + softproof2ref = cmsCreateTransform(gamutprof, TYPE_RGB_FLT, iprof, TYPE_Lab_FLT, INTENT_ABSOLUTE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE | (gamutbpc ? cmsFLAGS_BLACKPOINTCOMPENSATION : 0)); + } + + if (!softproof2ref) { + if (lab2softproof) { + cmsDeleteTransform(lab2softproof); + lab2softproof = nullptr; + } + } else if (!lab2softproof) { + if (softproof2ref) { + cmsDeleteTransform(softproof2ref); + softproof2ref = nullptr; + } + } +} + + +GamutWarning::~GamutWarning() +{ + if (softproof2ref) { + cmsDeleteTransform(softproof2ref); + } + if (lab2ref) { + cmsDeleteTransform(lab2ref); + } + if (lab2softproof) { + cmsDeleteTransform(lab2softproof); + } +} + + +void GamutWarning::markLine(Image8 *image, int y, float *srcbuf, float *buf1, float *buf2) +{ + if (softproof2ref) { + const int width = image->getWidth(); + + float delta_max = lab2ref ? 0.0001f : 4.9999f; + cmsDoTransform(lab2softproof, srcbuf, buf2, width); + // since we are checking for out-of-gamut, we do want to clamp here! + for (int i = 0; i < width * 3; ++i) { + buf2[i] = LIM01(buf2[i]); + } + cmsDoTransform(softproof2ref, buf2, buf1, width); + + float *proofdata = buf1; + float *refdata = srcbuf; + + if (lab2ref) { + cmsDoTransform(lab2ref, srcbuf, buf2, width); + refdata = buf2; + + int iy = 0; + for (int j = 0; j < width; ++j) { + float delta = max(std::abs(proofdata[iy] - refdata[iy]), std::abs(proofdata[iy+1] - refdata[iy+1]), std::abs(proofdata[iy+2] - refdata[iy+2])); + iy += 3; + + if (delta > delta_max) { + mark(image, y, j); + } + } + } else { + int iy = 0; + for (int j = 0; j < width; ++j) { + cmsCIELab lab1 = { proofdata[iy], proofdata[iy+1], proofdata[iy+2] }; + cmsCIELab lab2 = { refdata[iy], refdata[iy+1], refdata[iy+2] }; + iy += 3; + float delta = cmsDeltaE(&lab1, &lab2); + if (delta > delta_max) { + mark(image, y, j); + } + } + } + } +} + + +inline void GamutWarning::mark(Image8 *image, int y, int x) +{ + image->r(y, x) = 0; + image->g(y, x) = 255; + image->b(y, x) = 255; +} + + +} // namespace rtengine diff --git a/rtengine/gamutwarning.h b/rtengine/gamutwarning.h new file mode 100644 index 000000000..19a27cdfd --- /dev/null +++ b/rtengine/gamutwarning.h @@ -0,0 +1,50 @@ +/* -*- 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 . + */ + +/** + * Adapted from PhotoFlow, Copyright (C) 2014 Ferrero Andrea + * also distributed under the GPL V3+ + */ + +#pragma once + +#include "iccstore.h" +#include "noncopyable.h" +#include "image8.h" + +namespace rtengine { + +enum RenderingIntent : int; + +class GamutWarning: public NonCopyable { +public: + GamutWarning(cmsHPROFILE iprof, cmsHPROFILE gamutprof, RenderingIntent intent, bool bpc); + ~GamutWarning(); + void markLine(Image8 *image, int y, float *srcbuf, float *buf1, float *buf2); + +private: + void mark(Image8 *image, int i, int j); + + cmsHTRANSFORM lab2ref; + cmsHTRANSFORM lab2softproof; + cmsHTRANSFORM softproof2ref; +}; + +} // namespace rtengine diff --git a/rtengine/gauss.cc b/rtengine/gauss.cc index 09c91db1e..b7de67851 100644 --- a/rtengine/gauss.cc +++ b/rtengine/gauss.cc @@ -163,15 +163,15 @@ template void gauss3x3div (T** RESTRICT src, T** RESTRICT dst, T** REST #pragma omp single nowait #endif { - dst[0][0] = divBuffer[0][0] / (src[0][0] > 0.f ? src[0][0] : 1.f); + dst[0][0] = rtengine::max(divBuffer[0][0] / (src[0][0] > 0.f ? src[0][0] : 1.f), 0.f); for (int j = 1; j < W - 1; j++) { float tmp = (b1 * (src[0][j - 1] + src[0][j + 1]) + b0 * src[0][j]); - dst[0][j] = divBuffer[0][j] / (tmp > 0.f ? tmp : 1.f); + dst[0][j] = rtengine::max(divBuffer[0][j] / (tmp > 0.f ? tmp : 1.f), 0.f); } - dst[0][W - 1] = divBuffer[0][W - 1] / (src[0][W - 1] > 0.f ? src[0][W - 1] : 1.f); + dst[0][W - 1] = rtengine::max(divBuffer[0][W - 1] / (src[0][W - 1] > 0.f ? src[0][W - 1] : 1.f), 0.f); } #ifdef _OPENMP @@ -180,15 +180,15 @@ template void gauss3x3div (T** RESTRICT src, T** RESTRICT dst, T** REST for (int i = 1; i < H - 1; i++) { float tmp = (b1 * (src[i - 1][0] + src[i + 1][0]) + b0 * src[i][0]); - dst[i][0] = divBuffer[i][0] / (tmp > 0.f ? tmp : 1.f); + dst[i][0] = rtengine::max(divBuffer[i][0] / (tmp > 0.f ? tmp : 1.f), 0.f); for (int j = 1; j < W - 1; j++) { tmp = (c2 * (src[i - 1][j - 1] + src[i - 1][j + 1] + src[i + 1][j - 1] + src[i + 1][j + 1]) + c1 * (src[i - 1][j] + src[i][j - 1] + src[i][j + 1] + src[i + 1][j]) + c0 * src[i][j]); - dst[i][j] = divBuffer[i][j] / (tmp > 0.f ? tmp : 1.f); + dst[i][j] = rtengine::max(divBuffer[i][j] / (tmp > 0.f ? tmp : 1.f), 0.f); } tmp = (b1 * (src[i - 1][W - 1] + src[i + 1][W - 1]) + b0 * src[i][W - 1]); - dst[i][W - 1] = divBuffer[i][W - 1] / (tmp > 0.f ? tmp : 1.f); + dst[i][W - 1] = rtengine::max(divBuffer[i][W - 1] / (tmp > 0.f ? tmp : 1.f), 0.f); } // last row @@ -196,14 +196,14 @@ template void gauss3x3div (T** RESTRICT src, T** RESTRICT dst, T** REST #pragma omp single #endif { - dst[H - 1][0] = divBuffer[H - 1][0] / (src[H - 1][0] > 0.f ? src[H - 1][0] : 1.f); + dst[H - 1][0] = rtengine::max(divBuffer[H - 1][0] / (src[H - 1][0] > 0.f ? src[H - 1][0] : 1.f), 0.f); for (int j = 1; j < W - 1; j++) { float tmp = (b1 * (src[H - 1][j - 1] + src[H - 1][j + 1]) + b0 * src[H - 1][j]); - dst[H - 1][j] = divBuffer[H - 1][j] / (tmp > 0.f ? tmp : 1.f); + dst[H - 1][j] = rtengine::max(divBuffer[H - 1][j] / (tmp > 0.f ? tmp : 1.f), 0.f); } - dst[H - 1][W - 1] = divBuffer[H - 1][W - 1] / (src[H - 1][W - 1] > 0.f ? src[H - 1][W - 1] : 1.f); + dst[H - 1][W - 1] = rtengine::max(divBuffer[H - 1][W - 1] / (src[H - 1][W - 1] > 0.f ? src[H - 1][W - 1] : 1.f), 0.f); } } @@ -229,7 +229,7 @@ template void gaussHorizontal3 (T** src, T** dst, int W, int H, const f } #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 @@ template void gaussVertical3 (T** src, T** dst, int W, int H, const flo #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 @@ template void gaussHorizontal (T** src, T** dst, const int W, const int } #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 @@ template SSEFUNCTION void gaussVerticalSse (T** src, T** dst, const int #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 gaussVerticalSsemult (T** RESTRICT src, T** R } } -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); @@ -859,8 +859,8 @@ template SSEFUNCTION void gaussVerticalSsediv (T** RESTRICT src, T** RE Tv1 = Rv1; Rv = LVF(tmp[j][0]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v; Rv1 = LVF(tmp[j][4]) * Bv + Tv1 * b1v + Tm2v1 * b2v + Tm3v1 * b3v; - STVFU( dst[j][i], LVFU(divBuffer[j][i]) / vself(vmaskf_gt(Rv, ZEROV), Rv, onev)); - STVFU( dst[j][i + 4], LVFU(divBuffer[j][i + 4]) / vself(vmaskf_gt(Rv1, ZEROV), Rv1, onev)); + STVFU( dst[j][i], vmaxf(LVFU(divBuffer[j][i]) / vself(vmaskf_gt(Rv, ZEROV), Rv, onev), ZEROV)); + STVFU( dst[j][i + 4], vmaxf(LVFU(divBuffer[j][i + 4]) / vself(vmaskf_gt(Rv1, ZEROV), Rv1, onev), ZEROV)); Tm3v = Tm2v; Tm3v1 = Tm2v1; Tm2v = Tv; @@ -895,7 +895,7 @@ template SSEFUNCTION void gaussVerticalSsediv (T** RESTRICT src, T** RE } for (int j = 0; j < H; j++) { - dst[j][i] = divBuffer[j][i] / (tmp[j][0] > 0.f ? tmp[j][0] : 1.f); + dst[j][i] = rtengine::max(divBuffer[j][i] / (tmp[j][0] > 0.f ? tmp[j][0] : 1.f), 0.f); } } @@ -1020,14 +1020,14 @@ template void gaussVerticaldiv (T** src, T** dst, T** divBuffer, const } for (int k = 0; k < numcols; k++) { - dst[H - 1][i + k] = divBuffer[H - 1][i + k] / (temp2[H - 1][k] = temp2Hm1[k]); - dst[H - 2][i + k] = divBuffer[H - 2][i + k] / (temp2[H - 2][k] = B * temp2[H - 2][k] + b1 * temp2[H - 1][k] + b2 * temp2H[k] + b3 * temp2Hp1[k]); - dst[H - 3][i + k] = divBuffer[H - 3][i + k] / (temp2[H - 3][k] = B * temp2[H - 3][k] + b1 * temp2[H - 2][k] + b2 * temp2[H - 1][k] + b3 * temp2H[k]); + dst[H - 1][i + k] = rtengine::max(divBuffer[H - 1][i + k] / (temp2[H - 1][k] = temp2Hm1[k]), 0.0); + dst[H - 2][i + k] = rtengine::max(divBuffer[H - 2][i + k] / (temp2[H - 2][k] = B * temp2[H - 2][k] + b1 * temp2[H - 1][k] + b2 * temp2H[k] + b3 * temp2Hp1[k]), 0.0); + dst[H - 3][i + k] = rtengine::max(divBuffer[H - 3][i + k] / (temp2[H - 3][k] = B * temp2[H - 3][k] + b1 * temp2[H - 2][k] + b2 * temp2[H - 1][k] + b3 * temp2H[k]), 0.0); } for (int j = H - 4; j >= 0; j--) { for (int k = 0; k < numcols; k++) { - dst[j][i + k] = divBuffer[j][i + k] / (temp2[j][k] = B * temp2[j][k] + b1 * temp2[j + 1][k] + b2 * temp2[j + 2][k] + b3 * temp2[j + 3][k]); + dst[j][i + k] = rtengine::max(divBuffer[j][i + k] / (temp2[j][k] = B * temp2[j][k] + b1 * temp2[j + 1][k] + b2 * temp2[j + 2][k] + b3 * temp2[j + 3][k]), 0.0); } } } @@ -1050,12 +1050,12 @@ template void gaussVerticaldiv (T** src, T** dst, T** divBuffer, const double temp2H = src[H - 1][i] + M[1][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[1][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[1][2] * (temp2[H - 3][0] - src[H - 1][i]); double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[2][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[2][2] * (temp2[H - 3][0] - src[H - 1][i]); - dst[H - 1][i] = divBuffer[H - 1][i] / (temp2[H - 1][0] = temp2Hm1); - dst[H - 2][i] = divBuffer[H - 2][i] / (temp2[H - 2][0] = B * temp2[H - 2][0] + b1 * temp2[H - 1][0] + b2 * temp2H + b3 * temp2Hp1); - dst[H - 3][i] = divBuffer[H - 3][i] / (temp2[H - 3][0] = B * temp2[H - 3][0] + b1 * temp2[H - 2][0] + b2 * temp2[H - 1][0] + b3 * temp2H); + dst[H - 1][i] = rtengine::max(divBuffer[H - 1][i] / (temp2[H - 1][0] = temp2Hm1), 0.0); + dst[H - 2][i] = rtengine::max(divBuffer[H - 2][i] / (temp2[H - 2][0] = B * temp2[H - 2][0] + b1 * temp2[H - 1][0] + b2 * temp2H + b3 * temp2Hp1), 0.0); + dst[H - 3][i] = rtengine::max(divBuffer[H - 3][i] / (temp2[H - 3][0] = B * temp2[H - 3][0] + b1 * temp2[H - 2][0] + b2 * temp2[H - 1][0] + b3 * temp2H), 0.0); for (int j = H - 4; j >= 0; j--) { - dst[j][i] = divBuffer[j][i] / (temp2[j][0] = B * temp2[j][0] + b1 * temp2[j + 1][0] + b2 * temp2[j + 2][0] + b3 * temp2[j + 3][0]); + dst[j][i] = rtengine::max(divBuffer[j][i] / (temp2[j][0] = B * temp2[j][0] + b1 * temp2[j + 1][0] + b2 * temp2[j + 2][0] + b3 * temp2[j + 3][0]), 0.0); } } } @@ -1143,7 +1143,7 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int { static constexpr auto GAUSS_SKIP = 0.25; static constexpr auto GAUSS_3X3_LIMIT = 0.6; - static constexpr auto GAUSS_DOUBLE = 70.0; + static constexpr auto GAUSS_DOUBLE = 25.0; if(buffer) { // special variant for very large sigma, currently only used by retinex algorithm @@ -1190,7 +1190,9 @@ template void gaussianBlurImpl(T** src, T** dst, const int W, const int if (sigma < GAUSS_SKIP) { // don't perform filtering if (src != dst) { - memcpy (dst[0], src[0], W * H * sizeof(T)); + for(int i = 0; i < H; ++i) { + memcpy(dst[i], src[i], W * sizeof(T)); + } } } else if (sigma < GAUSS_3X3_LIMIT) { if(src != dst) { diff --git a/rtengine/green_equil_RT.cc b/rtengine/green_equil_RT.cc index 90c412871..361bde882 100644 --- a/rtengine/green_equil_RT.cc +++ b/rtengine/green_equil_RT.cc @@ -46,7 +46,6 @@ void RawImageSource::green_equilibrate_global(array2D &rawData) for (int i = border; i < H - border; i++) { double avgg = 0.; - for (int j = border + ((FC(i, border) & 1) ^ 1); j < W - border; j += 2) { avgg += rawData[i][j]; } @@ -89,7 +88,7 @@ void RawImageSource::green_equilibrate_global(array2D &rawData) } //void green_equilibrate()//for dcraw implementation -void RawImageSource::green_equilibrate(float thresh, array2D &rawData) +void RawImageSource::green_equilibrate(const GreenEqulibrateThreshold &thresh, array2D &rawData) { // thresh = threshold for performing green equilibration; max percentage difference of G1 vs G2 // G1-G2 differences larger than this will be assumed to be Nyquist texture, and left untouched @@ -119,7 +118,7 @@ void RawImageSource::green_equilibrate(float thresh, array2D &rawData) } constexpr float eps = 1.f; //tolerance to avoid dividing by zero - const float thresh6 = 6 * thresh; + // const float thresh6 = 6 * thresh; // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Fill G interpolated values with border interpolation and input values @@ -136,8 +135,8 @@ void RawImageSource::green_equilibrate(float thresh, array2D &rawData) #ifdef __SSE2__ vfloat zd5v = F2V(0.5f); vfloat onev = F2V(1.f); - vfloat threshv = F2V(thresh); - vfloat thresh6v = F2V(thresh6); + // vfloat threshv = F2V(thresh); + // vfloat thresh6v = F2V(thresh6); vfloat epsv = F2V(eps); #endif #ifdef _OPENMP @@ -165,7 +164,13 @@ void RawImageSource::green_equilibrate(float thresh, array2D &rawData) vfloat c1 = (vabsf(o1_1 - o1_2) + vabsf(o1_1 - o1_3) + vabsf(o1_1 - o1_4) + vabsf(o1_2 - o1_3) + vabsf(o1_3 - o1_4) + vabsf(o1_2 - o1_4)); vfloat c2 = (vabsf(o2_1 - o2_2) + vabsf(o2_1 - o2_3) + vabsf(o2_1 - o2_4) + vabsf(o2_2 - o2_3) + vabsf(o2_3 - o2_4) + vabsf(o2_2 - o2_4)); - vmask mask1 = vmaskf_lt(c1 + c2, thresh6v * vabsf(d1 - d2)); + vfloat tfv; + for (int k = 0; k < 4; ++k) { + tfv[k] = thresh(rr, cc + 2 * k); + } + vfloat tf6v = F2V(6.f) * tfv; + + vmask mask1 = vmaskf_lt(c1 + c2, tf6v * vabsf(d1 - d2)); if (_mm_movemask_ps((vfloat)mask1)) { // if for any of the 4 pixels the condition is true, do the maths for all 4 pixels and mask the unused out at the end //pixel interpolation @@ -188,7 +193,7 @@ void RawImageSource::green_equilibrate(float thresh, array2D &rawData) vfloat ginterp = (gse * wtse + gnw * wtnw + gne * wtne + gsw * wtsw) / (wtse + wtnw + wtne + wtsw); - vfloat val = vself(vmaskf_lt(ginterp - gin, threshv * (ginterp + gin)), zd5v * (ginterp + gin), gin); + vfloat val = vself(vmaskf_lt(ginterp - gin, tfv * (ginterp + gin)), zd5v * (ginterp + gin), gin); val = vself(mask1, val, gin); STC2VFU(rawData[rr][cc], val); } @@ -213,7 +218,9 @@ void RawImageSource::green_equilibrate(float thresh, array2D &rawData) float c1 = (fabs(o1_1 - o1_2) + fabs(o1_1 - o1_3) + fabs(o1_1 - o1_4) + fabs(o1_2 - o1_3) + fabs(o1_3 - o1_4) + fabs(o1_2 - o1_4)); float c2 = (fabs(o2_1 - o2_2) + fabs(o2_1 - o2_3) + fabs(o2_1 - o2_4) + fabs(o2_2 - o2_3) + fabs(o2_3 - o2_4) + fabs(o2_2 - o2_4)); - if (c1 + c2 < thresh6 * fabs(d1 - d2)) { + float tf = thresh(rr, cc); + + if (c1 + c2 < 6 * tf * fabs(d1 - d2)) { //pixel interpolation float gin = cfa[rr][cc >> 1]; @@ -234,7 +241,7 @@ void RawImageSource::green_equilibrate(float thresh, array2D &rawData) float ginterp = (gse * wtse + gnw * wtnw + gne * wtne + gsw * wtsw) / (wtse + wtnw + wtne + wtsw); - if (ginterp - gin < thresh * (ginterp + gin)) { + if (ginterp - gin < tf * (ginterp + gin)) { rawData[rr][cc] = 0.5f * (ginterp + gin); } } diff --git a/rtengine/guidedfilter.cc b/rtengine/guidedfilter.cc new file mode 100644 index 000000000..e7fe9b8af --- /dev/null +++ b/rtengine/guidedfilter.cc @@ -0,0 +1,235 @@ +/* -*- 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 . + */ + +/** + * This is a Fast Guided Filter implementation, derived directly from the + * pseudo-code of the paper: + * + * Fast Guided Filter + * by Kaiming He, Jian Sun + * + * available at https://arxiv.org/abs/1505.00996 + */ + +#include "guidedfilter.h" +#include "boxblur.h" +#include "rescale.h" +#include "imagefloat.h" + +namespace rtengine { + +#if 0 +# define DEBUG_DUMP(arr) \ + do { \ + Imagefloat im(arr.width(), arr.height()); \ + const char *out = "/tmp/" #arr ".tif"; \ + for (int y = 0; y < im.getHeight(); ++y) { \ + for (int x = 0; x < im.getWidth(); ++x) { \ + im.r(y, x) = im.g(y, x) = im.b(y, x) = arr[y][x] * 65535.f; \ + } \ + } \ + im.saveTIFF(out, 16); \ + } while (false) +#else +# define DEBUG_DUMP(arr) +#endif + + +namespace { + +int calculate_subsampling(int w, int h, int r) +{ + if (r == 1) { + return 1; + } + + if (max(w, h) <= 600) { + return 1; + } + + for (int s = 5; s > 0; --s) { + if (r % s == 0) { + return s; + } + } + + return LIM(r / 2, 2, 4); +} + +} // namespace + + +void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling) +{ + + const int W = src.width(); + const int H = src.height(); + + if (subsampling <= 0) { + subsampling = calculate_subsampling(W, H, r); + } + + enum Op { MUL, DIVEPSILON, ADD, SUB, ADDMUL, SUBMUL }; + + const auto apply = + [=](Op op, array2D &res, const array2D &a, const array2D &b, const array2D &c=array2D()) -> void + { + const int w = res.width(); + const int h = res.height(); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + float r; + float aa = a[y][x]; + float bb = b[y][x]; + switch (op) { + case MUL: + r = aa * bb; + break; + case DIVEPSILON: + r = aa / (bb + epsilon); + break; + case ADD: + r = aa + bb; + break; + case SUB: + r = aa - bb; + break; + case ADDMUL: + r = aa * bb + c[y][x]; + break; + case SUBMUL: + r = c[y][x] - (aa * bb); + break; + default: + assert(false); + r = 0; + break; + } + res[y][x] = r; + } + } + }; + + // use the terminology of the paper (Algorithm 2) + const array2D &I = guide; + const array2D &p = src; + array2D &q = dst; + + const auto f_subsample = + [=](array2D &d, const array2D &s) -> void + { + rescaleBilinear(s, d, multithread); + }; + + const auto f_upsample = f_subsample; + + const size_t w = W / subsampling; + const size_t h = H / subsampling; + + AlignedBuffer blur_buf(w * h); + const auto f_mean = + [&](array2D &d, array2D &s, int rad) -> void + { + rad = LIM(rad, 0, (min(s.width(), s.height()) - 1) / 2 - 1); + float **src = s; + float **dst = d; +#ifdef _OPENMP + #pragma omp parallel if (multithread) +#endif + boxblur(src, dst, blur_buf.data, rad, rad, s.width(), s.height()); + }; + + array2D I1(w, h); + array2D p1(w, h); + + f_subsample(I1, I); + f_subsample(p1, p); + + DEBUG_DUMP(I); + DEBUG_DUMP(p); + DEBUG_DUMP(I1); + DEBUG_DUMP(p1); + + float r1 = float(r) / subsampling; + + array2D meanI(w, h); + f_mean(meanI, I1, r1); + DEBUG_DUMP(meanI); + + array2D meanp(w, h); + f_mean(meanp, p1, r1); + DEBUG_DUMP(meanp); + + array2D &corrIp = p1; + apply(MUL, corrIp, I1, p1); + f_mean(corrIp, corrIp, r1); + DEBUG_DUMP(corrIp); + + array2D &corrI = I1; + apply(MUL, corrI, I1, I1); + f_mean(corrI, corrI, r1); + DEBUG_DUMP(corrI); + + array2D &varI = corrI; + apply(SUBMUL, varI, meanI, meanI, corrI); + DEBUG_DUMP(varI); + + array2D &covIp = corrIp; + apply(SUBMUL, covIp, meanI, meanp, corrIp); + DEBUG_DUMP(covIp); + + array2D &a = varI; + apply(DIVEPSILON, a, covIp, varI); + DEBUG_DUMP(a); + + array2D &b = covIp; + apply(SUBMUL, b, a, meanI, meanp); + DEBUG_DUMP(b); + + meanI.free(); // frees w * h * 4 byte + meanp.free(); // frees w * h * 4 byte + + array2D &meana = a; + f_mean(meana, a, r1); + DEBUG_DUMP(meana); + + array2D &meanb = b; + f_mean(meanb, b, r1); + DEBUG_DUMP(meanb); + + blur_buf.resize(0); // frees w * h * 4 byte + + array2D meanA(W, H); + f_upsample(meanA, meana); + DEBUG_DUMP(meanA); + + array2D &meanB = q; + f_upsample(meanB, meanb); + DEBUG_DUMP(meanB); + + apply(ADDMUL, q, meanA, I, meanB); + DEBUG_DUMP(q); +} + +} // namespace rtengine diff --git a/rtengine/guidedfilter.h b/rtengine/guidedfilter.h new file mode 100644 index 000000000..6691af251 --- /dev/null +++ b/rtengine/guidedfilter.h @@ -0,0 +1,29 @@ +/* -*- 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 . + */ + +#pragma once + +#include "array2D.h" + +namespace rtengine { + +void guidedFilter(const array2D &guide, const array2D &src, array2D &dst, int r, float epsilon, bool multithread, int subsampling=0); + +} // namespace rtengine diff --git a/rtengine/helpersse2.h b/rtengine/helpersse2.h index 7e2185a7f..74780cf48 100644 --- a/rtengine/helpersse2.h +++ b/rtengine/helpersse2.h @@ -29,29 +29,13 @@ typedef __m128 vfloat; 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 @@ static INLINE vfloat LC2VFU(float &a) // 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);\ @@ -173,10 +157,14 @@ static INLINE vfloat vsqrtf(vfloat x) } static INLINE vfloat vmaxf(vfloat x, vfloat y) { + // _mm_max_ps(x, y) returns y if x is NaN + // don't change the order of the parameters return _mm_max_ps(x, y); } static INLINE vfloat vminf(vfloat x, vfloat y) { + // _mm_min_ps(x, y) returns y if x is NaN + // don't change the order of the parameters return _mm_min_ps(x, y); } diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index f9e630f9d..bb173f11a 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -35,7 +35,7 @@ extern const Settings* settings; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -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 @@ -336,7 +336,9 @@ void RawImageSource::boxblur_resamp(float **src, float **dst, float ** temp, int } // process remaining columns +#ifdef _OPENMP #pragma omp single +#endif { //vertical blur diff --git a/rtengine/histmatching.cc b/rtengine/histmatching.cc index 4216c4581..614e5368a 100644 --- a/rtengine/histmatching.cc +++ b/rtengine/histmatching.cc @@ -24,11 +24,12 @@ #include "color.h" #include "rt_math.h" #include "iccstore.h" +#include "procparams.h" #include "../rtgui/mydiagonalcurve.h" #include "improcfun.h" +//#define BENCHMARK #include "StopWatch.h" #include -#include namespace rtengine { @@ -37,20 +38,36 @@ extern const Settings *settings; namespace { -std::vector getCdf(const IImage8 &img) +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) { - std::vector ret(256); + 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[lum]; + int lum = LIM(int(Color::rgbLuminance(float(img.r(y, x)), float(img.g(y, x)), float(img.b(y, x)))), 0, 255); + ++ret.cdf[lum]; } } int sum = 0; - for (size_t i = 0; i < ret.size(); ++i) { - sum += ret[i]; - ret[i] = sum; + 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; @@ -85,55 +102,135 @@ void mappingToCurve(const std::vector &mapping, std::vector &curve) { curve.clear(); - const int npoints = 8; - int idx = 1; + int idx = 15; for (; idx < int(mapping.size()); ++idx) { if (mapping[idx] >= idx) { break; } } - int step = max(int(mapping.size())/npoints, 1); + if (idx == int(mapping.size())) { + for (idx = 1; idx < int(mapping.size()); ++idx) { + if (mapping[idx] >= idx) { + break; + } + } + } auto coord = [](int v) -> double { return double(v)/255.0; }; auto doit = - [&](int start, int stop, int step, bool addstart) -> void + [&](int start, int stop, int step, bool addstart, int maxdelta=0) -> void { + if (!maxdelta) maxdelta = step * 2; int prev = start; - if (addstart) { + 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) { + if ((change && std::abs(diff - step) <= 1) || diff > maxdelta) { curve.push_back(coord(i)); curve.push_back(coord(v)); prev = i; } } }; - doit(0, idx, idx > step ? step : idx / 2, true); - doit(idx, int(mapping.size()), step, idx - step > step / 2); - if (curve.size() > 2 && (1 - curve[curve.size()-2] <= step / (256.0 * 3))) { + + curve.push_back(0.0); + curve.push_back(0.0); + + int start = 0; + while (start < idx && (mapping[start] < 0 || start < idx / 2)) { + ++start; + } + + const int npoints = 8; + int step = std::max(int(mapping.size())/npoints, 1); + int end = mapping.size(); + if (idx <= end / 3) { + doit(start, idx, idx / 2, true); + step = (end - idx) / 4; + doit(idx, end, step, false, step); + } else { + doit(start, idx, idx > step ? step : idx / 2, true); + doit(idx, end, step, idx - step > step / 2 && std::abs(curve[curve.size()-2] - coord(idx)) > 0.01); + } + + if (curve.size() > 2 && (1 - curve[curve.size()-2] <= coord(step) / 3)) { curve.pop_back(); curve.pop_back(); } + curve.push_back(1.0); curve.push_back(1.0); + + // we assume we are matching an S-shaped curve, so try to avoid + // concavities in the upper part of the S + const auto getpos = + [](float x, float xa, float ya, float xb, float yb) + { + // line equation: + // (x - xa) / (xb - xa) = (y - ya) / (yb - ya) + return (x - xa) / (xb - xa) * (yb - ya) + ya; + }; + idx = -1; + for (size_t i = curve.size()-1; i > 0; i -= 2) { + if (curve[i] <= 0.f) { + idx = i+1; + break; + } + } + if (idx >= 0 && size_t(idx) < curve.size()) { + // idx is the position of the first point in the upper part of the S + // for each 3 consecutive points (xa, ya), (x, y), (xb, yb) we check + // that y is above the point at x of the line between the other two + // if this is not the case, we remove (x, y) from the curve + while (size_t(idx+5) < curve.size()) { + float xa = curve[idx]; + float ya = curve[idx+1]; + float x = curve[idx+2]; + float y = curve[idx+3]; + float xb = curve[idx+4]; + float yb = curve[idx+5]; + float yy = getpos(x, xa, ya, xb, yb); + if (yy > y) { + // we have to remove (x, y) from the curve + curve.erase(curve.begin()+(idx+2), curve.begin()+(idx+4)); + } else { + // move on to the next point + idx += 2; + } + } + } if (curve.size() < 4) { curve = { DCT_Linear }; // not enough points, fall back to linear } else { curve.insert(curve.begin(), DCT_Spline); + DiagonalCurve c(curve); + double gap = 0.05; + double x = 0.0; + curve = { DCT_CatumullRom }; + while (x < 1.0) { + curve.push_back(x); + curve.push_back(c.getVal(x)); + x += gap; + gap *= 1.4; + } + curve.push_back(1.0); + curve.push_back(c.getVal(1.0)); } } } // namespace -void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) +void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, std::vector &outCurve) { BENCHFUN @@ -141,39 +238,66 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) std::cout << "performing histogram matching for " << getFileName() << " on the embedded thumbnail" << std::endl; } - if (!histMatchingCache.empty()) { + const auto same_profile = + [](const ColorManagementParams &a, const ColorManagementParams &b) -> bool + { + return (a.inputProfile == b.inputProfile + && 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 = histMatchingCache; + return; } outCurve = { DCT_Linear }; int fw, fh; getFullSize(fw, fh, TR_NONE); - int skip = 10; + if (getRotateDegree() == 90 || getRotateDegree() == 270) { + std::swap(fw, fh); + } + 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.outputProfile = ColorManagementParams::NoICMString; 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)); + std::unique_ptr thumb(Thumbnail::loadQuickFromRaw(getFileName(), rml, sensor_type, w, h, 1, false, true, true)); if (!thumb) { if (settings->verbose) { std::cout << "histogram matching: no thumbnail found, generating a neutral curve" << std::endl; } histMatchingCache = outCurve; + *histMatchingParams = cp; + return; + } else if (w * 10 < fw) { + if (settings->verbose) { + std::cout << "histogram matching: the embedded thumbnail is too small: " << w << "x" << h << 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) { @@ -183,42 +307,57 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) std::unique_ptr target; { - int tw = source->getWidth(), th = source->getHeight(); - float thumb_ratio = float(std::max(tw, th)) / float(std::min(tw, th)); - float target_ratio = float(std::max(fw, fh)) / float(std::min(fw, fh)); + 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 = fh - (fw * float(th) / float(tw)); + int ch = th - (tw * float(sh) / float(sw)); cy += ch / 2; - fh -= ch; + th -= ch; } else { // crop the width - int cw = fw - (fh * float(tw) / float(th)); + int cw = tw - (th * float(sw) / float(sh)); cx += cw / 2; - fw -= cw; + tw -= cw; } if (settings->verbose) { - std::cout << "histogram matching: cropping target to get an aspect ratio of " << std::fixed << std::setprecision(2) << thumb_ratio << ":1, new full size is " << fw << "x" << fh << std::endl; + 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); } } - PreviewProps pp(cx, cy, fw, fh, skip); - ColorTemp currWB = getWB(); - std::unique_ptr image(new Imagefloat(int(fw / skip), int(fh / skip))); - getImage(currWB, TR_NONE, image.get(), pp, neutral.toneCurve, neutral.raw); - - // this could probably be made faster -- ideally we would need to just - // perform the transformation from camera space to the output space - // (taking gamma into account), but I couldn't find anything - // ready-made, so for now this will do. Remember the famous quote: - // "premature optimization is the root of all evil" :-) - convertColorSpace(image.get(), neutral.icm, currWB); - ImProcFunctions ipf(&neutral); - LabImage tmplab(image->getWidth(), image->getHeight()); - ipf.rgb2lab(*image, tmplab, neutral.icm.working); - image.reset(ipf.lab2rgbOut(&tmplab, 0, 0, tmplab.W, tmplab.H, neutral.icm)); - target.reset(image->to8()); if (settings->verbose) { std::cout << "histogram matching: generated neutral rendering" << std::endl; @@ -229,14 +368,18 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) target->resizeImgTo(source->getWidth(), source->getHeight(), TI_Nearest, tmp); target.reset(tmp); } - std::vector scdf = getCdf(*source); - std::vector tcdf = getCdf(*target); + CdfInfo scdf = getCdf(*source); + CdfInfo tcdf = getCdf(*target); std::vector mapping; int j = 0; - for (size_t i = 0; i < tcdf.size(); ++i) { - j = findMatch(tcdf[i], scdf, j); - mapping.push_back(j); + 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); @@ -246,6 +389,7 @@ void RawImageSource::getAutoMatchedToneCurve(std::vector &outCurve) } histMatchingCache = outCurve; + *histMatchingParams = cp; } } // namespace rtengine diff --git a/rtengine/hphd_demosaic_RT.cc b/rtengine/hphd_demosaic_RT.cc new file mode 100644 index 000000000..1d9aa0dd0 --- /dev/null +++ b/rtengine/hphd_demosaic_RT.cc @@ -0,0 +1,365 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2004-2019 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 "rawimagesource.h" +#include "rawimagesource_i.h" +#include "jaggedarray.h" +#include "rawimage.h" +#include "rt_math.h" +#include "procparams.h" +#include "../rtgui/multilangmgr.h" +#include "opthelper.h" +//#define BENCHMARK +#include "StopWatch.h" +#ifdef _OPENMP +#include +#endif + +using namespace std; +using namespace rtengine; + +namespace { + +void hphd_vertical(const array2D &rawData, float** hpmap, int col_from, int col_to, int H) +{ + + // process 'numCols' columns for better usage of L1 cpu cache (especially faster for large values of H) + constexpr int numCols = 8; + JaggedArray temp(numCols, H, true); + JaggedArray avg(numCols, H, true); + JaggedArray dev(numCols, H, true); + + int k = col_from; +#ifdef __SSE2__ + const vfloat ninev = F2V(9.f); + const vfloat epsv = F2V(0.001f); +#endif + for (; k < col_to - 7; k += numCols) { + for (int i = 5; i < H - 5; i++) { +#ifdef _OPENMP + #pragma omp simd +#endif + for(int h = 0; h < numCols; ++h) { + temp[i][h] = std::fabs((rawData[i - 5][k + h] - rawData[i + 5][k + h]) - 8 * (rawData[i - 4][k + h] - rawData[i + 4][k + h]) + 27 * (rawData[i - 3][k + h] - rawData[i + 3][k + h]) - 48 * (rawData[i - 2][k + h] - rawData[i + 2][k + h]) + 42 * (rawData[i - 1][k + h] - rawData[i + 1][k + h])); + } + } + + for (int j = 4; j < H - 4; j++) { +#ifdef __SSE2__ + // faster than #pragma omp simd... + const vfloat avgL1 = ((LVFU(temp[j - 4][0]) + LVFU(temp[j - 3][0])) + (LVFU(temp[j - 2][0]) + LVFU(temp[j - 1][0])) + (LVFU(temp[j][0]) + LVFU(temp[j + 1][0])) + (LVFU(temp[j + 2][0]) + LVFU(temp[j + 3][0])) + LVFU(temp[j + 4][0])) / ninev; + STVFU(avg[j][0], avgL1); + STVFU(dev[j][0], vmaxf(epsv, (SQRV(LVFU(temp[j - 4][0]) - avgL1) + SQRV(LVFU(temp[j - 3][0]) - avgL1)) + (SQRV(LVFU(temp[j - 2][0]) - avgL1) + SQRV(LVFU(temp[j - 1][0]) - avgL1)) + (SQRV(LVFU(temp[j][0]) - avgL1) + SQRV(LVFU(temp[j + 1][0]) - avgL1)) + (SQRV(LVFU(temp[j + 2][0]) - avgL1) + SQRV(LVFU(temp[j + 3][0]) - avgL1)) + SQRV(LVFU(temp[j + 4][0]) - avgL1))); + const vfloat avgL2 = ((LVFU(temp[j - 4][4]) + LVFU(temp[j - 3][4])) + (LVFU(temp[j - 2][4]) + LVFU(temp[j - 1][4])) + (LVFU(temp[j][4]) + LVFU(temp[j + 1][4])) + (LVFU(temp[j + 2][4]) + LVFU(temp[j + 3][4])) + LVFU(temp[j + 4][4])) / ninev; + STVFU(avg[j][4], avgL2); + STVFU(dev[j][4], vmaxf(epsv, (SQRV(LVFU(temp[j - 4][4]) - avgL2) + SQRV(LVFU(temp[j - 3][4]) - avgL2)) + (SQRV(LVFU(temp[j - 2][4]) - avgL2) + SQRV(LVFU(temp[j - 1][4]) - avgL2)) + (SQRV(LVFU(temp[j][4]) - avgL2) + SQRV(LVFU(temp[j + 1][4]) - avgL2)) + (SQRV(LVFU(temp[j + 2][4]) - avgL2) + SQRV(LVFU(temp[j + 3][4]) - avgL2)) + SQRV(LVFU(temp[j + 4][4]) - avgL2))); +#else +#ifdef _OPENMP + #pragma omp simd +#endif + for(int h = 0; h < numCols; ++h) { + const float avgL = ((temp[j - 4][h] + temp[j - 3][h]) + (temp[j - 2][h] + temp[j - 1][h]) + (temp[j][h] + temp[j + 1][h]) + (temp[j + 2][h] + temp[j + 3][h]) + temp[j + 4][h]) / 9.f; + avg[j][h] = avgL; + dev[j][h] = std::max(0.001f, (SQR(temp[j - 4][h] - avgL) + SQR(temp[j - 3][h] - avgL)) + (SQR(temp[j - 2][h] - avgL) + SQR(temp[j - 1][h] - avgL)) + (SQR(temp[j][h] - avgL) + SQR(temp[j + 1][h] - avgL)) + (SQR(temp[j + 2][h] - avgL) + SQR(temp[j + 3][h] - avgL)) + SQR(temp[j + 4][h] - avgL)); + } +#endif + } + + for (int j = 5; j < H - 5; j++) { +#ifdef _OPENMP + #pragma omp simd +#endif + for(int h = 0; h < numCols; ++h) { + const float avgL = avg[j - 1][h]; + const float avgR = avg[j + 1][h]; + const float devL = dev[j - 1][h]; + const float devR = dev[j + 1][h]; + hpmap[j][k + h] = avgL + (avgR - avgL) * devL / (devL + devR); + } + } + } + for (; k < col_to; k++) { + for (int i = 5; i < H - 5; i++) { + temp[i][0] = std::fabs((rawData[i - 5][k] - rawData[i + 5][k]) - 8 * (rawData[i - 4][k] - rawData[i + 4][k]) + 27 * (rawData[i - 3][k] - rawData[i + 3][k]) - 48 * (rawData[i - 2][k] - rawData[i + 2][k]) + 42 * (rawData[i - 1][k] -rawData[i + 1][k])); + } + + for (int j = 4; j < H - 4; j++) { + const float avgL = (temp[j - 4][0] + temp[j - 3][0] + temp[j - 2][0] + temp[j - 1][0] + temp[j][0] + temp[j + 1][0] + temp[j + 2][0] + temp[j + 3][0] + temp[j + 4][0]) / 9.f; + avg[j][0] = avgL; + dev[j][0] = std::max(0.001f, SQR(temp[j - 4][0] - avgL) + SQR(temp[j - 3][0] - avgL) + SQR(temp[j - 2][0] - avgL) + SQR(temp[j - 1][0] - avgL) + SQR(temp[j][0] - avgL) + SQR(temp[j + 1][0] - avgL) + SQR(temp[j + 2][0] - avgL) + SQR(temp[j + 3][0] - avgL) + SQR(temp[j + 4][0] - avgL)); + } + + for (int j = 5; j < H - 5; j++) { + const float avgL = avg[j - 1][0]; + const float avgR = avg[j + 1][0]; + const float devL = dev[j - 1][0]; + const float devR = dev[j + 1][0]; + hpmap[j][k] = avgL + (avgR - avgL) * devL / (devL + devR); + } + } +} + +void hphd_horizontal(const array2D &rawData, float** hpmap, int row_from, int row_to, int W) +{ + + float* temp = new float[W]; + float* avg = new float[W]; + float* dev = new float[W]; + + memset(temp, 0, W * sizeof(float)); + memset(avg, 0, W * sizeof(float)); + memset(dev, 0, W * sizeof(float)); + +#ifdef __SSE2__ + const vfloat onev = F2V(1.f); + const vfloat twov = F2V(2.f); + const vfloat zd8v = F2V(0.8f); +#endif + for (int i = row_from; i < row_to; i++) { +#ifdef _OPENMP + #pragma omp simd +#endif + for (int j = 5; j < W - 5; j++) { + temp[j] = std::fabs((rawData[i][j - 5] - rawData[i][j + 5]) - 8 * (rawData[i][j - 4] - rawData[i][j + 4]) + 27 * (rawData[i][j - 3] - rawData[i][j + 3]) - 48 * (rawData[i][j - 2] - rawData[i][j + 2]) + 42 * (rawData[i][j - 1] - rawData[i][j + 1])); + } + +#ifdef _OPENMP + #pragma omp simd +#endif + for (int j = 4; j < W - 4; j++) { + const float avgL = ((temp[j - 4] + temp[j - 3]) + (temp[j - 2] + temp[j - 1]) + (temp[j] + temp[j + 1]) + (temp[j + 2] + temp[j + 3]) + temp[j + 4]) / 9.f; + avg[j] = avgL; + dev[j] = std::max(0.001f, (SQR(temp[j - 4] - avgL) + SQR(temp[j - 3] - avgL)) + (SQR(temp[j - 2] - avgL) + SQR(temp[j - 1] - avgL)) + (SQR(temp[j] - avgL) + SQR(temp[j + 1] - avgL)) + (SQR(temp[j + 2] - avgL) + SQR(temp[j + 3] - avgL)) + SQR(temp[j + 4] - avgL)); + } + + int j = 5; +#ifdef __SSE2__ + // faster than #pragma omp simd + for (; j < W - 8; j+=4) { + const vfloat avgL = LVFU(avg[j - 1]); + const vfloat avgR = LVFU(avg[j + 1]); + const vfloat devL = LVFU(dev[j - 1]); + const vfloat devR = LVFU(dev[j + 1]); + const vfloat hpv = avgL + (avgR - avgL) * devL / (devL + devR); + + const vfloat hpmapoldv = LVFU(hpmap[i][j]); + const vfloat hpmapv = vselfzero(vmaskf_lt(hpmapoldv, zd8v * hpv), twov); + STVFU(hpmap[i][j], vself(vmaskf_lt(hpv, zd8v * hpmapoldv), onev, hpmapv)); + } +#endif + for (; j < W - 5; j++) { + const float avgL = avg[j - 1]; + const float avgR = avg[j + 1]; + const float devL = dev[j - 1]; + const float devR = dev[j + 1]; + const float hpv = avgL + (avgR - avgL) * devL / (devL + devR); + + if (hpmap[i][j] < 0.8f * hpv) { + hpmap[i][j] = 2; + } else if (hpv < 0.8f * hpmap[i][j]) { + hpmap[i][j] = 1; + } else { + hpmap[i][j] = 0; + } + } + } + + delete [] temp; + delete [] avg; + delete [] dev; +} + +void hphd_green(const RawImage *ri, const array2D &rawData, float** hpmap, int W, int H, array2D &green) +{ + + constexpr float eps = 0.001f; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + + for (int i = 3; i < H - 3; i++) { + for (int j = 3; j < W - 3; j++) { + if (ri->ISGREEN(i, j)) { + green[i][j] = rawData[i][j]; + } else { + if (hpmap[i][j] == 1) { + const float g2 = rawData[i][j + 1] - rawData[i][j + 2] * 0.5f; + const float g4 = rawData[i][j - 1] - rawData[i][j - 2] * 0.5f; + + const float dx = eps + std::fabs(rawData[i][j + 1] - rawData[i][j - 1]); + float d1 = rawData[i][j + 3] - rawData[i][j + 1]; + float d2 = rawData[i][j + 2] - rawData[i][j]; + float d3 = rawData[i - 1][j + 2] - rawData[i - 1][j]; + float d4 = rawData[i + 1][j + 2] - rawData[i + 1][j]; + + const float e2 = 1.f / (dx + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + d1 = rawData[i][j - 3] - rawData[i][j - 1]; + d2 = rawData[i][j - 2] - rawData[i][j]; + d3 = rawData[i - 1][j - 2] - rawData[i - 1][j]; + d4 = rawData[i + 1][j - 2] - rawData[i + 1][j]; + + const float e4 = 1.f / (dx + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + green[i][j] = rawData[i][j] * 0.5f + (e2 * g2 + e4 * g4) / (e2 + e4); + } else if (hpmap[i][j] == 2) { + const float g1 = rawData[i - 1][j] - rawData[i - 2][j] * 0.5f; + const float g3 = rawData[i + 1][j] - rawData[i + 2][j] * 0.5f; + + const float dy = eps + std::fabs(rawData[i + 1][j] - rawData[i - 1][j]); + float d1 = rawData[i - 1][j] - rawData[i - 3][j]; + float d2 = rawData[i][j] - rawData[i - 2][j]; + float d3 = rawData[i][j - 1] - rawData[i - 2][j - 1]; + float d4 = rawData[i][j + 1] - rawData[i - 2][j + 1]; + + const float e1 = 1.f / (dy + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + d1 = rawData[i + 1][j] - rawData[i + 3][j]; + d2 = rawData[i][j] - rawData[i + 2][j]; + d3 = rawData[i][j - 1] - rawData[i + 2][j - 1]; + d4 = rawData[i][j + 1] - rawData[i + 2][j + 1]; + + const float e3 = 1.f / (dy + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + green[i][j] = rawData[i][j] * 0.5f + (e1 * g1 + e3 * g3) / (e1 + e3); + } else { + const float g1 = rawData[i - 1][j] - rawData[i - 2][j] * 0.5f; + const float g2 = rawData[i][j + 1] - rawData[i][j + 2] * 0.5f; + const float g3 = rawData[i + 1][j] - rawData[i + 2][j] * 0.5f; + const float g4 = rawData[i][j - 1] - rawData[i][j - 2] * 0.5f; + + const float dx = eps + std::fabs(rawData[i][j + 1] - rawData[i][j - 1]); + const float dy = eps + std::fabs(rawData[i + 1][j] - rawData[i - 1][j]); + + float d1 = rawData[i - 1][j] - rawData[i - 3][j]; + float d2 = rawData[i][j] - rawData[i - 2][j]; + float d3 = rawData[i][j - 1] - rawData[i - 2][j - 1]; + float d4 = rawData[i][j + 1] - rawData[i - 2][j + 1]; + + const float e1 = 1.f / (dy + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + d1 = rawData[i][j + 3] - rawData[i][j + 1]; + d2 = rawData[i][j + 2] - rawData[i][j]; + d3 = rawData[i - 1][j + 2] - rawData[i - 1][j]; + d4 = rawData[i + 1][j + 2] - rawData[i + 1][j]; + + const float e2 = 1.f / (dx + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + d1 = rawData[i + 1][j] - rawData[i + 3][j]; + d2 = rawData[i][j] - rawData[i + 2][j]; + d3 = rawData[i][j - 1] - rawData[i + 2][j - 1]; + d4 = rawData[i][j + 1] - rawData[i + 2][j + 1]; + + const float e3 = 1.f / (dy + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + d1 = rawData[i][j - 3] - rawData[i][j - 1]; + d2 = rawData[i][j - 2] - rawData[i][j]; + d3 = rawData[i - 1][j - 2] - rawData[i - 1][j]; + d4 = rawData[i + 1][j - 2] - rawData[i + 1][j]; + + const float e4 = 1.f / (dx + (std::fabs(d1) + std::fabs(d2)) + (std::fabs(d3) + std::fabs(d4)) * 0.5f); + + green[i][j] = rawData[i][j] * 0.5f + ((e1 * g1 + e2 * g2) + (e3 * g3 + e4 * g4)) / (e1 + e2 + e3 + e4); + } + } + } + } +} + +} + +namespace rtengine +{ + +void RawImageSource::hphd_demosaic () +{ + BENCHFUN + if (plistener) { + plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD))); + plistener->setProgress(0.0); + } + + JaggedArray hpmap(W, H, true); + +#ifdef _OPENMP + #pragma omp parallel + { + int tid = omp_get_thread_num(); + int nthreads = omp_get_num_threads(); + int blk = W / nthreads; + + if (tid < nthreads - 1) { + hphd_vertical(rawData, hpmap, tid * blk, (tid + 1)*blk, H); + } else { + hphd_vertical(rawData, hpmap, tid * blk, W, H); + } + } +#else + hphd_vertical(rawData, hpmap, 0, W, H); +#endif + + if (plistener) { + plistener->setProgress(0.35); + } + +#ifdef _OPENMP + #pragma omp parallel + { + int tid = omp_get_thread_num(); + int nthreads = omp_get_num_threads(); + int blk = H / nthreads; + + if (tid < nthreads - 1) { + hphd_horizontal(rawData, hpmap, tid * blk, (tid + 1)*blk, W); + } else { + hphd_horizontal(rawData, hpmap, tid * blk, H, W); + } + } +#else + hphd_horizontal(rawData, hpmap, 0, H, W); +#endif + + if (plistener) { + plistener->setProgress(0.43); + } + + hphd_green(ri, rawData, hpmap, W, H, green); + + if (plistener) { + plistener->setProgress(0.65); + } + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int i = 4; i < H - 4; i++) { + interpolate_row_rb_mul_pp(rawData, red[i], blue[i], green[i - 1], green[i], green[i + 1], i, 1.0, 1.0, 1.0, 0, W, 1); + } + + border_interpolate2(W, H, 4, rawData, red, green, blue); + + if (plistener) { + plistener->setProgress(1.0); + } +} + + + +} /* namespace */ diff --git a/rtengine/iccmatrices.h b/rtengine/iccmatrices.h index a6fd8d9e6..29426c62d 100644 --- a/rtengine/iccmatrices.h +++ b/rtengine/iccmatrices.h @@ -32,6 +32,19 @@ constexpr double d50_d65[3][3] = { { -0.0092345, 0.0150436, 0.7521316} }; +//J.Desmis 04 2018 +constexpr double d50_d60[3][3] = { + { 1.034368, 0.016908, -0.037658}, + {0.021752, 0.992183, -0.012785}, + { -0.006971, 0.011377, 0.812150} +}; + +constexpr double d60_d50[3][3] = { + { 0.96743198, -0.01699717, 0.044590689}, + {-0.02109893, 1.008067172, 0.014890785}, + {0.008598998, -0.01426777, 1.231474467} +}; + // Color space conversion to/from XYZ; color spaces adapted to D65 constexpr double xyz_sRGBd65[3][3] = { {0.4124564, 0.3575761, 0.1804375}, @@ -66,6 +79,31 @@ constexpr double xyz_sRGB[3][3] = { {0.0139322, 0.0971045, 0.7141733} }; +constexpr double xyz_ACESp0[3][3] = { + {0.9908526, 0.0122334, -0.0388654}, + {0.3618807, 0.72255045 , -0.0843859}, + {-0.0027093, 0.0082323, 0.8196880} +}; + +constexpr double ACESp0_xyz[3][3] = { + {1.01583320, -0.01772807, 0.04634052}, + {-0.50781231, 1.39131494 , 0.11915641}, + {0.00845768, -0.01403193, 1.21893277} +}; + +constexpr double xyz_ACESp1[3][3] = { + {0.689697, 0.149944, 0.124559}, + {0.284448, 0.671758 , 0.043794}, + {-0.006043, 0.009998, 0.820945} +}; + +constexpr double ACESp1_xyz[3][3] = { + {1.5932624, -0.352316, -0.222945}, + {-0.6759496, 1.639286 , 0.01511026}, + {0.0199602, -0.0225577, 1.2162833} +}; + + constexpr double sRGB_xyz[3][3] = { {3.1338561, -1.6168667, -0.4906146}, { -0.9787684, 1.9161415, 0.0334540}, diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 81d0583ac..268a6b1c2 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -27,14 +27,20 @@ #include #endif +#include + #include "iccstore.h" #include "iccmatrices.h" -#include "procparams.h" #include "../rtgui/options.h" #include "../rtgui/threadutils.h" +#include "lcms2_plugin.h" +#include "color.h" + +#include "cJSON.h" +#define inkc_constant 0x696E6B43 namespace rtengine { @@ -153,6 +159,7 @@ bool loadProfile( if (profileContents) { profileContents->emplace(name, content); } + return true; } } @@ -192,19 +199,102 @@ cmsHPROFILE createXYZProfile() return rtengine::ICCStore::createFromMatrix(mat, false, "XYZ"); } -const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020}; -const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz, rec2020_xyz}; -const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB", "Rec2020"}; -const char* wpgamma[] = {"default", "BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9"}; //gamma free +const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020, xyz_ACESp0, xyz_ACESp1};// +const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz, rec2020_xyz, ACESp0_xyz, ACESp1_xyz};// +const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB", "Rec2020", "ACESp0", "ACESp1"};// //default = gamma inside profile -//BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92 +//BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92310 //linear g=1.0 //std22 g=2.2 std18 g=1.8 // high g=1.3 s=3.35 for high dynamic images //low g=2.6 s=6.9 for low contrast images +//----------------------------------------------------------------------------- +// helper functions to fix V2 profiles TRCs, used in +// rtengine::ProfileContent::toProfile() +// see https://github.com/Beep6581/RawTherapee/issues/5026 +// ----------------------------------------------------------------------------- +bool is_RTv2_profile(cmsHPROFILE profile) +{ + if (int(cmsGetProfileVersion(profile)) != 2) { + return false; + } + const cmsMLU *mlu = static_cast(cmsReadTag(profile, cmsSigDeviceMfgDescTag)); + if (!mlu) { + return false; + } + cmsUInt32Number sz = cmsMLUgetASCII(mlu, "en", "US", nullptr, 0); + if (!sz) { + return false; + } + std::vector buf(sz); + cmsMLUgetASCII(mlu, "en", "US", &buf[0], sz); + buf.back() = 0; // sanity + return strcmp(&buf[0], "RawTherapee") == 0; } + +bool get_RT_gamma_slope(cmsHPROFILE profile, double &gammatag, double &slopetag) +{ + const cmsMLU *modelDescMLU = static_cast(cmsReadTag(profile, cmsSigDeviceModelDescTag)); + if (modelDescMLU) { + cmsUInt32Number count = cmsMLUgetWide(modelDescMLU, "en", "US", nullptr, 0); + if (count) { + std::vector vbuf(count); + wchar_t *buffer = &vbuf[0]; + count = cmsMLUgetWide(modelDescMLU, "en", "US", buffer, count); + Glib::ustring modelDesc; +#if __SIZEOF_WCHAR_T__ == 2 + char *cModelDesc = g_utf16_to_utf8((unsigned short int*)buffer, -1, nullptr, nullptr, nullptr); // convert to utf-8 in a buffer allocated by glib + if (cModelDesc) { + modelDesc.assign(cModelDesc); + g_free(cModelDesc); + } +#else + modelDesc = utf32_to_utf8(buffer, count); +#endif + if (!modelDesc.empty()) { + try { + std::size_t pos = modelDesc.find("g"); + std::size_t posmid = modelDesc.find("s"); + std::size_t posend = modelDesc.find("!"); + if (pos == std::string::npos || posmid == std::string::npos || posend == std::string::npos) { + return false; + } + std::string strgamma = modelDesc.substr(pos + 1, (posmid - pos)); + gammatag = std::stod(strgamma.c_str()); + std::string strslope = modelDesc.substr(posmid + 1, (posend - posmid)); + slopetag = std::stod(strslope.c_str()); + return true; + } catch (std::invalid_argument &) { + return false; + } + } + } + } + return false; +} + + +Glib::ustring get_profile_description(cmsHPROFILE profile) +{ + const cmsMLU *mlu = static_cast(cmsReadTag(profile, cmsSigProfileDescriptionTag)); + if (!mlu) { + return ""; + } + cmsUInt32Number sz = cmsMLUgetASCII(mlu, "en", "US", nullptr, 0); + if (!sz) { + return ""; + } + std::vector buf(sz); + cmsMLUgetASCII(mlu, "en", "US", &buf[0], sz); + buf.back() = 0; // sanity + return std::string(&buf[0]); +} + +} // namespace + + rtengine::ProfileContent::ProfileContent() = default; rtengine::ProfileContent::ProfileContent(const Glib::ustring& fileName) @@ -217,7 +307,8 @@ rtengine::ProfileContent::ProfileContent(const Glib::ustring& fileName) fseek(f, 0, SEEK_END); long length = ftell(f); - if(length > 0) { + + if (length > 0) { char* d = new char[length + 1]; fseek(f, 0, SEEK_SET); length = fread(d, 1, length, f); @@ -227,6 +318,7 @@ rtengine::ProfileContent::ProfileContent(const Glib::ustring& fileName) } else { data.clear(); } + fclose(f); } @@ -248,11 +340,52 @@ rtengine::ProfileContent::ProfileContent(cmsHPROFILE hProfile) cmsHPROFILE rtengine::ProfileContent::toProfile() const { + cmsHPROFILE profile = nullptr; + if (!data.empty()) { + profile = cmsOpenProfileFromMem(data.c_str(), data.size()); + // if this is a V2 profile generated by RawTherapee, we rebuild the + // TRC. See https://github.com/Beep6581/RawTherapee/issues/5026 and + // the references in there + if (profile && is_RTv2_profile(profile)) { + double gammatag, slopetag; + if (get_RT_gamma_slope(profile, gammatag, slopetag)) { + constexpr double eps = 0.000000001; // not divide by zero + double pwr = 1.0 / gammatag; + double ts = slopetag; + double slope = slopetag == 0 ? eps : slopetag; - return - !data.empty() - ? cmsOpenProfileFromMem(data.c_str(), data.size()) - : nullptr; + GammaValues g_b; //gamma parameters + Color::calcGamma(pwr, ts, 0, g_b); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 + cmsFloat64Number gammaParams[7]; //gamma parameters + gammaParams[4] = g_b[3] * ts; + gammaParams[0] = gammatag; + gammaParams[1] = 1. / (1.0 + g_b[4]); + gammaParams[2] = g_b[4] / (1.0 + g_b[4]); + gammaParams[3] = 1. / slope; + gammaParams[5] = 0.0; + gammaParams[6] = 0.0; + + cmsToneCurve* GammaTRC; + if (slopetag == 0.) { + //printf("gammatag=%f\n", gammatag); + GammaTRC = cmsBuildGamma(NULL, gammatag); + } else { + GammaTRC = cmsBuildParametricToneCurve(nullptr, 5, gammaParams); //5 = smoother than 4 + } + cmsWriteTag(profile, cmsSigRedTRCTag, GammaTRC); + cmsWriteTag(profile, cmsSigGreenTRCTag, GammaTRC); + cmsWriteTag(profile, cmsSigBlueTRCTag, GammaTRC); + cmsFreeToneCurve(GammaTRC); + + if (settings->verbose) { + std::cout << "ICCStore: rebuilt TRC for RTv2 profile " << get_profile_description(profile) << ": gamma=" << gammatag << ", slope=" << slopetag << std::endl; + } + } else if (settings->verbose) { + std::cout << "ICCStore: no gamma/slope info found for RTv2 profile " << get_profile_description(profile) << std::endl; + } + } + } + return profile; } const std::string& rtengine::ProfileContent::getData() const @@ -274,7 +407,7 @@ public: for (int i = 0; i < N; ++i) { wProfiles[wpnames[i]] = createFromMatrix(wprofiles[i]); - wProfilesGamma[wpnames[i]] = createFromMatrix(wprofiles[i], true); + // wProfilesGamma[wpnames[i]] = createFromMatrix(wprofiles[i], true); wMatrices[wpnames[i]] = wprofiles[i]; iwMatrices[wpnames[i]] = iwprofiles[i]; } @@ -287,20 +420,23 @@ public: cmsCloseProfile(p.second); } } - for (auto &p : wProfilesGamma) { + + // for (auto &p : wProfilesGamma) { + // if (p.second) { + // cmsCloseProfile(p.second); + // } + // } + for (auto &p : fileProfiles) { if (p.second) { cmsCloseProfile(p.second); } } - for (auto &p : fileProfiles) { - if(p.second) { - cmsCloseProfile(p.second); - } - } - if(srgb) { + + if (srgb) { cmsCloseProfile(srgb); } - if(xyz) { + + if (xyz) { cmsCloseProfile(xyz); } } @@ -318,6 +454,7 @@ public: userICCDir = usrICCDir; fileProfiles.clear(); fileProfileContents.clear(); + if (loadAll) { loadProfiles(profilesDir, &fileProfiles, &fileProfileContents, nullptr, false); loadProfiles(userICCDir, &fileProfiles, &fileProfileContents, nullptr, false); @@ -328,11 +465,21 @@ public: stdProfilesDir = Glib::build_filename(rtICCDir, "input"); fileStdProfiles.clear(); fileStdProfilesFileNames.clear(); + if (loadAll) { loadProfiles(stdProfilesDir, nullptr, nullptr, &fileStdProfilesFileNames, true); + Glib::ustring user_input_icc_dir = Glib::build_filename(options.rtdir, "iccprofiles", "input"); + loadProfiles(user_input_icc_dir, nullptr, nullptr, &fileStdProfilesFileNames, true); } defaultMonitorProfile = settings->monitorProfile; + + loadWorkingSpaces(rtICCDir); + loadWorkingSpaces(userICCDir); + + // 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 @@ -341,20 +488,20 @@ public: return r != wProfiles.end() - ? r->second - : wProfiles.find("sRGB")->second; + ? r->second + : wProfiles.find("sRGB")->second; } - cmsHPROFILE workingSpaceGamma(const Glib::ustring& name) const - { + // cmsHPROFILE workingSpaceGamma(const Glib::ustring& name) const + // { - const ProfileMap::const_iterator r = wProfilesGamma.find(name); + // const ProfileMap::const_iterator r = wProfilesGamma.find(name); - return - r != wProfilesGamma.end() - ? r->second - : wProfilesGamma.find("sRGB")->second; - } + // return + // r != wProfilesGamma.end() + // ? r->second + // : wProfilesGamma.find("sRGB")->second; + // } TMatrix workingSpaceMatrix(const Glib::ustring& name) const { @@ -362,8 +509,8 @@ public: return r != wMatrices.end() - ? r->second - : wMatrices.find("sRGB")->second; + ? r->second + : wMatrices.find("sRGB")->second; } TMatrix workingSpaceInverseMatrix(const Glib::ustring& name) const @@ -373,8 +520,8 @@ public: return r != iwMatrices.end() - ? r->second - : iwMatrices.find("sRGB")->second; + ? r->second + : iwMatrices.find("sRGB")->second; } bool outputProfileExist(const Glib::ustring& name) const @@ -408,7 +555,9 @@ public: if (!loadProfile(name, profilesDir, &fileProfiles, &fileProfileContents)) { loadProfile(name, userICCDir, &fileProfiles, &fileProfileContents); } + const ProfileMap::const_iterator r = fileProfiles.find(name); + if (r != fileProfiles.end()) { return r->second; } @@ -433,7 +582,9 @@ public: if (!loadProfile(name, profilesDir, &fileProfiles, &fileProfileContents)) { loadProfile(name, userICCDir, &fileProfiles, &fileProfileContents); } + const ProfileMap::const_iterator r = fileProfiles.find(name); + if (r != fileProfiles.end()) { return r->second; } @@ -468,8 +619,8 @@ public: return r != fileProfileContents.end() - ? r->second - : ProfileContent(); + ? r->second + : ProfileContent(); } cmsHPROFILE getXYZProfile() const @@ -490,22 +641,22 @@ public: for (const auto profile : fileProfiles) { if ( - ( - type==ICCStore::ProfileType::MONITOR - && cmsGetDeviceClass(profile.second) == cmsSigDisplayClass - && cmsGetColorSpace(profile.second) == cmsSigRgbData - ) - ||( - type==ICCStore::ProfileType::PRINTER - && cmsGetDeviceClass(profile.second) == cmsSigOutputClass - ) - ||( - type==ICCStore::ProfileType::OUTPUT - && (cmsGetDeviceClass(profile.second) == cmsSigDisplayClass - || cmsGetDeviceClass(profile.second) == cmsSigInputClass - || cmsGetDeviceClass(profile.second) == cmsSigOutputClass) - && cmsGetColorSpace(profile.second) == cmsSigRgbData - ) + ( + type == ICCStore::ProfileType::MONITOR + && cmsGetDeviceClass(profile.second) == cmsSigDisplayClass + && cmsGetColorSpace(profile.second) == cmsSigRgbData + ) + || ( + type == ICCStore::ProfileType::PRINTER + && cmsGetDeviceClass(profile.second) == cmsSigOutputClass + ) + || ( + type == ICCStore::ProfileType::OUTPUT + && (cmsGetDeviceClass(profile.second) == cmsSigDisplayClass + || cmsGetDeviceClass(profile.second) == cmsSigInputClass + || cmsGetDeviceClass(profile.second) == cmsSigOutputClass) + && cmsGetColorSpace(profile.second) == cmsSigRgbData + ) ) { res.push_back(profile.first); } @@ -578,17 +729,286 @@ public: defaultMonitorProfile = name; } + std::vector getWorkingProfiles() + { + std::vector res; + + // for (unsigned int i = 0; i < sizeof(wpnames) / sizeof(wpnames[0]); i++) { + // res.push_back(wpnames[i]); + // } + for (const auto &p : wProfiles) { + res.push_back(p.first); + } + + return res; + } + private: + using CVector = std::array; + using CMatrix = std::array; + struct PMatrix { + double matrix[3][3]; + PMatrix(): matrix{} {} + explicit PMatrix(const CMatrix &m) + { + set(m); + } + + CMatrix toMatrix() const + { + CMatrix ret; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + ret[i][j] = matrix[i][j]; + } + } + + return ret; + } + + void set(const CMatrix &m) + { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + matrix[i][j] = m[i][j]; + } + } + } + }; + + bool computeWorkingSpaceMatrix(const Glib::ustring &path, const Glib::ustring &filename, PMatrix &out) + { + Glib::ustring fullpath = filename; + + if (!Glib::path_is_absolute(fullpath)) { + fullpath = Glib::build_filename(path, filename); + } + + ProfileContent content(fullpath); + cmsHPROFILE prof = content.toProfile(); + + if (!prof) { + return false; + } + + if (cmsGetColorSpace(prof) != cmsSigRgbData) { + cmsCloseProfile(prof); + return false; + } + + if (!cmsIsMatrixShaper(prof)) { + cmsCloseProfile(prof); + return false; + } + + cmsCIEXYZ *red = static_cast(cmsReadTag(prof, cmsSigRedMatrixColumnTag)); + cmsCIEXYZ *green = static_cast(cmsReadTag(prof, cmsSigGreenMatrixColumnTag)); + cmsCIEXYZ *blue = static_cast(cmsReadTag(prof, cmsSigBlueMatrixColumnTag)); + + if (!red || !green || !blue) { + cmsCloseProfile(prof); + return false; + } + + CMatrix m = { + CVector({ red->X, green->X, blue->X }), + CVector({ red->Y, green->Y, blue->Y }), + CVector({ red->Z, green->Z, blue->Z }) + }; + m[1][0] = red->Y; + m[1][1] = green->Y; + m[1][2] = blue->Y; + m[2][0] = red->Z; + m[2][1] = green->Z; + m[2][2] = blue->Z; + out.set(m); + + cmsCloseProfile(prof); + return true; + } + + bool loadWorkingSpaces(const Glib::ustring &path) + { + Glib::ustring fileName = Glib::build_filename(path, "workingspaces.json"); + FILE* const f = g_fopen(fileName.c_str(), "r"); + + if (settings->verbose) { + std::cout << "trying to load extra working spaces from " << fileName << std::flush; + } + + if (!f) { + if (settings->verbose) { + std::cout << " FAIL" << std::endl; + } + + return false; + } + + fseek(f, 0, SEEK_END); + long length = ftell(f); + + if (length <= 0) { + if (settings->verbose) { + std::cout << " FAIL" << std::endl; + } + + fclose(f); + return false; + } + + char *buf = new char[length + 1]; + fseek(f, 0, SEEK_SET); + length = fread(buf, 1, length, f); + buf[length] = 0; + + fclose(f); + + cJSON_Minify(buf); + cJSON *root = cJSON_Parse(buf); + + if (!root) { + if (settings->verbose) { + std::cout << " FAIL" << std::endl; + } + + return false; + } + + delete[] buf; + + cJSON *js = cJSON_GetObjectItem(root, "working_spaces"); + + if (!js) { + goto parse_error; + } + + for (js = js->child; js != nullptr; js = js->next) { + cJSON *ji = cJSON_GetObjectItem(js, "name"); + std::unique_ptr m(new PMatrix); + std::string name; + + if (!ji || ji->type != cJSON_String) { + goto parse_error; + } + + name = ji->valuestring; + + if (wProfiles.find(name) != wProfiles.end()) { + continue; // already there -- ignore + } + + bool found_matrix = false; + + ji = cJSON_GetObjectItem(js, "matrix"); + + if (ji) { + if (ji->type != cJSON_Array) { + goto parse_error; + } + + ji = ji->child; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j, ji = ji->next) { + if (!ji || ji->type != cJSON_Number) { + goto parse_error; + } + + m->matrix[i][j] = ji->valuedouble; + } + } + + if (ji) { + goto parse_error; + } + + found_matrix = true; + } else { + ji = cJSON_GetObjectItem(js, "file"); + + if (!ji || ji->type != cJSON_String) { + goto parse_error; + } + + found_matrix = computeWorkingSpaceMatrix(path, ji->valuestring, *m); + } + + if (!found_matrix) { + if (settings->verbose) { + std::cout << "Could not find suitable matrix for working space: " << name << std::endl; + } + + continue; + } + + pMatrices.emplace_back(std::move(m)); + TMatrix w = pMatrices.back()->matrix; + + CMatrix b = {}; + + if (!rtengine::invertMatrix(pMatrices.back()->toMatrix(), b)) { + if (settings->verbose) { + std::cout << "Matrix for working space: " << name << " is not invertible, skipping" << std::endl; + } + + pMatrices.pop_back(); + } else { + wMatrices[name] = w; + pMatrices.emplace_back(new PMatrix(b)); + TMatrix iw = pMatrices.back()->matrix; + iwMatrices[name] = iw; + wProfiles[name] = createFromMatrix(w); + + if (settings->verbose) { + std::cout << "Added working space: " << name << std::endl; + std::cout << " matrix: ["; + + for (int i = 0; i < 3; ++i) { + std::cout << " ["; + + for (int j = 0; j < 3; ++j) { + std::cout << " " << w[i][j]; + } + + std::cout << "]"; + } + + std::cout << " ]" << std::endl; + } + } + } + + cJSON_Delete(root); + + if (settings->verbose) { + std::cout << " OK" << std::endl; + } + + return true; + +parse_error: + + if (settings->verbose) { + std::cout << " ERROR in parsing " << fileName << std::endl; + } + + cJSON_Delete(root); + return false; + } + using ProfileMap = std::map; using MatrixMap = std::map; using ContentMap = std::map; using NameMap = std::map; ProfileMap wProfiles; - ProfileMap wProfilesGamma; + // ProfileMap wProfilesGamma; MatrixMap wMatrices; MatrixMap iwMatrices; + std::vector> pMatrices; + // These contain profiles from user/system directory(supplied on init) Glib::ustring profilesDir; Glib::ustring userICCDir; @@ -626,10 +1046,10 @@ cmsHPROFILE rtengine::ICCStore::workingSpace(const Glib::ustring& name) const return implementation->workingSpace(name); } -cmsHPROFILE rtengine::ICCStore::workingSpaceGamma(const Glib::ustring& name) const -{ - return implementation->workingSpaceGamma(name); -} +// cmsHPROFILE rtengine::ICCStore::workingSpaceGamma(const Glib::ustring& name) const +// { +// return implementation->workingSpaceGamma(name); +// } rtengine::TMatrix rtengine::ICCStore::workingSpaceMatrix(const Glib::ustring& name) const { @@ -732,96 +1152,7 @@ rtengine::ICCStore::~ICCStore() = default; std::vector rtengine::ICCStore::getWorkingProfiles() { - - std::vector res; - - for (unsigned int i = 0; i < sizeof(wpnames) / sizeof(wpnames[0]); i++) { - res.push_back(wpnames[i]); - } - - return res; -} - -std::vector rtengine::ICCStore::getGamma() -{ - - std::vector res; - - for (unsigned int i = 0; i < sizeof(wpgamma) / sizeof(wpgamma[0]); i++) { - res.push_back(wpgamma[i]); - } - - return res; -} - -void rtengine::ICCStore::getGammaArray(const procparams::ColorManagementParams &icm, GammaValues &ga) -{ - const double eps = 0.000000001; // not divide by zero - if (!icm.freegamma) {//if Free gamma not selected - // gamma : ga[0],ga[1],ga[2],ga[3],ga[4],ga[5] by calcul - if(icm.gamma == "BT709_g2.2_s4.5") { - ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin - ga[1] = 0.909995; - ga[2] = 0.090005; - ga[3] = 0.222222; - ga[4] = 0.081071; - } else if (icm.gamma == "sRGB_g2.4_s12.92") { - ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom - ga[1] = 0.947858; - ga[2] = 0.052142; - ga[3] = 0.077399; - ga[4] = 0.039293; - } else if (icm.gamma == "High_g1.3_s3.35") { - ga[0] = 1.3 ; //for high dynamic images - ga[1] = 0.998279; - ga[2] = 0.001721; - ga[3] = 0.298507; - ga[4] = 0.005746; - } else if (icm.gamma == "Low_g2.6_s6.9") { - ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images - ga[1] = 0.891161; - ga[2] = 0.108839; - ga[3] = 0.144928; - ga[4] = 0.076332; - } else if (icm.gamma == "standard_g2.2") { - ga[0] = 2.2; //gamma=2.2(as gamma of Adobe, Widegamut...) - ga[1] = 1.; - ga[2] = 0.; - ga[3] = 1. / eps; - ga[4] = 0.; - } else if (icm.gamma == "standard_g1.8") { - ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto) - ga[1] = 1.; - ga[2] = 0.; - ga[3] = 1. / eps; - ga[4] = 0.; - } else /* if (icm.gamma == "linear_g1.0") */ { - ga[0] = 1.0; //gamma=1 linear : for high dynamic images(cf : D.Coffin...) - ga[1] = 1.; - ga[2] = 0.; - ga[3] = 1. / eps; - ga[4] = 0.; - } - ga[5] = 0.0; - ga[6] = 0.0; - } else { //free gamma selected - GammaValues g_a; //gamma parameters - double pwr = 1.0 / icm.gampos; - double ts = icm.slpos; - double slope = icm.slpos == 0 ? eps : icm.slpos; - - 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; - ga[1] = 1. /(1.0 + g_a[4]); - ga[2] = g_a[4] /(1.0 + g_a[4]); - ga[3] = 1. / slope; - ga[5] = 0.0; - ga[6] = 0.0; - //printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]); - } + return implementation->getWorkingProfiles(); } // WARNING: the caller must lock lcmsMutex @@ -853,9 +1184,9 @@ cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) uint32_t size; } tags[tag_count]; - const uint32_t gamma = 0x239; - int gamma_size = 14; - int data_size =(gamma_size + 3) & ~3; + constexpr uint32_t gamma = 0x239; + constexpr int gamma_size = 14; + int data_size = (gamma_size + 3) & ~3; for (uint32_t i = 0; i < tag_count; i++) { memcpy(&tags[i], p, 12); @@ -868,7 +1199,7 @@ cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) tags[i].sig != 0x67545243 && // gTRC tags[i].sig != 0x72545243 && // rTRC tags[i].sig != 0x6B545243) { // kTRC - data_size +=(tags[i].size + 3) & ~3; + data_size += (tags[i].size + 3) & ~3; } } @@ -891,15 +1222,15 @@ cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) tags[i].sig == 0x6B545243) { // kTRC if (gamma_offset == 0) { gamma_offset = offset; - uint32_t pcurve[] = { htonl(0x63757276), htonl(0), htonl(gamma_size == 12 ? 0U : 1U) }; + uint32_t pcurve[] = { htonl(0x63757276), htonl(0), htonl(/*gamma_size == 12 ? 0U : */1U) }; memcpy(&nd[offset], pcurve, 12); - if (gamma_size == 14) { - uint16_t gm = htons(gamma); - memcpy(&nd[offset + 12], &gm, 2); - } + //if (gamma_size == 14) { + uint16_t gm = htons(gamma); + memcpy(&nd[offset + 12], &gm, 2); + //} - offset +=(gamma_size + 3) & ~3; + offset += (gamma_size + 3) & ~3; } tag.offset = htonl(gamma_offset); @@ -908,7 +1239,7 @@ cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) tag.offset = htonl(offset); tag.size = htonl(tags[i].size); memcpy(&nd[offset], &data[tags[i].offset], tags[i].size); - offset +=(tags[i].size + 3) & ~3; + offset += (tags[i].size + 3) & ~3; } memcpy(&nd[128 + 4 + i * 12], &tag, 12); @@ -950,7 +1281,7 @@ cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool pcurve[2] = 1; // pcurve[3] = 0x1f00000;// pcurve for gamma BT709 : g=2.22 s=4.5 // normalize gamma in RT, default(Emil's choice = sRGB) - pcurve[3] = 0x2390000;//pcurve for gamma sRGB : g:2.4 s=12.92 + pcurve[3] = 0x2390000;//pcurve for gamma sRGB : g:2.4 s=12.92310 } else { // lcms2 up to 2.4 has a bug with linear gamma causing precision loss(banding) @@ -973,9 +1304,9 @@ cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool // 0x74657874 : text // 0x64657363 : description tag for (unsigned int i = 0; i < pbody[0]; i++) { - oprof[oprof[0] / 4] = i ?(i > 1 ? 0x58595a20 : 0x64657363) : 0x74657874; + oprof[oprof[0] / 4] = i ? (i > 1 ? 0x58595a20 : 0x64657363) : 0x74657874; pbody[i * 3 + 2] = oprof[0]; - oprof[0] +=(pbody[i * 3 + 3] + 3) & -4; + oprof[0] += (pbody[i * 3 + 3] + 3) & -4; } memcpy(oprof + 32, pbody, sizeof(pbody)); @@ -1014,232 +1345,3 @@ cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool delete [] oprof; return p; } - -cmsHPROFILE rtengine::ICCStore::createGammaProfile(const procparams::ColorManagementParams &icm, GammaValues &ga) -{ - float p[6]; //primaries - ga[6] = 0.0; - - enum class ColorTemp { - D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50 - D65 = 6504 // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 - }; - ColorTemp temp = ColorTemp::D50; - - //primaries for 7 working profiles ==> output profiles - // eventually to adapt primaries if RT used special profiles ! - if (icm.output == "WideGamut") { - p[0] = 0.7350; //Widegamut primaries - p[1] = 0.2650; - p[2] = 0.1150; - p[3] = 0.8260; - p[4] = 0.1570; - p[5] = 0.0180; - } else if (icm.output == "Adobe RGB") { - p[0] = 0.6400; //Adobe primaries - p[1] = 0.3300; - p[2] = 0.2100; - p[3] = 0.7100; - p[4] = 0.1500; - p[5] = 0.0600; - temp = ColorTemp::D65; - } else if (icm.output == "sRGB") { - p[0] = 0.6400; // sRGB primaries - p[1] = 0.3300; - p[2] = 0.3000; - p[3] = 0.6000; - p[4] = 0.1500; - p[5] = 0.0600; - temp = ColorTemp::D65; - } else if (icm.output == "BruceRGB") { - p[0] = 0.6400; // Bruce primaries - p[1] = 0.3300; - p[2] = 0.2800; - p[3] = 0.6500; - p[4] = 0.1500; - p[5] = 0.0600; - temp = ColorTemp::D65; - } else if (icm.output == "Beta RGB") { - p[0] = 0.6888; // Beta primaries - p[1] = 0.3112; - p[2] = 0.1986; - p[3] = 0.7551; - p[4] = 0.1265; - p[5] = 0.0352; - } else if (icm.output == "BestRGB") { - p[0] = 0.7347; // Best primaries - p[1] = 0.2653; - p[2] = 0.2150; - p[3] = 0.7750; - p[4] = 0.1300; - p[5] = 0.0350; - } else if (icm.output == "Rec2020") { - p[0] = 0.7080; // Rec2020 primaries - p[1] = 0.2920; - p[2] = 0.1700; - p[3] = 0.7970; - p[4] = 0.1310; - p[5] = 0.0460; - temp = ColorTemp::D65; - } else { - p[0] = 0.7347; //ProPhoto and default primaries - p[1] = 0.2653; - p[2] = 0.1596; - p[3] = 0.8404; - p[4] = 0.0366; - p[5] = 0.0001; - } - - cmsCIExyY xyD; - cmsCIExyYTRIPLE Primaries = { - {p[0], p[1], 1.0}, // red - {p[2], p[3], 1.0}, // green - {p[4], p[5], 1.0} // blue - }; - cmsToneCurve* GammaTRC[3]; - - // 7 parameters for smoother curves - cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] } ; - - //lcmsMutex->lock(); Mutex acquired by the caller - cmsWhitePointFromTemp(&xyD,(double)temp); - GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, Parameters); //5 = smoother than 4 - cmsHPROFILE oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); //oprofdef become Outputprofile - cmsFreeToneCurve(GammaTRC[0]); - //lcmsMutex->unlock(); - - return oprofdef; -} - -// WARNING: the caller must lock lcmsMutex -cmsHPROFILE rtengine::ICCStore::createCustomGammaOutputProfile(const procparams::ColorManagementParams &icm, GammaValues &ga) -{ - bool pro = false; - Glib::ustring outProfile; - cmsHPROFILE outputProfile = nullptr; - - if (icm.freegamma && icm.gampos < 1.35) { - pro = true; //select profil with gammaTRC modified : - } else if (icm.gamma == "linear_g1.0" ||(icm.gamma == "High_g1.3_s3.35")) { - pro = true; //pro=0 RT_sRGB || Prophoto - } - - // Check that output profiles exist, otherwise use LCMS2 - // Use the icc/icm profiles associated to possible working profiles, set in "options" - if (icm.working == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto) && !pro) { - outProfile = options.rtSettings.prophoto; - } else if (icm.working == "Adobe RGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.adobe) ) { - outProfile = options.rtSettings.adobe; - } else if (icm.working == "WideGamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut) ) { - outProfile = options.rtSettings.widegamut; - } else if (icm.working == "Beta RGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta) ) { - outProfile = options.rtSettings.beta; - } else if (icm.working == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best) ) { - outProfile = options.rtSettings.best; - } else if (icm.working == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce) ) { - outProfile = options.rtSettings.bruce; - } else if (icm.working == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb) && !pro) { - outProfile = options.rtSettings.srgb; - } else if (icm.working == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb10) && pro) { - outProfile = options.rtSettings.srgb10; - } else if (icm.working == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto10) && pro) { - outProfile = options.rtSettings.prophoto10; - } else if (icm.working == "Rec2020" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.rec2020) ) { - outProfile = options.rtSettings.rec2020; - } else { - // Should not occurs - if (settings->verbose) { - printf("\"%s\": unknown working profile! - use LCMS2 substitution\n", icm.working.c_str() ); - } - - return nullptr; - } - - //begin adaptation rTRC gTRC bTRC - //"outputProfile" profile has the same characteristics than RGB values, but TRC are adapted... for applying profile - if (settings->verbose) { - printf("Output Gamma - profile: \"%s\"\n", outProfile.c_str() ); //c_str() - } - - outputProfile = ICCStore::getInstance()->getProfile(outProfile); //get output profile - - if (outputProfile == nullptr) { - - if (settings->verbose) { - printf("\"%s\" ICC output profile not found!\n", outProfile.c_str()); - } - return nullptr; - } - - // 7 parameters for smoother curves - cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] }; - - //change desc Tag , to "free gamma", or "BT709", etc. - cmsMLU *mlu; - cmsContext ContextID = cmsGetProfileContextID(outputProfile); // create context to modify some TAGs - mlu = cmsMLUalloc(ContextID, 1); - - // instruction with //ICC are used to generate ICC profile - if (mlu == nullptr) { - printf("Description error\n"); - } else { - - // Description TAG : selection of gamma and Primaries - if (!icm.freegamma) { - std::wstring gammaStr; - - if(icm.gamma == "High_g1.3_s3.35") { - gammaStr = std::wstring(L"GammaTRC: High g=1.3 s=3.35"); - } else if (icm.gamma == "Low_g2.6_s6.9") { - gammaStr = std::wstring(L"GammaTRC: Low g=2.6 s=6.9"); - } else if (icm.gamma == "sRGB_g2.4_s12.92") { - gammaStr = std::wstring(L"GammaTRC: sRGB g=2.4 s=12.92"); - } else if (icm.gamma == "BT709_g2.2_s4.5") { - gammaStr = std::wstring(L"GammaTRC: BT709 g=2.2 s=4.5"); - } else if (icm.gamma == "linear_g1.0") { - gammaStr = std::wstring(L"GammaTRC: Linear g=1.0"); - } else if (icm.gamma == "standard_g2.2") { - gammaStr = std::wstring(L"GammaTRC: g=2.2"); - } else if (icm.gamma == "standard_g1.8") { - gammaStr = std::wstring(L"GammaTRC: g=1.8"); - } - - cmsMLUsetWide(mlu, "en", "US", gammaStr.c_str()); - } else { - // create description with gamma + slope + primaries - std::wostringstream gammaWs; - gammaWs.precision(2); - gammaWs << "Manual GammaTRC: g=" <<(float)icm.gampos << " s=" <<(float)icm.slpos; - - cmsMLUsetWide(mlu, "en", "US", gammaWs.str().c_str()); - } - - cmsWriteTag(outputProfile, cmsSigProfileDescriptionTag, mlu);//desc changed - - /* - cmsMLUsetWide(mlu, "en", "US", L"General Public License - AdobeRGB compatible");//adapt to profil - cmsWriteTag(outputProfile, cmsSigCopyrightTag, mlu); - - cmsMLUsetWide(mlu, "en", "US", L"RawTherapee"); - cmsWriteTag(outputProfile, cmsSigDeviceMfgDescTag, mlu); - - cmsMLUsetWide(mlu, "en", "US", L"RTMedium"); //adapt to profil - cmsWriteTag(outputProfile, cmsSigDeviceModelDescTag, mlu); - - */ - - cmsMLUfree(mlu); - } - - // Calculate output profile's rTRC gTRC bTRC - cmsToneCurve* GammaTRC = cmsBuildParametricToneCurve(nullptr, 5, Parameters); - cmsWriteTag(outputProfile, cmsSigRedTRCTag,(void*)GammaTRC ); - cmsWriteTag(outputProfile, cmsSigGreenTRCTag,(void*)GammaTRC ); - cmsWriteTag(outputProfile, cmsSigBlueTRCTag,(void*)GammaTRC ); - - if (GammaTRC) { - cmsFreeToneCurve(GammaTRC); - } - - return outputProfile; -} diff --git a/rtengine/iccstore.h b/rtengine/iccstore.h index bdb15d2c0..6b57fd072 100644 --- a/rtengine/iccstore.h +++ b/rtengine/iccstore.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include @@ -69,7 +69,7 @@ public: void init(const Glib::ustring& usrICCDir, const Glib::ustring& stdICCDir, bool loadAll); cmsHPROFILE workingSpace(const Glib::ustring& name) const; - cmsHPROFILE workingSpaceGamma(const Glib::ustring& name) const; + // cmsHPROFILE workingSpaceGamma(const Glib::ustring& name) const; TMatrix workingSpaceMatrix(const Glib::ustring& name) const; TMatrix workingSpaceInverseMatrix(const Glib::ustring& name) const; @@ -95,14 +95,10 @@ public: std::uint8_t getOutputIntents(const Glib::ustring& name) const; std::uint8_t getProofIntents(const Glib::ustring& name) const; - static std::vector getWorkingProfiles(); - static std::vector getGamma(); + /*static*/ std::vector getWorkingProfiles(); - static void getGammaArray(const procparams::ColorManagementParams& icm, GammaValues& ga); static cmsHPROFILE makeStdGammaProfile(cmsHPROFILE iprof); static cmsHPROFILE createFromMatrix(const double matrix[3][3], bool gamma = false, const Glib::ustring& name = Glib::ustring()); - static cmsHPROFILE createGammaProfile(const procparams::ColorManagementParams& icm, GammaValues& ga); - static cmsHPROFILE createCustomGammaOutputProfile(const procparams::ColorManagementParams& icm, GammaValues& ga); private: class Implementation; diff --git a/rtengine/icons.cc b/rtengine/icons.cc index aa3b67cbf..ccc5ebd09 100644 --- a/rtengine/icons.cc +++ b/rtengine/icons.cc @@ -108,10 +108,7 @@ void setPaths () imagePaths.clear (); - imagePaths.push_back (Glib::build_filename(argv0, "images", "Dark")); - imagePaths.push_back (Glib::build_filename(argv0, "images", "Dark", "actions")); - imagePaths.push_back (Glib::build_filename(argv0, "images", "Dark", "devices")); - imagePaths.push_back (Glib::build_filename(argv0, "images", "Dark", "places")); + imagePaths.push_back (Glib::build_filename(argv0, "images", "dark")); // The images folder is the second fallback solution. imagePaths.push_back (Glib::build_filename(argv0, "images")); diff --git a/rtengine/iimage.cc b/rtengine/iimage.cc index adda06162..c9a4f223a 100644 --- a/rtengine/iimage.cc +++ b/rtengine/iimage.cc @@ -17,6 +17,7 @@ * along with RawTherapee. If not, see . */ +#include "procparams.h" #include "rtengine.h" const char rtengine::sImage8[] = "Image8"; diff --git a/rtengine/iimage.h b/rtengine/iimage.h index a22630301..20a3b50be 100644 --- a/rtengine/iimage.h +++ b/rtengine/iimage.h @@ -26,7 +26,6 @@ #include "imagedimensions.h" #include "LUT.h" #include "coord2d.h" -#include "procparams.h" #include "color.h" #include "../rtgui/threadutils.h" @@ -43,12 +42,21 @@ namespace rtengine { +namespace procparams +{ + +struct CoarseTransformParams; + +} + +class ProgressListener; +class Color; + extern const char sImage8[]; extern const char sImage16[]; extern const char sImagefloat[]; -int getCoarseBitMask( const procparams::CoarseTransformParams &coarse); -class ProgressListener; -class Color; + +int getCoarseBitMask(const procparams::CoarseTransformParams& coarse); enum TypeInterpolation { TI_Nearest, TI_Bilinear }; @@ -82,22 +90,18 @@ public: // Read the raw dump of the data void readData (FILE *fh) {} // Write a raw dump of the data - void writeData (FILE *fh) {} + void writeData (FILE *fh) const {} virtual void normalizeInt (int srcMinVal, int srcMaxVal) {}; virtual void normalizeFloat (float srcMinVal, float srcMaxVal) {}; - virtual void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, int compression) {} + virtual void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, int compression) const {} virtual void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, std::vector &red, std::vector &green, std::vector &blue, - int tran) {} - virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) + int tran) const {} + virtual void getAutoWBMultipliers (double &rm, double &gm, double &bm) const { rm = gm = bm = 1.0; } - virtual const char* getType () const - { - return "unknown"; - } }; @@ -119,13 +123,18 @@ inline void ImageDatas::convertTo(unsigned char src, unsigned short& dst) const template<> inline void ImageDatas::convertTo(float src, unsigned char& dst) const { - dst = uint16ToUint8Rounded(src); + dst = uint16ToUint8Rounded(CLIP(src)); } template<> inline void ImageDatas::convertTo(unsigned char src, float& dst) const { dst = src * 257; } +template<> +inline void ImageDatas::convertTo(float src, float& dst) const +{ + dst = std::isnan(src) ? 0.f : src; +} // -------------------------------------------------------------------- // Planar order classes @@ -138,7 +147,7 @@ protected: AlignedBuffer ab; public: #if CHECK_BOUNDS - int width_, height_; + size_t width_, height_; #endif T** ptrs; @@ -148,7 +157,7 @@ public: PlanarPtr() : ptrs (nullptr) {} #endif - bool resize(int newSize) + bool resize(size_t newSize) { if (ab.resize(newSize)) { ptrs = ab.data; @@ -166,7 +175,7 @@ public: ptrs = tmpsPtrs; #if CHECK_BOUNDS - int tmp = other.width_; + size_t tmp = other.width_; other.width_ = width_; width_ = tmp; tmp = other.height_; @@ -175,7 +184,7 @@ public: #endif } - T*& operator() (unsigned row) + T*& operator() (size_t row) { #if CHECK_BOUNDS assert (row < height_); @@ -183,7 +192,7 @@ public: return ptrs[row]; } // Will send back the start of a row, starting with a red, green or blue value - T* operator() (unsigned row) const + T* operator() (size_t row) const { #if CHECK_BOUNDS assert (row < height_); @@ -191,14 +200,14 @@ public: return ptrs[row]; } // Will send back a value at a given row, col position - T& operator() (unsigned row, unsigned col) + T& operator() (size_t row, size_t col) { #if CHECK_BOUNDS assert (row < height_ && col < width_); #endif return ptrs[row][col]; } - const T operator() (unsigned row, unsigned col) const + const T operator() (size_t row, size_t col) const { #if CHECK_BOUNDS assert (row < height_ && col < width_); @@ -214,7 +223,7 @@ class PlanarWhateverData : virtual public ImageDatas private: AlignedBuffer abData; - int rowstride; // Plan size, in bytes (all padding bytes included) + size_t rowstride; // Plan size, in bytes (all padding bytes included) public: T* data; @@ -227,7 +236,7 @@ public: } // Send back the row stride. WARNING: unit = byte, not element! - int getRowStride () + size_t getRowStride () const { return rowstride; } @@ -256,9 +265,8 @@ public: /* If any of the required allocation fails, "width" and "height" are set to -1, and all remaining buffer are freed * Can be safely used to reallocate an existing image */ - void allocate (int W, int H) + void allocate (int W, int H) override { - if (W == width && H == height) { return; } @@ -311,7 +319,7 @@ public: } /** Copy the data to another PlanarWhateverData */ - void copyData(PlanarWhateverData *dest) + void copyData(PlanarWhateverData *dest) const { assert (dest != NULL); // Make sure that the size is the same, reallocate if necessary @@ -343,7 +351,7 @@ public: } } - void rotate (int deg) + void rotate (int deg) override { if (deg == 90) { @@ -401,7 +409,7 @@ public: } template - void resizeImgTo (int nw, int nh, TypeInterpolation interp, PlanarWhateverData *imgPtr) + void resizeImgTo (int nw, int nh, TypeInterpolation interp, PlanarWhateverData *imgPtr) const { //printf("resizeImgTo: resizing %s image data (%d x %d) to %s (%d x %d)\n", getType(), width, height, imgPtr->getType(), imgPtr->width, imgPtr->height); if (width == nw && height == nh) { @@ -462,7 +470,7 @@ public: } } - void hflip () + void hflip () override { int width2 = width / 2; @@ -486,7 +494,7 @@ public: #endif } - void vflip () + void vflip () override { int height2 = height / 2; @@ -511,17 +519,7 @@ public: #endif } - void calcHist(unsigned int *hist16) - { - for (int row = 0; row < height; row++) - for (int col = 0; col < width; col++) { - unsigned short idx; - convertTo(v(row, col), idx); - hist16[idx]++; - } - } - - void transformPixel (int x, int y, int tran, int& tx, int& ty) + void transformPixel (int x, int y, int tran, int& tx, int& ty) const { if (!tran) { @@ -564,7 +562,7 @@ public: } } - void getPipetteData (T &value, int posX, int posY, int squareSize, int tran) + void getPipetteData (T &value, int posX, int posY, int squareSize, int tran) const { int x; int y; @@ -585,20 +583,28 @@ public: value = n ? T(accumulator / float(n)) : T(0); } - void readData (FILE *f) + void readData (FILE *f) { for (int i = 0; i < height; i++) { fread (v(i), sizeof(T), width, f); } } - void writeData (FILE *f) + void writeData (FILE *f) const { for (int i = 0; i < height; i++) { fwrite (v(i), sizeof(T), width, f); } } + void fill (T value) { + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + v(i, j) = value; + } + } + } + }; @@ -609,8 +615,8 @@ class PlanarRGBData : virtual public ImageDatas private: AlignedBuffer abData; - int rowstride; // Plan size, in bytes (all padding bytes included) - int planestride; // Row length, in bytes (padding bytes included) + size_t rowstride; // Plan size, in bytes (all padding bytes included) + size_t planestride; // Row length, in bytes (padding bytes included) protected: T* data; @@ -620,18 +626,18 @@ public: PlanarPtr b; PlanarRGBData() : rowstride(0), planestride(0), data (nullptr) {} - PlanarRGBData(int w, int h) : rowstride(0), planestride(0), data (nullptr) + PlanarRGBData(size_t w, size_t h) : rowstride(0), planestride(0), data (nullptr) { allocate(w, h); } // Send back the row stride. WARNING: unit = byte, not element! - int getRowStride () + size_t getRowStride () const { return rowstride; } // Send back the plane stride. WARNING: unit = byte, not element! - int getPlaneStride () + size_t getPlaneStride () const { return planestride; } @@ -666,7 +672,7 @@ public: /* If any of the required allocation fails, "width" and "height" are set to -1, and all remaining buffer are freed * Can be safely used to reallocate an existing image */ - void allocate (int W, int H) + void allocate (int W, int H) override { if (W == width && H == height) { @@ -728,7 +734,7 @@ public: char *bluestart = (char*)(data) + 2 * planestride; for (int i = 0; i < height; ++i) { - int k = i * rowstride; + size_t k = i * rowstride; r(i) = (T*)(redstart + k); g(i) = (T*)(greenstart + k); b(i) = (T*)(bluestart + k); @@ -736,7 +742,7 @@ public: } /** Copy the data to another PlanarRGBData */ - void copyData(PlanarRGBData *dest) + void copyData(PlanarRGBData *dest) const { assert (dest != nullptr); // Make sure that the size is the same, reallocate if necessary @@ -773,7 +779,7 @@ public: } } - void rotate (int deg) + void rotate (int deg) override { if (deg == 90) { @@ -843,7 +849,7 @@ public: } template - void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) + void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) const { //printf("resizeImgTo: resizing %s image data (%d x %d) to %s (%d x %d)\n", getType(), width, height, imgPtr->getType(), imgPtr->width, imgPtr->height); if (width == nw && height == nh) { @@ -892,15 +898,15 @@ public: // This case should never occur! for (int i = 0; i < nh; i++) { for (int j = 0; j < nw; j++) { - r(i, j) = 0; - g(i, j) = 0; - b(i, j) = 0; + imgPtr->r(i, j) = 0; + imgPtr->g(i, j) = 0; + imgPtr->b(i, j) = 0; } } } } - void hflip () + void hflip () override { int width2 = width / 2; @@ -932,7 +938,7 @@ public: #endif } - void vflip () + void vflip () override { int height2 = height / 2; @@ -965,7 +971,7 @@ public: #endif } - void calcGrayscaleHist(unsigned int *hist16) + void calcGrayscaleHist(unsigned int *hist16) const { for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { @@ -979,7 +985,7 @@ public: } } - void computeAutoHistogram (LUTu & histogram, int& histcompr) + void computeAutoHistogram (LUTu & histogram, int& histcompr) const { histcompr = 3; @@ -998,7 +1004,7 @@ public: } } - void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) + void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const override { histogram.clear(); avg_r = avg_g = avg_b = 0.; @@ -1030,7 +1036,7 @@ public: } } - void getAutoWBMultipliers (double &rm, double &gm, double &bm) + void getAutoWBMultipliers (double &rm, double &gm, double &bm) const override { double avg_r = 0.; @@ -1061,7 +1067,7 @@ public: bm = avg_b / double(n); } - void transformPixel (int x, int y, int tran, int& tx, int& ty) + void transformPixel (int x, int y, int tran, int& tx, int& ty) const { if (!tran) { @@ -1104,9 +1110,9 @@ public: } } - virtual void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, + void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, std::vector &red, std::vector &green, std::vector &blue, - int tran) + int tran) const override { int x; int y; @@ -1143,7 +1149,7 @@ public: } } - void getPipetteData (T &valueR, T &valueG, T &valueB, int posX, int posY, int squareSize, int tran) + void getPipetteData (T &valueR, T &valueG, T &valueB, int posX, int posY, int squareSize, int tran) const { int x; int y; @@ -1170,22 +1176,28 @@ public: valueB = n ? T(accumulatorB / float(n)) : T(0); } - void readData (FILE *f) + void readData (FILE *f) { for (int i = 0; i < height; i++) { - fread (r(i), sizeof(T), width, f); + if (fread(r(i), sizeof(T), width, f) < static_cast(width)) { + break; + } } for (int i = 0; i < height; i++) { - fread (g(i), sizeof(T), width, f); + if (fread(g(i), sizeof(T), width, f) < static_cast(width)) { + break; + } } for (int i = 0; i < height; i++) { - fread (b(i), sizeof(T), width, f); + if (fread(b(i), sizeof(T), width, f) < static_cast(width)) { + break; + } } } - void writeData (FILE *f) + void writeData (FILE *f) const { for (int i = 0; i < height; i++) { fwrite (r(i), sizeof(T), width, f); @@ -1211,10 +1223,10 @@ class ChunkyPtr { private: T* ptr; - int width; + ssize_t width; public: #if CHECK_BOUNDS - int width_, height_; + size_t width_, height_; #endif #if CHECK_BOUNDS @@ -1222,7 +1234,7 @@ public: #else ChunkyPtr() : ptr (nullptr), width(-1) {} #endif - void init(T* base, int w = -1) + void init(T* base, ssize_t w = -1) { ptr = base; width = w; @@ -1233,12 +1245,12 @@ public: other.ptr = ptr; ptr = tmpsPtr; - int tmpWidth = other.width; + ssize_t tmpWidth = other.width; other.width = width; width = tmpWidth; #if CHECK_BOUNDS - int tmp = other.width_; + size_t tmp = other.width_; other.width_ = width_; width_ = tmp; tmp = other.height_; @@ -1249,7 +1261,7 @@ public: } // Will send back the start of a row, starting with a red, green or blue value - T* operator() (unsigned row) const + T* operator() (size_t row) const { #if CHECK_BOUNDS assert (row < height_); @@ -1257,14 +1269,14 @@ public: return &ptr[3 * (row * width)]; } // Will send back a value at a given row, col position - T& operator() (unsigned row, unsigned col) + T& operator() (size_t row, size_t col) { #if CHECK_BOUNDS assert (row < height_ && col < width_); #endif return ptr[3 * (row * width + col)]; } - const T operator() (unsigned row, unsigned col) const + const T operator() (size_t row, size_t col) const { #if CHECK_BOUNDS assert (row < height_ && col < width_); @@ -1328,7 +1340,7 @@ public: * If any of the required allocation fails, "width" and "height" are set to -1, and all remaining buffer are freed * Can be safely used to reallocate an existing image or to free up it's memory with "allocate (0,0);" */ - void allocate (int W, int H) + void allocate (int W, int H) override { if (W == width && H == height) { @@ -1346,7 +1358,7 @@ public: b.height_ = height; #endif - abData.resize(width * height * 3u); + abData.resize((size_t)width * (size_t)height * (size_t)3); if (!abData.isEmpty()) { data = abData.data; @@ -1368,7 +1380,7 @@ public: } /** Copy the data to another ChunkyRGBData */ - void copyData(ChunkyRGBData *dest) + void copyData(ChunkyRGBData *dest) const { assert (dest != nullptr); // Make sure that the size is the same, reallocate if necessary @@ -1399,7 +1411,7 @@ public: } } - void rotate (int deg) + void rotate (int deg) override { if (deg == 90) { @@ -1461,7 +1473,7 @@ public: } template - void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) + void resizeImgTo (int nw, int nh, TypeInterpolation interp, IC *imgPtr) const { //printf("resizeImgTo: resizing %s image data (%d x %d) to %s (%d x %d)\n", getType(), width, height, imgPtr->getType(), imgPtr->width, imgPtr->height); if (width == nw && height == nh) { @@ -1525,15 +1537,15 @@ public: // This case should never occur! for (int i = 0; i < nh; i++) { for (int j = 0; j < nw; j++) { - r(i, j) = 0; - g(i, j) = 0; - b(i, j) = 0; + imgPtr->r(i, j) = 0; + imgPtr->g(i, j) = 0; + imgPtr->b(i, j) = 0; } } } } - void hflip () + void hflip () override { int width2 = width / 2; @@ -1569,7 +1581,7 @@ public: } } - void vflip () + void vflip () override { AlignedBuffer lBuffer(3 * width); @@ -1585,7 +1597,7 @@ public: } } - void calcGrayscaleHist(unsigned int *hist16) + void calcGrayscaleHist(unsigned int *hist16) const { for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { @@ -1599,7 +1611,7 @@ public: } } - void computeAutoHistogram (LUTu & histogram, int& histcompr) + void computeAutoHistogram (LUTu & histogram, int& histcompr) const { histcompr = 3; @@ -1618,7 +1630,7 @@ public: } } - void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) + void computeHistogramAutoWB (double &avg_r, double &avg_g, double &avg_b, int &n, LUTu &histogram, const int compression) const override { histogram.clear(); avg_r = avg_g = avg_b = 0.; @@ -1650,7 +1662,7 @@ public: } } - void getAutoWBMultipliers (double &rm, double &gm, double &bm) + void getAutoWBMultipliers (double &rm, double &gm, double &bm) const override { double avg_r = 0.; @@ -1681,7 +1693,7 @@ public: bm = avg_b / double(n); } - void transformPixel (int x, int y, int tran, int& tx, int& ty) + void transformPixel (int x, int y, int tran, int& tx, int& ty) const { if (!tran) { @@ -1724,9 +1736,9 @@ public: } } - virtual void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, + void getSpotWBData (double &reds, double &greens, double &blues, int &rn, int &gn, int &bn, std::vector &red, std::vector &green, std::vector &blue, - int tran) + int tran) const override { int x; int y; @@ -1763,14 +1775,16 @@ public: } } - void readData (FILE *f) + void readData (FILE *f) { for (int i = 0; i < height; i++) { - fread (r(i), sizeof(T), 3 * width, f); + if (fread(r(i), sizeof(T), 3 * width, f) < 3 * static_cast(width)) { + break; + } } } - void writeData (FILE *f) + void writeData (FILE *f) const { for (int i = 0; i < height; i++) { fwrite (r(i), sizeof(T), 3 * width, f); @@ -1791,30 +1805,31 @@ public: /** @brief Returns a mutex that can is useful in many situations. No image operations shuold be performed without locking this mutex. * @return The mutex */ virtual MyMutex& getMutex () = 0; - virtual cmsHPROFILE getProfile () = 0; + virtual cmsHPROFILE getProfile () const = 0; /** @brief Returns the bits per pixel of the image. * @return The bits per pixel of the image */ - virtual int getBitsPerPixel () = 0; + virtual int getBitsPerPixel () const = 0; /** @brief Saves the image to file. It autodetects the format (jpg, tif, png are supported). * @param fname is the name of the file @return the error code, 0 if none */ - virtual int saveToFile (Glib::ustring fname) = 0; + virtual int saveToFile (const Glib::ustring &fname) const = 0; /** @brief Saves the image to file in a png format. * @param fname is the name of the file * @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 bps = -1) = 0; + virtual int saveAsPNG (const Glib::ustring &fname, int bps = -1) const = 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 @return the error code, 0 if none */ - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3 ) = 0; + virtual int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3 ) const = 0; /** @brief Saves the image to file in a tif format. * @param fname is the name of the file * @param bps can be 8 or 16 depending on the bits per pixels the output file will have + * @param isFloat is true for saving float images. Will be ignored by file format not supporting float data @return the error code, 0 if none */ - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false) = 0; + virtual int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const = 0; /** @brief Sets the progress listener if you want to follow the progress of the image saving operations (optional). * @param pl is the pointer to the class implementing the ProgressListener interface */ virtual void setSaveProgressListener (ProgressListener* pl) = 0; @@ -1827,14 +1842,14 @@ public: class IImagefloat : public IImage, public PlanarRGBData { public: - virtual ~IImagefloat() {} + ~IImagefloat() override {} }; /** @brief This class represents an image having a classical 8 bits/pixel representation */ class IImage8 : public IImage, public ChunkyRGBData { public: - virtual ~IImage8() {} + ~IImage8() override {} }; /** @brief This class represents an image having a 16 bits/pixel planar representation. @@ -1842,7 +1857,7 @@ public: class IImage16 : public IImage, public PlanarRGBData { public: - virtual ~IImage16() {} + ~IImage16() override {} }; } diff --git a/rtengine/image16.cc b/rtengine/image16.cc index e4b7014b6..46de66e59 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -25,7 +25,7 @@ namespace { -void getScanline8 (const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned char* buffer) +void getScanline8(const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned char* buffer) { for (int i = 0, ix = 0; i < width; i++) { buffer[ix++] = rtengine::uint16ToUint8Rounded(red[i]); @@ -34,7 +34,7 @@ void getScanline8 (const uint16_t *red, const uint16_t *green, const uint16_t *b } } -void getScanline16 (const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned short* buffer) +void getScanline16(const uint16_t *red, const uint16_t *green, const uint16_t *blue, int width, unsigned short* buffer) { for (int i = 0, ix = 0; i < width; i++) { buffer[ix++] = red[i]; @@ -47,20 +47,20 @@ void getScanline16 (const uint16_t *red, const uint16_t *green, const uint16_t * using namespace rtengine; -Image16::Image16 () +Image16::Image16() { } -Image16::Image16 (int w, int h) +Image16::Image16(int w, int h) { - allocate (w, h); + allocate(w, h); } -Image16::~Image16 () +Image16::~Image16() { } -void Image16::getScanline (int row, unsigned char* buffer, int bps) +void Image16::getScanline(int row, unsigned char* buffer, int bps, bool isFloat) const { if (data == nullptr) { @@ -68,34 +68,33 @@ void Image16::getScanline (int row, unsigned char* buffer, int bps) } if (bps == 16) { - getScanline16 (r(row), g(row), b(row), width, (unsigned short*)buffer); + getScanline16(r(row), g(row), b(row), width, (unsigned short*)buffer); } else if (bps == 8) { - getScanline8 (r(row), g(row), b(row), width, buffer); + getScanline8(r(row), g(row), b(row), width, buffer); } } -/* - * void Image16::setScanline (int row, unsigned char* buffer, int bps, int minValue[3], int maxValue[3]); - * has not been implemented yet, because as of now, this method is called for IIOSF_FLOAT sample format only - */ -void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minValue, float *maxValue) +void Image16::setScanline(int row, unsigned char* buffer, int bps, unsigned int numSamples) { if (data == nullptr) { return; } - // For optimization purpose, we're assuming that this class never has to provide min/max bounds - assert(!minValue); - switch (sampleFormat) { case (IIOSF_UNSIGNED_CHAR): { int ix = 0; - for (int i = 0; i < width; ++i) { - r(row, i) = static_cast(buffer[ix++]) * 257; - g(row, i) = static_cast(buffer[ix++]) * 257; - b(row, i) = static_cast(buffer[ix++]) * 257; + if (numSamples == 1) { + for (int i = 0; i < width; ++i) { + r(row, i) = g(row, i) = b(row, i) = static_cast(buffer[ix++]) * 257; + } + } else { + for (int i = 0; i < width; ++i) { + r(row, i) = static_cast(buffer[ix++]) * 257; + g(row, i) = static_cast(buffer[ix++]) * 257; + b(row, i) = static_cast(buffer[ix++]) * 257; + } } break; @@ -125,10 +124,10 @@ void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minVa */ } -Image16* Image16::copy () +Image16* Image16::copy() const { - Image16* cp = new Image16 (width, height); + Image16* cp = new Image16(width, height); copyData(cp); return cp; } @@ -147,14 +146,15 @@ Image16* Image16::copySubRegion (int x, int y, int width, int height) return cp; } -void Image16::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp) +void Image16::getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const { // compute channel multipliers float rm = 1.f, gm = 1.f, bm = 1.f; + if (ctemp.getTemp() >= 0) { double drm, dgm, dbm; - ctemp.getMultipliers (drm, dgm, dbm); + ctemp.getMultipliers(drm, dgm, dbm); rm = drm; gm = dgm; bm = dbm; @@ -170,7 +170,7 @@ void Image16::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const P int sx1, sy1, sx2, sy2; - transform (pp, tran, sx1, sy1, sx2, sy2); + transform(pp, tran, sx1, sy1, sx2, sy2); int imwidth = image->getWidth(); // Destination image int imheight = image->getHeight(); // Destination image @@ -280,25 +280,22 @@ void Image16::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const P } } - if (mtran == TR_NONE) + if (mtran == TR_NONE) for (int dst_x = 0, src_x = sx1; dst_x < imwidth; dst_x++, src_x += skip) { image->r(iy, dst_x) = lineR[dst_x]; image->g(iy, dst_x) = lineG[dst_x]; image->b(iy, dst_x) = lineB[dst_x]; - } - else if (mtran == TR_R180) + } else if (mtran == TR_R180) for (int dst_x = 0; dst_x < imwidth; dst_x++) { image->r(imheight - 1 - iy, imwidth - 1 - dst_x) = lineR[dst_x]; image->g(imheight - 1 - iy, imwidth - 1 - dst_x) = lineG[dst_x]; image->b(imheight - 1 - iy, imwidth - 1 - dst_x) = lineB[dst_x]; - } - else if (mtran == TR_R90) + } else if (mtran == TR_R90) for (int dst_x = 0, src_x = sx1; dst_x < imwidth; dst_x++, src_x += skip) { image->r(dst_x, imheight - 1 - iy) = lineR[dst_x]; image->g(dst_x, imheight - 1 - iy) = lineG[dst_x]; image->b(dst_x, imheight - 1 - iy) = lineB[dst_x]; - } - else if (mtran == TR_R270) + } else if (mtran == TR_R270) for (int dst_x = 0, src_x = sx1; dst_x < imwidth; dst_x++, src_x += skip) { image->r(imwidth - 1 - dst_x, iy) = lineR[dst_x]; image->g(imwidth - 1 - dst_x, iy) = lineG[dst_x]; @@ -312,8 +309,7 @@ void Image16::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const P #undef GCLIP } -Image8* -Image16::to8() +Image8* Image16::to8() const { Image8* img8 = new Image8(width, height); @@ -328,23 +324,50 @@ Image16::to8() return img8; } -Imagefloat* -Image16::tofloat() +// Parallelized transformation; create transform with cmsFLAGS_NOCACHE! +void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform) { - Imagefloat* imgfloat = new Imagefloat(width, height); + //cmsDoTransform(hTransform, data, data, planestride); - for (int h = 0; h < height; ++h) { - for (int w = 0; w < width; ++w) { - imgfloat->r(h, w) = r(h, w); - imgfloat->g(h, w) = g(h, w); - imgfloat->b(h, w) = b(h, w); - } + // LittleCMS cannot parallelize planar setups -- Hombre: LCMS2.4 can! But it we use this new feature, memory allocation have to be modified too + // so build temporary buffers to allow multi processor execution +#ifdef _OPENMP + #pragma omp parallel +#endif + { + AlignedBuffer buffer(width * 3); + +#ifdef _OPENMP + #pragma omp for schedule(static) +#endif + + for (int y = 0; y < height; y++) + { + unsigned short *p = buffer.data, *pR = r(y), *pG = g(y), *pB = b(y); + + for (int x = 0; x < width; x++) { + *(p++) = *(pR++); + *(p++) = *(pG++); + *(p++) = *(pB++); + } + + cmsDoTransform(hTransform, buffer.data, buffer.data, width); + + p = buffer.data; + pR = r(y); + pG = g(y); + pB = b(y); + + for (int x = 0; x < width; x++) { + *(pR++) = *(p++); + *(pG++) = *(p++); + *(pB++) = *(p++); + } + } // End of parallelization } - - return imgfloat; } -// // Parallized transformation; create transform with cmsFLAGS_NOCACHE! +// // 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 diff --git a/rtengine/image16.h b/rtengine/image16.h index 3537051d2..f39f73c56 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -36,66 +36,75 @@ class Image16 : public IImage16, public ImageIO public: - Image16 (); - Image16 (int width, int height); - ~Image16 (); + Image16(); + Image16(int width, int height); + ~Image16() override; - Image16* copy (); + Image16* copy() const; Image16* copySubRegion (int x, int y, int width, int height); - Image8* to8(); - Imagefloat* tofloat(); + Image8* to8() const; - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp); + void getStdImage(const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const override; - virtual const char* getType () const + const char* getType() const override { return sImage16; } - virtual int getBPS () + int getBPS() const override { return 8 * sizeof(unsigned short); } - virtual void getScanline (int row, unsigned char* buffer, int bps); - virtual void setScanline (int row, unsigned char* buffer, int bps, float *minValue = nullptr, float *maxValue = nullptr); + + void getScanline(int row, unsigned char* buffer, int bps, bool isFloat = false) const override; + void setScanline(int row, unsigned char* buffer, int bps, unsigned int numSamples) override; // functions inherited from IImage16: - virtual MyMutex& getMutex () + MyMutex& getMutex() override { - return mutex (); + return mutex(); } - virtual cmsHPROFILE getProfile () + + cmsHPROFILE getProfile() const override { - return getEmbeddedProfile (); + return getEmbeddedProfile(); } - virtual int getBitsPerPixel () + + int getBitsPerPixel() const override { return 8 * sizeof(unsigned short); } - virtual int saveToFile (Glib::ustring fname) + + int saveToFile(const Glib::ustring &fname) const override { - return save (fname); + return save(fname); } - virtual int saveAsPNG (Glib::ustring fname, int bps = -1) + + int saveAsPNG(const Glib::ustring &fname, int bps = -1) const override { - return savePNG (fname, bps); + return savePNG(fname, bps); } - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) + + int saveAsJPEG(const Glib::ustring &fname, int quality = 100, int subSamp = 3) const override { - return saveJPEG (fname, quality, subSamp); + return saveJPEG(fname, quality, subSamp); } - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false) + + int saveAsTIFF(const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override { - return saveTIFF (fname, bps, uncompressed); + return saveTIFF(fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener (ProgressListener* pl) + + void setSaveProgressListener(ProgressListener* pl) override { - setProgressListener (pl); + setProgressListener(pl); } - virtual void free () + + void free() override { delete this; } + void ExecCMSTransform(cmsHTRANSFORM hTransform); /* void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); */ }; diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 16169e86f..bcb457a98 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -37,7 +37,7 @@ Image8::~Image8 () { } -void Image8::getScanline (int row, unsigned char* buffer, int bps) +void Image8::getScanline (int row, unsigned char* buffer, int bps, bool isFloat) const { if (data == nullptr) { @@ -55,19 +55,22 @@ void Image8::getScanline (int row, unsigned char* buffer, int bps) } } -void Image8::setScanline (int row, unsigned char* buffer, int bps, float *minValue, float *maxValue) +void Image8::setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples) { if (data == nullptr) { return; } - // For optimization purpose, we're assuming that this class never have to provide min/max bound - assert(!minValue); - switch (sampleFormat) { case (IIOSF_UNSIGNED_CHAR): - memcpy (data + row * width * 3u, buffer, width * 3); + if(numSamples == 1) { + for(size_t i = 0; i < static_cast(width); ++i) { + data[row * width * 3 + 3 * i] = data[row * width * 3 + 3 * i + 1] = data[row * width * 3 + 3 * i + 2] = buffer[i]; + } + } else { + memcpy (data + (uint64_t)row * (uint64_t)width * (uint64_t)3u, buffer, width * 3); + } break; case (IIOSF_UNSIGNED_SHORT): { @@ -86,7 +89,7 @@ void Image8::setScanline (int row, unsigned char* buffer, int bps, float *minVal } } -Image8* Image8::copy () +Image8* Image8::copy () const { Image8* cp = new Image8 (width, height); @@ -94,7 +97,7 @@ Image8* Image8::copy () return cp; } -void Image8::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp) +void Image8::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const { // compute channel multipliers float rm = 1.f, gm = 1.f, bm = 1.f; diff --git a/rtengine/image8.h b/rtengine/image8.h index 02fda32fb..3da80268c 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -36,57 +36,67 @@ public: Image8 (); Image8 (int width, int height); - ~Image8 (); + ~Image8 () override; - Image8* copy (); + Image8* copy () const; - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp); + void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const override; - virtual const char* getType () const + const char* getType () const override { return sImage8; } - virtual int getBPS () + + int getBPS () const override { return 8 * sizeof(unsigned char); } - virtual void getScanline (int row, unsigned char* buffer, int bps); - virtual void setScanline (int row, unsigned char* buffer, int bps, float *minValue = nullptr, float *maxValue = nullptr); + + void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const override; + void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples) override; // functions inherited from IImage*: - virtual MyMutex& getMutex () + MyMutex& getMutex () override { return mutex (); } - virtual cmsHPROFILE getProfile () + + cmsHPROFILE getProfile () const override { return getEmbeddedProfile (); } - virtual int getBitsPerPixel () + + int getBitsPerPixel () const override { return 8 * sizeof(unsigned char); } - virtual int saveToFile (Glib::ustring fname) + + int saveToFile (const Glib::ustring &fname) const override { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int bps = -1) + + int saveAsPNG (const Glib::ustring &fname, int bps = -1) const override { return savePNG (fname, bps); } - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) + + int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const override { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false) + + int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override { - return saveTIFF (fname, bps, uncompressed); + return saveTIFF (fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener (ProgressListener* pl) + + void setSaveProgressListener (ProgressListener* pl) override { setProgressListener (pl); } - virtual void free () + + void free () override { delete this; } diff --git a/rtengine/imagedata.cc b/rtengine/imagedata.cc index 5fb1e98f6..4dcfe80ff 100644 --- a/rtengine/imagedata.cc +++ b/rtengine/imagedata.cc @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include #include #include #include @@ -24,6 +25,8 @@ #include "iptcpairs.h" #include "imagesource.h" #include "rt_math.h" +#include "procparams.h" + #pragma GCC diagnostic warning "-Wextra" #define PRINT_HDR_PS_DETECTION 0 @@ -43,6 +46,22 @@ Glib::ustring to_utf8 (const std::string& str) } } +template +T getFromFrame( + const std::vector>& frames, + std::size_t frame, + const std::function& function +) +{ + if (frame < frames.size()) { + return function(*frames[frame]); + } + if (!frames.empty()) { + return function(*frames[0]); + } + return {}; +} + } FramesMetaData* FramesMetaData::fromFile (const Glib::ustring& fname, std::unique_ptr rml, bool firstFrameOnly) @@ -156,6 +175,13 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* model = "Unknown"; } + if (model == "Unknown") { + tag = newFrameRootDir->findTag("UniqueCameraModel"); + if (tag) { + model = tag->valueToString(); + } + } + tag = newFrameRootDir->findTagUpward("Orientation"); if (tag) { orientation = tag->valueToString (); @@ -207,7 +233,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* // 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 + // First try, official EXIF. Set by Adobe on some DNGs tag = exif->getTag("SubjectDistance"); if (tag) { @@ -274,6 +300,38 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } if (lens == "Unknown") { + const auto lens_from_make_and_model = + [this, exif]() -> bool + { + if (!exif) { + return false; + } + + const rtexif::Tag* const lens_model = exif->getTag(0xA434); + + if (lens_model) { + const rtexif::Tag* const lens_make = exif->getTag(0xA433); + const std::string make = + lens_make + ? lens_make->valueToString() + : std::string(); + const std::string model = lens_model->valueToString(); + + if (!model.empty()) { + lens = make; + + if (!lens.empty()) { + lens += ' '; + } + + lens += model; + + return true; + } + } + + return false; + }; if (mnote) { @@ -315,6 +373,11 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } } + // If MakeNotes are vague, fall back to Exif LensMake and LensModel if set + // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#LensType + if (lens == "Manual Lens No CPU") { + lens_from_make_and_model(); + } } } @@ -380,15 +443,25 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* rtexif::Tag *lt = mnote->getTag("LensType"); if ( lt ) { - std::string ldata = lt->valueToString (); + if (lt->toInt()) { + std::string ldata = lt->valueToString (); - if (ldata.size() > 1) { - found = true; - lens = "Canon " + ldata; + if (ldata.size() > 1) { + found = true; + lens = "Canon " + ldata; + } + } else { + found = lens_from_make_and_model(); } } - if( !found || lens.substr(lens.find(' ')).length() < 7 ) { + const std::string::size_type first_space_pos = lens.find(' '); + const std::string::size_type remaining_size = + first_space_pos != std::string::npos + ? lens.size() - first_space_pos + : 0; + + if( !found || remaining_size < 7U ) { lt = mnote->findTag("LensID"); if ( lt ) { @@ -411,7 +484,14 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } if (mnote->getTag ("LensType")) { - lens = mnote->getTag ("LensType")->valueToString (); + lens = mnote->getTag ("LensType")->valueToString(); + // If MakeNotes are vague, fall back to Exif LensMake and LensModel if set + // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Pentax.html#LensType + if (lens == "M-42 or No Lens" || lens == "K or M Lens" || lens == "A Series Lens" || lens == "Sigma") { + lens_from_make_and_model(); + } + } else { + lens_from_make_and_model(); } // Try to get the FocalLength from the LensInfo structure, where length below 10mm will be correctly set @@ -433,6 +513,9 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } else if (mnote && (!make.compare (0, 4, "SONY") || !make.compare (0, 6, "KONICA"))) { if (mnote->getTag ("LensID")) { lens = mnote->getTag ("LensID")->valueToString (); + if (lens == "Unknown") { + lens_from_make_and_model(); + } } } else if (!make.compare (0, 7, "OLYMPUS")) { if (mnote->getTag ("Equipment")) { @@ -442,6 +525,9 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* lens = eq->getTag ("LensType")->valueToString (); } } + if (lens == "Unknown") { + lens_from_make_and_model(); + } } else if (mnote && !make.compare (0, 9, "Panasonic")) { if (mnote->getTag ("LensType")) { std::string panalens = mnote->getTag("LensType")->valueToString(); @@ -456,9 +542,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } else if (exif->getTag ("DNGLensInfo")) { lens = exif->getTag ("DNGLensInfo")->valueToString (); - } else if (exif->getTag ("LensModel")) { - lens = exif->getTag ("LensModel")->valueToString (); - } else if (exif->getTag ("LensInfo")) { + } else if (!lens_from_make_and_model() && exif->getTag ("LensInfo")) { lens = exif->getTag ("LensInfo")->valueToString (); } } @@ -483,7 +567,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* 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) { + if (hdr->toInt() > 0) { isHDR = true; #if PRINT_HDR_PS_DETECTION printf("HDR detected ! -> \"HDR\" tag found\n"); @@ -506,7 +590,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* if (!isHDR) { const rtexif::Tag* const q = mnote->findTag("Quality"); - if (q && q->toInt() == 7) { + if (q && (q->toInt() == 7 || q->toInt() == 8)) { isPixelShift = true; #if PRINT_HDR_PS_DETECTION printf("PixelShift detected ! -> \"Quality\" = 7\n"); @@ -558,28 +642,51 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* 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; + if (bitspersample==16) { + sampleFormat = IIOSF_FLOAT16; isHDR = true; #if PRINT_HDR_PS_DETECTION - printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); + printf("HDR detected ! -> sampleFormat = %d (16-bit)\n", sampleFormat); +#endif + } + else if (bitspersample == 24) { + sampleFormat = IIOSF_FLOAT24; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d (24-bit)\n", sampleFormat); +#endif + } + else if (bitspersample == 32) { + sampleFormat = IIOSF_FLOAT32; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d (32-bit)\n", sampleFormat); #endif } } } else if (photometric == PHOTOMETRIC_CFA) { if (sampleformat == SAMPLEFORMAT_IEEEFP) { - sampleFormat = IIOSF_FLOAT; - isHDR = true; + if (bitspersample == 16) { + sampleFormat = IIOSF_FLOAT16; + isHDR = true; #if PRINT_HDR_PS_DETECTION - printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); + printf("HDR detected ! -> sampleFormat = %d (16-bit)\n", sampleFormat); #endif + } + else if (bitspersample == 24) { + sampleFormat = IIOSF_FLOAT24; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d (24-bit)\n", sampleFormat); +#endif + } + else if (bitspersample == 32) { + sampleFormat = IIOSF_FLOAT32; + isHDR = true; +#if PRINT_HDR_PS_DETECTION + printf("HDR detected ! -> sampleFormat = %d (32-bit)\n", sampleFormat); +#endif + } } else if (sampleformat == SAMPLEFORMAT_INT || sampleformat == SAMPLEFORMAT_UINT) { if (bitspersample == 8) { // shouldn't occur... sampleFormat = IIOSF_UNSIGNED_CHAR; @@ -589,7 +696,7 @@ FrameData::FrameData (rtexif::TagDirectory* frameRootDir_, rtexif::TagDirectory* } } 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; + sampleFormat = IIOSF_FLOAT32; isHDR = true; #if PRINT_HDR_PS_DETECTION printf("HDR detected ! -> sampleFormat = %d\n", sampleFormat); @@ -692,6 +799,10 @@ bool FrameData::getHDR () const { return isHDR; } +std::string FrameData::getImageType () const +{ + return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; +} IIOSampleFormat FrameData::getSampleFormat () const { return sampleFormat; @@ -782,32 +893,30 @@ unsigned int FramesData::getFrameCount () const return dcrawFrameCount ? dcrawFrameCount : frames.size(); } -FrameData *FramesData::getFrameData (unsigned int frame) const +bool FramesData::getPixelShift () 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 + // So far only Pentax and Sony provide multi-frame Pixel Shift files. + // Only the first frame contains the Pixel Shift 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 (); + return frames.empty() ? false : frames.at(0)->getPixelShift (); } bool FramesData::getHDR (unsigned int frame) const { - // So far only Pentax provide multi-frame HDR file. + // So far only Pentax provides 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 (); } +std::string FramesData::getImageType (unsigned int frame) const +{ + return frames.empty() || frame >= frames.size() ? "STD" : frames.at(0)->getImageType(); +} + IIOSampleFormat FramesData::getSampleFormat (unsigned int frame) const { return frames.empty() || frame >= frames.size() ? IIOSF_UNKNOWN : frames.at(frame)->getSampleFormat (); @@ -868,74 +977,196 @@ procparams::IPTCPairs FramesData::getIPTCData (unsigned int frame) const } } -bool FramesData::hasExif (unsigned int frame) const +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 (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.hasExif(); + } + ); } -tm FramesData::getDateTime (unsigned int frame) const +bool FramesData::hasIPTC(unsigned int frame) const { - if (frames.empty() || frame >= frames.size() ) { - return {}; - } else { - return frames.at(frame)->getDateTime (); - } + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.hasIPTC(); + } + ); } + +tm FramesData::getDateTime(unsigned int frame) const +{ + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getDateTime(); + } + ); +} + time_t FramesData::getDateTimeAsTS(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0 : frames.at(frame)->getDateTimeAsTS (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getDateTimeAsTS(); + } + ); } -int FramesData::getISOSpeed (unsigned int frame) const + +int FramesData::getISOSpeed(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0 : frames.at(frame)->getISOSpeed (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getISOSpeed(); + } + ); } -double FramesData::getFNumber (unsigned int frame) const + +double FramesData::getFNumber(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getFNumber (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getFNumber(); + } + ); } -double FramesData::getFocalLen (unsigned int frame) const + +double FramesData::getFocalLen(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getFocalLen (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getFocalLen(); + } + ); } -double FramesData::getFocalLen35mm (unsigned int frame) const + +double FramesData::getFocalLen35mm(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getFocalLen35mm (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getFocalLen35mm(); + } + ); } -float FramesData::getFocusDist (unsigned int frame) const + +float FramesData::getFocusDist(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0.f : frames.at(frame)->getFocusDist (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getFocusDist(); + } + ); } -double FramesData::getShutterSpeed (unsigned int frame) const + +double FramesData::getShutterSpeed(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getShutterSpeed (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getShutterSpeed(); + } + ); } -double FramesData::getExpComp (unsigned int frame) const + +double FramesData::getExpComp(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? 0. : frames.at(frame)->getExpComp (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getExpComp(); + } + ); } -std::string FramesData::getMake (unsigned int frame) const + +std::string FramesData::getMake(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getMake (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getMake(); + } + ); } -std::string FramesData::getModel (unsigned int frame) const + +std::string FramesData::getModel(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getModel (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getModel(); + } + ); } -std::string FramesData::getLens (unsigned int frame) const + +std::string FramesData::getLens(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getLens (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getLens(); + } + ); } -std::string FramesData::getSerialNumber (unsigned int frame) const + +std::string FramesData::getSerialNumber(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getSerialNumber (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getSerialNumber(); + } + ); } -std::string FramesData::getOrientation (unsigned int frame) const + +std::string FramesData::getOrientation(unsigned int frame) const { - return frames.empty() || frame >= frames.size() ? std::string() : frames.at(frame)->getOrientation (); + return getFromFrame( + frames, + frame, + [](const FrameData& frame_data) + { + return frame_data.getOrientation(); + } + ); } @@ -1070,37 +1301,31 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrexifBase >= 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; - } + 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) { + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); + } + 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)) { @@ -1112,8 +1337,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0)); - frames.push_back(fd); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } rewind (exifManager.f); // Not sure this is necessary iptc = iptc_data_new_from_jpeg_file (exifManager.f); @@ -1131,9 +1355,7 @@ FramesData::FramesData (const Glib::ustring& fname, std::unique_ptrgetRoot(), roots.at(0)); - - frames.push_back(fd); + frames.push_back(std::unique_ptr(new FrameData(currFrame, currFrame->getRoot(), roots.at(0)))); } for (auto currRoot : roots) { rtexif::Tag* t = currRoot->getTag(0x83BB); diff --git a/rtengine/imagedata.h b/rtengine/imagedata.h index b9f955611..c6889e653 100644 --- a/rtengine/imagedata.h +++ b/rtengine/imagedata.h @@ -20,11 +20,11 @@ #define __IMAGEDATA_H__ #include +#include #include "rawimage.h" #include #include #include "../rtexif/rtexif.h" -#include "procparams.h" #include #include "rtengine.h" @@ -63,6 +63,7 @@ public: bool getPixelShift () const; bool getHDR () const; + std::string getImageType () const; IIOSampleFormat getSampleFormat () const; rtexif::TagDirectory* getExifData () const; procparams::IPTCPairs getIPTCData () const; @@ -88,7 +89,7 @@ public: class FramesData : public FramesMetaData { private: // frame's root IFD, can be a file root IFD or a SUB-IFD - std::vector frames; + std::vector> frames; // root IFD in the file std::vector roots; IptcData* iptc; @@ -96,35 +97,35 @@ private: public: FramesData (const Glib::ustring& fname, std::unique_ptr rml = nullptr, bool firstFrameOnly = false); - ~FramesData (); + ~FramesData () override; 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; + unsigned int getRootCount () const override; + unsigned int getFrameCount () const override; + bool getPixelShift () const override; + bool getHDR (unsigned int frame = 0) const override; + std::string getImageType (unsigned int frame) const override; + IIOSampleFormat getSampleFormat (unsigned int frame = 0) const override; + rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const override; + rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const override; + rtexif::TagDirectory* getBestExifData (ImageSource *imgSource, procparams::RAWParams *rawParams) const override; + procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const override; + bool hasExif (unsigned int frame = 0) const override; + bool hasIPTC (unsigned int frame = 0) const override; + tm getDateTime (unsigned int frame = 0) const override; + time_t getDateTimeAsTS (unsigned int frame = 0) const override; + int getISOSpeed (unsigned int frame = 0) const override; + double getFNumber (unsigned int frame = 0) const override; + double getFocalLen (unsigned int frame = 0) const override; + double getFocalLen35mm (unsigned int frame = 0) const override; + float getFocusDist (unsigned int frame = 0) const override; + double getShutterSpeed (unsigned int frame = 0) const override; + double getExpComp (unsigned int frame = 0) const override; + std::string getMake (unsigned int frame = 0) const override; + std::string getModel (unsigned int frame = 0) const override; + std::string getLens (unsigned int frame = 0) const override; std::string getSerialNumber (unsigned int frame = 0) const; - std::string getOrientation (unsigned int frame = 0) const; + std::string getOrientation (unsigned int frame = 0) const override; }; diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 0951d06eb..1dac27efb 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -27,6 +27,7 @@ #include "alignedbuffer.h" #include "rt_math.h" #include "color.h" +#include "procparams.h" using namespace rtengine; @@ -44,48 +45,38 @@ Imagefloat::~Imagefloat () } // Call this method to handle floating points input values of different size -void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, float *minValue, float *maxValue) +void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples) { if (data == nullptr) { return; } + // The DNG decoder convert to 32 bits float data even if the file contains 16 or 24 bits data. + // DNG_HalfToFloat and DNG_FP24ToFloat from dcraw.cc can be used to manually convert + // from 16 and 24 bits to 32 bits float respectively switch (sampleFormat) { - case (IIOSF_FLOAT): { + case (IIOSF_FLOAT16): { + int ix = 0; + uint16_t* sbuffer = (uint16_t*) buffer; + + for (int i = 0; i < width; i++) { + r(row, i) = 65535.f * DNG_HalfToFloat(sbuffer[ix++]); + g(row, i) = 65535.f * DNG_HalfToFloat(sbuffer[ix++]); + b(row, i) = 65535.f * DNG_HalfToFloat(sbuffer[ix++]); + } + + break; + } + //case (IIOSF_FLOAT24): + case (IIOSF_FLOAT32): { int ix = 0; float* sbuffer = (float*) buffer; for (int i = 0; i < width; i++) { - r(row, i) = sbuffer[ix]; - - if (minValue) { - if (sbuffer[ix] < minValue[0]) { - minValue[0] = sbuffer[ix]; - } else if (sbuffer[ix] > maxValue[0]) { - maxValue[0] = sbuffer[ix]; - } ++ix; - } - - g(row, i) = sbuffer[ix]; - - if (minValue) { - if (sbuffer[ix] < minValue[1]) { - minValue[1] = sbuffer[ix]; - } else if (sbuffer[ix] > maxValue[1]) { - maxValue[1] = sbuffer[ix]; - } ++ix; - } - - b(row, i) = sbuffer[ix]; - - if (minValue) { - if (sbuffer[ix] < minValue[2]) { - minValue[2] = sbuffer[ix]; - } else if (sbuffer[ix] > maxValue[2]) { - maxValue[2] = sbuffer[ix]; - } ++ix; - } + r(row, i) = 65535.f * sbuffer[ix++]; + g(row, i) = 65535.f * sbuffer[ix++]; + b(row, i) = 65535.f * sbuffer[ix++]; } break; @@ -104,34 +95,8 @@ void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, float *mi // TODO: we may have to handle other color space than sRGB! Color::xyz2srgb(xyzvalues[0], xyzvalues[1], xyzvalues[2], rgbvalues[0], rgbvalues[1], rgbvalues[2]); r(row, i) = rgbvalues[0]; - - if (minValue) { - if (rgbvalues[0] < minValue[0]) { - minValue[0] = rgbvalues[0]; - } else if (rgbvalues[0] > maxValue[0]) { - maxValue[0] = rgbvalues[0]; - } - } - g(row, i) = rgbvalues[1]; - - if (minValue) { - if (rgbvalues[1] < minValue[1]) { - minValue[1] = rgbvalues[1]; - } else if (rgbvalues[1] > maxValue[1]) { - maxValue[1] = rgbvalues[1]; - } - } - b(row, i) = rgbvalues[2]; - - if (minValue) { - if (rgbvalues[2] < minValue[2]) { - minValue[2] = rgbvalues[2]; - } else if (rgbvalues[2] > maxValue[2]) { - maxValue[2] = rgbvalues[2]; - } - } } break; @@ -143,40 +108,54 @@ void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, float *mi } } -void Imagefloat::getScanline (int row, unsigned char* buffer, int bps) + +void Imagefloat::getScanline (int row, unsigned char* buffer, int bps, bool isFloat) const { if (data == nullptr) { return; } - if (bps == 32) { - 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) / 65535.f; - sbuffer[ix++] = g(row, i) / 65535.f; - sbuffer[ix++] = b(row, i) / 65535.f; + if (isFloat) { + if (bps == 32) { + 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) / 65535.f; + sbuffer[ix++] = g(row, i) / 65535.f; + sbuffer[ix++] = b(row, i) / 65535.f; + } + } else if (bps == 16) { + int ix = 0; + uint16_t* sbuffer = (uint16_t*) buffer; + // agriggio -- assume the image is normalized to [0, 65535] + for (int i = 0; i < width; i++) { + sbuffer[ix++] = DNG_FloatToHalf(r(row, i) / 65535.f); + sbuffer[ix++] = DNG_FloatToHalf(g(row, i) / 65535.f); + sbuffer[ix++] = DNG_FloatToHalf(b(row, i) / 65535.f); + } } - } else if (bps == 16) { + } else { 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))); + float ri = r(row, i); + float gi = g(row, i); + float bi = b(row, i); + if (bps == 16) { + sbuffer[ix++] = CLIP(ri); + sbuffer[ix++] = CLIP(gi); + sbuffer[ix++] = CLIP(bi); + } else if (bps == 8) { + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(ri)); + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(gi)); + buffer[ix++] = rtengine::uint16ToUint8Rounded(CLIP(bi)); + } } } } -Imagefloat* Imagefloat::copy () +Imagefloat* Imagefloat::copy () const { Imagefloat* cp = new Imagefloat (width, height); @@ -199,7 +178,7 @@ Imagefloat* Imagefloat::copySubRegion (int x, int y, int width, int height) } // This is called by the StdImageSource class. We assume that fp images from StdImageSource don't have to deal with gamma -void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp) +void Imagefloat::getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const { // compute channel multipliers @@ -249,6 +228,8 @@ void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, cons gm /= area; bm /= area; + const auto CLIP0 = [](float v) -> float { return std::max(v, 0.f); }; + #ifdef _OPENMP #pragma omp parallel { @@ -281,9 +262,9 @@ void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, cons continue; } - lineR[dst_x] = CLIP(rm2 * r(src_y, src_x)); - lineG[dst_x] = CLIP(gm2 * g(src_y, src_x)); - lineB[dst_x] = CLIP(bm2 * b(src_y, src_x)); + lineR[dst_x] = CLIP0(rm2 * r(src_y, src_x)); + lineG[dst_x] = CLIP0(gm2 * g(src_y, src_x)); + lineB[dst_x] = CLIP0(bm2 * b(src_y, src_x)); } } else { // source image, first line of the current destination row @@ -314,15 +295,15 @@ void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, cons // convert back to gamma and clip if (src_sub_width == skip && src_sub_height == skip) { // Common case where the sub-region is complete - lineR[dst_x] = CLIP(rm * rtot); - lineG[dst_x] = CLIP(gm * gtot); - lineB[dst_x] = CLIP(bm * btot); + lineR[dst_x] = CLIP0(rm * rtot); + lineG[dst_x] = CLIP0(gm * gtot); + lineB[dst_x] = CLIP0(bm * btot); } else { // computing a special factor for this incomplete sub-region float area = src_sub_width * src_sub_height; - lineR[dst_x] = CLIP(rm2 * rtot / area); - lineG[dst_x] = CLIP(gm2 * gtot / area); - lineB[dst_x] = CLIP(bm2 * btot / area); + lineR[dst_x] = CLIP0(rm2 * rtot / area); + lineG[dst_x] = CLIP0(gm2 * gtot / area); + lineB[dst_x] = CLIP0(bm2 * btot / area); } } } @@ -359,7 +340,7 @@ void Imagefloat::getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, cons } Image8* -Imagefloat::to8() +Imagefloat::to8() const { Image8* img8 = new Image8(width, height); #ifdef _OPENMP @@ -368,9 +349,9 @@ Imagefloat::to8() for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { - img8->r(h, w) = uint16ToUint8Rounded(r(h, w)); - img8->g(h, w) = uint16ToUint8Rounded(g(h, w)); - img8->b(h, w) = uint16ToUint8Rounded(b(h, w)); + img8->r(h, w) = uint16ToUint8Rounded(CLIP(r(h, w))); + img8->g(h, w) = uint16ToUint8Rounded(CLIP(g(h, w))); + img8->b(h, w) = uint16ToUint8Rounded(CLIP(b(h, w))); } } @@ -378,7 +359,7 @@ Imagefloat::to8() } Image16* -Imagefloat::to16() +Imagefloat::to16() const { Image16* img16 = new Image16(width, height); #ifdef _OPENMP @@ -387,9 +368,9 @@ Imagefloat::to16() for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { - img16->r(h, w) = r(h, w); - img16->g(h, w) = g(h, w); - img16->b(h, w) = b(h, w); + img16->r(h, w) = CLIP(r(h, w)); + img16->g(h, w) = CLIP(g(h, w)); + img16->b(h, w) = CLIP(b(h, w)); } } @@ -462,7 +443,7 @@ void Imagefloat::calcCroppedHistogram(const ProcParams ¶ms, float scale, LUT hist.clear(); // Set up factors to calc the lightness - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); float facRed = wprof[1][0]; float facGreen = wprof[1][1]; @@ -473,11 +454,15 @@ void Imagefloat::calcCroppedHistogram(const ProcParams ¶ms, float scale, LUT int x1, x2, y1, y2; params.crop.mapToResized(width, height, scale, x1, x2, y1, y2); +#ifdef _OPENMP #pragma omp parallel +#endif { LUTu histThr(65536); histThr.clear(); +#ifdef _OPENMP #pragma omp for nowait +#endif for (int y = y1; y < y2; y++) { for (int x = x1; x < x2; x++) { @@ -493,7 +478,9 @@ void Imagefloat::calcCroppedHistogram(const ProcParams ¶ms, float scale, LUT } } +#ifdef _OPENMP #pragma omp critical +#endif { for(int i = 0; i <= 0xffff; i++) { hist[i] += histThr[i]; @@ -516,7 +503,7 @@ void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) AlignedBuffer pBuf(width * 3); #ifdef _OPENMP - #pragma omp for schedule(static) + #pragma omp for schedule(dynamic, 16) #endif for (int y = 0; y < height; y++) @@ -545,7 +532,7 @@ void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) } } -// Parallized transformation; create transform with cmsFLAGS_NOCACHE! +// 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 diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index d63e09e85..1d35ecc66 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -42,70 +42,187 @@ public: Imagefloat (); Imagefloat (int width, int height); - ~Imagefloat (); + ~Imagefloat () override; - Imagefloat* copy (); + Imagefloat* copy () const; Imagefloat* copySubRegion (int x, int y, int width, int height); - Image8* to8(); - Image16* to16(); + Image8* to8() const; + Image16* to16() const; - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp); + void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const override; - virtual const char* getType () const + const char* getType () const override { return sImagefloat; } - virtual int getBPS () + + int getBPS () const override { return 8 * sizeof(float); } - virtual void getScanline (int row, unsigned char* buffer, int bps); - virtual void setScanline (int row, unsigned char* buffer, int bps, float *minValue = nullptr, float *maxValue = nullptr); + + void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const override; + void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples) override; // functions inherited from IImagefloat: - virtual MyMutex& getMutex () + MyMutex& getMutex () override { return mutex (); } - virtual cmsHPROFILE getProfile () + cmsHPROFILE getProfile () const override { return getEmbeddedProfile (); } - virtual int getBitsPerPixel () + int getBitsPerPixel () const override { return 8 * sizeof(float); } - virtual int saveToFile (Glib::ustring fname) + int saveToFile (const Glib::ustring &fname) const override { return save (fname); } - virtual int saveAsPNG (Glib::ustring fname, int bps = -1) + int saveAsPNG (const Glib::ustring &fname, int bps = -1) const override { return savePNG (fname, bps); } - virtual int saveAsJPEG (Glib::ustring fname, int quality = 100, int subSamp = 3) + int saveAsJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const override { return saveJPEG (fname, quality, subSamp); } - virtual int saveAsTIFF (Glib::ustring fname, int bps = -1, bool uncompressed = false) + int saveAsTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const override { - return saveTIFF (fname, bps, uncompressed); + return saveTIFF (fname, bps, isFloat, uncompressed); } - virtual void setSaveProgressListener (ProgressListener* pl) + void setSaveProgressListener (ProgressListener* pl) override { setProgressListener (pl); } - virtual void free () + void free () override { delete this; } - virtual void normalizeFloat(float srcMinVal, float srcMaxVal); + inline uint16_t DNG_FloatToHalf(float f) const + { + union { + float f; + uint32_t i; + } tmp; + + tmp.f = f; + int32_t sign = (tmp.i >> 16) & 0x00008000; + int32_t exponent = ((tmp.i >> 23) & 0x000000ff) - (127 - 15); + int32_t mantissa = tmp.i & 0x007fffff; + if (exponent <= 0) { + if (exponent < -10) { + return (uint16_t)sign; + } + mantissa = (mantissa | 0x00800000) >> (1 - exponent); + if (mantissa & 0x00001000) + mantissa += 0x00002000; + return (uint16_t)(sign | (mantissa >> 13)); + } else if (exponent == 0xff - (127 - 15)) { + if (mantissa == 0) { + return (uint16_t)(sign | 0x7c00); + } else { + return (uint16_t)(sign | 0x7c00 | (mantissa >> 13)); + } + } + if (mantissa & 0x00001000) { + mantissa += 0x00002000; + if (mantissa & 0x00800000) { + mantissa = 0; // overflow in significand, + exponent += 1; // adjust exponent + } + } + if (exponent > 30) { + return (uint16_t)(sign | 0x7c00); // infinity with the same sign as f. + } + return (uint16_t)(sign | (exponent << 10) | (mantissa >> 13)); + } + + // From DNG SDK dng_utils.h + inline float DNG_HalfToFloat(uint16_t halfValue) + { + union { + float f; + uint32_t i; + } tmp; + + 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 + tmp.i = (uint32_t) (sign << 31); + return tmp.f; + } 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. + tmp.i = (uint32_t)((sign << 31) | ((0x1eL + 127 - 15) << 23) | (0x3ffL << 13)); + return tmp.f; + } else { + // Nan -- Just set to zero. + return 0; + } + } + // Normalized number + exponent += (127 - 15); + mantissa <<= 13; + // Assemble sign, exponent and mantissa. + tmp.i = (uint32_t) ((sign << 31) | (exponent << 23) | mantissa); + return tmp.f; + } + + 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); + } + + void normalizeFloat(float srcMinVal, float srcMaxVal) override; void normalizeFloatTo1(); void normalizeFloatTo65535(); 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 --git a/rtengine/imageformat.h b/rtengine/imageformat.h index 2c9bb480d..22708daef 100644 --- a/rtengine/imageformat.h +++ b/rtengine/imageformat.h @@ -29,10 +29,11 @@ typedef enum IIO_Sample_Format { //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 + IIOSF_FLOAT16 = 1 << 4, + IIOSF_FLOAT24 = 1 << 5, + IIOSF_FLOAT32 = 1 << 6 } IIOSampleFormat; typedef enum IIO_Sample_Arrangement { diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 0e404fa91..f1fa8dbef 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -26,6 +26,7 @@ #include #include #include "rt_math.h" +#include "procparams.h" #include "../rtgui/options.h" #include "../rtgui/version.h" @@ -103,8 +104,8 @@ void ImageIO::setMetadata (const rtexif::TagDirectory* eroot, const rtengine::pr { // store exif info - exifChange.clear(); - exifChange = exif; + exifChange->clear(); + *exifChange = exif; if (exifRoot != nullptr) { delete exifRoot; @@ -185,6 +186,22 @@ void ImageIO::setOutputProfile (const char* pdata, int plen) profileLength = plen; } +ImageIO::ImageIO() : + pl(nullptr), + embProfile(nullptr), + profileData(nullptr), + profileLength(0), + loadedProfileData(nullptr), + loadedProfileDataJpg(false), + loadedProfileLength(0), + exifChange(new procparams::ExifPairs), + iptc(nullptr), + exifRoot(nullptr), + sampleFormat(IIOSF_UNKNOWN), + sampleArrangement(IIOSA_UNKNOWN) +{ +} + ImageIO::~ImageIO () { @@ -201,7 +218,7 @@ void png_read_data(png_struct_def *png_ptr, unsigned char *data, size_t length) void png_write_data(png_struct_def *png_ptr, unsigned char *data, size_t length); void png_flush(png_struct_def *png_ptr); -int ImageIO::getPNGSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) +int ImageIO::getPNGSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) { FILE *file = g_fopen (fname.c_str (), "rb"); @@ -273,7 +290,7 @@ int ImageIO::getPNGSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, } } -int ImageIO::loadPNG (Glib::ustring fname) +int ImageIO::loadPNG (const Glib::ustring &fname) { FILE *file = g_fopen (fname.c_str (), "rb"); @@ -447,7 +464,7 @@ void my_error_exit (j_common_ptr cinfo) (*cinfo->err->output_message) (cinfo); /* Return control to the setjmp point */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) __builtin_longjmp(myerr->setjmp_buffer, 1); #else longjmp(myerr->setjmp_buffer, 1); @@ -471,7 +488,7 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else @@ -523,7 +540,7 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) return IMIO_READERROR; } - setScanline (cinfo.output_scanline - 1, row, 8); + setScanline (cinfo.output_scanline - 1, row, 8, cinfo.num_components); if (pl && !(cinfo.output_scanline % 100)) { pl->setProgress ((double)(cinfo.output_scanline) / cinfo.output_height); @@ -543,7 +560,7 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) return IMIO_SUCCESS; } -int ImageIO::loadJPEG (Glib::ustring fname) +int ImageIO::loadJPEG (const Glib::ustring &fname) { FILE *file = g_fopen(fname.c_str (), "rb"); @@ -629,7 +646,7 @@ int ImageIO::loadJPEG (Glib::ustring fname) } } -int ImageIO::getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) +int ImageIO::getTIFFSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement) { #ifdef WIN32 wchar_t *wfilename = (wchar_t*)g_utf8_to_utf16 (fname.c_str(), -1, NULL, NULL, NULL); @@ -704,20 +721,21 @@ int ImageIO::getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, sFormat = IIOSF_UNSIGNED_SHORT; return IMIO_SUCCESS; } - } else if (samplesperpixel == 3 && sampleformat == SAMPLEFORMAT_IEEEFP) { - /* - * Not yet supported - * - if (bitspersample==16) { - sFormat = IIOSF_HALF; + } else if ((samplesperpixel == 3 || samplesperpixel == 4) && sampleformat == SAMPLEFORMAT_IEEEFP) { + if (bitspersample==16) { + sFormat = IIOSF_FLOAT16; return IMIO_SUCCESS; - }*/ + } + if (bitspersample == 24) { + sFormat = IIOSF_FLOAT24; + return IMIO_SUCCESS; + } if (bitspersample == 32) { - sFormat = IIOSF_FLOAT; + sFormat = IIOSF_FLOAT32; return IMIO_SUCCESS; } } - } else if (samplesperpixel == 3 && photometric == PHOTOMETRIC_LOGLUV) { + } else if ((samplesperpixel == 3 || samplesperpixel == 4) && photometric == PHOTOMETRIC_LOGLUV) { if (compression == COMPRESSION_SGILOG24) { sFormat = IIOSF_LOGLUV24; return IMIO_SUCCESS; @@ -730,7 +748,7 @@ int ImageIO::getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, return IMIO_VARIANTNOTSUPPORTED; } -int ImageIO::loadTIFF (Glib::ustring fname) +int ImageIO::loadTIFF (const Glib::ustring &fname) { static MyMutex thumbMutex; @@ -789,7 +807,7 @@ int ImageIO::loadTIFF (Glib::ustring fname) * 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); @@ -835,7 +853,6 @@ int ImageIO::loadTIFF (Glib::ustring fname) 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++) { @@ -861,33 +878,13 @@ int ImageIO::loadTIFF (Glib::ustring fname) } } - 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); 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; @@ -992,7 +989,7 @@ void PNGwriteRawProfile(png_struct *ping, png_info *ping_info, const char *profi } // namespace -int ImageIO::savePNG (Glib::ustring fname, volatile int bps) +int ImageIO::savePNG (const Glib::ustring &fname, int bps) const { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; @@ -1047,6 +1044,9 @@ int ImageIO::savePNG (Glib::ustring fname, volatile int bps) if (bps < 0) { bps = getBPS (); } + if (bps > 16) { + bps = 16; + } png_set_IHDR(png, info, width, height, bps, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_BASE); @@ -1072,7 +1072,7 @@ int ImageIO::savePNG (Glib::ustring fname, volatile int bps) iptcdata = nullptr; } - int size = rtexif::ExifManager::createPNGMarker(exifRoot, exifChange, width, height, bps, (char*)iptcdata, iptclen, buffer, bufferSize); + int size = rtexif::ExifManager::createPNGMarker(exifRoot, *exifChange, width, height, bps, (char*)iptcdata, iptclen, buffer, bufferSize); if (iptcdata) { iptc_data_free_buf (iptc, iptcdata); @@ -1128,7 +1128,7 @@ int ImageIO::savePNG (Glib::ustring fname, volatile int bps) // Quality 0..100, subsampling: 1=low quality, 2=medium, 3=high -int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) +int ImageIO::saveJPEG (const Glib::ustring &fname, int quality, int subSamp) const { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; @@ -1151,7 +1151,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else @@ -1222,7 +1222,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) // assemble and write exif marker if (exifRoot) { - int size = rtexif::ExifManager::createJPEGMarker (exifRoot, exifChange, cinfo.image_width, cinfo.image_height, buffer); + int size = rtexif::ExifManager::createJPEGMarker (exifRoot, *exifChange, cinfo.image_width, cinfo.image_height, buffer); if (size > 0 && size < 65530) { jpeg_write_marker(&cinfo, JPEG_APP0 + 1, buffer, size); @@ -1269,7 +1269,7 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) unsigned char *row = new unsigned char [rowlen]; /* To avoid memory leaks we establish a new setjmp return context for my_error_exit to use. */ -#if defined( WIN32 ) && defined( __x86_64__ ) +#if defined( WIN32 ) && defined( __x86_64__ ) && !defined(__clang__) if (__builtin_setjmp(jerr.setjmp_buffer)) { #else @@ -1318,13 +1318,12 @@ int ImageIO::saveJPEG (Glib::ustring fname, int quality, int subSamp) return IMIO_SUCCESS; } -int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) +int ImageIO::saveTIFF (const Glib::ustring &fname, int bps, bool isFloat, bool uncompressed) const { if (getWidth() < 1 || getHeight() < 1) { return IMIO_HEADERERROR; } - //TODO: Handling 32 bits floating point output images! bool writeOk = true; int width = getWidth (); int height = getHeight (); @@ -1358,6 +1357,8 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) pl->setProgress (0.0); } + bool applyExifPatch = false; + if (exifRoot) { rtexif::TagDirectory* cl = (const_cast (exifRoot))->clone (nullptr); @@ -1377,7 +1378,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) // ------------------ Apply list of change ----------------- - for (auto currExifChange : exifChange) { + for (auto currExifChange : *exifChange) { cl->applyChange (currExifChange.first, currExifChange.second); } @@ -1400,6 +1401,7 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) // at a different offset: TIFFSetWriteOffset (out, exif_size + 8); TIFFSetField (out, TIFFTAG_EXIFIFD, 8); + applyExifPatch = true; } } @@ -1438,14 +1440,14 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) } } - if (iptcdata) { - rtexif::Tag iptcTag(nullptr, rtexif::lookupAttrib (rtexif::ifdAttribs, "IPTCData")); - iptcTag.initLongArray((char*)iptcdata, iptclen); #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) { @@ -1471,21 +1473,40 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) 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); - TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, bps == 32 ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); + TIFFSetField (out, TIFFTAG_COMPRESSION, uncompressed ? COMPRESSION_NONE : COMPRESSION_ADOBE_DEFLATE); + TIFFSetField (out, TIFFTAG_SAMPLEFORMAT, (bps == 16 || bps == 32) && isFloat ? SAMPLEFORMAT_IEEEFP : SAMPLEFORMAT_UINT); if (!uncompressed) { - TIFFSetField (out, TIFFTAG_PREDICTOR, bps == 32 ? PREDICTOR_FLOATINGPOINT : PREDICTOR_HORIZONTAL); + TIFFSetField (out, TIFFTAG_PREDICTOR, (bps == 16 || bps == 32) && isFloat ? PREDICTOR_FLOATINGPOINT : PREDICTOR_HORIZONTAL); } - if (profileData) { TIFFSetField (out, TIFFTAG_ICCPROFILE, profileLength, profileData); } for (int row = 0; row < height; row++) { - getScanline (row, linebuffer, bps); + getScanline (row, linebuffer, bps, isFloat); + + if (bps == 16) { + if(needsReverse && !uncompressed && isFloat) { + for(int i = 0; i < lineWidth; i += 2) { + char temp = linebuffer[i]; + linebuffer[i] = linebuffer[i + 1]; + linebuffer[i + 1] = temp; + } + } + } else if (bps == 32) { + if(needsReverse && !uncompressed) { + 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 (TIFFWriteScanline (out, linebuffer, row, 0) < 0) { TIFFClose (out); @@ -1502,6 +1523,38 @@ int ImageIO::saveTIFF (Glib::ustring fname, int bps, bool uncompressed) writeOk = false; } + /************************************************************************************************************ + * + * 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); + } + } + } + /************************************************************************************************************/ + + TIFFClose (out); #ifdef WIN32 fclose (file); @@ -1559,7 +1612,7 @@ void png_flush(png_structp png_ptr) } } -int ImageIO::load (Glib::ustring fname) +int ImageIO::load (const Glib::ustring &fname) { if (hasPngExtension(fname)) { @@ -1573,7 +1626,7 @@ int ImageIO::load (Glib::ustring fname) } } -int ImageIO::save (Glib::ustring fname) +int ImageIO::save (const Glib::ustring &fname) const { if (hasPngExtension(fname)) { return savePNG (fname); @@ -1585,3 +1638,57 @@ int ImageIO::save (Glib::ustring fname) return IMIO_FILETYPENOTSUPPORTED; } } + +void ImageIO::setProgressListener (ProgressListener* l) +{ + pl = l; +} + +void ImageIO::setSampleFormat(IIOSampleFormat sFormat) +{ + sampleFormat = sFormat; +} + +IIOSampleFormat ImageIO::getSampleFormat() const +{ + return sampleFormat; +} + +void ImageIO::setSampleArrangement(IIOSampleArrangement sArrangement) +{ + sampleArrangement = sArrangement; +} + +IIOSampleArrangement ImageIO::getSampleArrangement() const +{ + return sampleArrangement; +} + +cmsHPROFILE ImageIO::getEmbeddedProfile () const +{ + return embProfile; +} + +void ImageIO::getEmbeddedProfileData (int& length, unsigned char*& pdata) const +{ + length = loadedProfileLength; + pdata = (unsigned char*)loadedProfileData; +} + +MyMutex& ImageIO::mutex () +{ + return imutex; +} + +void ImageIO::deleteLoadedProfileData( ) +{ + if(loadedProfileData) { + if(loadedProfileDataJpg) { + free(loadedProfileData); + } else { + delete[] loadedProfileData; + } + } + + loadedProfileData = nullptr; +} diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 5f24cc1b7..24cb2aa67 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -28,11 +28,12 @@ #define IMIO_FILETYPENOTSUPPORTED 6 #define IMIO_CANNOTWRITEFILE 7 +#include + +#include +#include #include "rtengine.h" #include "imageformat.h" -#include -#include "procparams.h" -#include #include "../rtexif/rtexif.h" #include "imagedimensions.h" #include "iimage.h" @@ -55,7 +56,7 @@ protected: char* loadedProfileData; bool loadedProfileDataJpg; int loadedProfileLength; - procparams::ExifPairs exifChange; + const std::unique_ptr exifChange; IptcData* iptc; const rtexif::TagDirectory* exifRoot; MyMutex imutex; @@ -63,100 +64,50 @@ protected: IIOSampleArrangement sampleArrangement; private: - void deleteLoadedProfileData( ) - { - if(loadedProfileData) { - if(loadedProfileDataJpg) { - free(loadedProfileData); - } else { - delete[] loadedProfileData; - } - } + void deleteLoadedProfileData( ); - loadedProfileData = nullptr; - } public: static Glib::ustring errorMsg[6]; - ImageIO () : pl (nullptr), embProfile(nullptr), profileData(nullptr), profileLength(0), loadedProfileData(nullptr), loadedProfileDataJpg(false), - loadedProfileLength(0), iptc(nullptr), exifRoot (nullptr), sampleFormat(IIOSF_UNKNOWN), - sampleArrangement(IIOSA_UNKNOWN) {} + ImageIO(); + ~ImageIO() override; - virtual ~ImageIO (); + void setProgressListener (ProgressListener* l); + void setSampleFormat(IIOSampleFormat sFormat); + IIOSampleFormat getSampleFormat() const; + void setSampleArrangement(IIOSampleArrangement sArrangement); + IIOSampleArrangement getSampleArrangement() const; - void setProgressListener (ProgressListener* l) - { - pl = l; - } + virtual void getStdImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp) const = 0; + virtual int getBPS () const = 0; + virtual void getScanline (int row, unsigned char* buffer, int bps, bool isFloat = false) const = 0; + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples = 3) = 0; + virtual const char* getType () const = 0; - void setSampleFormat(IIOSampleFormat sFormat) - { - sampleFormat = sFormat; - } - IIOSampleFormat getSampleFormat() - { - return sampleFormat; - } - void setSampleArrangement(IIOSampleArrangement sArrangement) - { - sampleArrangement = sArrangement; - } - IIOSampleArrangement getSampleArrangement() - { - return sampleArrangement; - } + int load (const Glib::ustring &fname); + int save (const Glib::ustring &fname) const; - virtual void getStdImage (ColorTemp ctemp, int tran, Imagefloat* image, const PreviewProps & pp, bool first, procparams::ToneCurveParams hrp) - { - printf("getStdImage NULL!\n"); - } - - virtual int getBPS () = 0; - virtual void getScanline (int row, unsigned char* buffer, int bps) {} - virtual void setScanline (int row, unsigned char* buffer, int bps, float minValue[3] = nullptr, float maxValue[3] = nullptr) {} - - virtual bool readImage (Glib::ustring &fname, FILE *fh) - { - return false; - }; - virtual bool writeImage (Glib::ustring &fname, FILE *fh) - { - return false; - }; - - int load (Glib::ustring fname); - int save (Glib::ustring fname); - - int loadPNG (Glib::ustring fname); - int loadJPEG (Glib::ustring fname); - int loadTIFF (Glib::ustring fname); - static int getPNGSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); - static int getTIFFSampleFormat (Glib::ustring fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); + int loadPNG (const Glib::ustring &fname); + int loadJPEG (const Glib::ustring &fname); + int loadTIFF (const Glib::ustring &fname); + static int getPNGSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); + static int getTIFFSampleFormat (const Glib::ustring &fname, IIOSampleFormat &sFormat, IIOSampleArrangement &sArrangement); 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, 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); + int savePNG (const Glib::ustring &fname, int bps = -1) const; + int saveJPEG (const Glib::ustring &fname, int quality = 100, int subSamp = 3) const; + int saveTIFF (const Glib::ustring &fname, int bps = -1, bool isFloat = false, bool uncompressed = false) const; - cmsHPROFILE getEmbeddedProfile () - { - return embProfile; - } - void getEmbeddedProfileData (int& length, unsigned char*& pdata) - { - length = loadedProfileLength; - pdata = (unsigned char*)loadedProfileData; - } + cmsHPROFILE getEmbeddedProfile () const; + void getEmbeddedProfileData (int& length, unsigned char*& pdata) const; void setMetadata (const rtexif::TagDirectory* eroot); void setMetadata (const rtexif::TagDirectory* eroot, const rtengine::procparams::ExifPairs& exif, const rtengine::procparams::IPTCPairs& iptcc); - void setOutputProfile (const char* pdata, int plen); - MyMutex& mutex () - { - return imutex; - } + void setOutputProfile (const char* pdata, int plen); + + MyMutex& mutex (); }; } diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 675243b65..a18cca9d7 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -23,7 +23,6 @@ #include #include "rtengine.h" #include "colortemp.h" -#include "procparams.h" #include "coord2d.h" #include "dcp.h" #include "LUT.h" @@ -35,7 +34,17 @@ namespace rtengine { -using namespace procparams; +namespace procparams +{ + +struct CoarseTransformParams; +struct ColorManagementParams; +struct LensProfParams; +struct RAWParams; +struct RetinexParams; +struct ToneCurveParams; + +} class ImageMatrices { @@ -65,28 +74,30 @@ public: ImageSource () : references (1), redAWBMul(-1.), greenAWBMul(-1.), blueAWBMul(-1.), embProfile(nullptr), idata(nullptr), dirpyrdenoiseExpComp(INFINITY) {} - virtual ~ImageSource () {} + ~ImageSource () override {} 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 (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 (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; + virtual void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) {}; + virtual void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold) {}; + virtual void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {}; + virtual void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {}; + virtual void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {}; virtual void flushRawData () {}; virtual void flushRGB () {}; - virtual void HLRecovery_Global (ToneCurveParams hrp) {}; + virtual void HLRecovery_Global (const procparams::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 bool isRGBSourceModified () const = 0; // tracks whether cached rgb output of demosaic has been modified + virtual void setBorder (unsigned int border) {} virtual void setCurrentFrame (unsigned int frameNum) = 0; virtual int getFrameCount () = 0; + virtual int getFlatFieldAutoClipValue () = 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 RAWParams &raw) = 0; + virtual void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hlp, const RAWParams &raw) = 0; virtual eSensorType getSensorType () const = 0; + virtual bool isMono () const = 0; // true is ready to provide the AutoWB, i.e. when the image has been demosaiced for RawImageSource virtual bool isWBProviderReady () = 0; @@ -107,21 +118,20 @@ public: return 0; } - virtual FrameData* getImageData (unsigned int frameNum) = 0; virtual ImageMatrices* getImageMatrices () = 0; virtual bool isRAW () const = 0; - virtual DCPProfile* getDCP (const ColorManagementParams &cmp, DCPProfile::ApplyState &as) + virtual DCPProfile* getDCP (const procparams::ColorManagementParams &cmp, DCPProfile::ApplyState &as) { return nullptr; }; virtual void setProgressListener (ProgressListener* pl) {} - void increaseRef () + void increaseRef () override { references++; } - void decreaseRef () + void decreaseRef () override { references--; @@ -139,7 +149,7 @@ public: } // for RAW files, compute a tone curve using histogram matching on the embedded thumbnail - virtual void getAutoMatchedToneCurve(std::vector &outCurve) + virtual void getAutoMatchedToneCurve(const procparams::ColorManagementParams &cp, std::vector &outCurve) { outCurve = { 0.0 }; } @@ -149,19 +159,19 @@ public: return dirpyrdenoiseExpComp; } // functions inherited from the InitialImage interface - virtual Glib::ustring getFileName () + Glib::ustring getFileName () override { return fileName; } - virtual cmsHPROFILE getEmbeddedProfile () + cmsHPROFILE getEmbeddedProfile () override { return embProfile; } - virtual const FramesMetaData* getMetaData () + const FramesMetaData* getMetaData () override { return idata; } - virtual ImageSource* getImageSource () + ImageSource* getImageSource () override { return this; } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index ef2c6695a..3697b7125 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -24,6 +24,11 @@ #include "colortemp.h" #include "improcfun.h" #include "iccstore.h" +#include "procparams.h" +#include +#include +#include +#include "color.h" #ifdef _OPENMP #include #endif @@ -32,85 +37,139 @@ namespace rtengine extern const Settings* settings; -ImProcCoordinator::ImProcCoordinator () - : orig_prev (nullptr), oprevi (nullptr), spotprevi (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), previewProps(-1, -1, -1, -1, 1), 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), +ImProcCoordinator::ImProcCoordinator() : + orig_prev(nullptr), + oprevi(nullptr), + spot_prev (nullptr), + oprevl(nullptr), + nprevl(nullptr), + fattal_11_dcrop_cache(nullptr), + previmg(nullptr), + workimg(nullptr), + ncie (nullptr), + imgsrc (nullptr), + lastAwbEqual (0.), + lastAwbTempBias (0.0), + previewProps(-1, -1, -1, -1, 1), + monitorIntent (RI_RELATIVE), + softProof(false), + gamutCheck(false), + sharpMask(false), + scale(10), + highDetailPreprocessComputed(false), + highDetailRawComputed(false), + allocated(false), + bwAutoR(-9000.f), + bwAutoG(-9000.f), + bwAutoB(-9000.f), + CAMMean(NAN), + hltonecurve(65536), + shtonecurve(65536), + tonecurve(65536, 0), //,1); + lumacurve(32770, 0), // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation + chroma_acurve(65536, 0), + chroma_bcurve(65536, 0), + satcurve(65536, 0), + lhskcurve(65536, 0), + clcurve(65536, 0), + conversionBuffer(1, 1), + wavclCurve(65536, 0), + clToningcurve(65536, 0), + cl2Toningcurve(65536, 0), + Noisecurve(65536, 0), + NoiseCCcurve(65536, 0), + vhist16(65536), vhist16bw(65536), + lhist16CAM(65536), + lhist16CCAM(65536), + lhist16RETI(), + lhist16LClad(65536), + histRed(256), histRedRaw(256), + histGreen(256), histGreenRaw(256), + histBlue(256), histBlueRaw(256), + histLuma(256), + histToneCurve(256), + histToneCurveBW(256), + histLCurve(256), + histCCurve(256), + histLLCurve(256), - hltonecurve (65536), - shtonecurve (65536), - tonecurve (65536, 0), //,1); - lumacurve (32770, 0), // lumacurve[32768] and lumacurve[32769] will be set to 32768 and 32769 later to allow linear interpolation - chroma_acurve (65536, 0), - chroma_bcurve (65536, 0), - satcurve (65536, 0), - lhskcurve (65536, 0), - clcurve (65536, 0), - conversionBuffer (1, 1), - wavclCurve (65536, 0), - clToningcurve (65536, 0), - cl2Toningcurve (65536, 0), - Noisecurve (65536, 0), - NoiseCCcurve (65536, 0), - vhist16 (65536), vhist16bw (65536), - lhist16CAM (65536), - lhist16CCAM (65536), - lhist16RETI(), - lhist16LClad (65536), - histRed (256), histRedRaw (256), - histGreen (256), histGreenRaw (256), - histBlue (256), histBlueRaw (256), - histLuma (256), - histToneCurve (256), - histToneCurveBW (256), - histLCurve (256), - histCCurve (256), - histLLCurve (256), + histLCAM(256), + histCCAM(256), + histClad(256), + bcabhist(256), + histChroma(256), - histLCAM (256), - histCCAM (256), - histClad (256), - bcabhist (256), - histChroma (256), + histLRETI(256), - histLRETI (256), + CAMBrightCurveJ(), CAMBrightCurveQ(), - CAMBrightCurveJ(), CAMBrightCurveQ(), - - rCurve(), - gCurve(), - bCurve(), - ctColorCurve(), - rcurvehist (256), rcurvehistCropped (256), rbeforehist (256), - gcurvehist (256), gcurvehistCropped (256), gbeforehist (256), - bcurvehist (256), bcurvehistCropped (256), bbeforehist (256), - fw (0), fh (0), tr (0), - fullw (1), fullh (1), - 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) -{} - -void ImProcCoordinator::assign (ImageSource* imgsrc) + rCurve(), + gCurve(), + bCurve(), + ctColorCurve(), + rcurvehist(256), rcurvehistCropped(256), rbeforehist(256), + gcurvehist(256), gcurvehistCropped(256), gbeforehist(256), + bcurvehist(256), bcurvehistCropped(256), bbeforehist(256), + fw(0), fh(0), tr(0), + fullw(1), fullh(1), + pW(-1), pH(-1), + plistener(nullptr), + imageListener(nullptr), + aeListener(nullptr), + acListener(nullptr), + abwListener(nullptr), + awbListener(nullptr), + flatFieldAutoClipListener(nullptr), + bayerAutoContrastListener(nullptr), + xtransAutoContrastListener(nullptr), + frameCountListener(nullptr), + imageTypeListener(nullptr), + actListener(nullptr), + adnListener(nullptr), + awavListener(nullptr), + dehaListener(nullptr), + hListener(nullptr), + resultValid(false), + params(new procparams::ProcParams), + lastOutputProfile("BADFOOD"), + lastOutputIntent(RI__COUNT), + lastOutputBPC(false), + thread(nullptr), + changeSinceLast(0), + updaterRunning(false), + nextParams(new procparams::ProcParams), + destroying(false), + utili(false), + autili(false), + butili(false), + ccutili(false), + cclutili(false), + clcutili(false), + opautili(false), + wavcontlutili(false), + colourToningSatLimit(0.f), + colourToningSatLimitOpacity(0.f), + highQualityComputed(false), + customTransformIn(nullptr), + customTransformOut(nullptr), + ipf(params.get(), true) { - this->imgsrc = imgsrc; } -ImProcCoordinator::~ImProcCoordinator () +ImProcCoordinator::~ImProcCoordinator() { destroying = true; - updaterThreadStart.lock (); + updaterThreadStart.lock(); if (updaterRunning && thread) { - thread->join (); + thread->join(); } mProcessing.lock(); mProcessing.unlock(); - freeAll (); + freeAll(); + if (fattal_11_dcrop_cache) { delete fattal_11_dcrop_cache; fattal_11_dcrop_cache = nullptr; @@ -122,796 +181,882 @@ ImProcCoordinator::~ImProcCoordinator () delete toDel[i]; } - imgsrc->decreaseRef (); - updaterThreadStart.unlock (); + imgsrc->decreaseRef(); + + if(customTransformIn) { + cmsDeleteTransform(customTransformIn); + customTransformIn = nullptr; + } + + if(customTransformOut) { + cmsDeleteTransform(customTransformOut); + customTransformOut = nullptr; + } + + updaterThreadStart.unlock(); } -DetailedCrop* ImProcCoordinator::createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow) +void ImProcCoordinator::assign(ImageSource* imgsrc) +{ + this->imgsrc = imgsrc; +} + +void ImProcCoordinator::getParams(procparams::ProcParams* dst) +{ + *dst = *params; +} + +DetailedCrop* ImProcCoordinator::createCrop(::EditDataProvider *editDataProvider, bool isDetailWindow) { - return new Crop (this, editDataProvider, isDetailWindow); + return new Crop(this, editDataProvider, isDetailWindow); } // todo: bitmask containing desired actions, taken from changesSinceLast -// cropCall: calling crop, used to prevent self-updates ...doesn't seem to be used -void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) +void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange) { MyMutex::MyLock processingLock (mProcessing); - int numofphases = 15; + + constexpr int numofphases = 15; int readyphase = 0; - bwAutoR = bwAutoG = bwAutoB = -9000.f; - - if (todo == CROP && ipf.needsPCVignetting()) { - todo |= TRANSFORM; // Change about Crop does affect TRANSFORM - } - - bool highDetailNeeded = false; - - if (options.prevdemo == PD_Sidecar) { - highDetailNeeded = true; //i#2664 - } else { - highDetailNeeded = (todo & M_HIGHQUAL); - } + bool highDetailNeeded = options.prevdemo == PD_Sidecar ? true : (todo & M_HIGHQUAL); // Check if any detail crops need high detail. If not, take a fast path short cut if (!highDetailNeeded) { - for (size_t i = 0; i < crops.size(); i++) - if (crops[i]->get_skip() == 1 ) { // skip=1 -> full resolution + for (size_t i = 0; i < crops.size(); i++) { + if (crops[i]->get_skip() == 1) { // skip=1 -> full resolution highDetailNeeded = true; break; } - } - - RAWParams rp = params.raw; - ColorManagementParams cmp = params.icm; - LCurveParams lcur = params.labCurve; - - if ( !highDetailNeeded ) { - // if below 100% magnification, take a fast path - 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::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; - rp.xtranssensor.ccSteps = 0; - //rp.deadPixelFilter = rp.hotPixelFilter = false; - } - - progress ("Applying white balance, color correction & sRGB conversion...", 100 * readyphase / numofphases); - - if (frameCountListener) { - frameCountListener->FrameCountChanged (imgsrc->getFrameCount(), params.raw.bayersensor.imageNum); - } - - // raw auto CA is bypassed if no high detail is needed, so we have to compute it when high detail is needed - if ( (todo & M_PREPROC) || (!highDetailPreprocessComputed && highDetailNeeded)) { - imgsrc->setCurrentFrame (params.raw.bayersensor.imageNum); - - imgsrc->preprocess ( rp, params.lensProf, params.coarse ); - imgsrc->getRAWHistogram ( histRedRaw, histGreenRaw, histBlueRaw ); - - highDetailPreprocessComputed = highDetailNeeded; - } - - /* - Demosaic is kicked off only when - Detail considerations: - accurate detail is not displayed yet needed based on preview specifics (driven via highDetailNeeded flag) - OR - HLR considerations: - Color HLR alters rgb output of demosaic, so re-demosaic is needed when Color HLR is being turned off; - if HLR is enabled and changing method *from* Color to any other method - OR HLR gets disabled when Color method was selected - */ - // If high detail (=100%) is newly selected, do a demosaic update, since the last was just with FAST - - if (imageTypeListener) { - imageTypeListener->imageTypeChanged (imgsrc->isRAW(), imgsrc->getSensorType() == ST_BAYER, imgsrc->getSensorType() == ST_FUJI_XTRANS); - } - - if ( (todo & M_RAW) - || (!highDetailRawComputed && highDetailNeeded) - || ( params.toneCurve.hrenabled && params.toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) - || (!params.toneCurve.hrenabled && params.toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { - - if (settings->verbose) { - if (imgsrc->getSensorType() == ST_BAYER) { - printf ("Demosaic Bayer image n.%d using method: %s\n", rp.bayersensor.imageNum + 1, rp.bayersensor.method.c_str()); - } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { - printf ("Demosaic X-Trans image with using method: %s\n", rp.xtranssensor.method.c_str()); - } - } - - imgsrc->demosaic ( rp); //enabled demosaic - // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag - todo |= M_INIT; - - if (highDetailNeeded) { - highDetailRawComputed = true; - } else { - highDetailRawComputed = false; - } - - if (params.retinex.enabled) { - lhist16RETI (32768); - lhist16RETI.clear(); - - imgsrc->retinexPrepareBuffers (params.icm, params.retinex, conversionBuffer, lhist16RETI); } } - if ((todo & (M_RETINEX | M_INIT)) && params.retinex.enabled) { - bool dehacontlutili = false; - bool mapcontlutili = false; - bool useHsl = false; - LUTf cdcurve (65536, 0); - LUTf mapcurve (65536, 0); + if (((todo & ALL) == ALL) || (todo & M_MONITOR) || panningRelatedChange || (highDetailNeeded && options.prevdemo != PD_Sidecar)) { + bwAutoR = bwAutoG = bwAutoB = -9000.f; - imgsrc->retinexPrepareCurves (params.retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, lhist16RETI, histLRETI); - float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax; - imgsrc->retinex ( params.icm, params.retinex, params.toneCurve, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, conversionBuffer, dehacontlutili, mapcontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, histLRETI); //enabled Retinex - - if (dehaListener) { - dehaListener->minmaxChanged (maxCD, minCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); - } - } - - 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 - - - if (settings->verbose) { - printf ("Applying white balance, color correction & sRBG conversion...\n"); + if (todo == CROP && ipf.needsPCVignetting()) { + todo |= TRANSFORM; // Change about Crop does affect TRANSFORM } - currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); + RAWParams rp = params->raw; + ColorManagementParams cmp = params->icm; + LCurveParams lcur = params->labCurve; - 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) { - double rm, gm, bm; - imgsrc->getAutoWBMultipliers (rm, gm, bm); - - if (rm != -1.) { - autoWB.update (rm, gm, bm, params.wb.equal, params.wb.tempBias); - lastAwbEqual = params.wb.equal; - lastAwbTempBias = params.wb.tempBias; - } else { - lastAwbEqual = -1.; - lastAwbTempBias = 0.0; - autoWB.useDefaults (params.wb.equal); - } - - //double rr,gg,bb; - //autoWB.getMultipliers(rr,gg,bb); + if (!highDetailNeeded) { + // if below 100% magnification, take a fast path + if (rp.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) && rp.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::MONO)) { + rp.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); } - currWB = autoWB; + //bayerrp.all_enhance = false; + + if (rp.xtranssensor.method != RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE) && rp.xtranssensor.method != RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO)) { + rp.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); + } + + rp.bayersensor.ccSteps = 0; + rp.xtranssensor.ccSteps = 0; + //rp.deadPixelFilter = rp.hotPixelFilter = false; } - if (params.wb.enabled) { - params.wb.temperature = currWB.getTemp (); - params.wb.green = currWB.getGreen (); + progress("Applying white balance, color correction & sRGB conversion...", 100 * readyphase / numofphases); + + if (frameCountListener) { + frameCountListener->FrameCountChanged(imgsrc->getFrameCount(), params->raw.bayersensor.imageNum); } - if (params.wb.method == "Auto" && awbListener && params.wb.enabled) { - awbListener->WBChanged (params.wb.temperature, params.wb.green); + // raw auto CA is bypassed if no high detail is needed, so we have to compute it when high detail is needed + if ((todo & M_PREPROC) || (!highDetailPreprocessComputed && highDetailNeeded)) { + imgsrc->setCurrentFrame(params->raw.bayersensor.imageNum); + + imgsrc->preprocess(rp, params->lensProf, params->coarse); + if (flatFieldAutoClipListener && rp.ff_AutoClipControl) { + flatFieldAutoClipListener->flatFieldAutoClipValueChanged(imgsrc->getFlatFieldAutoClipValue()); + } + imgsrc->getRAWHistogram(histRedRaw, histGreenRaw, histBlueRaw); + + highDetailPreprocessComputed = highDetailNeeded; } - int tr = getCoarseBitMask (params.coarse); - - imgsrc->getFullSize (fw, fh, tr); - - // Will (re)allocate the preview's buffers - setScale (scale); - previewProps.set (0, 0, fw, fh, scale); - // 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, previewProps, params.toneCurve, params.raw); - denoiseInfoStore.valid = false; - //ColorTemp::CAT02 (orig_prev, ¶ms) ; - // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale); - /* Issue 2785, disabled some 1:1 tools - if (todo & M_LINDENOISE) { - DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise; - if (denoiseParams.enabled && (scale==1)) { - Imagefloat *calclum = NULL ; - - denoiseParams.getCurves(noiseLCurve,noiseCCurve); - int nbw=6;//nb tile W - int nbh=4;// - - float ch_M[nbw*nbh]; - float max_r[nbw*nbh]; - float max_b[nbw*nbh]; - - if(denoiseParams.Lmethod == "CUR") { - if(noiseLCurve) - denoiseParams.luma = 0.5f; - else - denoiseParams.luma = 0.0f; - } else if(denoiseParams.Lmethod == "SLI") - noiseLCurve.Reset(); - - - if(noiseLCurve || noiseCCurve){//only allocate memory if enabled and scale=1 - // we only need image reduced to 1/4 here - calclum = new Imagefloat ((pW+1)/2, (pH+1)/2);//for luminance denoise curve - for(int ii=0;iir(ii>>1,jj>>1) = orig_prev->r(ii,jj); - calclum->g(ii>>1,jj>>1) = orig_prev->g(ii,jj); - calclum->b(ii>>1,jj>>1) = orig_prev->b(ii,jj); - } - } - imgsrc->convertColorSpace(calclum, params.icm, currWB);//claculate values after colorspace conversion - } - - int kall=1; - ipf.RGB_denoise(kall, orig_prev, orig_prev, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); - } - } + /* + Demosaic is kicked off only when + Detail considerations: + accurate detail is not displayed yet needed based on preview specifics (driven via highDetailNeeded flag) + OR + HLR considerations: + Color HLR alters rgb output of demosaic, so re-demosaic is needed when Color HLR is being turned off; + if HLR is enabled and changing method *from* Color to any other method + OR HLR gets disabled when Color method was selected */ - imgsrc->convertColorSpace (orig_prev, params.icm, currWB); + // If high detail (=100%) is newly selected, do a demosaic update, since the last was just with FAST - ipf.firstAnalysis (orig_prev, params, vhist16); - } - - 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 ("Spot Removal...", 100 * readyphase / numofphases); - - if ((todo & M_SPOT) && params.spot.enabled && !params.spot.entries.empty ()) { - if (spotprevi == oprevi) { - spotprevi = new Imagefloat (pW, pH); + if (imageTypeListener) { + imageTypeListener->imageTypeChanged(imgsrc->isRAW(), imgsrc->getSensorType() == ST_BAYER, imgsrc->getSensorType() == ST_FUJI_XTRANS, imgsrc->isMono()); } - oprevi->copyData (spotprevi); - ipf.removeSpots (spotprevi, params.spot.entries, previewProps); - } else { - if (spotprevi != oprevi) { - delete spotprevi; - spotprevi = oprevi; - } - } + if ((todo & M_RAW) + || (!highDetailRawComputed && highDetailNeeded) + || (params->toneCurve.hrenabled && params->toneCurve.method != "Color" && imgsrc->isRGBSourceModified()) + || (!params->toneCurve.hrenabled && params->toneCurve.method == "Color" && imgsrc->isRGBSourceModified())) { - readyphase++; + if (settings->verbose) { + if (imgsrc->getSensorType() == ST_BAYER) { + printf("Demosaic Bayer image n.%d using method: %s\n", rp.bayersensor.imageNum + 1, rp.bayersensor.method.c_str()); + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { + printf("Demosaic X-Trans image with using method: %s\n", rp.xtranssensor.method.c_str()); + } + } + if(imgsrc->getSensorType() == ST_BAYER) { + if(params->raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + imgsrc->setBorder(params->raw.bayersensor.border); + } else { + imgsrc->setBorder(std::max(params->raw.bayersensor.border, 2)); + } + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { + imgsrc->setBorder(params->raw.xtranssensor.border); + } + bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicAutoContrast : params->raw.xtranssensor.dualDemosaicAutoContrast; + double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params->raw.bayersensor.dualDemosaicContrast : params->raw.xtranssensor.dualDemosaicContrast; + imgsrc->demosaic(rp, autoContrast, contrastThreshold); //enabled demosaic - 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)) ) { - assert(spotprevi); - Imagefloat *op = spotprevi; - spotprevi = new Imagefloat (pW, pH); - - if (needstransform) - ipf.transform (op, spotprevi, 0, 0, 0, 0, pW, pH, fw, fh, - imgsrc->getMetaData(), imgsrc->getRotateDegree(), false); - else { - op->copyData (spotprevi); - } - } - - if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled && !params.colorappearance.enabled) { - const int W = spotprevi->getWidth(); - const int H = spotprevi->getHeight(); - LabImage labcbdl (W, H); - ipf.rgb2lab (*spotprevi, labcbdl, params.icm.working); - ipf.dirpyrequalizer (&labcbdl, scale); - ipf.lab2rgb (labcbdl, *spotprevi, params.icm.working); - } - - readyphase++; - progress ("Preparing shadow/highlight map...", 100 * readyphase / numofphases); - - if ((todo & M_BLURMAP) && params.sh.enabled) { - double radius = sqrt (double (pW * pW + pH * pH)) / 2.0; - double shradius = params.sh.radius; - - if (!params.sh.hq) { - shradius *= radius / 1800.0; - } - - if (!shmap) { - shmap = new SHMap (pW, pH, true); - } - - shmap->update (spotprevi, shradius, ipf.lumimul, params.sh.hq, scale); - } - - - - readyphase++; - - if (todo & M_AUTOEXP) { - if (params.toneCurve.autoexp) { - LUTu aehist; - int aehistcompr; - imgsrc->getAutoExpHistogram (aehist, aehistcompr); - 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.toneCurve.curve); - - if (params.toneCurve.autoexp) { - params.toneCurve.expcomp = 0.0; + if (imgsrc->getSensorType() == ST_BAYER && bayerAutoContrastListener && autoContrast) { + bayerAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.0); + } + if (imgsrc->getSensorType() == ST_FUJI_XTRANS && xtransAutoContrastListener && autoContrast) { + xtransAutoContrastListener->autoContrastChanged(autoContrast ? contrastThreshold : -1.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 a demosaic happened we should also call getimage later, so we need to set the M_INIT flag + todo |= M_INIT; - if (aeListener) { - aeListener->autoMatchedToneCurveChanged(params.toneCurve.curveMode, params.toneCurve.curve); - } - } - } - - progress ("Exposure curve & CIELAB conversion...", 100 * readyphase / numofphases); - - if ((todo & M_RGBCURVE) || (todo & M_CROP)) { -// if (hListener) spotprevi->calcCroppedHistogram(params, scale, histCropped); - - //complexCurve also calculated pre-curves histogram depending on crop - 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.curve, params.toneCurve.curve2, - vhist16, hltonecurve, shtonecurve, tonecurve, histToneCurve, customToneCurve1, customToneCurve2, 1); - - CurveFactory::RGBCurve (params.rgbCurves.rcurve, rCurve, 1); - CurveFactory::RGBCurve (params.rgbCurves.gcurve, gCurve, 1); - CurveFactory::RGBCurve (params.rgbCurves.bcurve, bCurve, 1); - - - opautili = false; - - if (params.colorToning.enabled) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.working); - double wp[3][3] = { - {wprof[0][0], wprof[0][1], wprof[0][2]}, - {wprof[1][0], wprof[1][1], wprof[1][2]}, - {wprof[2][0], wprof[2][1], wprof[2][2]} - }; - 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); - } - - if (params.blackwhite.enabled) { - CurveFactory::curveBW (params.blackwhite.beforeCurve, params.blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, 1); - } - - colourToningSatLimit = float (params.colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; - colourToningSatLimitOpacity = 1.f - (float (params.colorToning.saturatedOpacity) / 100.f); - - int satTH = 80; - int satPR = 30; - int indi = 0; - - 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 (spotprevi, moyS, eqty);//return image : mean saturation and standard dev of saturation - //printf("moy=%f ET=%f\n", moyS,eqty); - float satp = ((moyS + 1.5f * eqty) - 0.3f) / 0.7f; //1.5 sigma ==> 93% pixels with high saturation -0.3 / 0.7 convert to Hombre scale - - if (satp >= 0.92f) { - satp = 0.92f; //avoid values too high (out of gamut) - } - - if (satp <= 0.15f) { - satp = 0.15f; //avoid too low values - } - - //satTH=(int) 100.f*satp; - //satPR=(int) 100.f*(moyS-0.85f*eqty);//-0.85 sigma==>20% pixels with low saturation - colourToningSatLimit = 100.f * satp; - satTH = (int) 100.f * satp; - - colourToningSatLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation - satPR = (int) 100.f * (moyS - 0.85f * eqty); - } - - if (actListener) { - //if(params.blackwhite.enabled) {actListener->autoColorTonChanged(0, satTH, satPR);} - if (params.blackwhite.enabled && params.colorToning.autosat) { - actListener->autoColorTonChanged (0, satTH, satPR); //hide sliders only if autosat - indi = 0; + if (highDetailNeeded) { + highDetailRawComputed = true; } else { - if (params.colorToning.autosat) { - if (params.colorToning.method == "Lab") { - indi = 1; - } else if (params.colorToning.method == "RGBCurves") { - indi = 1; - } else if (params.colorToning.method == "RGBSliders") { - indi = 1; - } else if (params.colorToning.method == "Splico") { - indi = 2; - } else if (params.colorToning.method == "Splitlr") { - indi = 2; + highDetailRawComputed = false; + } + + if (params->retinex.enabled) { + lhist16RETI(32768); + lhist16RETI.clear(); + + imgsrc->retinexPrepareBuffers(params->icm, params->retinex, conversionBuffer, lhist16RETI); + } + } + + if ((todo & (M_RETINEX | M_INIT)) && params->retinex.enabled) { + bool dehacontlutili = false; + bool mapcontlutili = false; + bool useHsl = false; + LUTf cdcurve(65536, 0); + LUTf mapcurve(65536, 0); + + imgsrc->retinexPrepareCurves(params->retinex, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, dehacontlutili, mapcontlutili, useHsl, lhist16RETI, histLRETI); + float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax; + imgsrc->retinex(params->icm, params->retinex, params->toneCurve, cdcurve, mapcurve, dehatransmissionCurve, dehagaintransmissionCurve, conversionBuffer, dehacontlutili, mapcontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, histLRETI); //enabled Retinex + + if (dehaListener) { + dehaListener->minmaxChanged(maxCD, minCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax); + } + } + + 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 + + + if (settings->verbose) { + printf("Applying white balance, color correction & sRBG conversion...\n"); + } + + currWB = ColorTemp(params->wb.temperature, params->wb.green, params->wb.equal, params->wb.method); + + 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) { + double rm, gm, bm; + imgsrc->getAutoWBMultipliers(rm, gm, bm); + + if (rm != -1.) { + autoWB.update(rm, gm, bm, params->wb.equal, params->wb.tempBias); + lastAwbEqual = params->wb.equal; + lastAwbTempBias = params->wb.tempBias; + } else { + lastAwbEqual = -1.; + lastAwbTempBias = 0.0; + autoWB.useDefaults(params->wb.equal); } - //actListener->autoColorTonChanged(indi, satTH, satPR); - } - } - } - - // if it's just crop we just need the histogram, no image updates - if ( todo & M_RGBCURVE ) { - //initialize rrm bbm ggm different from zero to avoid black screen in some cases - double rrm = 33.; - double ggm = 33.; - double bbm = 33.; - - DCPProfile::ApplyState as; - DCPProfile *dcpProf = imgsrc->getDCP (params.icm, as); - - ipf.rgbProc (spotprevi, 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); - - if (params.blackwhite.enabled && params.blackwhite.autoc && abwListener) { - if (settings->verbose) { - printf ("ImProcCoordinator / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", bwAutoR, bwAutoG, bwAutoB); + //double rr,gg,bb; + //autoWB.getMultipliers(rr,gg,bb); } - abwListener->BWChanged((float) rrm, (float) ggm, (float) bbm); + currWB = autoWB; } - if (params.colorToning.autosat && actListener) { - if (settings->verbose) { - printf ("ImProcCoordinator / Auto CT: indi=%d satH=%d satPR=%d\n", indi, (int)colourToningSatLimit, (int) colourToningSatLimitOpacity); - } - - actListener->autoColorTonChanged (indi, (int) colourToningSatLimit, (int)colourToningSatLimitOpacity); //change sliders autosat + if (params->wb.enabled) { + params->wb.temperature = currWB.getTemp(); + params->wb.green = currWB.getGreen(); } - // correct GUI black and white with value + if (params->wb.method == "Auto" && awbListener && params->wb.enabled) { + awbListener->WBChanged(params->wb.temperature, params->wb.green); + } + + /* + GammaValues g_a; + double pwr = 1.0 / params->icm.gampos; + double ts = params->icm.slpos; + + + int mode = 0; + Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope + printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", g_a[0],g_a[1],g_a[2],g_a[3],g_a[4]); + + Glib::ustring datal; + datal = "lutsrgb.txt"; + ofstream fou(datal, ios::out | ios::trunc); + + for(int i=0; i < 212; i++) { + //printf("igamma2=%i\n", (int) 65535.f*Color::igamma2(i/212.0)); + float gam = Color::igamma2(i/211.0); + int lutga = nearbyint(65535.f* gam); + // fou << 65535*(int)Color::igamma2(i/212.0) << endl; + fou << i << " " << lutga << endl; + + } + fou.close(); + */ + int tr = getCoarseBitMask(params->coarse); + + imgsrc->getFullSize(fw, fh, tr); + + // Will (re)allocate the preview's buffers + setScale(scale); + previewProps.set(0, 0, fw, fh, scale); + // 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, previewProps, params->toneCurve, params->raw); + denoiseInfoStore.valid = false; + //ColorTemp::CAT02 (orig_prev, ¶ms) ; + // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale); + /* Issue 2785, disabled some 1:1 tools + if (todo & M_LINDENOISE) { + DirPyrDenoiseParams denoiseParams = params->dirpyrDenoise; + if (denoiseParams.enabled && (scale==1)) { + Imagefloat *calclum = NULL ; + + denoiseParams.getCurves(noiseLCurve,noiseCCurve); + int nbw=6;//nb tile W + int nbh=4;// + + float ch_M[nbw*nbh]; + float max_r[nbw*nbh]; + float max_b[nbw*nbh]; + + if(denoiseParams.Lmethod == "CUR") { + if(noiseLCurve) + denoiseParams.luma = 0.5f; + else + denoiseParams.luma = 0.0f; + } else if(denoiseParams.Lmethod == "SLI") + noiseLCurve.Reset(); + + + if(noiseLCurve || noiseCCurve){//only allocate memory if enabled and scale=1 + // we only need image reduced to 1/4 here + calclum = new Imagefloat ((pW+1)/2, (pH+1)/2);//for luminance denoise curve + for(int ii=0;iir(ii>>1,jj>>1) = orig_prev->r(ii,jj); + calclum->g(ii>>1,jj>>1) = orig_prev->g(ii,jj); + calclum->b(ii>>1,jj>>1) = orig_prev->b(ii,jj); + } + } + imgsrc->convertColorSpace(calclum, params->icm, currWB);//calculate values after colorspace conversion + } + + int kall=1; + ipf.RGB_denoise(kall, orig_prev, orig_prev, calclum, ch_M, max_r, max_b, imgsrc->isRAW(), denoiseParams, imgsrc->getDirPyrDenoiseExpComp(), noiseLCurve, noiseCCurve, chaut, redaut, blueaut, maxredaut, maxblueaut, nresi, highresi); + } + } + */ + imgsrc->convertColorSpace(orig_prev, params->icm, currWB); + + ipf.firstAnalysis(orig_prev, *params, vhist16); } - // compute L channel histogram - int x1, y1, x2, y2; - params.crop.mapToResized (pW, pH, scale, x1, x2, y1, y2); - } - - readyphase++; - - if (todo & (M_LUMACURVE | M_CROP)) { - LUTu lhist16 (32768); - lhist16.clear(); -#ifdef _OPENMP - const int numThreads = min (max (pW * pH / (int)lhist16.getSize(), 1), omp_get_max_threads()); - #pragma omp parallel num_threads(numThreads) if(numThreads>1) -#endif - { - LUTu lhist16thr (lhist16.getSize()); - lhist16thr.clear(); -#ifdef _OPENMP - #pragma omp for nowait -#endif - - for (int x = 0; x < pH; x++) - for (int y = 0; y < pW; y++) { - int pos = (int) (oprevl->L[x][y]); - lhist16thr[pos]++; - } - -#ifdef _OPENMP - #pragma omp critical -#endif - lhist16 += lhist16thr; - } -#ifdef _OPENMP - static_cast (numThreads); // to silence cppcheck warning -#endif - CurveFactory::complexLCurve (params.labCurve.brightness, params.labCurve.contrast, params.labCurve.lcurve, lhist16, lumacurve, histLCurve, scale == 1 ? 1 : 16, utili); - } - - if (todo & M_LUMACURVE) { - - CurveFactory::curveCL (clcutili, params.labCurve.clcurve, clcurve, scale == 1 ? 1 : 16); - - CurveFactory::complexsgnCurve (autili, butili, ccutili, cclutili, params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, - params.labCurve.lccurve, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, scale == 1 ? 1 : 16); - } - - if (todo & (M_LUMINANCE + M_COLOR) ) { - nprevl->CopyFrom (oprevl); - - progress ("Applying Color Boost...", 100 * readyphase / numofphases); - // ipf.MSR(nprevl, nprevl->W, nprevl->H, 1); - histCCurve.clear(); - histLCurve.clear(); - ipf.chromiLuminanceCurve (nullptr, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLCurve); - ipf.vibrance (nprevl); - - if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || (!params.colorappearance.enabled)) { - ipf.EPDToneMap (nprevl, 5, scale); - } - - // for all treatments Defringe, Sharpening, Contrast detail , Microcontrast they are activated if "CIECAM" function are disabled readyphase++; - /* Issue 2785, disabled some 1:1 tools - if (scale==1) { - if((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)){ - progress ("Denoising luminance impulse...",100*readyphase/numofphases); - ipf.impulsedenoise (nprevl); - readyphase++; + if ((todo & M_HDR) && (params->fattal.enabled || params->dehaze.enabled)) { + if (fattal_11_dcrop_cache) { + delete fattal_11_dcrop_cache; + fattal_11_dcrop_cache = nullptr; + } + + ipf.dehaze(orig_prev); + ipf.ToneMapFattal02(orig_prev); + + if (oprevi != orig_prev) { + delete oprevi; + } + } + + oprevi = orig_prev; + + progress ("Spot Removal...", 100 * readyphase / numofphases); + + if ((todo & M_SPOT) && params->spot.enabled && !params->spot.entries.empty ()) { + // First update the image with spot healing + ipf.removeSpots (oprevi, params->spot.entries, previewProps); + + // Then create fork the image to cache the data + if (spot_prev == nullptr) { + spot_prev = new Imagefloat (pW, pH); + } + + oprevi->copyData (spot_prev); + } else { + if (spot_prev) { + delete spot_prev; + spot_prev = nullptr; + } + } + + readyphase++; + + 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))) { + // Forking the image + assert(oprevi); + Imagefloat *op = oprevi; + oprevi = new Imagefloat(pW, pH); + + if (needstransform) + ipf.transform(op, oprevi, 0, 0, 0, 0, pW, pH, fw, fh, + imgsrc->getMetaData(), imgsrc->getRotateDegree(), false); + else { + op->copyData(oprevi); + } + } + + if ((todo & (M_TRANSFORM | M_RGBCURVE)) && params->dirpyrequalizer.cbdlMethod == "bef" && params->dirpyrequalizer.enabled && !params->colorappearance.enabled) { + const int W = oprevi->getWidth(); + const int H = oprevi->getHeight(); + LabImage labcbdl(W, H); + ipf.rgb2lab(*oprevi, labcbdl, params->icm.workingProfile); + ipf.dirpyrequalizer(&labcbdl, scale); + ipf.lab2rgb(labcbdl, *oprevi, params->icm.workingProfile); + } + + readyphase++; + progress("Preparing shadow/highlight map...", 100 * readyphase / numofphases); + + readyphase++; + + if (todo & M_AUTOEXP) { + if (params->toneCurve.autoexp) { + LUTu aehist; + int aehistcompr; + imgsrc->getAutoExpHistogram(aehist, aehistcompr); + 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) { + if (!params->toneCurve.fromHistMatching) { + imgsrc->getAutoMatchedToneCurve(params->icm, params->toneCurve.curve); + } + + if (params->toneCurve.autoexp) { + params->toneCurve.expcomp = 0.0; + } + + params->toneCurve.autoexp = false; + params->toneCurve.curveMode = ToneCurveMode::FILMLIKE; + params->toneCurve.curve2 = { 0 }; + params->toneCurve.brightness = 0; + params->toneCurve.contrast = 0; + params->toneCurve.black = 0; + params->toneCurve.fromHistMatching = true; + + if (aeListener) { + aeListener->autoMatchedToneCurveChanged(params->toneCurve.curveMode, params->toneCurve.curve); + } + } + } + + progress("Exposure curve & CIELAB conversion...", 100 * readyphase / numofphases); + + if (todo & (M_AUTOEXP | M_RGBCURVE)) { + if (params->icm.workingTRC == "Custom") { //exec TRC IN free + if (oprevi == orig_prev) { + oprevi = new Imagefloat(pW, pH); + orig_prev->copyData(oprevi); + } + + const Glib::ustring profile = params->icm.workingProfile; + + if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1") { + const int cw = oprevi->getWidth(); + const int ch = oprevi->getHeight(); + // put gamma TRC to 1 + if(customTransformIn) { + cmsDeleteTransform(customTransformIn); + customTransformIn = nullptr; } - if((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)){ - progress ("Defringing...",100*readyphase/numofphases); - ipf.defringe (nprevl); - readyphase++; + ipf.workingtrc(oprevi, oprevi, cw, ch, -5, params->icm.workingProfile, 2.4, 12.92310, customTransformIn, true, false, true); + //adjust TRC + if(customTransformOut) { + cmsDeleteTransform(customTransformOut); + customTransformOut = nullptr; } - if (params.sharpenEdge.enabled) { - progress ("Edge sharpening...",100*readyphase/numofphases); - ipf.MLsharpen (nprevl); - readyphase++; + ipf.workingtrc(oprevi, oprevi, cw, ch, 5, params->icm.workingProfile, params->icm.workingTRCGamma, params->icm.workingTRCSlope, customTransformOut, false, true, true); + } + } + } + + + if ((todo & M_RGBCURVE) || (todo & M_CROP)) { + // if (hListener) oprevi->calcCroppedHistogram(params, scale, histCropped); + + //complexCurve also calculated pre-curves histogram depending on crop + 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.curve, params->toneCurve.curve2, + vhist16, hltonecurve, shtonecurve, tonecurve, histToneCurve, customToneCurve1, customToneCurve2, 1); + + CurveFactory::RGBCurve(params->rgbCurves.rcurve, rCurve, 1); + CurveFactory::RGBCurve(params->rgbCurves.gcurve, gCurve, 1); + CurveFactory::RGBCurve(params->rgbCurves.bcurve, bCurve, 1); + + + opautili = false; + + if (params->colorToning.enabled) { + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + double wp[3][3] = { + {wprof[0][0], wprof[0][1], wprof[0][2]}, + {wprof[1][0], wprof[1][1], wprof[1][2]}, + {wprof[2][0], wprof[2][1], wprof[2][2]} + }; + 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); + } + + if (params->blackwhite.enabled) { + CurveFactory::curveBW(params->blackwhite.beforeCurve, params->blackwhite.afterCurve, vhist16bw, histToneCurveBW, beforeToneCurveBW, afterToneCurveBW, 1); + } + + colourToningSatLimit = float (params->colorToning.satProtectionThreshold) / 100.f * 0.7f + 0.3f; + colourToningSatLimitOpacity = 1.f - (float (params->colorToning.saturatedOpacity) / 100.f); + + int satTH = 80; + int satPR = 30; + int indi = 0; + + 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 + //printf("moy=%f ET=%f\n", moyS,eqty); + float satp = ((moyS + 1.5f * eqty) - 0.3f) / 0.7f; //1.5 sigma ==> 93% pixels with high saturation -0.3 / 0.7 convert to Hombre scale + + if (satp >= 0.92f) { + satp = 0.92f; //avoid values too high (out of gamut) + } + + if (satp <= 0.15f) { + satp = 0.15f; //avoid too low values + } + + //satTH=(int) 100.f*satp; + //satPR=(int) 100.f*(moyS-0.85f*eqty);//-0.85 sigma==>20% pixels with low saturation + colourToningSatLimit = 100.f * satp; + satTH = (int) 100.f * satp; + + colourToningSatLimitOpacity = 100.f * (moyS - 0.85f * eqty); //-0.85 sigma==>20% pixels with low saturation + satPR = (int) 100.f * (moyS - 0.85f * eqty); + } + + if (actListener && params->colorToning.enabled) { + if (params->blackwhite.enabled && params->colorToning.autosat) { + actListener->autoColorTonChanged(0, satTH, satPR); //hide sliders only if autosat + indi = 0; + } else { + if (params->colorToning.autosat) { + if (params->colorToning.method == "Lab") { + indi = 1; + } else if (params->colorToning.method == "RGBCurves") { + indi = 1; + } else if (params->colorToning.method == "RGBSliders") { + indi = 1; + } else if (params->colorToning.method == "Splico") { + indi = 2; + } else if (params->colorToning.method == "Splitlr") { + indi = 2; + } } - if (params.sharpenMicro.enabled) { - if(( params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)){ - progress ("Microcontrast...",100*readyphase/numofphases); - ipf.MLmicrocontrast (nprevl); + } + } + + // if it's just crop we just need the histogram, no image updates + if (todo & M_RGBCURVE) { + //initialize rrm bbm ggm different from zero to avoid black screen in some cases + double rrm = 33.; + double ggm = 33.; + double bbm = 33.; + + DCPProfile::ApplyState as; + DCPProfile *dcpProf = imgsrc->getDCP(params->icm, as); + + ipf.rgbProc (oprevi, oprevl, nullptr, hltonecurve, shtonecurve, tonecurve, 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); + + if (params->blackwhite.enabled && params->blackwhite.autoc && abwListener) { + if (settings->verbose) { + printf("ImProcCoordinator / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", bwAutoR, bwAutoG, bwAutoB); + } + + abwListener->BWChanged((float) rrm, (float) ggm, (float) bbm); + } + + if (params->colorToning.enabled && params->colorToning.autosat && actListener) { + actListener->autoColorTonChanged(indi, (int) colourToningSatLimit, (int)colourToningSatLimitOpacity); //change sliders autosat + } + + // correct GUI black and white with value + } + + // compute L channel histogram + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + } + + readyphase++; + + if (todo & (M_LUMACURVE | M_CROP)) { + LUTu lhist16(32768); + lhist16.clear(); +#ifdef _OPENMP + const int numThreads = min(max(pW * pH / (int)lhist16.getSize(), 1), omp_get_max_threads()); + #pragma omp parallel num_threads(numThreads) if(numThreads>1) +#endif + { + LUTu lhist16thr(lhist16.getSize()); + lhist16thr.clear(); +#ifdef _OPENMP + #pragma omp for nowait +#endif + + for (int x = 0; x < pH; x++) + for (int y = 0; y < pW; y++) { + int pos = (int)(oprevl->L[x][y]); + lhist16thr[pos]++; + } + +#ifdef _OPENMP + #pragma omp critical +#endif + lhist16 += lhist16thr; + } +#ifdef _OPENMP + static_cast(numThreads); // to silence cppcheck warning +#endif + CurveFactory::complexLCurve(params->labCurve.brightness, params->labCurve.contrast, params->labCurve.lcurve, lhist16, lumacurve, histLCurve, scale == 1 ? 1 : 16, utili); + } + + if (todo & M_LUMACURVE) { + + CurveFactory::curveCL(clcutili, params->labCurve.clcurve, clcurve, scale == 1 ? 1 : 16); + + CurveFactory::complexsgnCurve(autili, butili, ccutili, cclutili, params->labCurve.acurve, params->labCurve.bcurve, params->labCurve.cccurve, + params->labCurve.lccurve, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, scale == 1 ? 1 : 16); + } + + if (todo & (M_LUMINANCE + M_COLOR)) { + nprevl->CopyFrom(oprevl); + + progress("Applying Color Boost...", 100 * readyphase / numofphases); + + histCCurve.clear(); + histLCurve.clear(); + ipf.chromiLuminanceCurve(nullptr, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histLCurve); + ipf.vibrance(nprevl); + ipf.labColorCorrectionRegions(nprevl); + + if ((params->colorappearance.enabled && !params->colorappearance.tonecie) || (!params->colorappearance.enabled)) { + ipf.EPDToneMap(nprevl, 5, scale); + } + + // for all treatments Defringe, Sharpening, Contrast detail , Microcontrast they are activated if "CIECAM" function are disabled + readyphase++; + + /* Issue 2785, disabled some 1:1 tools + if (scale==1) { + if((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)){ + progress ("Denoising luminance impulse...",100*readyphase/numofphases); + ipf.impulsedenoise (nprevl); + readyphase++; + } + if((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)){ + progress ("Defringing...",100*readyphase/numofphases); + ipf.defringe (nprevl); + readyphase++; + } + if (params->sharpenEdge.enabled) { + progress ("Edge sharpening...",100*readyphase/numofphases); + ipf.MLsharpen (nprevl); + readyphase++; + } + if (params->sharpenMicro.enabled) { + if(( params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)){ + progress ("Microcontrast...",100*readyphase/numofphases); + ipf.MLmicrocontrast (nprevl); + readyphase++; + } + } + if(((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled)) && params->sharpening.enabled) { + progress ("Sharpening...",100*readyphase/numofphases); + + float **buffer = new float*[pH]; + for (int i=0; iautocielab) || (!params.colorappearance.enabled)) && params.sharpening.enabled) { - progress ("Sharpening...",100*readyphase/numofphases); + */ + if (params->dirpyrequalizer.cbdlMethod == "aft") { + if (((params->colorappearance.enabled && !settings->autocielab) || (!params->colorappearance.enabled))) { + progress("Pyramid wavelet...", 100 * readyphase / numofphases); + ipf.dirpyrequalizer(nprevl, scale); + //ipf.Lanczoslab (ip_wavelet(LabImage * lab, LabImage * dst, const procparams::EqualizerParams & eqparams), nprevl, 1.f/scale); + readyphase++; + } + } - float **buffer = new float*[pH]; - for (int i=0; iwavelet.lcurve, wavclCurve, LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,int skip); + CurveFactory::curveWavContL(wavcontlutili, params->wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); - for (int i=0; iwavelet.enabled)) { + WaveletParams WaveParams = params->wavelet; + // WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY); + WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); + + 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, scale); + + } + + ipf.softLight(nprevl); + + if (params->colorappearance.enabled) { + //L histo and Chroma histo for ciecam + // histogram well be for Lab (Lch) values, because very difficult to do with J,Q, M, s, C + int x1, y1, x2, y2; + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); + lhist16CAM.clear(); + lhist16CCAM.clear(); + + if (!params->colorappearance.datacie) { + for (int x = 0; x < pH; x++) + for (int y = 0; y < pW; y++) { + int pos = CLIP((int)(nprevl->L[x][y])); + int posc = CLIP((int)sqrt(nprevl->a[x][y] * nprevl->a[x][y] + nprevl->b[x][y] * nprevl->b[x][y])); + lhist16CAM[pos]++; + lhist16CCAM[posc]++; + } + } + + CurveFactory::curveLightBrightColor(params->colorappearance.curve, params->colorappearance.curve2, params->colorappearance.curve3, + lhist16CAM, histLCAM, lhist16CCAM, histCCAM, + customColCurve1, customColCurve2, customColCurve3, 1); + + 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); } } - */ - if (params.dirpyrequalizer.cbdlMethod == "aft") { - if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) ) { - progress ("Pyramid wavelet...", 100 * readyphase / numofphases); - ipf.dirpyrequalizer (nprevl, scale); - //ipf.Lanczoslab (ip_wavelet(LabImage * lab, LabImage * dst, const procparams::EqualizerParams & eqparams), nprevl, 1.f/scale); + + 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 + adap = 2000.; + } else { + double E_V = fcomp + log2(double ((fnum * fnum) / fspeed / (fiso / 100.f))); + E_V += params->toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV + E_V += log2(params->raw.expos); // exposure raw white point ; log2 ==> linear to EV + adap = powf(2.f, E_V - 3.f); // cd / m2 + // end calculation adaptation scene luminosity + } + + float d, dj, yb; + bool execsharp = false; + + if (!ncie) { + ncie = new CieImage(pW, pH); + } + + if (!CAMBrightCurveJ && (params->colorappearance.algo == "JC" || params->colorappearance.algo == "JS" || params->colorappearance.algo == "ALL")) { + CAMBrightCurveJ(32768, 0); + } + + if (!CAMBrightCurveQ && (params->colorappearance.algo == "QM" || params->colorappearance.algo == "ALL")) { + CAMBrightCurveQ(32768, 0); + } + + // Issue 2785, only float version of ciecam02 for navigator and pan background + CAMMean = NAN; + CAMBrightCurveJ.dirty = true; + CAMBrightCurveQ.dirty = true; + + ipf.ciecam_02float(ncie, float (adap), pW, 2, nprevl, params.get(), 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); + } + + if (params->colorappearance.autoadapscen && acListener && params->colorappearance.enabled) { + acListener->adapCamChanged(adap); //real value of adapt scene + } + + if (params->colorappearance.autoybscen && acListener && params->colorappearance.enabled) { + acListener->ybCamChanged((int) yb); //real value Yb scene + } + readyphase++; - } - } + } else { + // CIECAM is disabled, we free up its image buffer to save some space + if (ncie) { + delete ncie; + } + ncie = nullptr; - wavcontlutili = false; - //CurveFactory::curveWavContL ( wavcontlutili,params.wavelet.lcurve, wavclCurve, LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,int skip); - CurveFactory::curveWavContL (wavcontlutili, params.wavelet.wavclCurve, wavclCurve, scale == 1 ? 1 : 16); + if (CAMBrightCurveJ) { + CAMBrightCurveJ.reset(); + } - - if ((params.wavelet.enabled)) { - WaveletParams WaveParams = params.wavelet; - // WaveParams.getCurves(wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY); - WaveParams.getCurves (wavCLVCurve, waOpacityCurveRG, waOpacityCurveBY, waOpacityCurveW, waOpacityCurveWL); - - 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, scale); - - } - - - if (params.colorappearance.enabled) { - //L histo and Chroma histo for ciecam - // histogram well be for Lab (Lch) values, because very difficult to do with J,Q, M, s, C - int x1, y1, x2, y2; - params.crop.mapToResized (pW, pH, scale, x1, x2, y1, y2); - lhist16CAM.clear(); - lhist16CCAM.clear(); - - if (!params.colorappearance.datacie) { - for (int x = 0; x < pH; x++) - for (int y = 0; y < pW; y++) { - int pos = CLIP ((int) (nprevl->L[x][y])); - int posc = CLIP ((int)sqrt (nprevl->a[x][y] * nprevl->a[x][y] + nprevl->b[x][y] * nprevl->b[x][y])); - lhist16CAM[pos]++; - lhist16CCAM[posc]++; - } - } - - CurveFactory::curveLightBrightColor (params.colorappearance.curve, params.colorappearance.curve2, params.colorappearance.curve3, - lhist16CAM, histLCAM, lhist16CCAM, histCCAM, - customColCurve1, customColCurve2, customColCurve3, 1); - - 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); + if (CAMBrightCurveQ) { + CAMBrightCurveQ.reset(); } } - - 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 - adap = 2000.; - } else { - double E_V = fcomp + log2 (double ((fnum * fnum) / fspeed / (fiso / 100.f))); - E_V += params.toneCurve.expcomp;// exposure compensation in tonecurve ==> direct EV - E_V += log2 (params.raw.expos); // exposure raw white point ; log2 ==> linear to EV - adap = powf (2.f, E_V - 3.f); // cd / m2 - // end calculation adaptation scene luminosity - } - - float d, dj, yb; - bool execsharp = false; - - if (!ncie) { - ncie = new CieImage (pW, pH); - } - - if (!CAMBrightCurveJ && (params.colorappearance.algo == "JC" || params.colorappearance.algo == "JS" || params.colorappearance.algo == "ALL")) { - CAMBrightCurveJ (32768, 0); - } - - if (!CAMBrightCurveQ && (params.colorappearance.algo == "QM" || params.colorappearance.algo == "ALL")) { - CAMBrightCurveQ (32768, 0); - } - - // Issue 2785, only float version of ciecam02 for navigator and pan background - CAMMean = NAN; - CAMBrightCurveJ.dirty = true; - CAMBrightCurveQ.dirty = true; - - 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); - } - - if (params.colorappearance.autoadapscen && acListener && params.colorappearance.enabled) { - acListener->adapCamChanged (adap); //real value of adapt scene - } - - if (params.colorappearance.autoybscen && acListener && params.colorappearance.enabled) { - acListener->ybCamChanged ((int) yb); //real value Yb scene - } - - readyphase++; - } else { - // CIECAM is disabled, we free up its image buffer to save some space - if (ncie) { - delete ncie; - } - - ncie = nullptr; - - if (CAMBrightCurveJ) { - CAMBrightCurveJ.reset(); - } - - if (CAMBrightCurveQ) { - CAMBrightCurveQ.reset(); - } } - } - // Update the monitor color transform if necessary - if ((todo & M_MONITOR) || (lastOutputProfile != params.icm.output) || lastOutputIntent != params.icm.outputIntent || lastOutputBPC != params.icm.outputBPC) { - lastOutputProfile = params.icm.output; - lastOutputIntent = params.icm.outputIntent; - lastOutputBPC = params.icm.outputBPC; - ipf.updateColorProfiles (monitorProfile, monitorIntent, softProof, gamutCheck); + // Update the monitor color transform if necessary + if ((todo & M_MONITOR) || (lastOutputProfile != params->icm.outputProfile) || lastOutputIntent != params->icm.outputIntent || lastOutputBPC != params->icm.outputBPC) { + lastOutputProfile = params->icm.outputProfile; + lastOutputIntent = params->icm.outputIntent; + lastOutputBPC = params->icm.outputBPC; + ipf.updateColorProfiles(monitorProfile, monitorIntent, softProof, gamutCheck); + } } // process crop, if needed for (size_t i = 0; i < crops.size(); i++) - if (crops[i]->hasListener () && cropCall != crops[i] ) { - crops[i]->update (todo); // may call ourselves + if (crops[i]->hasListener() && (panningRelatedChange || (highDetailNeeded && options.prevdemo != PD_Sidecar) || (todo & (M_MONITOR | M_RGBCURVE | M_LUMACURVE)) || crops[i]->get_skip() == 1)) { + crops[i]->update(todo); // may call ourselves } - progress ("Conversion to RGB...", 100 * readyphase / numofphases); + if (panningRelatedChange || (todo & M_MONITOR)) { + progress("Conversion to RGB...", 100 * readyphase / numofphases); - if ((todo != CROP && todo != MINUPDATE) || (todo & M_MONITOR)) { - MyMutex::MyLock prevImgLock (previmg->getMutex()); + if ((todo != CROP && todo != MINUPDATE) || (todo & M_MONITOR)) { + MyMutex::MyLock prevImgLock(previmg->getMutex()); - try { - // Computing the preview image, i.e. converting from WCS->Monitor color space (soft-proofing disabled) or WCS->Printer profile->Monitor color space (soft-proofing enabled) - ipf.lab2monitorRgb (nprevl, previmg); + try { + // Computing the preview image, i.e. converting from WCS->Monitor color space (soft-proofing disabled) or WCS->Printer profile->Monitor color space (soft-proofing enabled) + ipf.lab2monitorRgb(nprevl, previmg); - // Computing the internal image for analysis, i.e. conversion from WCS->Output profile - delete workimg; - workimg = ipf.lab2rgb (nprevl, 0, 0, pW, pH, params.icm); - } catch (char * str) { - progress ("Error converting file...", 0); - return; + // Computing the internal image for analysis, i.e. conversion from WCS->Output profile + delete workimg; + workimg = ipf.lab2rgb(nprevl, 0, 0, pW, pH, params->icm); + } catch (char * str) { + progress("Error converting file...", 0); + return; + } + } + + if (!resultValid) { + resultValid = true; + + if (imageListener) { + imageListener->setImage(previmg, scale, params->crop); + } + } + + if (imageListener) + // TODO: The WB tool should be advertised too in order to get the AutoWB's temp and green values + { + imageListener->imageReady(params->crop); + } + + readyphase++; + + if (hListener) { + updateLRGBHistograms(); + hListener->histogramChanged(histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI); } } - - if (!resultValid) { - resultValid = true; - - if (imageListener) { - imageListener->setImage (previmg, scale, params.crop); - } + if (orig_prev != oprevi) { + delete oprevi; + oprevi = nullptr; } - if (imageListener) - // TODO: The WB tool should be advertised too in order to get the AutoWB's temp and green values - { - imageListener->imageReady (params.crop); - } - - readyphase++; - - if (hListener) { - updateLRGBHistograms (); - hListener->histogramChanged (histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI); - } } -void ImProcCoordinator::freeAll () +void ImProcCoordinator::freeAll() { - if (settings->verbose) { - printf ("freeall starts %d\n", (int)allocated); - } - if (allocated) { - if (spotprevi && spotprevi != oprevi) { - delete spotprevi; + if (spot_prev && spot_prev != oprevi) { + delete spot_prev; } - spotprevi = NULL; + spot_prev = nullptr; if (oprevi && oprevi != orig_prev) { delete oprevi; } - oprevi = nullptr; + delete orig_prev; orig_prev = nullptr; delete oprevl; @@ -926,19 +1071,13 @@ void ImProcCoordinator::freeAll () ncie = nullptr; if (imageListener) { - imageListener->delImage (previmg); + imageListener->delImage(previmg); } else { delete previmg; } delete workimg; - if (shmap) { - delete shmap; - } - - shmap = nullptr; - } allocated = false; @@ -950,17 +1089,13 @@ void ImProcCoordinator::freeAll () * * @param prevscale New Preview's scale. */ -void ImProcCoordinator::setScale (int prevscale) +void ImProcCoordinator::setScale(int prevscale) { - if (settings->verbose) { - printf ("setscale before lock\n"); - } - - tr = getCoarseBitMask (params.coarse); + tr = getCoarseBitMask(params->coarse); int nW, nH; - imgsrc->getFullSize (fw, fh, tr); + imgsrc->getFullSize(fw, fh, tr); prevscale++; @@ -968,30 +1103,22 @@ void ImProcCoordinator::setScale (int prevscale) prevscale--; PreviewProps pp (0, 0, fw, fh, prevscale); imgsrc->getSize (pp, nW, nH); - } while (nH < 400 && prevscale > 1 && (nW * nH < 1000000) ); // actually hardcoded values, perhaps a better choice is possible - - if (settings->verbose) { - printf ("setscale starts (%d, %d)\n", nW, nH); - } + } while (nH < 400 && prevscale > 1 && (nW * nH < 1000000)); // actually hardcoded values, perhaps a better choice is possible if (nW != pW || nH != pH) { - freeAll (); + freeAll(); pW = nW; pH = nH; - orig_prev = new Imagefloat (pW, pH); - spotprevi = oprevi = orig_prev; - oprevl = new LabImage (pW, pH); - nprevl = new LabImage (pW, pH); + orig_prev = new Imagefloat(pW, pH); + spot_prev = oprevi = orig_prev; + oprevl = new LabImage(pW, pH); + nprevl = new LabImage(pW, pH); //ncie is only used in ImProcCoordinator::updatePreviewImage, it will be allocated on first use and deleted if not used anymore - previmg = new Image8 (pW, pH); - workimg = new Image8 (pW, pH); - - if (params.sh.enabled) { - shmap = new SHMap (pW, pH, true); - } + previmg = new Image8(pW, pH); + workimg = new Image8(pW, pH); allocated = true; } @@ -1001,51 +1128,50 @@ void ImProcCoordinator::setScale (int prevscale) fullw = fw; fullh = fh; - if (settings->verbose) { - printf ("setscale ends\n"); - } - if (!sizeListeners.empty()) for (size_t i = 0; i < sizeListeners.size(); i++) { - sizeListeners[i]->sizeChanged (fullw, fullh, fw, fh); + sizeListeners[i]->sizeChanged(fullw, fullh, fw, fh); } - - if (settings->verbose) { - printf ("setscale ends2\n"); - } - } -void ImProcCoordinator::updateLRGBHistograms () +void ImProcCoordinator::updateLRGBHistograms() { int x1, y1, x2, y2; - params.crop.mapToResized (pW, pH, scale, x1, x2, y1, y2); + params->crop.mapToResized(pW, pH, scale, x1, x2, y1, y2); +#ifdef _OPENMP #pragma omp parallel sections +#endif { +#ifdef _OPENMP #pragma omp section +#endif { histChroma.clear(); for (int i = y1; i < y2; i++) for (int j = x1; j < x2; j++) { - histChroma[ (int) (sqrtf (SQR (nprevl->a[i][j]) + SQR (nprevl->b[i][j])) / 188.f)]++; //188 = 48000/256 + histChroma[(int)(sqrtf(SQR(nprevl->a[i][j]) + SQR(nprevl->b[i][j])) / 188.f)]++; //188 = 48000/256 } } +#ifdef _OPENMP #pragma omp section +#endif { histLuma.clear(); for (int i = y1; i < y2; i++) for (int j = x1; j < x2; j++) { - histLuma[ (int) (nprevl->L[i][j] / 128.f)]++; + histLuma[(int)(nprevl->L[i][j] / 128.f)]++; } } +#ifdef _OPENMP #pragma omp section +#endif { histRed.clear(); histGreen.clear(); @@ -1070,7 +1196,7 @@ void ImProcCoordinator::updateLRGBHistograms () } -void ImProcCoordinator::progress (Glib::ustring str, int pr) +void ImProcCoordinator::progress(Glib::ustring str, int pr) { /* if (plistener) { @@ -1079,28 +1205,28 @@ void ImProcCoordinator::progress (Glib::ustring str, int pr) }*/ } -bool ImProcCoordinator::getAutoWB (double& temp, double& green, double equal, double tempBias) +bool ImProcCoordinator::getAutoWB(double& temp, double& green, double equal, double tempBias) { if (imgsrc) { if (lastAwbEqual != equal || lastAwbTempBias != tempBias) { // Issue 2500 MyMutex::MyLock lock(minit); // Also used in crop window double rm, gm, bm; - imgsrc->getAutoWBMultipliers (rm, gm, bm); + imgsrc->getAutoWBMultipliers(rm, gm, bm); if (rm != -1) { - autoWB.update (rm, gm, bm, equal, tempBias); + autoWB.update(rm, gm, bm, equal, tempBias); lastAwbEqual = equal; lastAwbTempBias = tempBias; } else { lastAwbEqual = -1.; - autoWB.useDefaults (equal); + autoWB.useDefaults(equal); lastAwbTempBias = 0.0; } } - temp = autoWB.getTemp (); - green = autoWB.getGreen (); + temp = autoWB.getTemp(); + green = autoWB.getGreen(); return true; } else { //temp = autoWB.getTemp(); @@ -1110,64 +1236,64 @@ bool ImProcCoordinator::getAutoWB (double& temp, double& green, double equal, do } } -void ImProcCoordinator::getCamWB (double& temp, double& green) +void ImProcCoordinator::getCamWB(double& temp, double& green) { if (imgsrc) { - temp = imgsrc->getWB().getTemp (); - green = imgsrc->getWB().getGreen (); + temp = imgsrc->getWB().getTemp(); + green = imgsrc->getWB().getGreen(); } } -void ImProcCoordinator::getSpotWB (int x, int y, int rect, double& temp, double& tgreen) +void ImProcCoordinator::getSpotWB(int x, int y, int rect, double& temp, double& tgreen) { ColorTemp ret; { - MyMutex::MyLock lock (mProcessing); + MyMutex::MyLock lock(mProcessing); std::vector points, red, green, blue; for (int i = y - rect; i <= y + rect; i++) for (int j = x - rect; j <= x + rect; j++) { - points.push_back (Coord2D (j, i)); + points.push_back(Coord2D(j, i)); } - ipf.transCoord (fw, fh, points, red, green, blue); + ipf.transCoord(fw, fh, points, red, green, blue); - int tr = getCoarseBitMask (params.coarse); + int tr = getCoarseBitMask(params->coarse); - ret = imgsrc->getSpotWB (red, green, blue, tr, params.wb.equal); - currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); + ret = imgsrc->getSpotWB(red, green, blue, tr, params->wb.equal); + currWB = ColorTemp(params->wb.temperature, params->wb.green, params->wb.equal, params->wb.method); //double rr,gg,bb; //currWB.getMultipliers(rr,gg,bb); } // end of mutex lockong if (ret.getTemp() > 0) { - temp = ret.getTemp (); - tgreen = ret.getGreen (); + temp = ret.getTemp(); + tgreen = ret.getGreen(); } else { - temp = currWB.getTemp (); - tgreen = currWB.getGreen (); + temp = currWB.getTemp(); + tgreen = currWB.getGreen(); } } -void ImProcCoordinator::getAutoCrop (double ratio, int &x, int &y, int &w, int &h) +void ImProcCoordinator::getAutoCrop(double ratio, int &x, int &y, int &w, int &h) { - MyMutex::MyLock lock (mProcessing); + MyMutex::MyLock lock(mProcessing); LensCorrection *pLCPMap = nullptr; - if (params.lensProf.useLcp() && imgsrc->getMetaData()->getFocalLen() > 0) { - const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile (params.lensProf.lcpFile); + if (params->lensProf.useLcp() && imgsrc->getMetaData()->getFocalLen() > 0) { + const std::shared_ptr pLCPProf = LCPStore::getInstance()->getProfile(params->lensProf.lcpFile); - if (pLCPProf) pLCPMap = new LCPMapper (pLCPProf, imgsrc->getMetaData()->getFocalLen(), imgsrc->getMetaData()->getFocalLen35mm(), imgsrc->getMetaData()->getFocusDist(), - 0, false, params.lensProf.useDist, fullw, fullh, params.coarse, imgsrc->getRotateDegree()); + if (pLCPProf) pLCPMap = new LCPMapper(pLCPProf, imgsrc->getMetaData()->getFocalLen(), imgsrc->getMetaData()->getFocalLen35mm(), imgsrc->getMetaData()->getFocusDist(), + 0, false, params->lensProf.useDist, fullw, fullh, params->coarse, imgsrc->getRotateDegree()); } - double fillscale = ipf.getTransformAutoFill (fullw, fullh, pLCPMap); + double fillscale = ipf.getTransformAutoFill(fullw, fullh, pLCPMap); if (ratio > 0) { w = fullw * fillscale; @@ -1186,64 +1312,70 @@ void ImProcCoordinator::getAutoCrop (double ratio, int &x, int &y, int &w, int & y = (fullh - h) / 2; } -void ImProcCoordinator::setMonitorProfile (const Glib::ustring& profile, RenderingIntent intent) +void ImProcCoordinator::setMonitorProfile(const Glib::ustring& profile, RenderingIntent intent) { monitorProfile = profile; monitorIntent = intent; } -void ImProcCoordinator::getMonitorProfile (Glib::ustring& profile, RenderingIntent& intent) const +void ImProcCoordinator::getMonitorProfile(Glib::ustring& profile, RenderingIntent& intent) const { profile = monitorProfile; intent = monitorIntent; } -void ImProcCoordinator::setSoftProofing (bool softProof, bool gamutCheck) +void ImProcCoordinator::setSoftProofing(bool softProof, bool gamutCheck) { this->softProof = softProof; this->gamutCheck = gamutCheck; } -void ImProcCoordinator::getSoftProofing (bool &softProof, bool &gamutCheck) +void ImProcCoordinator::getSoftProofing(bool &softProof, bool &gamutCheck) { softProof = this->softProof; gamutCheck = this->gamutCheck; } -void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname, bool apply_wb) +void ImProcCoordinator::setSharpMask (bool sharpMask) +{ + this->sharpMask = sharpMask; +} + +void ImProcCoordinator::saveInputICCReference(const Glib::ustring& fname, bool apply_wb) { - MyMutex::MyLock lock (mProcessing); + MyMutex::MyLock lock(mProcessing); int fW, fH; - int tr = getCoarseBitMask (params.coarse); + int tr = getCoarseBitMask(params->coarse); - imgsrc->getFullSize (fW, fH, tr); - PreviewProps pp (0, 0, fW, fH, 1); - ProcParams ppar = params; + imgsrc->getFullSize(fW, fH, tr); + PreviewProps pp(0, 0, fW, fH, 1); + ProcParams ppar = *params; ppar.toneCurve.hrenabled = false; - ppar.icm.input = "(none)"; - Imagefloat* im = new Imagefloat (fW, fH); - imgsrc->preprocess ( ppar.raw, ppar.lensProf, ppar.coarse ); - imgsrc->demosaic (ppar.raw ); - ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method); + ppar.icm.inputProfile = "(none)"; + Imagefloat* im = new Imagefloat(fW, fH); + imgsrc->preprocess(ppar.raw, ppar.lensProf, ppar.coarse); + double dummy = 0.0; + imgsrc->demosaic(ppar.raw, false, dummy); + ColorTemp currWB = ColorTemp(params->wb.temperature, params->wb.green, params->wb.equal, params->wb.method); - if (params.wb.method == "Camera") { - currWB = imgsrc->getWB (); - } else if (params.wb.method == "Auto") { - if (lastAwbEqual != params.wb.equal || lastAwbTempBias != params.wb.tempBias) { + if (params->wb.method == "Camera") { + currWB = imgsrc->getWB(); + } else if (params->wb.method == "Auto") { + if (lastAwbEqual != params->wb.equal || lastAwbTempBias != params->wb.tempBias) { double rm, gm, bm; - imgsrc->getAutoWBMultipliers (rm, gm, bm); + imgsrc->getAutoWBMultipliers(rm, gm, bm); if (rm != -1.) { - autoWB.update (rm, gm, bm, params.wb.equal, params.wb.tempBias); - lastAwbEqual = params.wb.equal; - lastAwbTempBias = params.wb.tempBias; + autoWB.update(rm, gm, bm, params->wb.equal, params->wb.tempBias); + lastAwbEqual = params->wb.equal; + lastAwbTempBias = params->wb.tempBias; } else { lastAwbEqual = -1.; lastAwbTempBias = 0.0; - autoWB.useDefaults (params.wb.equal); + autoWB.useDefaults(params->wb.equal); } } @@ -1254,30 +1386,32 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname, bool currWB = ColorTemp(); // = no white balance } - imgsrc->getImage (currWB, tr, im, pp, ppar.toneCurve, ppar.raw); - ImProcFunctions ipf (&ppar, true); + imgsrc->getImage(currWB, tr, im, pp, ppar.toneCurve, ppar.raw); + ImProcFunctions ipf(&ppar, true); if (ipf.needsTransform()) { - Imagefloat* trImg = new Imagefloat (fW, fH); - ipf.transform (im, trImg, 0, 0, 0, 0, fW, fH, fW, fH, - imgsrc->getMetaData(), imgsrc->getRotateDegree(), true); + Imagefloat* trImg = new Imagefloat(fW, fH); + ipf.transform(im, trImg, 0, 0, 0, 0, fW, fH, fW, fH, + imgsrc->getMetaData(), imgsrc->getRotateDegree(), true); delete im; im = trImg; } - if (params.crop.enabled) { - Imagefloat *tmpim = new Imagefloat (params.crop.w, params.crop.h); - int cx = params.crop.x; - int cy = params.crop.y; - int cw = params.crop.w; - int ch = params.crop.h; + if (params->crop.enabled) { + Imagefloat *tmpim = new Imagefloat(params->crop.w, params->crop.h); + int cx = params->crop.x; + int cy = params->crop.y; + int cw = params->crop.w; + int ch = params->crop.h; +#ifdef _OPENMP #pragma omp parallel for +#endif for (int i = cy; i < cy + ch; i++) { for (int j = cx; j < cx + cw; j++) { - tmpim->r (i - cy, j - cx) = im->r (i, j); - tmpim->g (i - cy, j - cx) = im->g (i, j); - tmpim->b (i - cy, j - cx) = im->b (i, j); + tmpim->r(i - cy, j - cx) = im->r(i, j); + tmpim->g(i - cy, j - cx) = im->g(i, j); + tmpim->b(i - cy, j - cx) = im->b(i, j); } } @@ -1286,130 +1420,191 @@ void ImProcCoordinator::saveInputICCReference (const Glib::ustring& fname, bool } // image may contain out of range samples, clip them to avoid wrap-arounds +#ifdef _OPENMP #pragma omp parallel for +#endif for (int i = 0; i < im->getHeight(); i++) { for (int j = 0; j < im->getWidth(); j++) { - im->r (i, j) = CLIP (im->r (i, j)); - im->g (i, j) = CLIP (im->g (i, j)); - im->b (i, j) = CLIP (im->b (i, j)); + im->r(i, j) = CLIP(im->r(i, j)); + im->g(i, j) = CLIP(im->g(i, j)); + im->b(i, j) = CLIP(im->b(i, j)); } } int imw, imh; - double tmpScale = ipf.resizeScale (¶ms, fW, fH, imw, imh); + double tmpScale = ipf.resizeScale(params.get(), fW, fH, imw, imh); if (tmpScale != 1.0) { - Imagefloat* tempImage = new Imagefloat (imw, imh); - ipf.resize (im, tempImage, tmpScale); + Imagefloat* tempImage = new Imagefloat(imw, imh); + ipf.resize(im, tempImage, tmpScale); delete im; im = tempImage; } - im->setMetadata (imgsrc->getMetaData()->getRootExifData ()); + im->setMetadata(imgsrc->getMetaData()->getRootExifData()); - im->saveTIFF (fname, 16, true); + im->saveTIFF(fname, 16, false, true); delete im; if (plistener) { - plistener->setProgressState (false); + plistener->setProgressState(false); } //im->saveJPEG (fname, 85); } -void ImProcCoordinator::stopProcessing () +void ImProcCoordinator::stopProcessing() { - updaterThreadStart.lock (); + updaterThreadStart.lock(); if (updaterRunning && thread) { changeSinceLast = 0; - thread->join (); + thread->join(); } - updaterThreadStart.unlock (); + updaterThreadStart.unlock(); } -void ImProcCoordinator::startProcessing () +void ImProcCoordinator::startProcessing() { #undef THREAD_PRIORITY_NORMAL if (!destroying) { if (!updaterRunning) { - updaterThreadStart.lock (); + updaterThreadStart.lock(); thread = nullptr; updaterRunning = true; - updaterThreadStart.unlock (); + updaterThreadStart.unlock(); //batchThread->yield(); //the running batch should wait other threads to avoid conflict - thread = Glib::Thread::create (sigc::mem_fun (*this, &ImProcCoordinator::process), 0, true, true, Glib::THREAD_PRIORITY_NORMAL); + thread = Glib::Thread::create(sigc::mem_fun(*this, &ImProcCoordinator::process), 0, true, true, Glib::THREAD_PRIORITY_NORMAL); } } } -void ImProcCoordinator::startProcessing (int changeCode) +void ImProcCoordinator::startProcessing(int changeCode) { paramsUpdateMutex.lock(); changeSinceLast |= changeCode; paramsUpdateMutex.unlock(); - startProcessing (); + startProcessing(); } -void ImProcCoordinator::process () +void ImProcCoordinator::process() { if (plistener) { - plistener->setProgressState (true); + plistener->setProgressState(true); } - paramsUpdateMutex.lock (); + paramsUpdateMutex.lock(); while (changeSinceLast) { - params = nextParams; + const bool panningRelatedChange = + params->toneCurve != nextParams->toneCurve + || params->labCurve != nextParams->labCurve + || params->localContrast != nextParams->localContrast + || params->rgbCurves != nextParams->rgbCurves + || params->colorToning != nextParams->colorToning + || params->vibrance != nextParams->vibrance + || params->wb != nextParams->wb + || params->colorappearance != nextParams->colorappearance + || params->epd != nextParams->epd + || params->fattal != nextParams->fattal + || params->sh != nextParams->sh + || params->crop != nextParams->crop + || params->coarse != nextParams->coarse + || params->commonTrans != nextParams->commonTrans + || params->rotate != nextParams->rotate + || params->distortion != nextParams->distortion + || params->lensProf != nextParams->lensProf + || params->perspective != nextParams->perspective + || params->gradient != nextParams->gradient + || params->pcvignette != nextParams->pcvignette + || params->cacorrection != nextParams->cacorrection + || params->vignetting != nextParams->vignetting + || params->chmixer != nextParams->chmixer + || params->blackwhite != nextParams->blackwhite + || params->icm != nextParams->icm + || params->hsvequalizer != nextParams->hsvequalizer + || params->filmSimulation != nextParams->filmSimulation + || params->softlight != nextParams->softlight + || params->raw != nextParams->raw + || params->retinex != nextParams->retinex + || params->wavelet != nextParams->wavelet + || params->dirpyrequalizer != nextParams->dirpyrequalizer + || params->dehaze != nextParams->dehaze; + + *params = *nextParams; int change = changeSinceLast; changeSinceLast = 0; - paramsUpdateMutex.unlock (); + paramsUpdateMutex.unlock(); // M_VOID means no update, and is a bit higher that the rest if (change & (M_VOID - 1)) { - updatePreviewImage (change); + updatePreviewImage(change, panningRelatedChange); } - paramsUpdateMutex.lock (); + paramsUpdateMutex.lock(); } - paramsUpdateMutex.unlock (); + paramsUpdateMutex.unlock(); updaterRunning = false; if (plistener) { - plistener->setProgressState (false); + plistener->setProgressState(false); } } -ProcParams* ImProcCoordinator::beginUpdateParams () +ProcParams* ImProcCoordinator::beginUpdateParams() { - paramsUpdateMutex.lock (); + paramsUpdateMutex.lock(); - return &nextParams; + return nextParams.get(); } -void ImProcCoordinator::endUpdateParams (ProcEvent change) +void ImProcCoordinator::endUpdateParams(ProcEvent change) { int action = RefreshMapper::getInstance()->getAction(change); endUpdateParams(action); } -void ImProcCoordinator::endUpdateParams (int changeFlags) +void ImProcCoordinator::endUpdateParams(int changeFlags) { changeSinceLast |= changeFlags; - paramsUpdateMutex.unlock (); - startProcessing (); + paramsUpdateMutex.unlock(); + 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 --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index 250e30c1c..0081b9e1e 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -19,6 +19,8 @@ #ifndef _IMPROCCOORDINATOR_H_ #define _IMPROCCOORDINATOR_H_ +#include + #include "rtengine.h" #include "improcfun.h" #include "image8.h" @@ -55,7 +57,7 @@ class ImProcCoordinator : public StagedImageProcessor protected: Imagefloat *orig_prev; Imagefloat *oprevi; - Imagefloat *spotprevi; + Imagefloat *spot_prev; LabImage *oprevl; LabImage *nprevl; Imagefloat *fattal_11_dcrop_cache; // global cache for ToneMapFattal02 used in 1:1 detail windows (except when denoise is active) @@ -65,21 +67,19 @@ protected: ImageSource* imgsrc; - SHMap* shmap; - ColorTemp currWB; ColorTemp autoWB; double lastAwbEqual; double lastAwbTempBias; - ImProcFunctions ipf; PreviewProps previewProps; Glib::ustring monitorProfile; RenderingIntent monitorIntent; bool softProof; bool gamutCheck; + bool sharpMask; int scale; bool highDetailPreprocessComputed; @@ -161,6 +161,9 @@ protected: AutoCamListener* acListener; AutoBWListener* abwListener; AutoWBListener* awbListener; + FlatFieldAutoClipListener *flatFieldAutoClipListener; + AutoContrastListener *bayerAutoContrastListener; + AutoContrastListener *xtransAutoContrastListener; FrameCountListener *frameCountListener; ImageTypeListener *imageTypeListener; @@ -182,10 +185,10 @@ protected: void reallocAll (); void updateLRGBHistograms (); void setScale (int prevscale); - void updatePreviewImage (int todo, Crop* cropCall = nullptr); + void updatePreviewImage (int todo, bool panningRelatedChange); MyMutex mProcessing; - ProcParams params; + const std::unique_ptr params; // for optimization purpose, the output profile, output rendering intent and // output BPC will trigger a regeneration of the profile on parameter change only @@ -200,7 +203,7 @@ protected: MyMutex paramsUpdateMutex; int changeSinceLast; bool updaterRunning; - ProcParams nextParams; + const std::unique_ptr nextParams; bool destroying; bool utili; bool autili; @@ -214,88 +217,91 @@ protected: void process (); float colourToningSatLimit; float colourToningSatLimitOpacity; + bool highQualityComputed; + cmsHTRANSFORM customTransformIn; + cmsHTRANSFORM customTransformOut; + + ImProcFunctions ipf; public: ImProcCoordinator (); - ~ImProcCoordinator (); + ~ImProcCoordinator () override; void assign (ImageSource* imgsrc); - void getParams (procparams::ProcParams* dst) - { - *dst = params; - } + void getParams (procparams::ProcParams* dst) override; - void startProcessing (int changeCode); - ProcParams* beginUpdateParams (); - void endUpdateParams (ProcEvent change); // must be called after beginUpdateParams, triggers update - void endUpdateParams (int changeFlags); - void stopProcessing (); + void startProcessing (int changeCode) override; + ProcParams* beginUpdateParams () override; + void endUpdateParams (ProcEvent change) override; // must be called after beginUpdateParams, triggers update + void endUpdateParams (int changeFlags) override; + void stopProcessing () override; - void setPreviewScale (int scale) + void setPreviewScale (int scale) override { setScale (scale); } - int getPreviewScale () + int getPreviewScale () override { return scale; } //void fullUpdatePreviewImage (); - int getFullWidth () + int getFullWidth () override { return fullw; } - int getFullHeight () + int getFullHeight () override { return fullh; } - int getPreviewWidth () + int getPreviewWidth () override { return pW; } - int getPreviewHeight () + int getPreviewHeight () override { return pH; } - DetailedCrop* createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow); + DetailedCrop* createCrop (::EditDataProvider *editDataProvider, bool isDetailWindow) override; - bool getAutoWB (double& temp, double& green, double equal, double tempBias); - 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); - - void setMonitorProfile (const Glib::ustring& profile, RenderingIntent intent); - void getMonitorProfile (Glib::ustring& profile, RenderingIntent& intent) const; - void setSoftProofing (bool softProof, bool gamutCheck); - void getSoftProofing (bool &softProof, bool &gamutCheck); - - bool updateTryLock () + bool getAutoWB (double& temp, double& green, double equal, double tempBias) override; + void getCamWB (double& temp, double& green) override; + void getSpotWB (int x, int y, int rectSize, double& temp, double& green) override; + void getAutoCrop (double ratio, int &x, int &y, int &w, int &h) override; + bool getHighQualComputed() override; + void setHighQualComputed() override; + void setMonitorProfile (const Glib::ustring& profile, RenderingIntent intent) override; + void getMonitorProfile (Glib::ustring& profile, RenderingIntent& intent) const override; + void setSoftProofing (bool softProof, bool gamutCheck) override; + void getSoftProofing (bool &softProof, bool &gamutCheck) override; + void setSharpMask (bool sharpMask) override; + bool updateTryLock () override { return updaterThreadStart.trylock(); } - void updateUnLock () + void updateUnLock () override { updaterThreadStart.unlock(); } - void setProgressListener (ProgressListener* pl) + void setProgressListener (ProgressListener* pl) override { plistener = pl; } - void setPreviewImageListener (PreviewImageListener* il) + void setPreviewImageListener (PreviewImageListener* il) override { imageListener = il; } - void setSizeListener (SizeListener* il) + void setSizeListener (SizeListener* il) override { sizeListeners.push_back (il); } - void delSizeListener (SizeListener* il) + void delSizeListener (SizeListener* il) override { std::vector::iterator it = std::find (sizeListeners.begin(), sizeListeners.end(), il); @@ -303,60 +309,84 @@ public: sizeListeners.erase (it); } } - void setAutoExpListener (AutoExpListener* ael) + void setAutoExpListener (AutoExpListener* ael) override { aeListener = ael; } - void setHistogramListener (HistogramListener *h) + void setHistogramListener (HistogramListener *h) override { hListener = h; } - void setAutoCamListener (AutoCamListener* acl) + void setAutoCamListener (AutoCamListener* acl) override { acListener = acl; } - void setAutoBWListener (AutoBWListener* abw) + void setAutoBWListener (AutoBWListener* abw) override { abwListener = abw; } - void setAutoWBListener (AutoWBListener* awb) + void setAutoWBListener (AutoWBListener* awb) override { awbListener = awb; } - void setAutoColorTonListener (AutoColorTonListener* bwct) + void setAutoColorTonListener (AutoColorTonListener* bwct) override { actListener = bwct; } - void setAutoChromaListener (AutoChromaListener* adn) + void setAutoChromaListener (AutoChromaListener* adn) override { adnListener = adn; } - void setRetinexListener (RetinexListener* adh) + void setRetinexListener (RetinexListener* adh) override { dehaListener = adh; } - void setWaveletListener (WaveletListener* awa) + void setWaveletListener (WaveletListener* awa) override { awavListener = awa; } - void setFrameCountListener (FrameCountListener* fcl) + void setFrameCountListener (FrameCountListener* fcl) override { frameCountListener = fcl; } - void setImageTypeListener (ImageTypeListener* itl) + void setFlatFieldAutoClipListener (FlatFieldAutoClipListener* ffacl) override + { + flatFieldAutoClipListener = ffacl; + } + void setBayerAutoContrastListener (AutoContrastListener* acl) override + { + bayerAutoContrastListener = acl; + } + + void setXtransAutoContrastListener (AutoContrastListener* acl) override + { + xtransAutoContrastListener = acl; + } + + void setImageTypeListener (ImageTypeListener* itl) override { imageTypeListener = itl; } - void saveInputICCReference (const Glib::ustring& fname, bool apply_wb); + void saveInputICCReference (const Glib::ustring& fname, bool apply_wb) override; - InitialImage* getInitialImage () + InitialImage* getInitialImage () override { return imgsrc; } + cmsHTRANSFORM& getCustomTransformIn () + { + return customTransformIn; + } + + cmsHTRANSFORM& getCustomTransformOut () + { + return customTransformOut; + } + struct DenoiseInfoStore { DenoiseInfoStore () : chM (0), max_r{}, max_b{}, ch_M{}, valid (false) {} float chM; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index d0c78f906..4e2523137 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -41,6 +41,7 @@ #include "clutstore.h" #include "ciecam02.h" #include "StopWatch.h" +#include "procparams.h" #include "../rtgui/ppversion.h" #include "../rtgui/guiutils.h" @@ -50,8 +51,11 @@ 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) { +void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) +{ #if defined( __SSE2__ ) && defined( __x86_64__ ) vfloat cr = F2V(0.299f); @@ -62,7 +66,8 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; #if defined( __SSE2__ ) && defined( __x86_64__ ) - for (; j < tW - 3; j+=4, tj+=4) { + + for (; j < tW - 3; j += 4, tj += 4) { vfloat rv = LVF(rtemp[ti * tileSize + tj]); vfloat gv = LVF(gtemp[ti * tileSize + tj]); @@ -75,7 +80,9 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float 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]; @@ -92,7 +99,8 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float } } -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) { +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) +{ #if defined( __SSE2__ ) && defined( __x86_64__ ) vfloat threev = F2V(3.f); @@ -102,7 +110,8 @@ void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, flo for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; #if defined( __SSE2__ ) && defined( __x86_64__ ) - for (; j < tW - 3; j+=4, tj+=4) { + + for (; j < tW - 3; j += 4, tj += 4) { vfloat rv = LVF(rtemp[ti * tileSize + tj]); vfloat gv = LVF(gtemp[ti * tileSize + tj]); @@ -111,14 +120,15 @@ void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, flo //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)) { + + 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; + 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; @@ -133,7 +143,9 @@ void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, flo STVF(btemp[ti * tileSize + tj], bv * tonefactorv); } } + #endif + for (; j < tW; j++, tj++) { float r = rtemp[ti * tileSize + tj]; @@ -142,9 +154,9 @@ void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, flo //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; + 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; @@ -158,7 +170,7 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, // 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; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#ifdef __SSE2__ for (; j < tW - 3; j+=4, tj+=4) { vfloat rv = LVF(rtemp[ti * tileSize + tj]); vfloat gv = LVF(gtemp[ti * tileSize + tj]); @@ -167,8 +179,9 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, 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 b = btemp[ti * tileSize + tj + k]; + + if ((r == 0.0f || g == 0.0f) && rtengine::min(r, g, b) >= 0.f) { float h, s, v; Color::rgb2hsv (r, g, b, h, s, v); s *= 0.99f; @@ -181,9 +194,9 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, for (; j < tW; j++, tj++) { float r = rtemp[ti * tileSize + tj]; float g = gtemp[ti * tileSize + tj]; + float b = btemp[ti * tileSize + tj]; - if (r == 0.0f || g == 0.0f) { - float b = btemp[ti * tileSize + tj]; + if ((r == 0.0f || g == 0.0f) && rtengine::min(r, g, b) >= 0.f) { float h, s, v; Color::rgb2hsv (r, g, b, h, s, v); s *= 0.99f; @@ -193,44 +206,39 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, } } -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) { +void customToneCurve(const ToneCurve &customToneCurve, ToneCurveMode 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 + if (curveMode == ToneCurveMode::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 + } else if (curveMode == ToneCurveMode::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]); - } + userToneCurve.BatchApply(0, tW - jstart, &rtemp[ti * tileSize], >emp[ti * tileSize], &btemp[ti * tileSize]); } - } else if (curveMode == ToneCurveParams::TcMode::SATANDVALBLENDING) { // apply the curve on the saturation and value channels + } else if (curveMode == ToneCurveMode::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 + } else if (curveMode == ToneCurveMode::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 + } else if (curveMode == ToneCurveMode::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 + } else if (curveMode == ToneCurveMode::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); @@ -260,7 +268,6 @@ extern const Settings* settings; ImProcFunctions::~ImProcFunctions () { - if (monitorTransform) { cmsDeleteTransform (monitorTransform); } @@ -271,12 +278,14 @@ void ImProcFunctions::setScale (double iscale) scale = iscale; } + void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck) { // set up monitor transform if (monitorTransform) { cmsDeleteTransform (monitorTransform); } + gamutWarning.reset(nullptr); monitorTransform = nullptr; @@ -286,7 +295,7 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, #if !defined(__APPLE__) // No support for monitor profiles on OS X, all data is sRGB monitor = ICCStore::getInstance()->getProfile (monitorProfile); #else - monitor = ICCStore::getInstance()->getProfile ("RT_sRGB"); + monitor = ICCStore::getInstance()->getProfile (options.rtSettings.srgb); #endif } @@ -295,40 +304,100 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, cmsUInt32Number flags; cmsHPROFILE iprof = cmsCreateLab4Profile (nullptr); + cmsHPROFILE gamutprof = nullptr; + cmsUInt32Number gamutbpc = 0; + RenderingIntent gamutintent = RI_RELATIVE; bool softProofCreated = false; 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 = RenderingIntent(settings->printerIntent); + } else { + oprof = ICCStore::getInstance()->getProfile(params->icm.outputProfile); + 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; + // } - if (gamutCheck) { - flags |= cmsFLAGS_GAMUTCHECK; + const auto make_gamma_table = + [](cmsHPROFILE prof, cmsTagSignature tag) -> void + { + cmsToneCurve *tc = static_cast(cmsReadTag(prof, tag)); + if (tc) { + const cmsUInt16Number *table = cmsGetToneCurveEstimatedTable(tc); + cmsToneCurve *tc16 = cmsBuildTabulatedToneCurve16(nullptr, cmsGetToneCurveEstimatedTableEntries(tc), table); + if (tc16) { + cmsWriteTag(prof, tag, tc16); + cmsFreeToneCurve(tc16); + } + } + }; + + cmsHPROFILE softproof = ProfileContent(oprof).toProfile(); + if (softproof) { + make_gamma_table(softproof, cmsSigRedTRCTag); + make_gamma_table(softproof, cmsSigGreenTRCTag); + make_gamma_table(softproof, cmsSigBlueTRCTag); } monitorTransform = cmsCreateProofingTransform ( iprof, TYPE_Lab_FLT, - monitor, TYPE_RGB_8, - oprof, - monitorIntent, settings->printerIntent, + monitor, TYPE_RGB_FLT, + softproof, //oprof, + monitorIntent, outIntent, flags ); + if (softproof) { + cmsCloseProfile(softproof); + } + if (monitorTransform) { softProofCreated = true; } + + if (gamutCheck) { + gamutprof = oprof; + if (params->icm.outputBPC) { + gamutbpc = cmsFLAGS_BLACKPOINTCOMPENSATION; + } + gamutintent = outIntent; + } } + } 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; + // } + gamutprof = monitor; + if (settings->monitorBPC) { + gamutbpc = cmsFLAGS_BLACKPOINTCOMPENSATION; + } + gamutintent = monitorIntent; } if (!softProofCreated) { @@ -338,7 +407,11 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } - monitorTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, monitor, TYPE_RGB_8, monitorIntent, flags); + monitorTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, monitor, TYPE_RGB_FLT, monitorIntent, flags); + } + + if (gamutCheck && gamutprof) { + gamutWarning.reset(new GamutWarning(iprof, gamutprof, gamutintent, gamutbpc)); } cmsCloseProfile (iprof); @@ -348,7 +421,7 @@ void ImProcFunctions::updateColorProfiles (const Glib::ustring& monitorProfile, void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const ProcParams ¶ms, LUTu & histogram) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); lumimul[0] = wprof[1][0]; lumimul[1] = wprof[1][1]; @@ -410,1311 +483,11 @@ void ImProcFunctions::firstAnalysis (const Imagefloat* const original, const Pro } } -// Copyright (c) 2012 Jacques Desmis -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, int rtt) -{ - if (params->colorappearance.enabled) { -//int lastskip; -//if(rtt==1) {lastskip=scale;} //not for Rtthumbnail - -#ifdef _DEBUG - MyTime t1e, t2e; - t1e.set(); -#endif - LUTf dLcurve; - LUTu hist16JCAM; - bool jp = false; - - //preparate for histograms CIECAM - if (pW != 1) { //only with improccoordinator - dLcurve (65536, 0); - dLcurve.clear(); - hist16JCAM (65536, 0); - hist16JCAM.clear(); - - for (int i = 0; i < 32768; i++) { //# 32768*1.414 approximation maxi for chroma - float val = (double)i / 32767.0; - dLcurve[i] = CLIPD (val); - } - } - - LUTf dCcurve; - LUTu hist16_CCAM; - bool chropC = false; - - if (pW != 1) { //only with improccoordinator - dCcurve (65536, 0); - hist16_CCAM (65536); - hist16_CCAM.clear(); - - for (int i = 0; i < 48000; i++) { //# 32768*1.414 approximation maxi for chroma - float valc = (double)i / 47999.0; - dCcurve[i] = CLIPD (valc); - } - } - - //end preparate histogram - int width = lab->W, height = lab->H; - float minQ = 10000.f; - float maxQ = -1000.f; - float a_w; - float c_; - float f_l; - double Yw; - Yw = 1.0; - double Xw, Zw; - double Xwout, Zwout; - double Xwsc, Zwsc; - - double f = 0., c = 0., nc = 0., yb = 0., la, xw, yw, zw, f2 = 0., c2 = 0., nc2 = 0., yb2 = 0., la2; - double fl, n, nbb, ncb, aw; - double xwd = 0., ywd, zwd = 0.; - double xws, yws, zws; - int alg = 0; - bool algepd = false; - float sum = 0.f; - - bool ciedata = params->colorappearance.datacie; - - 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") { - f = 1.00; - c = 0.69; - nc = 1.00; - } else if (params->colorappearance.surrsrc == "Dim") { - f = 0.9; - c = 0.59; - nc = 0.9; - } else if (params->colorappearance.surrsrc == "Dark") { - f = 0.8; - c = 0.525; - nc = 0.8; - } else if (params->colorappearance.surrsrc == "ExtremelyDark") { - f = 0.8; - c = 0.41; - nc = 0.8; - } - - - //viewing condition for surround - if (params->colorappearance.surround == "Average") { - f2 = 1.0, c2 = 0.69, nc2 = 1.0; - } else if (params->colorappearance.surround == "Dim") { - f2 = 0.9; - c2 = 0.59; - nc2 = 0.9; - } else if (params->colorappearance.surround == "Dark") { - f2 = 0.8; - c2 = 0.525; - nc2 = 0.8; - } else if (params->colorappearance.surround == "ExtremelyDark") { - f2 = 0.8; - c2 = 0.41; - nc2 = 0.8; - } - - /* - //scene condition for surround - if (params->colorappearance.surrsource) { - f = 0.85; // if user => source image has surround very dark - c = 0.55; - nc = 0.85; - } - */ - //with which algorithme - if (params->colorappearance.algo == "JC") { - alg = 0; - } else if (params->colorappearance.algo == "JS") { - alg = 1; - } else if (params->colorappearance.algo == "QM") { - alg = 2; - algepd = true; - } else if (params->colorappearance.algo == "ALL") { - alg = 3; - algepd = true; - } - - bool needJ = (alg == 0 || alg == 1 || alg == 3); - bool needQ = (alg == 2 || alg == 3); - /* - //settings white point of output device - or illuminant viewing - if (settings->viewingdevice == 0) { - xwd = 96.42; //5000K - ywd = 100.0; - zwd = 82.52; - } else if (settings->viewingdevice == 1) { - xwd = 95.68; //5500 - ywd = 100.0; - zwd = 92.15; - } else if (settings->viewingdevice == 2) { - xwd = 95.24; //6000 - ywd = 100.0; - zwd = 100.81; - } else if (settings->viewingdevice == 3) { - xwd = 95.04; //6500 - ywd = 100.0; - zwd = 108.88; - } else if (settings->viewingdevice == 4) { - xwd = 109.85; //tungsten - ywd = 100.0; - zwd = 35.58; - } else if (settings->viewingdevice == 5) { - xwd = 99.18; //fluo F2 - ywd = 100.0; - zwd = 67.39; - } else if (settings->viewingdevice == 6) { - xwd = 95.04; //fluo F7 - ywd = 100.0; - zwd = 108.75; - } else if (settings->viewingdevice == 7) { - xwd = 100.96; //fluo F11 - ywd = 100.0; - zwd = 64.35; - } - */ - - xwd = 100. * Xwout; - zwd = 100. * Zwout; - ywd = 100. / params->colorappearance.greenout;//approximation to simplify - - xws = 100. * Xwsc; - zws = 100. * Zwsc; - yws = 100. / params->colorappearance.greensc;//approximation to simplify - - /* - //settings mean Luminance Y of output device or viewing - if (settings->viewingdevicegrey == 0) { - yb2 = 5.0; - } else if (settings->viewingdevicegrey == 1) { - yb2 = 10.0; - } else if (settings->viewingdevicegrey == 2) { - yb2 = 15.0; - } else if (settings->viewingdevicegrey == 3) { - yb2 = 18.0; - } else if (settings->viewingdevicegrey == 4) { - yb2 = 23.0; - } else if (settings->viewingdevicegrey == 5) { - yb2 = 30.0; - } else if (settings->viewingdevicegrey == 6) { - yb2 = 40.0; - } - */ - yb2 = params->colorappearance.ybout; - - //La and la2 = ambiant luminosity scene and viewing - la = double (params->colorappearance.adapscen); - - if (pwb == 2) { - if (params->colorappearance.autoadapscen) { - la = adap; - } - } - - la2 = double (params->colorappearance.adaplum); - - // level of adaptation - double deg = (params->colorappearance.degree) / 100.0; - double pilot = params->colorappearance.autodegree ? 2.0 : deg; - - - const float degout = (params->colorappearance.degreeout) / 100.0; - const float pilotout = params->colorappearance.autodegreeout ? 2.0 : degout; - - //algoritm's params - float jli = params->colorappearance.jlight; - float chr = params->colorappearance.chroma; - float contra = params->colorappearance.contrast; - float qbri = params->colorappearance.qbright; - float schr = params->colorappearance.schroma; - float mchr = params->colorappearance.mchroma; - float qcontra = params->colorappearance.qcontrast; - float hue = params->colorappearance.colorh; - double rstprotection = 100. - params->colorappearance.rstprotection; - - if (schr > 0.0) { - schr = schr / 2.0f; //divide sensibility for saturation - } - - // extracting datas from 'params' to avoid cache flush (to be confirmed) - ColorAppearanceParams::TcMode curveMode = params->colorappearance.curveMode; - ColorAppearanceParams::TcMode curveMode2 = params->colorappearance.curveMode2; - bool hasColCurve1 = bool (customColCurve1); - bool hasColCurve2 = bool (customColCurve2); - ColorAppearanceParams::CtcMode curveMode3 = params->colorappearance.curveMode3; - bool hasColCurve3 = bool (customColCurve3); - - - if (CAMBrightCurveJ.dirty || CAMBrightCurveQ.dirty) { - LUTu hist16J; - LUTu hist16Q; - - if (needJ) { - hist16J (65536); - hist16J.clear(); - } - - if (needQ) { - hist16Q (65536); - hist16Q.clear(); - } - - float koef = 1.0f; //rough correspondence between L and J - - for (int i = 0; i < height; i++) - - // for (int i=begh; iL[i][j] / 327.68f; - - if (currL > 95.) { - koef = 1.f; - } else if (currL > 85.) { - koef = 0.97f; - } else if (currL > 80.) { - koef = 0.93f; - } else if (currL > 70.) { - koef = 0.87f; - } else if (currL > 60.) { - koef = 0.85f; - } else if (currL > 50.) { - koef = 0.8f; - } else if (currL > 40.) { - koef = 0.75f; - } else if (currL > 30.) { - koef = 0.7f; - } else if (currL > 20.) { - koef = 0.7f; - } else if (currL > 10.) { - koef = 0.9f; - } else if (currL > 0.) { - koef = 1.0f; - } - - if (needJ) { - hist16J[CLIP ((int) ((koef * lab->L[i][j])))]++; //evaluate histogram luminance L # J - } - - if (needQ) { - 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 - } - - //mean=(sum/((endh-begh)*width))/327.68f;//for Yb for all image...if one day "pipette" we can adapt Yb for each zone - mean = (sum / ((height) * width)) / 327.68f; //for Yb for all image...if one day "pipette" we can adapt Yb for each zone - - //evaluate lightness, contrast - if (needJ) { - if (!CAMBrightCurveJ) { - CAMBrightCurveJ (65536, 0); - CAMBrightCurveJ.dirty = false; - } - - Ciecam02::curveJ (jli, contra, 1, CAMBrightCurveJ, hist16J);//lightness and contrast J - } - - if (needQ) { - if (!CAMBrightCurveQ) { - CAMBrightCurveQ (65536, 0); - CAMBrightCurveQ.dirty = false; - } - - Ciecam02::curveJ (qbri, qcontra, 1, CAMBrightCurveQ, hist16Q);//brightness and contrast Q - } - } - - // if (settings->viewinggreySc == 0) { //auto - if (params->colorappearance.autoybscen && pwb == 2) {//auto - - if (mean < 15.f) { - yb = 3.0; - } else if (mean < 30.f) { - yb = 5.0; - } else if (mean < 40.f) { - yb = 10.0; - } else if (mean < 45.f) { - yb = 15.0; - } else if (mean < 50.f) { - yb = 18.0; - } else if (mean < 55.f) { - yb = 23.0; - } else if (mean < 60.f) { - yb = 30.0; - } else if (mean < 70.f) { - yb = 40.0; - } else if (mean < 80.f) { - yb = 60.0; - } else if (mean < 90.f) { - yb = 80.0; - } else { - yb = 90.0; - } - } else { - yb = params->colorappearance.ybscen; - } - - if (settings->viewinggreySc == 1) { - yb = 18.0; - } - - int gamu = 0; - bool highlight = params->toneCurve.hrenabled; //Get the value if "highlight reconstruction" is activated - - if (params->colorappearance.gamut) { - gamu = 1; //enabled gamut control - } - - xw = 100.0 * Xw; - yw = 100.0 * Yw; - zw = 100.0 * Zw; - double xw1 = 0., yw1 = 0., zw1 = 0., xw2 = 0., yw2 = 0., zw2 = 0.; - - // settings of WB: scene and viewing - if (params->colorappearance.wbmodel == "RawT") { - xw1 = 96.46; //use RT WB; CAT 02 is used for output device (see prefreneces) - yw1 = 100.0; - zw1 = 82.445; - xw2 = xwd; - yw2 = ywd; - zw2 = zwd; - } else if (params->colorappearance.wbmodel == "RawTCAT02") { - xw1 = xw; // Settings RT WB are used for CAT02 => mix , CAT02 is use for output device (screen: D50 D65, projector: lamp, LED) see preferences - yw1 = yw; - zw1 = zw; - xw2 = xwd; - yw2 = ywd; - zw2 = zwd; - } else if (params->colorappearance.wbmodel == "free") { - xw1 = xws; // free temp and green - yw1 = yws; - zw1 = zws; - xw2 = xwd; - yw2 = ywd; - zw2 = zwd; - } - - double cz, wh, pfl; - Ciecam02::initcam1 (gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); - double nj, nbbj, ncbj, czj, awj, flj; - Ciecam02::initcam2 (gamu, yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); - - - - -#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,nc2,f2,c2, alg,algepd, gamu, highlight, rstprotection, pW, scale) -#endif - { - //matrix for current working space - 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]} - }; - -#ifndef _DEBUG - #pragma omp for schedule(dynamic, 10) -#endif - - for (int i = 0; i < height; i++) - -// for (int i=begh; iL[i][j]; - float a = lab->a[i][j]; - float b = lab->b[i][j]; - float x1, y1, z1; - double x, y, z; - double epsil = 0.0001; - //convert Lab => XYZ - Color::Lab2XYZ (L, a, b, x1, y1, z1); - // double J, C, h, Q, M, s, aw, fl, wh; - double J, C, h, Q, M, s; - - double Jpro, Cpro, hpro, Qpro, Mpro, spro; - bool t1L = false; - bool t1B = false; - bool t2B = false; - int c1s = 0; - int c1co = 0; - //double n,nbb,ncb,pfl,cz,d; - x = (double)x1 / 655.35; - y = (double)y1 / 655.35; - z = (double)z1 / 655.35; - //process source==> normal - Ciecam02::xyz2jchqms_ciecam02 ( J, C, h, - Q, M, s, aw, fl, wh, - x, y, z, - xw1, yw1, zw1, - c, nc, gamu, n, nbb, ncb, pfl, cz, d ); - Jpro = J; - Cpro = C; - hpro = h; - Qpro = Q; - Mpro = M; - spro = s; - a_w = aw; - c_ = c; - f_l = fl; - - // we cannot have all algoritms with all chroma curves - if (alg == 1) { - // Lightness saturation - if (Jpro > 99.9f) { - Jpro = 99.9f; - } - - Jpro = (CAMBrightCurveJ[ (float) (Jpro * 327.68)]) / 327.68; //ligthness CIECAM02 + contrast - double sres; - double Sp = spro / 100.0; - double parsat = 1.5; //parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation) - - if (schr == -100.0) { - schr = -99.8; - } - - Ciecam02::curvecolor (schr, Sp, sres, parsat); - double coe = pow (fl, 0.25); - float dred = 100.f; // in C mode - float protect_red = 80.0f; // in C mode - dred = 100.0 * sqrt ((dred * coe) / Qpro); - protect_red = 100.0 * sqrt ((protect_red * coe) / Qpro); - int sk = 0; - float ko = 100.f; - Color::skinred (Jpro, hpro, sres, Sp, dred, protect_red, sk, rstprotection, ko, spro); - Qpro = ( 4.0 / c ) * sqrt ( Jpro / 100.0 ) * ( aw + 4.0 ) ; - Cpro = (spro * spro * Qpro) / (10000.0); - } else if (alg == 3 || alg == 0 || alg == 2) { - double coef = 32760. / wh; - - if (alg == 3 || alg == 2) { - if (Qpro * coef > 32767.0f) { - Qpro = (CAMBrightCurveQ[ (float)32767.0f]) / coef; //brightness and contrast - } else { - Qpro = (CAMBrightCurveQ[ (float) (Qpro * coef)]) / coef; //brightness and contrast - } - } - - double Mp, sres; - double coe = pow (fl, 0.25); - Mp = Mpro / 100.0; - double parsat = 2.5; - - if (mchr == -100.0) { - mchr = -99.8 ; - } - - if (mchr == 100.0) { - mchr = 99.9; - } - - if (alg == 3 || alg == 2) { - Ciecam02::curvecolor (mchr, Mp, sres, parsat); - } else { - Ciecam02::curvecolor (0.0, Mp, sres, parsat); //colorfullness - } - - float dred = 100.f; //in C mode - float protect_red = 80.0f; // in C mode - dred *= coe; //in M mode - protect_red *= coe; //M mode - int sk = 0; - float ko = 100.f; - Color::skinred (Jpro, hpro, sres, Mp, dred, protect_red, sk, rstprotection, ko, Mpro); - Jpro = (100.0 * Qpro * Qpro) / (wh * wh); - Cpro = Mpro / coe; - spro = 100.0 * sqrt ( Mpro / Qpro ); - - if (alg != 2) { - if (Jpro > 99.9f) { - Jpro = 99.9f; - } - - Jpro = (CAMBrightCurveJ[ (float) (Jpro * 327.68f)]) / 327.68f; //ligthness CIECAM02 + contrast - } - - double Cp; - double Sp = spro / 100.0; - parsat = 1.5; - - if (schr == -100.0) { - schr = -99.; - } - - if (schr == 100.0) { - schr = 98.; - } - - if (alg == 3) { - Ciecam02::curvecolor (schr, Sp, sres, parsat); - } else { - Ciecam02::curvecolor (0.0, Sp, sres, parsat); //saturation - } - - dred = 100.f; // in C mode - protect_red = 80.0f; // in C mode - dred = 100.0 * sqrt ((dred * coe) / Q); - protect_red = 100.0 * sqrt ((protect_red * coe) / Q); - sk = 0; - Color::skinred (Jpro, hpro, sres, Sp, dred, protect_red, sk, rstprotection, ko, spro); - //double Q1; - Qpro = ( 4.0 / c ) * sqrt ( Jpro / 100.0 ) * ( aw + 4.0 ) ; - Cpro = (spro * spro * Qpro) / (10000.0); - Cp = Cpro / 100.0; - parsat = 1.8; //parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation : for not) - - if (chr == -100.0) { - chr = -99.8; - } - - if (alg != 2) { - Ciecam02::curvecolor (chr, Cp, sres, parsat); - } else { - Ciecam02::curvecolor (0.0, Cp, sres, parsat); //chroma - } - - dred = 55.f; - protect_red = 30.0f; - sk = 1; - Color::skinred (Jpro, hpro, sres, Cp, dred, protect_red, sk, rstprotection, ko, Cpro); - - if (Jpro < 1. && Cpro > 12.) { - Cpro = 12.; //reduce artifacts by "pseudo gamut control CIECAM" - } else if (Jpro < 2. && Cpro > 15.) { - Cpro = 15.; - } else if (Jpro < 4. && Cpro > 30.) { - Cpro = 30.; - } else if (Jpro < 7. && Cpro > 50.) { - Cpro = 50.; - } - - hpro = hpro + hue; - - if ( hpro < 0.0 ) { - hpro += 360.0; //hue - } - } - - if (hasColCurve1) {//curve 1 with Lightness and Brightness - if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { - /* float Jj=(float) Jpro*327.68; - float Jold=Jj; - const Lightcurve& userColCurve = static_cast(customColCurve1); - userColCurve.Apply(Jj); - Jj=0.7f*(Jj-Jold)+Jold;//divide sensibility - */ - float Jj = (float) Jpro * 327.68f; - float Jold = Jj; - float Jold100 = (float) Jpro; - float redu = 25.f; - float reduc = 1.f; - const Lightcurve& userColCurveJ1 = static_cast (customColCurve1); - userColCurveJ1.Apply (Jj); - - if (Jj > Jold) { - if (Jj < 65535.f) { - if (Jold < 327.68f * redu) { - Jj = 0.3f * (Jj - Jold) + Jold; //divide sensibility - } else { - reduc = LIM ((100.f - Jold100) / (100.f - redu), 0.f, 1.f); - Jj = 0.3f * reduc * (Jj - Jold) + Jold; //reduct sensibility in highlights - } - } - } else if (Jj > 10.f) { - Jj = 0.8f * (Jj - Jold) + Jold; - } else if (Jj >= 0.f) { - Jj = 0.90f * (Jj - Jold) + Jold; // not zero ==>artifacts - } - - - Jpro = (double) (Jj / 327.68f); - - if (Jpro < 1.) { - Jpro = 1.; - } - - t1L = true; - } else if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { - //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algoritms 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); - float Qold100 = (float) Qpro / coef; - - float Qold = Qq; - float redu = 20.f; - float reduc = 1.f; - - const Brightcurve& userColCurveB1 = static_cast (customColCurve1); - userColCurveB1.Apply (Qq); - - if (Qq > Qold) { - if (Qq < 65535.f) { - if (Qold < 327.68f * redu) { - Qq = 0.25f * (Qq - Qold) + Qold; //divide sensibility - } else { - reduc = LIM ((100.f - Qold100) / (100.f - redu), 0.f, 1.f); - Qq = 0.25f * reduc * (Qq - Qold) + Qold; //reduct sensibility in highlights - } - } - } else if (Qq > 10.f) { - Qq = 0.5f * (Qq - Qold) + Qold; - } else if (Qq >= 0.f) { - Qq = 0.7f * (Qq - Qold) + Qold; // not zero ==>artifacts - } - - if (Qold == 0.f) { - Qold = 0.001f; - } - - Qpro = Qanc * (Qq / Qold); - Jpro = Jpro * SQR (Qq / Qold); - -// Qpro = (double) (Qq * (coef) / 327.68f); -// Jpro = 100.* (Qpro * Qpro) / ((4.0 / c) * (4.0 / c) * (aw + 4.0) * (aw + 4.0)); - t1B = true; - - if (Jpro < 1.) { - Jpro = 1.; - } - - } - } - - if (hasColCurve2) {//curve 2 with Lightness and Brightness - if (curveMode2 == ColorAppearanceParams::TcMode::LIGHT) { - float Jj = (float) Jpro * 327.68; - float Jold = Jj; - /* - const Lightcurve& userColCurve = static_cast(customColCurve2); - userColCurve.Apply(Jj); - Jj=0.7f*(Jj-Jold)+Jold;//divide sensibility - */ - float Jold100 = (float) Jpro; - float redu = 25.f; - float reduc = 1.f; - const Lightcurve& userColCurveJ2 = static_cast (customColCurve2); - userColCurveJ2.Apply (Jj); - - if (Jj > Jold) { - if (Jj < 65535.f) { - if (Jold < 327.68f * redu) { - Jj = 0.3f * (Jj - Jold) + Jold; //divide sensibility - } else { - reduc = LIM ((100.f - Jold100) / (100.f - redu), 0.f, 1.f); - Jj = 0.3f * reduc * (Jj - Jold) + Jold; //reduct sensibility in highlights - } - } - } else if (Jj > 10.f) { - if (!t1L) { - Jj = 0.8f * (Jj - Jold) + Jold; - } else { - Jj = 0.4f * (Jj - Jold) + Jold; - } - } else if (Jj >= 0.f) { - if (!t1L) { - Jj = 0.90f * (Jj - Jold) + Jold; // not zero ==>artifacts - } else { - Jj = 0.5f * (Jj - Jold) + Jold; - } - } - - Jpro = (double) (Jj / 327.68f); - - if (Jpro < 1.) { - Jpro = 1.; - } - - } 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); - float Qold100 = (float) Qpro / coef; - - float Qold = Qq; - float redu = 20.f; - float reduc = 1.f; - - const Brightcurve& userColCurveB2 = static_cast (customColCurve2); - userColCurveB2.Apply (Qq); - - if (Qq > Qold) { - if (Qq < 65535.f) { - if (Qold < 327.68f * redu) { - Qq = 0.25f * (Qq - Qold) + Qold; //divide sensibility - } else { - reduc = LIM ((100.f - Qold100) / (100.f - redu), 0.f, 1.f); - Qq = 0.25f * reduc * (Qq - Qold) + Qold; //reduct sensibility in highlights - } - } - } else if (Qq > 10.f) { - Qq = 0.5f * (Qq - Qold) + Qold; - } else if (Qq >= 0.f) { - Qq = 0.7f * (Qq - Qold) + Qold; // not zero ==>artifacts - } - - if (Qold == 0.f) { - Qold = 0.001f; - } - - // Qpro = (float) (Qq * (coef) / 327.68f); - Qpro = Qanc * (Qq / Qold); - Jpro = Jpro * SQR (Qq / Qold); - - // Qpro = (double) (Qq * (coef) / 327.68f); - // Jpro = 100.* (Qpro * Qpro) / ((4.0 / c) * (4.0 / c) * (aw + 4.0) * (aw + 4.0)); - t2B = true; - - if (t1L) { //to workaround the problem if we modify curve1-lightnees after curve2 brightness(the cat that bites its own tail!) in fact it's another type of curve only for this case - coef = 2.f; //adapt Q to J approximation - Qq = (float) Qpro * coef; - Qold = Qq; - const Lightcurve& userColCurveJ1 = static_cast (customColCurve1); - userColCurveJ1.Apply (Qq); - Qq = 0.1f * (Qq - Qold) + Qold; //approximative adaptation - Qpro = (double) (Qq / coef); - Jpro = 100.* (Qpro * Qpro) / ((4.0 / c) * (4.0 / c) * (aw + 4.0) * (aw + 4.0)); - } - - if (Jpro < 1.) { - Jpro = 1.; - } - } - } - - if (hasColCurve3) {//curve 3 with chroma saturation colorfullness - if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { - double parsat = 0.8; //0.68; - double coef = 327.68 / parsat; - float Cc = (float) Cpro * coef; - float Ccold = Cc; - const Chromacurve& userColCurve = static_cast (customColCurve3); - userColCurve.Apply (Cc); - float dred = 55.f; - float protect_red = 30.0f; - float sk = 1; - float ko = 1.f / coef; - Color::skinred (Jpro, hpro, Cc, Ccold, dred, protect_red, sk, rstprotection, ko, Cpro); - - if (Jpro < 1. && Cpro > 12.) { - Cpro = 12.; //reduce artifacts by "pseudo gamut control CIECAM" - } else if (Jpro < 2. && Cpro > 15.) { - Cpro = 15.; - } else if (Jpro < 4. && Cpro > 30.) { - Cpro = 30.; - } else if (Jpro < 7. && Cpro > 50.) { - Cpro = 50.; - } - - // Cpro=Cc/coef; - } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { // - double parsat = 0.8; //0.6 - double coef = 327.68 / parsat; - float Ss = (float) spro * coef; - float Sold = Ss; - const Saturcurve& userColCurve = static_cast (customColCurve3); - userColCurve.Apply (Ss); - Ss = 0.6f * (Ss - Sold) + Sold; //divide sensibility saturation - double coe = pow (fl, 0.25); - float dred = 100.f; // in C mode - float protect_red = 80.0f; // in C mode - dred = 100.0 * sqrt ((dred * coe) / Qpro); - protect_red = 100.0 * sqrt ((protect_red * coe) / Qpro); - int sk = 0; - float ko = 1.f / coef; - Color::skinred (Jpro, hpro, Ss, Sold, dred, protect_red, sk, rstprotection, ko, spro); - Qpro = ( 4.0 / c ) * sqrt ( Jpro / 100.0 ) * ( aw + 4.0 ) ; - Cpro = (spro * spro * Qpro) / (10000.0); - c1s = 1; - - } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { // - double parsat = 0.8; //0.68; - double coef = 327.68 / parsat; - float Mm = (float) Mpro * coef; - float Mold = Mm; - const Colorfcurve& userColCurve = static_cast (customColCurve3); - userColCurve.Apply (Mm); - double coe = pow (fl, 0.25); - float dred = 100.f; //in C mode - float protect_red = 80.0f; // in C mode - dred *= coe; //in M mode - protect_red *= coe; - int sk = 0; - float ko = 1.f / coef; - Color::skinred (Jpro, hpro, Mm, Mold, dred, protect_red, sk, rstprotection, ko, Mpro); - Cpro = Mpro / coe; - - if (Jpro < 1. && Mpro > 12.*coe) { - Mpro = 12.*coe; //reduce artifacts by "pseudo gamut control CIECAM" - } else if (Jpro < 2. && Mpro > 15.*coe) { - Mpro = 15.*coe; - } else if (Jpro < 4. && Mpro > 30.*coe) { - Mpro = 30.*coe; - } else if (Jpro < 7. && Mpro > 50.*coe) { - Mpro = 50.*coe; - } - - - c1co = 1; - } - } - - //to retrieve the correct values of variables - if (t2B && t1B) { - Jpro = (100.0 * Qpro * Qpro) / (wh * wh); // for brightness curve - } - - if (c1s == 1) { - Qpro = ( 4.0 / c ) * sqrt ( Jpro / 100.0 ) * ( aw + 4.0 ) ; //for saturation curve - Cpro = (spro * spro * Qpro) / (10000.0); - } - - if (c1co == 1) { - double coe = pow (fl, 0.25); // for colorfullness curve - Cpro = Mpro / coe; - } - - //retrieve values C,J...s - C = Cpro; - J = Jpro; - Q = Qpro; - M = Mpro; - h = hpro; - s = spro; - - if (params->colorappearance.tonecie || settings->autocielab) { //use pointer for tonemapping with CIECAM and also sharpening , defringe, contrast detail - // if(params->colorappearance.tonecie || params->colorappearance.sharpcie){//use pointer for tonemapping with CIECAM and also sharpening , defringe, contrast detail - float Qred = ( 4.0 / c) * ( aw + 4.0 ); //estimate Q max if J=100.0 - ncie->Q_p[i][j] = (float)Q + epsil; //epsil to avoid Q=0 - ncie->M_p[i][j] = (float)M + epsil; - ncie->J_p[i][j] = (float)J + epsil; - ncie->h_p[i][j] = (float)h; - ncie->C_p[i][j] = (float)C + epsil; - // ncie->s_p[i][j]=(float)s; - ncie->sh_p[i][j] = (float) 32768.* (( 4.0 / c ) * sqrt ( J / 100.0 ) * ( aw + 4.0 )) / Qred ; - - // ncie->ch_p[i][j]=(float) 327.68*C; - if (ncie->Q_p[i][j] < minQ) { - minQ = ncie->Q_p[i][j]; //minima - } - - if (ncie->Q_p[i][j] > maxQ) { - maxQ = ncie->Q_p[i][j]; //maxima - } - } - - if (!params->colorappearance.tonecie || !settings->autocielab || !params->epd.enabled ) { - -// if(!params->epd.enabled || !params->colorappearance.tonecie || !settings->autocielab){ - // if(!params->epd.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){ - double brli = 327.; - double chsacol = 327.; - int libr = 0; - int colch = 0; - - if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { - brli = 70.0; - libr = 1; - } else if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { - brli = 327.; - libr = 0; - } - - if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { - chsacol = 400.;//327.; - colch = 0; - } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { - chsacol = 450.0; - colch = 1; - } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { - chsacol = 400.;//327.0; - colch = 2; - } - - if (ciedata) { - // Data for J Q M s and C histograms - //update histogram - jp = true; - - if (pW != 1) { //only with improccoordinator - int posl; - - if (libr == 1) { - posl = CLIP ((int) (Q * brli)); //40.0 to 100.0 approximative factor for Q - 327 for J - } else { /*if(libr == 0)*/ - posl = CLIP ((int) (J * brli)); //327 for J - } - - hist16JCAM[posl]++; - } - - chropC = true; - - if (pW != 1) { //only with improccoordinator - int posc; - - if (colch == 0) { - posc = CLIP ((int) (C * chsacol)); //450.0 approximative factor for s 320 for M - } else if (colch == 1) { - posc = CLIP ((int) (s * chsacol)); - } else { /*if(colch == 2)*/ - posc = CLIP ((int) (M * chsacol)); - } - - hist16_CCAM[posc]++; - } - } - - double xx, yy, zz; - //double nj, nbbj, ncbj, flj, czj, dj, awj; - //process normal==> viewing - Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz, - J, C, h, - xw2, yw2, zw2, - 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; - float Ll, aa, bb; - //convert xyz=>lab - Color::XYZ2Lab (x, y, z, Ll, aa, bb); - lab->L[i][j] = Ll; - lab->a[i][j] = aa; - lab->b[i][j] = bb; - - // gamut control in Lab mode; I must study how to do with cIECAM only - if (gamu == 1) { - float R, G, B; - float HH, Lprov1, Chprov1; - Lprov1 = lab->L[i][j] / 327.68f; - Chprov1 = sqrt (SQR (lab->a[i][j] / 327.68f) + SQR (lab->b[i][j] / 327.68f)); - HH = atan2 (lab->b[i][j], lab->a[i][j]); - -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f, neg, more_rgb); -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f); -#endif - - lab->L[i][j] = Lprov1 * 327.68f; - lab->a[i][j] = 327.68f * Chprov1 * cos (HH); - lab->b[i][j] = 327.68f * Chprov1 * sin (HH); - - } - } - } - } - - // End of parallelization - if (!params->epd.enabled || !params->colorappearance.tonecie || !settings->autocielab) { //normal -//if(!params->epd.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){//normal - - if (ciedata) { - //update histogram J - if (pW != 1) { //only with improccoordinator - for (int i = 0; i < 32768; i++) { // - if (jp) { - float hval = dLcurve[i]; - int hi = (int) (255.0 * CLIPD (hval)); // - histLCAM[hi] += hist16JCAM[i] ; - } - } - } - - if (pW != 1) { //only with improccoordinator - for (int i = 0; i < 48000; i++) { // - if (chropC) { - float hvalc = dCcurve[i]; - int hic = (int) (255.0 * CLIPD (hvalc)); // - histCCAM[hic] += hist16_CCAM[i] ; - } - } - } - } - } - -#ifdef _DEBUG - - if (settings->verbose) { - t2e.set(); - printf ("CIECAM02 performed in %d usec:\n", t2e.etime (t1e)); - // printf("minc=%f maxc=%f minj=%f maxj=%f\n",minc,maxc,minj,maxj); - } - -#endif - - if (settings->autocielab) { -//if(params->colorappearance.sharpcie) { - -//all this treatments reduce artifacts, but can lead to slightly different results - if (params->defringe.enabled) if (execsharp) { - ImProcFunctions::defringecam (ncie); // - } - -//if(params->dirpyrequalizer.enabled) if(execsharp) { - if (params->dirpyrequalizer.enabled) { - if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) { - float artifact = (float) settings->artifact_cbdl; - - if (artifact > 6.f) { - artifact = 6.f; - } - - if (artifact < 0.f) { - artifact = 1.f; - } - - float chrom = 50.f; - { - int hotbad = 0; - 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, 1);//for bad pixels CIECAM - } - - if (params->sharpenMicro.enabled)if (execsharp) { - ImProcFunctions::MLmicrocontrastcam (ncie); - } - - if (params->sharpening.enabled) - if (execsharp) { - float **buffer = lab->L; // We can use the L-buffer from lab as buffer to save some memory - ImProcFunctions::sharpeningcam (ncie, buffer); // sharpening adapted to CIECAM - } - -//if(params->dirpyrequalizer.enabled) if(execsharp) { - if (params->dirpyrequalizer.enabled /*&& (execsharp)*/) { - -// 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.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 - } - } - - float Qredi = ( 4.0 / c_) * ( a_w + 4.0 ); - float co_e = (pow (f_l, 0.25f)); - -#ifndef _DEBUG - #pragma omp parallel default(shared) firstprivate(height,width, Qredi,a_w,c_) -#endif - { -#ifndef _DEBUG - #pragma omp for schedule(dynamic, 10) -#endif - - for (int i = 0; i < height; i++) // update CieImages with new values after sharpening, defringe, contrast by detail level - for (int j = 0; j < width; j++) { - float interm = Qredi * ncie->sh_p[i][j] / (32768.f); - ncie->J_p[i][j] = 100.0 * interm * interm / ((a_w + 4.) * (a_w + 4.) * (4. / c_) * (4. / c_)); - ncie->Q_p[i][j] = ( 4.0 / c_) * ( a_w + 4.0 ) * sqrt (ncie->J_p[i][j] / 100.f); - ncie->M_p[i][j] = ncie->C_p[i][j] * co_e; - } - } - } - - if ((params->colorappearance.tonecie || (params->colorappearance.tonecie && params->epd.enabled)) || (params->sharpening.enabled && settings->autocielab) - || (params->dirpyrequalizer.enabled && settings->autocielab) || (params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) - || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { - - if (params->epd.enabled && params->colorappearance.tonecie && algepd) { - 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, nc2,f2,c2, gamu, highlight,pW) -#endif - { - TMatrix wiprofa = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); - double wipa[3][3] = { - {wiprofa[0][0], wiprofa[0][1], wiprofa[0][2]}, - {wiprofa[1][0], wiprofa[1][1], wiprofa[1][2]}, - {wiprofa[2][0], wiprofa[2][1], wiprofa[2][2]} - }; - - -#ifndef _DEBUG - #pragma omp for schedule(dynamic, 10) -#endif - - for (int i = 0; i < height; i++) // update CIECAM with new values after tone-mapping - - // for (int i=begh; iepd.enabled) ncie->J_p[i][j]=(100.0* ncie->Q_p[i][j]*ncie->Q_p[i][j])/(w_h*w_h); - if (params->epd.enabled) { - ncie->J_p[i][j] = (100.0 * ncie->Q_p[i][j] * ncie->Q_p[i][j]) / SQR ((4. / c) * (aw + 4.)); - } - - ncie->C_p[i][j] = (ncie->M_p[i][j]) / co_e; - //show histogram in CIECAM mode (Q,J, M,s,C) - double brli = 327.; - double chsacol = 327.; - int libr = 0; - int colch = 0; - - if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { - brli = 70.0; - libr = 1; - } else if (curveMode == ColorAppearanceParams::TcMode::LIGHT) { - brli = 327.; - libr = 0; - } - - if (curveMode3 == ColorAppearanceParams::CtcMode::CHROMA) { - chsacol = 400.;//327.; - colch = 0; - } else if (curveMode3 == ColorAppearanceParams::CtcMode::SATUR) { - chsacol = 450.0; - colch = 1; - } else if (curveMode3 == ColorAppearanceParams::CtcMode::COLORF) { - chsacol = 400.;//327.0; - colch = 2; - } - - if (ciedata) { - // Data for J Q M s and C histograms - //update histogram - jp = true; - - if (pW != 1) { //only with improccoordinator - int posl; - - if (libr == 1) { - posl = CLIP ((int) (ncie->Q_p[i][j] * brli)); //40.0 to 100.0 approximative factor for Q - 327 for J - } else { /*if(libr == 0)*/ - posl = CLIP ((int) (ncie->J_p[i][j] * brli)); //327 for J - } - - hist16JCAM[posl]++; - } - - chropC = true; - - if (pW != 1) { //only with improccoordinator - int posc; - - if (colch == 0) { - posc = CLIP ((int) (ncie->C_p[i][j] * chsacol)); //450.0 approximative factor for s 320 for M - } else if (colch == 1) { - float sa_t = 100.f * sqrt (ncie->C_p[i][j] / ncie->Q_p[i][j]); //Q_p always > 0 - posc = CLIP ((int) (sa_t * chsacol)); - } else { /*if(colch == 2)*/ - posc = CLIP ((int) (ncie->M_p[i][j] * chsacol)); - } - - hist16_CCAM[posc]++; - } - } - - //end histograms - // double nd, nbbd, ncbd, fld, czd, dd, awd; - Ciecam02::jch2xyz_ciecam02 ( xx, yy, zz, - ncie->J_p[i][j], ncie->C_p[i][j], ncie->h_p[i][j], - xw2, yw2, zw2, - 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; - float Ll, aa, bb; - //convert xyz=>lab - Color::XYZ2Lab (x, y, z, Ll, aa, bb); - lab->L[i][j] = Ll; - lab->a[i][j] = aa; - lab->b[i][j] = bb; - - if (gamu == 1) { - float R, G, B; - float HH, Lprov1, Chprov1; - Lprov1 = lab->L[i][j] / 327.68f; - Chprov1 = sqrt (SQR (lab->a[i][j] / 327.68f) + SQR (lab->b[i][j] / 327.68f)); - HH = atan2 (lab->b[i][j], lab->a[i][j]); - -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; - //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, Lprov1, Chprov1, R, G, B, wipa, highlight, 0.15f, 0.96f, neg, more_rgb); -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, Lprov1, Chprov1, R, G, B, wipa, highlight, 0.15f, 0.96f); -#endif - - lab->L[i][j] = Lprov1 * 327.68f; - lab->a[i][j] = 327.68f * Chprov1 * cos (HH); - lab->b[i][j] = 327.68f * Chprov1 * sin (HH); - } - } - - - } - - //end parallelization - //show CIECAM histograms - if (ciedata) { - //update histogram J and Q - if (pW != 1) { //only with improccoordinator - for (int i = 0; i < 32768; i++) { // - if (jp) { - float hval = dLcurve[i]; - int hi = (int) (255.0 * CLIPD (hval)); // - histLCAM[hi] += hist16JCAM[i] ; - } - } - } - - //update color histogram M,s,C - if (pW != 1) { //only with improccoordinator - for (int i = 0; i < 48000; i++) { // - if (chropC) { - float hvalc = dCcurve[i]; - int hic = (int) (255.0 * CLIPD (hvalc)); // - histCCAM[hic] += hist16_CCAM[i] ; - } - } - } - } - - } - - } -} -//end CIECAM - - // Copyright (c) 2012 Jacques Desmis 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) + LUTu & histLCAM, LUTu & histCCAM, LUTf & CAMBrightCurveJ, LUTf & CAMBrightCurveQ, float &mean, int Iterates, int scale, bool execsharp, float &d, float &dj, float &yb, int rtt, + bool showSharpMask) { if (params->colorappearance.enabled) { @@ -1983,8 +756,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw 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()); @@ -2004,8 +776,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw hist16Qthr.clear(); } - // #pragma omp for reduction(+:sum,sumQ) +#ifdef _OPENMP #pragma omp for reduction(+:sum) +#endif for (int i = 0; i < height; i++) @@ -2074,7 +847,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw //can be used in case of... } +#ifdef _OPENMP #pragma omp critical +#endif { if (needJ) { hist16J += hist16Jthr; @@ -2163,12 +938,12 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float cz, wh, pfl; - Ciecam02::initcam1float (gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); + Ciecam02::initcam1float (yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); //printf ("wh=%f \n", wh); 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); + Ciecam02::initcam2float (yb2, pilotout, f2, la2, xw2, yw2, zw2, nj, dj, nbbj, ncbj, czj, awj, flj); #ifdef __SSE2__ const float reccmcz = 1.f / (c2 * czj); #endif @@ -2212,7 +987,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw //matrix for current working space - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); const float wip[3][3] = { { (float)wiprof[0][0], (float)wiprof[0][1], (float)wiprof[0][2]}, { (float)wiprof[1][0], (float)wiprof[1][1], (float)wiprof[1][2]}, @@ -2223,7 +998,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw int bufferLength = ((width + 3) / 4) * 4; // bufferLength has to be a multiple of 4 #endif #ifndef _DEBUG +#ifdef _OPENMP #pragma omp parallel +#endif #endif { float minQThr = 10000.f; @@ -2238,7 +1015,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw float sbuffer[bufferLength] ALIGNED16; #endif #ifndef _DEBUG +#ifdef _OPENMP #pragma omp for schedule(dynamic, 16) +#endif #endif for (int i = 0; i < height; i++) { @@ -2283,7 +1062,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Q, M, s, aw, fl, wh, x, y, z, xw1, yw1, zw1, - c, nc, gamu, pow1, nbb, ncb, pfl, cz, d); + c, nc, pow1, nbb, ncb, pfl, cz, d); Jbuffer[k] = J; Cbuffer[k] = C; hbuffer[k] = h; @@ -2321,7 +1100,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Q, M, s, aw, fl, wh, x, y, z, xw1, yw1, zw1, - c, nc, gamu, pow1, nbb, ncb, pfl, cz, d); + c, nc, pow1, nbb, ncb, pfl, cz, d); #endif float Jpro, Cpro, hpro, Qpro, Mpro, spro; Jpro = J; @@ -2448,7 +1227,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Jpro = 1.f; } } else if (curveMode == ColorAppearanceParams::TcMode::BRIGHT) { - //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algoritms will be different + //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); @@ -2736,7 +1515,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, J, C, h, xw2, yw2, zw2, - c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, pow1n, nbbj, ncbj, flj, czj, dj, awj); float x, y, z; x = xx * 655.35f; y = yy * 655.35f; @@ -2846,7 +1625,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw #endif } +#ifdef _OPENMP #pragma omp critical +#endif { if (minQThr < minQ) { minQ = minQThr; @@ -2886,60 +1667,50 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw -//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) { lab->deleteLab(); - ImProcFunctions::defringecam (ncie);//defringe adapted to CIECAM + defringecam (ncie);//defringe adapted to CIECAM lab->reallocLab(); } //if(params->dirpyrequalizer.enabled) if(execsharp) { - if (params->dirpyrequalizer.enabled) { - if (params->dirpyrequalizer.gamutlab /*&& execsharp*/) { //remove artifacts by gaussian blur - skin control - float artifact = (float) settings->artifact_cbdl; + if (params->dirpyrequalizer.enabled && params->dirpyrequalizer.gamutlab && rtt) { //remove artifacts by gaussian blur - skin control, but not for thumbs + constexpr float artifact = 4.f; + constexpr float chrom = 50.f; + const bool hotbad = params->dirpyrequalizer.skinprotect != 0.0; - if (artifact > 6.f) { - artifact = 6.f; - } - - if (artifact < 0.f) { - artifact = 1.f; - } - - int hotbad = 0; - float chrom = 50.f; - lab->deleteLab(); - ImProcFunctions::badpixcam (ncie, artifact, 5, 2, params->dirpyrequalizer.skinprotect, chrom, hotbad); //enabled remove artifacts for cbDL - lab->reallocLab(); - } + lab->deleteLab(); + badpixcam (ncie, artifact / scale, 5, 2, chrom, hotbad); //enabled remove artifacts for cbDL + lab->reallocLab(); } //if(params->colorappearance.badpixsl > 0) { int mode=params->colorappearance.badpixsl; - if (params->colorappearance.badpixsl > 0) if (execsharp) { - int mode = params->colorappearance.badpixsl; - lab->deleteLab(); - ImProcFunctions::badpixcam (ncie, 3.0, 10, mode, 0, 0, 1);//for bad pixels CIECAM - lab->reallocLab(); - } + if (params->colorappearance.badpixsl > 0 && execsharp) { + int mode = params->colorappearance.badpixsl; + lab->deleteLab(); + badpixcam (ncie, 3.0, 10, mode, 0, true);//for bad pixels CIECAM + lab->reallocLab(); + } if (params->impulseDenoise.enabled) if (execsharp) { float **buffers[3]; buffers[0] = lab->L; buffers[1] = lab->a; buffers[2] = lab->b; - ImProcFunctions::impulsedenoisecam (ncie, buffers); //impulse adapted to CIECAM + impulsedenoisecam (ncie, buffers); //impulse adapted to CIECAM } if (params->sharpenMicro.enabled)if (execsharp) { - ImProcFunctions::MLmicrocontrastcam (ncie); + MLmicrocontrastcam (ncie); } if (params->sharpening.enabled) if (execsharp) { float **buffer = lab->L; // We can use the L-buffer from lab as buffer to save some memory - ImProcFunctions::sharpeningcam (ncie, buffer); // sharpening adapted to CIECAM + sharpeningcam (ncie, buffer, showSharpMask); // sharpening adapted to CIECAM } //if(params->dirpyrequalizer.enabled) if(execsharp) { @@ -2969,11 +1740,15 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw #ifndef _DEBUG +#ifdef _OPENMP #pragma omp parallel +#endif #endif { #ifndef _DEBUG +#ifdef _OPENMP #pragma omp for schedule(dynamic, 10) +#endif #endif for (int i = 0; i < height; i++) // update CieImages with new values after sharpening, defringe, contrast by detail level @@ -2995,7 +1770,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw if (epdEnabled && params->colorappearance.tonecie && algepd) { lab->deleteLab(); - ImProcFunctions::EPDToneMapCIE (ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale ); + EPDToneMapCIE (ncie, a_w, c_, width, height, minQ, maxQ, Iterates, scale ); lab->reallocLab(); } @@ -3006,7 +1781,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw const float co_e = (pow_F (f_l, 0.25f)) + eps; #ifndef _DEBUG +#ifdef _OPENMP #pragma omp parallel +#endif #endif { #ifdef __SSE2__ @@ -3020,7 +1797,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw #endif #ifndef _DEBUG +#ifdef _OPENMP #pragma omp for schedule(dynamic, 10) +#endif #endif for (int i = 0; i < height; i++) { // update CIECAM with new values after tone-mapping @@ -3079,7 +1858,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz, ncie->J_p[i][j], ncie_C_p, ncie->h_p[i][j], xw2, yw2, zw2, - c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj); + c2, nc2, 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; @@ -3241,7 +2020,7 @@ filmlike_clip_rgb_tone (float *r, float *g, float *b, const float L) *b = b_; } -static void +/*static*/ void filmlike_clip (float *r, float *g, float *b) { // This is Adobe's hue-stable film-like curve with a diagonal, ie only used for clipping. Can probably be further optimized. @@ -3271,18 +2050,25 @@ filmlike_clip (float *r, float *g, float *b) } void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve ) + int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) { - rgbProc (working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, shmap, sat, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, asIn, histToneCurve); + rgbProc (working, lab, pipetteBuffer, hltonecurve, shtonecurve, tonecurve, sat, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, params->toneCurve.expcomp, params->toneCurve.hlcompr, params->toneCurve.hlcomprthresh, dcpProf, asIn, histToneCurve, chunkSize, measure); } // Process RGB image and convert to LAB space void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, - const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve ) + int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clToningcurve, LUTf & cl2Toningcurve, + const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize, bool measure) { - BENCHFUN + + std::unique_ptr stop; + + if (measure) { + std::cout << "rgb processing " << working->getWidth() << "x" << working->getHeight() << " image with " << chunkSize << " tiles per thread" << std::endl; + stop.reset(new StopWatch("rgb processing")); + } + Imagefloat *tmpImage = nullptr; Imagefloat* editImgFloat = nullptr; @@ -3304,17 +2090,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - int h_th = 0, s_th = 0; - - if (shmap) { - h_th = shmap->max_f - params->sh.htonalwidth * (shmap->max_f - shmap->avg) / 100; - s_th = params->sh.stonalwidth * (shmap->avg - shmap->min_f) / 100; - } - - bool processSH = params->sh.enabled && shmap && (params->sh.highlights > 0 || params->sh.shadows > 0); - - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.workingProfile); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); float toxyz[3][3] = { { @@ -3423,7 +2200,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer hald_clut = CLUTStore::getInstance().getClut ( params->filmSimulation.clutFilename ); if ( hald_clut ) { - clutAndWorkingProfilesAreSame = hald_clut->getProfile() == params->icm.working; + clutAndWorkingProfilesAreSame = hald_clut->getProfile() == params->icm.workingProfile; if ( !clutAndWorkingProfilesAreSame ) { xyz2clut = ICCStore::getInstance()->workingSpaceInverseMatrix ( hald_clut->getProfile() ); @@ -3452,10 +2229,10 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer const float comp = (max (0.0, expcomp) + 1.0) * hlcompr / 100.0; const float shoulder = ((65536.0 / max (1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1; const float hlrange = 65536.0 - shoulder; - const bool isProPhoto = (params->icm.working == "ProPhoto"); + const bool isProPhoto = (params->icm.workingProfile == "ProPhoto"); // extracting datas from 'params' to avoid cache flush (to be confirmed) - ToneCurveParams::TcMode curveMode = params->toneCurve.curveMode; - ToneCurveParams::TcMode curveMode2 = params->toneCurve.curveMode2; + ToneCurveMode curveMode = params->toneCurve.curveMode; + ToneCurveMode 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); @@ -3467,14 +2244,14 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer PerceptualToneCurveState ptc1ApplyState, ptc2ApplyState; - if (hasToneCurve1 && curveMode == ToneCurveParams::TcMode::PERCEPTUAL) { + if (hasToneCurve1 && curveMode == ToneCurveMode::PERCEPTUAL) { const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve1); - userToneCurve.initApplyState (ptc1ApplyState, params->icm.working); + userToneCurve.initApplyState (ptc1ApplyState, params->icm.workingProfile); } - if (hasToneCurve2 && curveMode2 == ToneCurveParams::TcMode::PERCEPTUAL) { + if (hasToneCurve2 && curveMode2 == ToneCurveMode::PERCEPTUAL) { const PerceptualToneCurve& userToneCurve = static_cast (customToneCurve2); - userToneCurve.initApplyState (ptc2ApplyState, params->icm.working); + userToneCurve.initApplyState (ptc2ApplyState, params->icm.workingProfile); } bool hasColorToning = params->colorToning.enabled && bool (ctOpacityCurve) && bool (ctColorCurve) && params->colorToning.method != "LabGrid"; @@ -3527,18 +2304,16 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float Balan = float (params->colorToning.balance); - float chMixRR = float (params->chmixer.red[0]); - float chMixRG = float (params->chmixer.red[1]); - float chMixRB = float (params->chmixer.red[2]); - float chMixGR = float (params->chmixer.green[0]); - float chMixGG = float (params->chmixer.green[1]); - float chMixGB = float (params->chmixer.green[2]); - float chMixBR = float (params->chmixer.blue[0]); - float chMixBG = float (params->chmixer.blue[1]); - float chMixBB = float (params->chmixer.blue[2]); + float chMixRR = float (params->chmixer.red[0])/10.f; + float chMixRG = float (params->chmixer.red[1])/10.f; + float chMixRB = float (params->chmixer.red[2])/10.f; + float chMixGR = float (params->chmixer.green[0])/10.f; + float chMixGG = float (params->chmixer.green[1])/10.f; + float chMixGB = float (params->chmixer.green[2])/10.f; + float chMixBR = float (params->chmixer.blue[0])/10.f; + float chMixBG = float (params->chmixer.blue[1])/10.f; + float chMixBB = float (params->chmixer.blue[2])/10.f; - int shHighlights = params->sh.highlights; - int shShadows = params->sh.shadows; bool blackwhite = params->blackwhite.enabled; bool complem = params->blackwhite.enabledcc; float bwr = float (params->blackwhite.mixerRed); @@ -3651,6 +2426,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } float out_rgbx[4 * TS] ALIGNED16; // Line buffer for CLUT + float clutr[TS] ALIGNED16; + float clutg[TS] ALIGNED16; + float clutb[TS] ALIGNED16; LUTu histToneCurveThr; @@ -3660,7 +2438,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } #ifdef _OPENMP - #pragma omp for schedule(dynamic) collapse(2) + #pragma omp for schedule(dynamic, chunkSize) collapse(2) #endif for (int ii = 0; ii < working->getHeight(); ii += TS) @@ -3698,31 +2476,6 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } - if (processSH) { - 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 mapval = 1.f + shmap->map[i][j]; - float factor = 1.f; - - 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; - } - - rtemp[ti * TS + tj] = factor * r; - gtemp[ti * TS + tj] = factor * g; - btemp[ti * TS + tj] = factor * b; - } - } - } - highlightToneCurve(hltonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS, exp_scale, comp, hlrange); shadowToneCurve(shtonecurve, rtemp, gtemp, btemp, istart, tH, jstart, tW, TS); @@ -3730,20 +2483,21 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer dcpProf->step2ApplyTile (rtemp, gtemp, btemp, tW - jstart, tH - istart, TS, asIn); } - for (int i = istart, ti = 0; i < tH; i++, ti++) { - for (int j = jstart, tj = 0; j < tW; j++, tj++) { - // 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 (params->toneCurve.clampOOG) { + for (int i = istart, ti = 0; i < tH; i++, ti++) { + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + // 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); + if (OOG(r) || OOG(g) || OOG(b)) { + filmlike_clip(&r, &g, &b); + } + rtemp[ti * TS + tj] = r; + gtemp[ti * TS + tj] = g; + btemp[ti * TS + tj] = b; } - - rtemp[ti * TS + tj] = r; - gtemp[ti * TS + tj] = g; - btemp[ti * TS + tj] = b; } } @@ -3752,30 +2506,37 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer 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] ]; + float r = tonecurve[ CLIP(rtemp[ti * TS + tj]) ]; + float g = tonecurve[ CLIP(gtemp[ti * TS + tj]) ]; + float b = tonecurve[ CLIP(btemp[ti * TS + tj]) ]; 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]++; + + setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], r, g, b); } } } else { + float tmpr[4] ALIGNED16; + float tmpg[4] ALIGNED16; + float tmpb[4] ALIGNED16; + for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0; -#if defined( __SSE2__ ) && defined( __x86_64__ ) +#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]))); + STVF(tmpr[0], tonecurve(LVF(rtemp[ti * TS + tj]))); + STVF(tmpg[0], tonecurve(LVF(gtemp[ti * TS + tj]))); + STVF(tmpb[0], tonecurve(LVF(btemp[ti * TS + tj]))); + for (int k = 0; k < 4; ++k) { + setUnlessOOG(rtemp[ti * TS + tj + k], gtemp[ti * TS + tj + k], btemp[ti * TS + tj + k], tmpr[k], tmpg[k], tmpb[k]); + } } #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]]; + setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], tonecurve[rtemp[ti * TS + tj]], tonecurve[gtemp[ti * TS + tj]], tonecurve[btemp[ti * TS + tj]]); } } } @@ -3823,17 +2584,17 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int j = jstart, tj = 0; j < tW; j++, tj++) { // individual R tone curve if (rCurve) { - rtemp[ti * TS + tj] = rCurve[ rtemp[ti * TS + tj] ]; + setUnlessOOG(rtemp[ti * TS + tj], rCurve[ rtemp[ti * TS + tj] ]); } // individual G tone curve if (gCurve) { - gtemp[ti * TS + tj] = gCurve[ gtemp[ti * TS + tj] ]; + setUnlessOOG(gtemp[ti * TS + tj], gCurve[ gtemp[ti * TS + tj] ]); } // individual B tone curve if (bCurve) { - btemp[ti * TS + tj] = bCurve[ btemp[ti * TS + tj] ]; + setUnlessOOG(btemp[ti * TS + tj], bCurve[ btemp[ti * TS + tj] ]); } } } @@ -3877,8 +2638,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer // 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) { @@ -3901,18 +2661,20 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer bool neg = false; bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, sincosval, Lpro, Chpro, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], wip, highlight, 0.15f, 0.96f, neg, more_rgb); + Color::gamutLchonly (HH, sincosval, Lpro, Chpro, r, g, b, wip, highlight, 0.15f, 0.96f, neg, more_rgb); #else //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, sincosval, Lpro, Chpro, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], wip, highlight, 0.15f, 0.96f); + Color::gamutLchonly (HH, sincosval, Lpro, Chpro, r, g, b, wip, highlight, 0.15f, 0.96f); #endif //end of gamut control } else { float x_, y_, z_; //calculate RGB with L_2 and old value of a and b Color::Lab2XYZ (L_2, a_1, b_1, x_, y_, z_) ; - Color::xyz2rgb (x_, y_, z_, rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], wip); + Color::xyz2rgb (x_, y_, z_, r, g, b, wip); } + + setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], r, g, b); } } } @@ -3978,7 +2740,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer 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; @@ -4063,9 +2825,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer bo *= preserv; } - rtemp[ti * TS + tj] = CLIP(ro); - gtemp[ti * TS + tj] = CLIP(go); - btemp[ti * TS + tj] = CLIP(bo); + setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], CLIP(ro), CLIP(go), CLIP(bo)); } } } @@ -4119,9 +2879,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer 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 - gtemp[ti * TS + tj] = CLIP (go); - btemp[ti * TS + tj] = CLIP (bo); + setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], ro, go, bo); } } } @@ -4203,9 +2961,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { 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]); + // 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]); } } @@ -4213,9 +2971,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int i = istart, ti = 0; i < tH; i++, ti++) { for (int j = jstart, tj = 0; j < tW; j++, tj++) { 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]); + // 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]); } @@ -4268,7 +3026,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer #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 @@ -4368,28 +3126,32 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer Color::rgbxyz (sourceR, sourceG, sourceB, x, y, z, v_work2xyz); Color::xyz2rgb (x, y, z, sourceR, sourceG, sourceB, v_xyz2clut); - STVF (rtemp[ti * TS + tj], sourceR); - STVF (gtemp[ti * TS + tj], sourceG); - STVF (btemp[ti * TS + tj], sourceB); + STVF (clutr[tj], sourceR); + STVF (clutg[tj], sourceG); + STVF (clutb[tj], sourceB); } #endif for (; j < tW; j++, tj++) { - float &sourceR = rtemp[ti * TS + tj]; - float &sourceG = gtemp[ti * TS + tj]; - float &sourceB = btemp[ti * TS + tj]; + float sourceR = rtemp[ti * TS + tj]; + float sourceG = gtemp[ti * TS + tj]; + float sourceB = btemp[ti * TS + tj]; float x, y, z; Color::rgbxyz ( sourceR, sourceG, sourceB, x, y, z, wprof ); - Color::xyz2rgb (x, y, z, sourceR, sourceG, sourceB, xyz2clut); + Color::xyz2rgb (x, y, z, clutr[tj], clutg[tj], clutb[tj], xyz2clut); } + } else { + memcpy(clutr, &rtemp[ti * TS], sizeof(float) * TS); + memcpy(clutg, >emp[ti * TS], sizeof(float) * TS); + memcpy(clutb, &btemp[ti * TS], sizeof(float) * TS); } for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float &sourceR = rtemp[ti * TS + tj]; - float &sourceG = gtemp[ti * TS + tj]; - float &sourceB = btemp[ti * TS + tj]; + float &sourceR = clutr[tj]; + float &sourceG = clutg[tj]; + float &sourceB = clutb[tj]; // Apply gamma sRGB (default RT) sourceR = Color::gamma_srgbclipped (sourceR); @@ -4397,20 +3159,19 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer sourceB = Color::gamma_srgbclipped (sourceB); } - const std::size_t line_offset = ti * TS; hald_clut->getRGB ( film_simulation_strength, std::min (TS, tW - jstart), - rtemp + line_offset, - gtemp + line_offset, - btemp + line_offset, + clutr, + clutg, + clutb, out_rgbx ); for (int j = jstart, tj = 0; j < tW; j++, tj++) { - float &sourceR = rtemp[ti * TS + tj]; - float &sourceG = gtemp[ti * TS + tj]; - float &sourceB = btemp[ti * TS + tj]; + float &sourceR = clutr[tj]; + float &sourceG = clutg[tj]; + float &sourceB = clutb[tj]; // Apply inverse gamma sRGB sourceR = Color::igamma_srgb (out_rgbx[tj * 4 + 0]); @@ -4426,9 +3187,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer #ifdef __SSE2__ for (; j < tW - 3; j += 4, tj += 4) { - vfloat sourceR = LVF (rtemp[ti * TS + tj]); - vfloat sourceG = LVF (gtemp[ti * TS + tj]); - vfloat sourceB = LVF (btemp[ti * TS + tj]); + vfloat sourceR = LVF (clutr[tj]); + vfloat sourceG = LVF (clutg[tj]); + vfloat sourceB = LVF (clutb[tj]); vfloat x; vfloat y; @@ -4436,27 +3197,32 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer Color::rgbxyz (sourceR, sourceG, sourceB, x, y, z, v_clut2xyz); Color::xyz2rgb (x, y, z, sourceR, sourceG, sourceB, v_xyz2work); - STVF (rtemp[ti * TS + tj], sourceR); - STVF (gtemp[ti * TS + tj], sourceG); - STVF (btemp[ti * TS + tj], sourceB); + STVF (clutr[tj], sourceR); + STVF (clutg[tj], sourceG); + STVF (clutb[tj], sourceB); } #endif for (; j < tW; j++, tj++) { - float &sourceR = rtemp[ti * TS + tj]; - float &sourceG = gtemp[ti * TS + tj]; - float &sourceB = btemp[ti * TS + tj]; + float &sourceR = clutr[tj]; + float &sourceG = clutg[tj]; + float &sourceB = clutb[tj]; float x, y, z; Color::rgbxyz (sourceR, sourceG, sourceB, x, y, z, clut2xyz); Color::xyz2rgb ( x, y, z, sourceR, sourceG, sourceB, wiprof ); } } + + for (int j = jstart, tj = 0; j < tW; j++, tj++) { + setUnlessOOG(rtemp[ti * TS + tj], gtemp[ti * TS + tj], btemp[ti * TS + tj], clutr[tj], clutg[tj], clutb[tj]); + } } } - + //softLight(rtemp, gtemp, btemp, istart, jstart, tW, tH, TS); + if (!blackwhite) { if (editImgFloat || editWhatever) { for (int i = istart, ti = 0; i < tH; i++, ti++) { @@ -4580,7 +3346,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int j = 0; j < tW; j++) { //mix channel - tmpImage->r (i, j) = tmpImage->g (i, j) = tmpImage->b (i, j) = CLIP ((bwr * tmpImage->r (i, j) + bwg * tmpImage->g (i, j) + bwb * tmpImage->b (i, j)) * kcorec); + tmpImage->r (i, j) = tmpImage->g (i, j) = tmpImage->b (i, j) = /*CLIP*/ ((bwr * tmpImage->r (i, j) + bwg * tmpImage->g (i, j) + bwb * tmpImage->b (i, j)) * kcorec); #ifndef __SSE2__ @@ -4637,9 +3403,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer for (int j = 0; j < tW; j++) { const WeightedStdToneCurve& userToneCurve = static_cast (customToneCurvebw2); - tmpImage->r (i, j) = CLIP (tmpImage->r (i, j)); - tmpImage->g (i, j) = CLIP (tmpImage->g (i, j)); - tmpImage->b (i, j) = CLIP (tmpImage->b (i, j)); + // tmpImage->r (i, j) = CLIP (tmpImage->r (i, j)); + // tmpImage->g (i, j) = CLIP (tmpImage->g (i, j)); + // tmpImage->b (i, j) = CLIP (tmpImage->b (i, j)); userToneCurve.Apply (tmpImage->r (i, j), tmpImage->g (i, j), tmpImage->b (i, j)); } @@ -4664,7 +3430,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer const float lumbefore = 0.299f * r + 0.587f * g + 0.114f * b; - if (lumbefore < 65000.f && lumbefore > 500.f) { //reduce artefacts for highlights and extreme shadows + if (lumbefore < 65000.f && lumbefore > 500.f) { //reduce artifacts for highlights and extreme shadows float ro, go, bo; toningsmh(r, g, b, ro, go, bo, RedLow, GreenLow, BlueLow, RedMed, GreenMed, BlueMed, RedHigh, GreenHigh, BlueHigh, reducac, mode, strProtect); @@ -4676,9 +3442,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer bo *= preserv; } - tmpImage->r(i, j) = CLIP(ro); - tmpImage->g(i, j) = CLIP(go); - tmpImage->b(i, j) = CLIP(bo); + tmpImage->r(i, j) = /*CLIP*/(ro); + tmpImage->g(i, j) = /*CLIP*/(go); + tmpImage->b(i, j) = /*CLIP*/(bo); } } } @@ -4785,10 +3551,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer float b = tmpImage->b (i, j); float ro, bo, go; labtoning (r, g, b, ro, go, bo, algm, metchrom, twoc, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, clToningcurve, cl2Toningcurve, iplow, iphigh, wp, wip); - tmpImage->r (i, j) = CLIP (ro); - tmpImage->g (i, j) = CLIP (go); - tmpImage->b (i, j) = CLIP (bo); - + setUnlessOOG(tmpImage->r(i, j), tmpImage->g(i, j), tmpImage->b(i, j), ro, go, bo); } } } @@ -4885,6 +3648,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer delete vCurve; } + shadowsHighlights(lab); + if (params->localContrast.enabled) { // Alberto's local contrast localContrast(lab); @@ -5031,9 +3796,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, r += corr; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } { @@ -5045,9 +3810,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, g += corr; } - r = CLIP(r); - b = CLIP(b); - g = CLIP(g); + // r = CLIP(r); + // b = CLIP(b); + // g = CLIP(g); } @@ -5061,9 +3826,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, b += corr; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } // mid tones @@ -5094,9 +3859,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, g -= 20000.f * RedM; b -= 20000.f * RedM; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } { @@ -5111,9 +3876,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, g += 10000.f * GreenM; b -= 20000.f * GreenM; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } { @@ -5128,9 +3893,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, g -= 20000.f * BlueM; b += 10000.f * BlueM; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } //high tones @@ -5155,9 +3920,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, b -= corr; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } { @@ -5170,9 +3935,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, b -= corr; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } { @@ -5185,9 +3950,9 @@ void ImProcFunctions::toningsmh(float r, float g, float b, float &ro, float &go, g -= corr; } - r = CLIP(r); - g = CLIP(g); - b = CLIP(b); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } ro = r; @@ -5212,7 +3977,7 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g 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 transfered value for more action + const float rlo = strProtect; //0.5 ==> 0.75 transferred value for more action const float rlh = 2.2f * strProtect; //low tones @@ -5244,24 +4009,24 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g b -= factor * krl; } - g = CLIP(g); - b = CLIP(b); + // g = CLIP(g); + // b = CLIP(b); if (kgl > 0.f) { r -= factor * kgl; b -= factor * kgl; } - r = CLIP(r); - b = CLIP(b); + // r = CLIP(r); + // b = CLIP(b); if (kbl > 0.f) { r -= factor * kbl; g -= factor * kbl; } - r = CLIP(r); - g = CLIP(g); + // r = CLIP(r); + // g = CLIP(g); } //high tones @@ -5288,9 +4053,9 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g 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); + // r = CLIP(r); + // g = CLIP(g); + // b = CLIP(b); } float preserv = 1.f; @@ -5299,9 +4064,7 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g preserv = lumbefore / lumafter; } - ro = CLIP(r * preserv); - go = CLIP(g * preserv); - bo = CLIP(b * preserv); + setUnlessOOG(ro, go, bo, CLIP(r * preserv), CLIP(g * preserv), CLIP(b * preserv)); } /** @@ -5318,9 +4081,13 @@ void ImProcFunctions::toning2col (float r, float g, float b, float &ro, float &g **/ void ImProcFunctions::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] ) { + ro = CLIP(r); + go = CLIP(g); + bo = CLIP(b); + float realL; float h, s, l; - Color::rgb2hsl (r, g, b, h, s, l); + Color::rgb2hsl (ro, go, bo, h, s, l); float x2, y2, z2; float xl, yl, zl; @@ -5345,24 +4112,22 @@ void ImProcFunctions::labtoning (float r, float g, float b, float &ro, float &go // get the opacity and tweak it to preserve saturated colors //float l_ = Color::gamma_srgb(l*65535.f)/65535.f; - float opacity; - opacity = (1.f - min (s / satLimit, 1.f) * (1.f - satLimitOpacity)) * ctOpacityCurve.lutOpacityCurve[l * 500.f]; + float opacity = (1.f - min (s / satLimit, 1.f) * (1.f - satLimitOpacity)) * ctOpacityCurve.lutOpacityCurve[l * 500.f]; float opacity2 = (1.f - min (s / satLimit, 1.f) * (1.f - satLimitOpacity)); - //float ro, go, bo; - float lm = l; - float chromat, luma; + l *= 65535.f; + float chromat = 0.f, luma = 0.f; - if (clToningcurve[lm * 65535.f] / (lm * 65535.f) < 1.f) { - chromat = (clToningcurve[ (lm) * 65535.f] / (lm * 65535.f)) - 1.f; //special effect - } else { - chromat = 1.f - SQR (SQR ((lm * 65535.f) / clToningcurve[ (lm) * 65535.f])); //apply C=f(L) acts on 'a' and 'b' + if (clToningcurve[l] < l) { + chromat = clToningcurve[l] / l - 1.f; //special effect + } else if (clToningcurve[l] > l) { + chromat = 1.f - SQR(SQR(l / clToningcurve[l])); //apply C=f(L) acts on 'a' and 'b' } - if (cl2Toningcurve[lm * 65535.f] / (lm * 65535.f) < 1.f) { - luma = (cl2Toningcurve[ (lm) * 65535.f] / (lm * 65535.f)) - 1.f; //special effect - } else { - luma = 1.f - SQR (SQR ((lm * 65535.f) / (cl2Toningcurve[ (lm) * 65535.f]))); //apply C2=f(L) acts only on 'b' + if (cl2Toningcurve[l] < l) { + luma = cl2Toningcurve[l] / l - 1.f; //special effect + } else if (cl2Toningcurve[l] > l) { + luma = 1.f - SQR(SQR(l / cl2Toningcurve[l])); //apply C2=f(L) acts only on 'b' } if (algm == 1) { @@ -5379,7 +4144,9 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur int W = lold->W; int H = lold->H; +#ifdef _OPENMP #pragma omp parallel for if (multiThread) +#endif for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { @@ -5391,16 +4158,11 @@ void ImProcFunctions::luminanceCurve (LabImage* lold, LabImage* lnew, LUTf & cur -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"); - //init Flatcurve for C=f(H) PlanarWhateverData* editWhatever = nullptr; EditUniqueID editID = EUID_None; @@ -5426,6 +4188,61 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } } + //------------------------------------------------------------------------- + // support for pipettes for the new LabRegions color toning mode this is a + // hack to fill the pipette buffers also when + // !params->labCurve.enabled. It is ugly, but it's the smallest code + // change that I could find + //------------------------------------------------------------------------- + class TempParams { + const ProcParams **p_; + const ProcParams *old_; + ProcParams tmp_; + + public: + explicit TempParams(const ProcParams **p): p_(p) + { + old_ = *p; + tmp_.labCurve.enabled = true; + *p_ = &tmp_; + } + + ~TempParams() + { + *p_ = old_; + } + }; + std::unique_ptr tempparams; + bool pipette_for_colortoning_labregions = + editPipette && + params->colorToning.enabled && params->colorToning.method == "LabRegions"; + if (!params->labCurve.enabled && pipette_for_colortoning_labregions) { + utili = autili = butili = ccutili = cclutili = clcutili = false; + tempparams.reset(new TempParams(¶ms)); + curve.makeIdentity(); + } + //------------------------------------------------------------------------- + + + if (!params->labCurve.enabled) { + if (editPipette && (editID == EUID_Lab_LCurve || editID == EUID_Lab_aCurve || editID == EUID_Lab_bCurve || editID == EUID_Lab_LHCurve || editID == EUID_Lab_CHCurve || editID == EUID_Lab_HHCurve || editID == EUID_Lab_CLCurve || editID == EUID_Lab_CCurve || editID == EUID_Lab_LCCurve)) { + // fill pipette buffer with zeros to avoid crashes + editWhatever->fill(0.f); + } + if (params->blackwhite.enabled && !params->colorToning.enabled) { + for (int i = 0; i < lnew->H; ++i) { + for (int j = 0; j < lnew->W; ++j) { + lnew->a[i][j] = lnew->b[i][j] = 0.f; + } + } + } + return; + } + + // lhskcurve.dump("lh_curve"); + //init Flatcurve for C=f(H) + + FlatCurve* chCurve = nullptr;// curve C=f(H) bool chutili = false; @@ -5478,17 +4295,8 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } - LUTu hist16Clad; - LUTu hist16Llad; - - //preparate for histograms CIECAM - if (pW != 1) { //only with improccoordinator - hist16Clad (65536); - hist16Clad.clear(); - hist16Llad (65536); - hist16Llad.clear(); - - } + const float histLFactor = pW != 1 ? histLCurve.getSize() / 100.f : 1.f; + const float histCFactor = pW != 1 ? histCCurve.getSize() / 48000.f : 1.f; #ifdef _DEBUG MyTime t1e, t2e; @@ -5502,19 +4310,19 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu // if(params->labCurve.avoidclip ){ // parameter to adapt curve C=f(C) to gamut - if (params->icm.working == "ProPhoto") { + if (params->icm.workingProfile == "ProPhoto") { adjustr = 1.2f; // 1.2 instead 1.0 because it's very rare to have C>170.. - } else if (params->icm.working == "Adobe RGB") { + } else if (params->icm.workingProfile == "Adobe RGB") { adjustr = 1.8f; - } else if (params->icm.working == "sRGB") { + } else if (params->icm.workingProfile == "sRGB") { adjustr = 2.0f; - } else if (params->icm.working == "WideGamut") { + } else if (params->icm.workingProfile == "WideGamut") { adjustr = 1.2f; - } else if (params->icm.working == "Beta RGB") { + } else if (params->icm.workingProfile == "Beta RGB") { adjustr = 1.4f; - } else if (params->icm.working == "BestRGB") { + } else if (params->icm.workingProfile == "BestRGB") { adjustr = 1.4f; - } else if (params->icm.working == "BruceRGB") { + } else if (params->icm.workingProfile == "BruceRGB") { adjustr = 1.8f; } @@ -5581,31 +4389,35 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu const bool gamutLch = settings->gamutLch; const float amountchroma = (float) settings->amchroma; - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); const 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]} }; - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params->icm.workingProfile); const double wp[3][3] = { {wprof[0][0], wprof[0][1], wprof[0][2]}, {wprof[1][0], wprof[1][1], wprof[1][2]}, {wprof[2][0], wprof[2][1], wprof[2][2]} }; +#ifdef _OPENMP #ifdef _DEBUG #pragma omp parallel default(shared) firstprivate(lold, lnew, MunsDebugInfo, pW) if (multiThread) #else #pragma omp parallel if (multiThread) +#endif #endif { #ifdef __SSE2__ float HHBuffer[W] ALIGNED16; float CCBuffer[W] ALIGNED16; #endif +#ifdef _OPENMP #pragma omp for schedule(dynamic, 16) +#endif for (int i = 0; i < H; i++) { if (avoidColorShift) @@ -5627,7 +4439,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu av = LVFU (lold->a[i][k]); bv = LVFU (lold->b[i][k]); STVF (HHBuffer[k], xatan2f (bv, av)); - STVF (CCBuffer[k], _mm_sqrt_ps (SQRV (av) + SQRV (bv)) / c327d68v); + STVF (CCBuffer[k], vsqrtf (SQRV (av) + SQRV (bv)) / c327d68v); } for (; k < W; k++) { @@ -5767,7 +4579,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu 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 { @@ -5775,7 +4587,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu 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); @@ -5865,7 +4677,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu 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 @@ -5911,8 +4723,8 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu factorsat = chromaCfactor; factor = factorsat; Color::transitred ( HH, Chprov1, dred, factorskin, protect_redcur, factorskinext, deltaHH, factorsat, factor); - atmp *= factor; - btmp *= factor; + atmp = LIM(atmp * factor, min(-42000.f, atmp), max(42000.f, atmp)); + btmp = LIM(btmp * factor, min(-42000.f, btmp), max(42000.f, btmp)); } // end C=f(L) @@ -5984,8 +4796,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu //update histogram C if (pW != 1) { //only with improccoordinator - int posp = (int)sqrt (atmp * atmp + btmp * btmp); - hist16Clad[posp]++; + histCCurve[histCFactor * sqrt(atmp * atmp + btmp * btmp)]++; } if (editPipette && editID == EUID_Lab_LCCurve) { @@ -6040,8 +4851,7 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu //update histo LC if (pW != 1) { //only with improccoordinator - int posl = Lprov1 * 327.68f; - hist16Llad[posl]++; + histLCurve[Lprov1 * histLFactor]++; } Chprov1 = sqrt (SQR (atmp) + SQR (btmp)) / 327.68f; @@ -6128,13 +4938,6 @@ SSEFUNCTION void ImProcFunctions::chromiLuminanceCurve (PipetteBuffer *pipetteBu } } // end of parallelization - if (pW != 1) { //only with improccoordinator - //update histogram C with data chromaticity and not with CC curve - hist16Clad.compressTo (histCCurve); - //update histogram L with data luminance - hist16Llad.compressTo (histLCurve); - } - #ifdef _DEBUG if (settings->verbose) { @@ -6272,53 +5075,44 @@ void ImProcFunctions::defringe (LabImage* lab) if (params->defringe.enabled && lab->W >= 8 && lab->H >= 8) { - PF_correct_RT (lab, lab, params->defringe.radius, params->defringe.threshold); + PF_correct_RT (lab, params->defringe.radius, params->defringe.threshold); } } void ImProcFunctions::defringecam (CieImage* ncie) { if (params->defringe.enabled && ncie->W >= 8 && ncie->H >= 8) { - PF_correct_RTcam (ncie, ncie, params->defringe.radius, params->defringe.threshold); + PF_correct_RTcam (ncie, params->defringe.radius, params->defringe.threshold); } } -void ImProcFunctions::badpixcam (CieImage* ncie, double rad, int thr, int mode, float skinprot, float chrom, int hotbad) +void ImProcFunctions::badpixcam (CieImage* ncie, double rad, int thr, int mode, float chrom, bool hotbad) { if (ncie->W >= 8 && ncie->H >= 8) { - Badpixelscam (ncie, ncie, rad, thr, mode, skinprot, chrom, hotbad); + Badpixelscam (ncie, rad, thr, mode, chrom, hotbad); } } -void ImProcFunctions::badpixlab (LabImage* lab, double rad, int thr, int mode, float skinprot, float chrom) +void ImProcFunctions::badpixlab (LabImage* lab, double rad, int thr, float chrom) { if (lab->W >= 8 && lab->H >= 8) { - BadpixelsLab (lab, lab, rad, thr, mode, skinprot, chrom); + BadpixelsLab (lab, rad, thr, 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.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; + float b_l = static_cast (params->dirpyrequalizer.hueskin.getBottomLeft()) / 100.f; + float t_l = static_cast (params->dirpyrequalizer.hueskin.getTopLeft()) / 100.f; + float t_r = static_cast (params->dirpyrequalizer.hueskin.getTopRight()) / 100.f; // if (params->dirpyrequalizer.algo=="FI") choice=0; // else if(params->dirpyrequalizer.algo=="LA") choice=1; - float artifact = (float) settings->artifact_cbdl; - if (artifact > 6.f) { - artifact = 6.f; - } - - if (artifact < 0.f) { - artifact = 1.f; - } - - float chrom = 50.f; - - if (params->dirpyrequalizer.gamutlab) { - ImProcFunctions::badpixlab (lab, artifact, 5, 3, params->dirpyrequalizer.skinprotect, chrom); //for artifacts + if (params->dirpyrequalizer.gamutlab && params->dirpyrequalizer.skinprotect != 0) { + constexpr float artifact = 4.f; + constexpr float chrom = 50.f; + ImProcFunctions::badpixlab (lab, artifact / scale, 5, chrom); //for artifacts } //dirpyrLab_equalizer(lab, lab, params->dirpyrequalizer.mult); @@ -6354,7 +5148,9 @@ void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wi EdgePreservingDecomposition epd (Wid, Hei); +#ifdef _OPENMP #pragma omp parallel for +#endif for (int i = 0; i < Hei; i++) for (int j = 0; j < Wid; j++) { @@ -6380,7 +5176,9 @@ void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wi //Restore past range, also desaturate a bit per Mantiuk's Color correction for tone mapping. float s = (1.0f + 38.7889f) * powf (Compression, 1.5856f) / (1.0f + 38.7889f * powf (Compression, 1.5856f)); #ifndef _DEBUG +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,10) +#endif #endif for (int i = 0; i < Hei; i++) @@ -6394,7 +5192,7 @@ void ImProcFunctions::EPDToneMapCIE (CieImage *ncie, float a_w, float c_, int Wi 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++) @@ -6461,11 +5259,15 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip //Due to the taking of logarithms, L must be nonnegative. Further, scale to 0 to 1 using nominal range of L, 0 to 15 bit. float minL = FLT_MAX; float maxL = 0.f; +#ifdef _OPENMP #pragma omp parallel +#endif { float lminL = FLT_MAX; float lmaxL = 0.f; +#ifdef _OPENMP #pragma omp for +#endif for (size_t i = 0; i < N; i++) { if (L[i] < lminL) { @@ -6477,7 +5279,9 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip } } +#ifdef _OPENMP #pragma omp critical +#endif { if (lminL < minL) { minL = lminL; @@ -6493,7 +5297,13 @@ void ImProcFunctions::EPDToneMap (LabImage *lab, unsigned int Iterates, int skip minL = 0.0f; //Disable the shift if there are no negative numbers. I wish there were just no negative numbers to begin with. } + if (maxL == 0.f) { // avoid division by zero + maxL = 1.f; + } + +#ifdef _OPENMP #pragma omp parallel for +#endif for (size_t i = 0; i < N; ++i) //{L[i] = (L[i] - minL)/32767.0f; @@ -6554,7 +5364,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double histogram.getSumAndAverage (sum, ave); //find median of luminance - int median = 0, count = histogram[0]; + size_t median = 0, count = histogram[0]; while (count < sum / 2) { median++; @@ -6731,7 +5541,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double //now tune hlcompr to bring back rawmax to 65535 - hlcomprthresh = 33; + hlcomprthresh = 0; //this is a series approximation of the actual formula for comp, //which is a transcendental equation float comp = (gain * ((float)whiteclip) / scale - 1.f) * 2.3f; // 2.3 instead of 2 to increase slightly comp @@ -6769,7 +5579,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double 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; @@ -6815,7 +5625,7 @@ void ImProcFunctions::getAutoExp (const LUTu &histogram, int histcompr, double gavg += histogram[i] * CurveFactory::gamma2((int)(corr*(i<workingSpaceInverseMatrix ( workingSpace ); const float wip[3][3] = { @@ -7012,10 +5822,11 @@ SSEFUNCTION void ImProcFunctions::lab2rgb (const LabImage &src, Imagefloat &dst, 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; + const float scaling = ColorToningParams::LABGRID_CORR_SCALE; + float a_scale = (params->colorToning.labgridAHigh - params->colorToning.labgridALow) / factor / scaling; + float a_base = params->colorToning.labgridALow / scaling; + float b_scale = (params->colorToning.labgridBHigh - params->colorToning.labgridBLow) / factor / scaling; + float b_base = params->colorToning.labgridBLow / scaling; #ifdef _OPENMP #pragma omp parallel for if (multiThread) diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 720f835da..96f339dd2 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -22,7 +22,6 @@ #include "imagefloat.h" #include "image16.h" #include "image8.h" -#include "procparams.h" #include "shmap.h" #include "coord2d.h" #include "color.h" @@ -34,46 +33,52 @@ #include "curves.h" #include "cplx_wavelet_dec.h" #include "pipettebuffer.h" +#include "gamutwarning.h" namespace rtengine { -using namespace procparams; +namespace procparams +{ + +class ProcParams; +class SpotEntry; + +struct DirPyrDenoiseParams; +struct SharpeningParams; +struct VignettingParams; +struct WaveletParams; + +} + +enum RenderingIntent : int; class ImProcFunctions { - - cmsHTRANSFORM monitorTransform; - cmsHTRANSFORM lab2outputTransform; - cmsHTRANSFORM output2monitorTransform; + std::unique_ptr gamutWarning; const ProcParams* params; double scale; bool multiThread; - void calcVignettingParams (int oW, int oH, const VignettingParams& vignetting, double &w2, double &h2, double& maxRadius, double &v, double &b, double &mul); + void calcVignettingParams(int oW, int oH, const procparams::VignettingParams& vignetting, double &w2, double &h2, double& maxRadius, double &v, double &b, double &mul); - void transformLuminanceOnly (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int oW, int oH, int fW, int fH); + void transformLuminanceOnly(Imagefloat* original, Imagefloat* transformed, int cx, int cy, int oW, int oH, int fW, int fH); 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); - void sharpenHaloCtrlcam (CieImage* ncie, float** blurmap, float** base, int W, int H); - void dcdamping (float** aI, float** aO, float damping, int W, int H); - - bool needsCA (); - bool needsDistortion (); - bool needsRotation (); - bool needsPerspective (); - bool needsGradient (); - bool needsVignetting (); - bool needsLCP (); + bool needsCA(); + bool needsDistortion(); + bool needsRotation(); + bool needsPerspective(); + bool needsGradient(); + bool needsVignetting(); + bool needsLCP(); bool needsLensfun(); // static cmsUInt8Number* Mempro = NULL; - inline void interpolateTransformCubic (Imagefloat* src, int xs, int ys, double Dx, double Dy, float *r, float *g, float *b, double mul) + inline void interpolateTransformCubic(Imagefloat* src, int xs, int ys, double Dx, double Dy, float *r, float *g, float *b, double mul) { const double A = -0.85; @@ -96,9 +101,9 @@ class ImProcFunctions rd = gd = bd = 0.0; for (int i = xs, ix = 0; i < xs + 4; i++, ix++) { - rd += src->r (k, i) * w[ix]; - gd += src->g (k, i) * w[ix]; - bd += src->b (k, i) * w[ix]; + rd += src->r(k, i) * w[ix]; + gd += src->g(k, i) * w[ix]; + bd += src->b(k, i) * w[ix]; } yr[kx] = rd; @@ -134,7 +139,7 @@ class ImProcFunctions // printf ("r=%g, g=%g\n", *r, *g); } - inline void interpolateTransformChannelsCubic (float** src, int xs, int ys, double Dx, double Dy, float *r, double mul) + inline void interpolateTransformChannelsCubic(float** src, int xs, int ys, double Dx, double Dy, float *r, double mul) { const double A = -0.85; @@ -196,172 +201,177 @@ public: double lumimul[3]; - ImProcFunctions (const ProcParams* iparams, bool imultiThread = true) - : monitorTransform (nullptr), lab2outputTransform (nullptr), output2monitorTransform (nullptr), params (iparams), scale (1), multiThread (imultiThread), lumimul{} {} - ~ImProcFunctions (); - bool needsLuminanceOnly() { return !(needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient());} - void setScale (double iscale); + ImProcFunctions(const ProcParams* iparams, bool imultiThread = true) + : monitorTransform(nullptr), params(iparams), scale(1), multiThread(imultiThread), lumimul{} {} + ~ImProcFunctions(); + bool needsLuminanceOnly() + { + return !(needsCA() || needsDistortion() || needsRotation() || needsPerspective() || needsLCP() || needsLensfun()) && (needsVignetting() || needsPCVignetting() || needsGradient()); + } + void setScale(double iscale); - bool needsTransform (); - bool needsPCVignetting (); + bool needsTransform(); + bool needsPCVignetting(); - void firstAnalysis (const Imagefloat* const working, const ProcParams ¶ms, LUTu & vhist16); - void updateColorProfiles (const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck); - void rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, - const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve ); - void rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, - SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, - const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, - 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, 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); + void firstAnalysis(const Imagefloat* const working, const procparams::ProcParams ¶ms, LUTu & vhist16); + void updateColorProfiles(const Glib::ustring& monitorProfile, RenderingIntent monitorIntent, bool softProof, bool gamutCheck); + void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, + int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, + const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); + void rgbProc(Imagefloat* working, LabImage* lab, PipetteBuffer *pipetteBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve, + int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit, float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2, + const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, + double expcomp, int hlcompr, int hlcomprthresh, DCPProfile *dcpProf, const DCPProfile::ApplyState &asIn, LUTu &histToneCurve, size_t chunkSize = 1, bool measure = false); + 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, 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); - void retreavergb (float &r, float &g, float &b); - void moyeqt (Imagefloat* working, float &moyS, float &eqty); + void retreavergb(float &r, float &g, float &b); + void moyeqt(Imagefloat* working, float &moyS, float &eqty); - void luminanceCurve (LabImage* lold, LabImage* lnew, LUTf &curve); - 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 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, 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 luminanceCurve(LabImage* lold, LabImage* lnew, LUTf &curve); + 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, + bool showSharpMask = false); + 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 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 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 (Imagefloat* src, Imagefloat* dst, float dScale); - void Lanczos (const LabImage* src, LabImage* dst, float scale); - void Lanczos (const Imagefloat* src, Imagefloat* dst, float scale); + void sharpening(LabImage* lab, const procparams::SharpeningParams &sharpenParam, bool showMask = false); + void sharpeningcam(CieImage* ncie, float** buffer, bool showMask = false); + 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(Imagefloat* src, Imagefloat* dst, float dScale); + void Lanczos(const LabImage* src, LabImage* dst, float scale); + void Lanczos(const Imagefloat* src, Imagefloat* dst, float scale); - void deconvsharpening (float** luminance, float** buffer, int W, int H, const SharpeningParams &sharpenParam); - void MLsharpen (LabImage* lab);// Manuel's clarity / sharpening - void MLmicrocontrast (float** luminance, int W, int H ); //Manuel's microcontrast - void MLmicrocontrast (LabImage* lab ); //Manuel's microcontrast - void MLmicrocontrastcam (CieImage* ncie ); //Manuel's microcontrast + void deconvsharpening(float** luminance, float** buffer, int W, int H, const procparams::SharpeningParams &sharpenParam); + void MLsharpen(LabImage* lab); // Manuel's clarity / sharpening + void MLmicrocontrast(float** luminance, int W, int H); //Manuel's microcontrast + void MLmicrocontrast(LabImage* lab); //Manuel's microcontrast + void MLmicrocontrastcam(CieImage* ncie); //Manuel's microcontrast - void impulsedenoise (LabImage* lab);//Emil's impulse denoise - void impulsedenoisecam (CieImage* ncie, float **buffers[3]); - void impulse_nr (LabImage* lab, double thresh); - void impulse_nrcam (CieImage* ncie, double thresh, float **buffers[3]); + void impulsedenoise(LabImage* lab); //Emil's impulse denoise + void impulsedenoisecam(CieImage* ncie, float **buffers[3]); + void impulse_nr(LabImage* lab, double thresh); + void impulse_nrcam(CieImage* ncie, double thresh, float **buffers[3]); - void dirpyrdenoise (LabImage* src);//Emil's pyramid denoise - void dirpyrequalizer (LabImage* lab, int scale);//Emil's wavelet + void dirpyrdenoise(LabImage* src); //Emil's pyramid denoise + void dirpyrequalizer(LabImage* lab, int scale); //Emil's wavelet - 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 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 EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterates, int skip, struct cont_params& cp, int W_L, int H_L, float max0, float min0); + void CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost); + void ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0); - void EPDToneMap (LabImage *lab, 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); + void EPDToneMap(LabImage *lab, 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; - void dirpyr (LabImage* data_fine, LabImage* data_coarse, int level, LUTf &rangefn_L, LUTf &rangefn_ab, - int pitch, int scale, const int luma, int chroma ); - void idirpyr (LabImage* data_coarse, LabImage* data_fine, int level, LUTf &rangefn_L, LUTf & nrwt_l, LUTf & nrwt_ab, - int pitch, int scale, const int luma, const int chroma/*, LUTf & Lcurve, LUTf & abcurve*/ ); +// procparams::DirPyrDenoiseParams dnparams; + void dirpyr(LabImage* data_fine, LabImage* data_coarse, int level, LUTf &rangefn_L, LUTf &rangefn_ab, + int pitch, int scale, const int luma, int chroma); + void idirpyr(LabImage* data_coarse, LabImage* data_fine, int level, LUTf &rangefn_L, LUTf & nrwt_l, LUTf & nrwt_ab, + 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, int skip); + 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, int skip); - void WaveletcontAllL (LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L, - 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 (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 *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, - 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 WaveletcontAllL(LabImage * lab, float **varhue, float **varchrom, wavelet_decomposition &WaveletCoeffs_L, + 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(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 *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, + 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); - void calckoe (float ** WavCoeffs_LL, const struct cont_params& cp, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC = nullptr); + 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); + void calckoe(float ** WavCoeffs_LL, const struct cont_params& cp, float ** koeLi, int level, int dir, int W_L, int H_L, float edd, float *maxkoeLi, float **tmC = nullptr); - void Median_Denoise ( float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); - 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 - void RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top ); - 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, 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); + void Median_Denoise(float **src, float **dst, int width, int height, Median medianType, int iterations, int numThreads, float **buffer = nullptr); + 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 + void RGBoutput_tile_row(float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top); + 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, 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, - const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); - 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 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); - float Mad (float * DataList, const int datalen); - float MadRgb (float * DataList, const int datalen); + 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, + const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb); + 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 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); + float Mad(float * DataList, const int datalen); + float MadRgb(float * DataList, const int datalen); // spot removal tool void removeSpots (Imagefloat* img, const std::vector &entries, const PreviewProps &pp); // 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, 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 skinprot, float chrom, int hotbad); - void badpixlab (LabImage* lab, double rad, int thr, int mode, float skinprot, float chrom); + 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, 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 chrom, bool hotbad); + void badpixlab(LabImage* lab, double rad, int thr, 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 skinprot, float chrom, int hotbad); - void BadpixelsLab (LabImage * src, LabImage * dst, double radius, int thresh, int mode, float skinprot, float chrom); + void PF_correct_RT(LabImage * lab, double radius, int thresh); + void PF_correct_RTcam(CieImage * ncie, double radius, int thresh); + void Badpixelscam(CieImage * ncie, double radius, int thresh, int mode, float chrom, bool hotbad); + void BadpixelsLab(LabImage * lab, double radius, int thresh, float chrom); + void dehaze(Imagefloat *rgb); 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); - Imagefloat* lab2rgbOut (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); - // CieImage *ciec; + void shadowsHighlights(LabImage *lab); + void softLight(LabImage *lab); + void labColorCorrectionRegions(LabImage *lab); - 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 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); - void lab2rgb (const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace); + 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); + // CieImage *ciec; + void workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, cmsHTRANSFORM &transform, bool normalizeIn = true, bool normalizeOut = true, bool keepTransForm = false) const; + + 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 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); + void lab2rgb(const LabImage &src, Imagefloat &dst, const Glib::ustring &workingSpace); }; } #endif diff --git a/rtengine/impulse_denoise.cc b/rtengine/impulse_denoise.cc index a40577f39..907afc1a1 100644 --- a/rtengine/impulse_denoise.cc +++ b/rtengine/impulse_denoise.cc @@ -31,7 +31,7 @@ using namespace std; namespace rtengine { -SSEFUNCTION void ImProcFunctions::impulse_nr (LabImage* lab, double thresh) +void ImProcFunctions::impulse_nr (LabImage* lab, double thresh) { // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // impulse noise removal @@ -260,7 +260,7 @@ SSEFUNCTION void ImProcFunctions::impulse_nr (LabImage* lab, double thresh) } -SSEFUNCTION void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh, float **buffers[3]) +void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh, float **buffers[3]) { // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // impulse noise removal diff --git a/rtengine/init.cc b/rtengine/init.cc index 0d4560c6b..ee092ae8f 100644 --- a/rtengine/init.cc +++ b/rtengine/init.cc @@ -32,6 +32,7 @@ #include "profilestore.h" #include "../rtgui/threadutils.h" #include "rtlensfun.h" +#include "procparams.h" namespace rtengine { @@ -49,7 +50,7 @@ int init (const Settings* s, Glib::ustring baseDir, Glib::ustring userSettingsDi RawImageSource::init(); #ifdef _OPENMP -#pragma omp parallel sections +#pragma omp parallel sections if (!settings->verbose) #endif { #ifdef _OPENMP diff --git a/rtengine/ipdehaze.cc b/rtengine/ipdehaze.cc new file mode 100644 index 000000000..c1092e335 --- /dev/null +++ b/rtengine/ipdehaze.cc @@ -0,0 +1,329 @@ +/* -*- 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 . + */ + +/* + * Haze removal using the algorithm described in the paper: + * + * Single Image Haze Removal Using Dark Channel Prior + * by He, Sun and Tang + * + * using a guided filter for the "soft matting" of the transmission map + * + */ + +#include +#include + +#include "guidedfilter.h" +#include "improcfun.h" +#include "procparams.h" +#include "rt_algo.h" +#include "rt_math.h" + +extern Options options; + +namespace rtengine { + +namespace { + +#if 0 +# define DEBUG_DUMP(arr) \ + do { \ + Imagefloat im(arr.width(), arr.height()); \ + const char *out = "/tmp/" #arr ".tif"; \ + for (int y = 0; y < im.getHeight(); ++y) { \ + for (int x = 0; x < im.getWidth(); ++x) { \ + im.r(y, x) = im.g(y, x) = im.b(y, x) = arr[y][x] * 65535.f; \ + } \ + } \ + im.saveTIFF(out, 16); \ + } while (false) +#else +# define DEBUG_DUMP(arr) +#endif + + +int get_dark_channel(const array2D &R, const array2D &G, const array2D &B, array2D &dst, int patchsize, const float ambient[3], bool clip, bool multithread) +{ + const int W = R.width(); + const int H = R.height(); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + for (int y = 0; y < H; y += patchsize) { + const int pH = min(y + patchsize, H); + for (int x = 0; x < W; x += patchsize) { + float val = RT_INFINITY_F; + const int pW = min(x + patchsize, W); + for (int yy = y; yy < pH; ++yy) { + for (int xx = x; xx < pW; ++xx) { + float r = R[yy][xx]; + float g = G[yy][xx]; + float b = B[yy][xx]; + if (ambient) { + r /= ambient[0]; + g /= ambient[1]; + b /= ambient[2]; + } + val = min(val, r, g, b); + } + } + if (clip) { + val = LIM01(val); + } + for (int yy = y; yy < pH; ++yy) { + std::fill(dst[yy] + x, dst[yy] + pW, val); + } + } + } + + return (W / patchsize + ((W % patchsize) > 0)) * (H / patchsize + ((H % patchsize) > 0)); +} + + +float estimate_ambient_light(const array2D &R, const array2D &G, const array2D &B, const array2D &dark, int patchsize, int npatches, float ambient[3]) +{ + const int W = R.width(); + const int H = R.height(); + + const auto get_percentile = + [](std::priority_queue &q, float prcnt) -> float + { + size_t n = LIM(q.size() * prcnt, 1, q.size()); + while (q.size() > n) { + q.pop(); + } + return q.top(); + }; + + float darklim = RT_INFINITY_F; + { + std::priority_queue p; + for (int y = 0; y < H; y += patchsize) { + for (int x = 0; x < W; x += patchsize) { + if (!OOG(dark[y][x], 1.f - 1e-5f)) { + p.push(dark[y][x]); + } + } + } + darklim = get_percentile(p, 0.95); + } + + std::vector> patches; + patches.reserve(npatches); + + for (int y = 0; y < H; y += patchsize) { + for (int x = 0; x < W; x += patchsize) { + if (dark[y][x] >= darklim && !OOG(dark[y][x], 1.f)) { + patches.push_back(std::make_pair(x, y)); + } + } + } + + if (options.rtSettings.verbose) { + std::cout << "dehaze: computing ambient light from " << patches.size() + << " patches" << std::endl; + } + + float bright_lim = RT_INFINITY_F; + { + std::priority_queue l; + + for (auto &p : patches) { + const int pW = min(p.first+patchsize, W); + const int pH = min(p.second+patchsize, H); + + for (int y = p.second; y < pH; ++y) { + for (int x = p.first; x < pW; ++x) { + l.push(R[y][x] + G[y][x] + B[y][x]); + } + } + } + + bright_lim = get_percentile(l, 0.95); + } + + double rr = 0, gg = 0, bb = 0; + int n = 0; + for (auto &p : patches) { + const int pW = min(p.first+patchsize, W); + const int pH = min(p.second+patchsize, H); + + for (int y = p.second; y < pH; ++y) { + for (int x = p.first; x < pW; ++x) { + float r = R[y][x]; + float g = G[y][x]; + float b = B[y][x]; + if (r + g + b >= bright_lim) { + rr += r; + gg += g; + bb += b; + ++n; + } + } + } + } + n = std::max(n, 1); + ambient[0] = rr / n; + ambient[1] = gg / n; + ambient[2] = bb / n; + + // taken from darktable + return darklim > 0 ? -1.125f * std::log(darklim) : std::log(std::numeric_limits::max()) / 2; +} + + +void extract_channels(Imagefloat *img, array2D &r, array2D &g, array2D &b, int radius, float epsilon, bool multithread) +{ + const int W = img->getWidth(); + const int H = img->getHeight(); + + array2D imgR(W, H, img->r.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(imgR, imgR, r, radius, epsilon, multithread); + + array2D imgG(W, H, img->g.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(imgG, imgG, g, radius, epsilon, multithread); + + array2D imgB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(imgB, imgB, b, radius, epsilon, multithread); +} + +} // namespace + + +void ImProcFunctions::dehaze(Imagefloat *img) +{ + if (!params->dehaze.enabled) { + return; + } + + img->normalizeFloatTo1(); + + const int W = img->getWidth(); + const int H = img->getHeight(); + const float strength = LIM01(float(params->dehaze.strength) / 100.f * 0.9f); + + if (options.rtSettings.verbose) { + std::cout << "dehaze: strength = " << strength << std::endl; + } + + array2D dark(W, H); + + int patchsize = max(int(5 / scale), 2); + int npatches = 0; + float ambient[3]; + array2D &t_tilde = dark; + float max_t = 0.f; + + { + array2D R(W, H); + array2D G(W, H); + array2D B(W, H); + extract_channels(img, R, G, B, patchsize, 1e-1, multiThread); + + patchsize = max(max(W, H) / 600, 2); + npatches = get_dark_channel(R, G, B, dark, patchsize, nullptr, false, multiThread); + DEBUG_DUMP(dark); + + max_t = estimate_ambient_light(R, G, B, dark, patchsize, npatches, ambient); + + if (options.rtSettings.verbose) { + std::cout << "dehaze: ambient light is " + << ambient[0] << ", " << ambient[1] << ", " << ambient[2] + << std::endl; + } + + get_dark_channel(R, G, B, dark, patchsize, ambient, true, multiThread); + } + + if (min(ambient[0], ambient[1], ambient[2]) < 0.01f) { + if (options.rtSettings.verbose) { + std::cout << "dehaze: no haze detected" << std::endl; + } + img->normalizeFloatTo65535(); + return; // probably no haze at all + } + + DEBUG_DUMP(t_tilde); + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + dark[y][x] = 1.f - strength * dark[y][x]; + } + } + + const int radius = patchsize * 4; + const float epsilon = 1e-5; + array2D &t = t_tilde; + + { + array2D guideB(W, H, img->b.ptrs, ARRAY2D_BYREFERENCE); + guidedFilter(guideB, t_tilde, t, radius, epsilon, multiThread); + } + + DEBUG_DUMP(t); + + if (options.rtSettings.verbose) { + std::cout << "dehaze: max distance is " << max_t << std::endl; + } + + float depth = -float(params->dehaze.depth) / 100.f; + const float t0 = max(1e-3f, std::exp(depth * max_t)); + const float teps = 1e-3f; +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < H; ++y) { + for (int x = 0; x < W; ++x) { + // ensure that the transmission is such that to avoid clipping... + float rgb[3] = { img->r(y, x), img->g(y, x), img->b(y, x) }; + // ... t >= tl to avoid negative values + float tl = 1.f - min(rgb[0]/ambient[0], rgb[1]/ambient[1], rgb[2]/ambient[2]); + // ... t >= tu to avoid values > 1 + float tu = t0 - teps; + for (int c = 0; c < 3; ++c) { + if (ambient[c] < 1) { + tu = max(tu, (rgb[c] - ambient[c])/(1.f - ambient[c])); + } + } + float mt = max(t[y][x], t0, tl + teps, tu + teps); + if (params->dehaze.showDepthMap) { + img->r(y, x) = img->g(y, x) = img->b(y, x) = LIM01(1.f - mt); + } else { + float r = (rgb[0] - ambient[0]) / mt + ambient[0]; + float g = (rgb[1] - ambient[1]) / mt + ambient[1]; + float b = (rgb[2] - ambient[2]) / mt + ambient[2]; + + img->r(y, x) = r; + img->g(y, x) = g; + img->b(y, x) = b; + } + } + } + + img->normalizeFloatTo65535(); +} + + +} // namespace rtengine diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index ba2fe6ffb..8790f003c 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -26,19 +26,68 @@ #include "curves.h" #include "alignedbuffer.h" #include "color.h" +#include "procparams.h" namespace rtengine { +extern void filmlike_clip(float *r, float *g, float *b); + extern const Settings* settings; +namespace { + +inline void copyAndClampLine(const float *src, unsigned char *dst, const int W) +{ + for (int j = 0, iy = 0; j < W; ++j) { + float r = src[iy] * MAXVALF; + float g = src[iy+1] * MAXVALF; + float b = src[iy+2] * MAXVALF; + dst[iy] = uint16ToUint8Rounded(CLIP(r)); + dst[iy+1] = uint16ToUint8Rounded(CLIP(g)); + dst[iy+2] = uint16ToUint8Rounded(CLIP(b)); + iy += 3; + } +} + + +inline void copyAndClamp(const LabImage *src, unsigned char *dst, const double rgb_xyz[3][3], bool multiThread) +{ + int W = src->W; + int H = src->H; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int i = 0; i < H; ++i) { + float* rL = src->L[i]; + float* ra = src->a[i]; + float* rb = src->b[i]; + int ix = i * 3 * W; + + float R, G, B; + float x_, y_, z_; + + for (int j = 0; j < W; ++j) { + Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_ ); + Color::xyz2rgb(x_, y_, z_, R, G, B, rgb_xyz); + + dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[R]); + dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[G]); + dst[ix++] = uint16ToUint8Rounded(Color::gamma2curve[B]); + } + } +} + +} // namespace + // Used in ImProcCoordinator::updatePreviewImage (rtengine/improccoordinator.cc) // Crop::update (rtengine/dcrop.cc) // Thumbnail::processImage (rtengine/rtthumbnail.cc) // // If monitorTransform, divide by 327.68 then apply monitorTransform (which can integrate soft-proofing) // otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve -void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) +void ImProcFunctions::lab2monitorRgb(LabImage* lab, Image8* image) { if (monitorTransform) { @@ -52,7 +101,18 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) #endif { AlignedBuffer pBuf(3 * lab->W); + AlignedBuffer mBuf(3 * lab->W); + + AlignedBuffer gwBuf1; + AlignedBuffer gwBuf2; + + if (gamutWarning) { + gwBuf1.resize(3 * lab->W); + gwBuf2.resize(3 * lab->W); + } + float *buffer = pBuf.data; + float *outbuffer = mBuf.data; #ifdef _OPENMP #pragma omp for schedule(dynamic,16) @@ -73,43 +133,16 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) buffer[iy++] = rb[j] / 327.68f; } - cmsDoTransform (monitorTransform, buffer, data + ix, W); + cmsDoTransform (monitorTransform, buffer, outbuffer, W); + copyAndClampLine(outbuffer, data + ix, W); + + if (gamutWarning) { + gamutWarning->markLine(image, i, buffer, gwBuf1.data, gwBuf2.data); + } } } // End of parallelization } else { - - int W = lab->W; - int H = lab->H; - unsigned char * data = image->data; - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - - for (int i = 0; i < H; ++i) { - float* rL = lab->L[i]; - float* ra = lab->a[i]; - float* rb = lab->b[i]; - int ix = i * 3 * W; - - float R, G, B; - float x_, y_, z_; - - for (int j = 0; j < W; ++j) { - - //float L1=rL[j],a1=ra[j],b1=rb[j];//for testing - - Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_ ); - - Color::xyz2srgb(x_, y_, z_, R, G, B); - - /* copy RGB */ - //int R1=((int)gamma2curve[(R)]) - data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[R]); - data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[G]); - data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[B]); - } - } + copyAndClamp(lab, image->data, sRGB_xyz, multiThread); } } @@ -122,7 +155,7 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image) // // 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); @@ -142,23 +175,25 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, ch = lab->H - cy; } - Image8* image = new Image8 (cw, ch); + Image8* image = new Image8(cw, ch); Glib::ustring profile; bool standard_gamma; - if(settings->HistogramWorking) { - profile = icm.working; + if (settings->HistogramWorking && consider_histogram_settings) { + profile = icm.workingProfile; standard_gamma = true; } else { - profile = icm.output; - if (icm.output.empty() || icm.output == ColorManagementParams::NoICMString) { + profile = icm.outputProfile; + + if (icm.outputProfile.empty() || icm.outputProfile == ColorManagementParams::NoICMString) { profile = "sRGB"; } + standard_gamma = false; } - cmsHPROFILE oprof = ICCStore::getInstance()->getProfile (profile); + cmsHPROFILE oprof = ICCStore::getInstance()->getProfile(profile); if (oprof) { cmsHPROFILE oprofG = oprof; @@ -168,14 +203,16 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, } cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; + if (icm.outputBPC) { flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } - lcmsMutex->lock (); + + lcmsMutex->lock(); cmsHPROFILE LabIProf = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (LabIProf, TYPE_Lab_DBL, oprofG, TYPE_RGB_8, icm.outputIntent, flags); // NOCACHE is important for thread safety + cmsHTRANSFORM hTransform = cmsCreateTransform (LabIProf, TYPE_Lab_DBL, oprofG, TYPE_RGB_FLT, icm.outputIntent, flags); // NOCACHE is important for thread safety cmsCloseProfile(LabIProf); - lcmsMutex->unlock (); + lcmsMutex->unlock(); unsigned char *data = image->data; @@ -185,7 +222,9 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, #endif { AlignedBuffer pBuf(3 * cw); + AlignedBuffer oBuf(3 * cw); double *buffer = pBuf.data; + float *outbuffer = oBuf.data; int condition = cy + ch; #ifdef _OPENMP @@ -205,7 +244,8 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, buffer[iy++] = rb[j] / 327.68f; } - cmsDoTransform (hTransform, buffer, data + ix, cw); + cmsDoTransform (hTransform, buffer, outbuffer, cw); + copyAndClampLine(outbuffer, data + ix, cw); } } // End of parallelization @@ -215,32 +255,8 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, cmsCloseProfile(oprofG); } } else { - - const auto xyz_rgb = ICCStore::getInstance()->workingSpaceInverseMatrix (profile); - -#ifdef _OPENMP - #pragma omp parallel for schedule(dynamic,16) if (multiThread) -#endif - - for (int i = cy; i < cy + ch; ++i) { - float* rL = lab->L[i]; - float* ra = lab->a[i]; - float* rb = lab->b[i]; - int ix = 3 * i * cw; - - float R, G, B; - float x_, y_, z_; - - for (int j = cx; j < cx + cw; ++j) { - Color::Lab2XYZ(rL[j], ra[j], rb[j], x_, y_, z_); - - Color::xyz2rgb(x_, y_, z_, R, G, B, xyz_rgb); - - image->data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[R]); - image->data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[G]); - image->data[ix++] = uint16ToUint8Rounded(Color::gamma2curve[B]); - } - } + const auto xyz_rgb = ICCStore::getInstance()->workingSpaceInverseMatrix(profile); + copyAndClamp(lab, image->data, xyz_rgb, multiThread); } return image; @@ -252,7 +268,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, * 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 +278,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, * 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 */ -Imagefloat* ImProcFunctions::lab2rgbOut (LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga) +Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm) { if (cx < 0) { @@ -281,35 +297,30 @@ Imagefloat* ImProcFunctions::lab2rgbOut (LabImage* lab, int cx, int cy, int cw, ch = lab->H - cy; } - Imagefloat* image = new Imagefloat (cw, ch); - - cmsHPROFILE oprof = nullptr; - if (ga) { - lcmsMutex->lock (); - ICCStore::getInstance()->getGammaArray(icm, *ga); - oprof = ICCStore::getInstance()->createGammaProfile(icm, *ga); - lcmsMutex->unlock (); - } else { - oprof = ICCStore::getInstance()->getProfile (icm.output); - } + Imagefloat* image = new Imagefloat(cw, ch); + cmsHPROFILE oprof = ICCStore::getInstance()->getProfile(icm.outputProfile); if (oprof) { cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; + if (icm.outputBPC) { flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } - lcmsMutex->lock (); + + lcmsMutex->lock(); cmsHPROFILE iprof = cmsCreateLab4Profile(nullptr); - cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, oprof, TYPE_RGB_FLT, icm.outputIntent, flags); - lcmsMutex->unlock (); + 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) #endif + for (int i = cy; i < cy + ch; i++) { float R, G, B; float* rL = lab->L[i]; @@ -318,7 +329,7 @@ Imagefloat* ImProcFunctions::lab2rgbOut (LabImage* lab, int cx, int cy, int cw, 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; @@ -340,4 +351,231 @@ Imagefloat* ImProcFunctions::lab2rgbOut (LabImage* lab, int cx, int cy, int cw, return image; } + +void ImProcFunctions::workingtrc(const Imagefloat* src, Imagefloat* dst, int cw, int ch, int mul, const Glib::ustring &profile, double gampos, double slpos, cmsHTRANSFORM &transform, bool normalizeIn, bool normalizeOut, bool keepTransForm) const +{ + const TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + + double dx = Color::D50x; + double dz = Color::D50z; + { + dx = dz = 1.0; + } + const float toxyz[3][3] = { + { + static_cast(wprof[0][0] / (dx * (normalizeIn ? 65535.0 : 1.0))), //I have suppressed / Color::D50x + static_cast(wprof[0][1] / (dx * (normalizeIn ? 65535.0 : 1.0))), + static_cast(wprof[0][2] / (dx * (normalizeIn ? 65535.0 : 1.0))) + }, { + static_cast(wprof[1][0] / (normalizeIn ? 65535.0 : 1.0)), + static_cast(wprof[1][1] / (normalizeIn ? 65535.0 : 1.0)), + static_cast(wprof[1][2] / (normalizeIn ? 65535.0 : 1.0)) + }, { + static_cast(wprof[2][0] / (dz * (normalizeIn ? 65535.0 : 1.0))), //I have suppressed / Color::D50z + static_cast(wprof[2][1] / (dz * (normalizeIn ? 65535.0 : 1.0))), + static_cast(wprof[2][2] / (dz * (normalizeIn ? 65535.0 : 1.0))) + } + }; + + cmsHTRANSFORM hTransform = nullptr; + if (transform) { + hTransform = transform; + } else { + + double pwr = 1.0 / gampos; + double ts = slpos; + int five = mul; + + + if (gampos < 1.0) { + pwr = gampos; + gampos = 1. / gampos; + five = -mul; + } + + // int select_temp = 1; //5003K + constexpr double eps = 0.000000001; // not divide by zero + + enum class ColorTemp { + D50 = 5003, // for Widegamut, ProPhoto Best, Beta -> D50 + D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 + D60 = 6005 // for ACES AP0 and AP1 + + }; + ColorTemp temp = ColorTemp::D50; + + float p[6]; //primaries + + //primaries for 10 working profiles ==> output profiles + if (profile == "WideGamut") { + p[0] = 0.7350; //Widegamut primaries + p[1] = 0.2650; + p[2] = 0.1150; + p[3] = 0.8260; + p[4] = 0.1570; + p[5] = 0.0180; + } else if (profile == "Adobe RGB") { + p[0] = 0.6400; //Adobe primaries + p[1] = 0.3300; + p[2] = 0.2100; + p[3] = 0.7100; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (profile == "sRGB") { + p[0] = 0.6400; // sRGB primaries + p[1] = 0.3300; + p[2] = 0.3000; + p[3] = 0.6000; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (profile == "BruceRGB") { + p[0] = 0.6400; // Bruce primaries + p[1] = 0.3300; + p[2] = 0.2800; + p[3] = 0.6500; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (profile == "Beta RGB") { + p[0] = 0.6888; // Beta primaries + p[1] = 0.3112; + p[2] = 0.1986; + p[3] = 0.7551; + p[4] = 0.1265; + p[5] = 0.0352; + } else if (profile == "BestRGB") { + p[0] = 0.7347; // Best primaries + p[1] = 0.2653; + p[2] = 0.2150; + p[3] = 0.7750; + p[4] = 0.1300; + p[5] = 0.0350; + } else if (profile == "Rec2020") { + p[0] = 0.7080; // Rec2020 primaries + p[1] = 0.2920; + p[2] = 0.1700; + p[3] = 0.7970; + p[4] = 0.1310; + p[5] = 0.0460; + temp = ColorTemp::D65; + } else if (profile == "ACESp0") { + p[0] = 0.7347; // ACES P0 primaries + p[1] = 0.2653; + p[2] = 0.0000; + p[3] = 1.0; + p[4] = 0.0001; + p[5] = -0.0770; + temp = ColorTemp::D60; + } else if (profile == "ACESp1") { + p[0] = 0.713; // ACES P1 primaries + p[1] = 0.293; + p[2] = 0.165; + p[3] = 0.830; + p[4] = 0.128; + p[5] = 0.044; + temp = ColorTemp::D60; + } else if (profile == "ProPhoto") { + p[0] = 0.7347; //ProPhoto and default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + } else { + p[0] = 0.7347; //default primaries always unused + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + } + + if (slpos == 0) { + slpos = eps; + } + + GammaValues g_a; //gamma parameters + constexpr int mode = 0; + Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 + + + cmsFloat64Number gammaParams[7]; + gammaParams[4] = g_a[3] * ts; + gammaParams[0] = gampos; + gammaParams[1] = 1. / (1.0 + g_a[4]); + gammaParams[2] = g_a[4] / (1.0 + g_a[4]); + gammaParams[3] = 1. / slpos; + gammaParams[5] = 0.0; + gammaParams[6] = 0.0; + // printf("ga0=%f ga1=%f ga2=%f ga3=%f ga4=%f\n", ga0, ga1, ga2, ga3, ga4); + + // 7 parameters for smoother curves + cmsCIExyY xyD; + cmsWhitePointFromTemp(&xyD, (double)temp); + if (profile == "ACESp0") { + xyD = {0.32168, 0.33767, 1.0};//refine white point to avoid differences + } + + cmsToneCurve* GammaTRC[3]; + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, five, gammaParams);//5 = more smoother than 4 + + const cmsCIExyYTRIPLE Primaries = { + {p[0], p[1], 1.0}, // red + {p[2], p[3], 1.0}, // green + {p[4], p[5], 1.0} // blue + }; + const cmsHPROFILE oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); + cmsFreeToneCurve(GammaTRC[0]); + + if (oprofdef) { + constexpr cmsUInt32Number flags = cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE; + const cmsHPROFILE iprof = ICCStore::getInstance()->getXYZProfile(); + lcmsMutex->lock(); + hTransform = cmsCreateTransform(iprof, TYPE_RGB_FLT, oprofdef, TYPE_RGB_FLT, params->icm.outputIntent, flags); + lcmsMutex->unlock(); + } + } + if (hTransform) { +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { + AlignedBuffer pBuf(cw * 3); + const float normalize = normalizeOut ? 65535.f : 1.f; + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) nowait +#endif + + for (int i = 0; i < ch; ++i) { + float *p = pBuf.data; + for (int j = 0; j < cw; ++j) { + const float r = src->r(i, j); + const float g = src->g(i, j); + const float b = src->b(i, j); + + *(p++) = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b; + *(p++) = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b; + *(p++) = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b; + } + p = pBuf.data; + cmsDoTransform(hTransform, p, p, cw); + for (int j = 0; j < cw; ++j) { + dst->r(i, j) = *(p++) * normalize; + dst->g(i, j) = *(p++) * normalize; + dst->b(i, j) = *(p++) * normalize; + } + } + } + if (!keepTransForm) { + cmsDeleteTransform(hTransform); + hTransform = nullptr; + } + transform = hTransform; + } +} + + } diff --git a/rtengine/iplabregions.cc b/rtengine/iplabregions.cc new file mode 100644 index 000000000..5945398d2 --- /dev/null +++ b/rtengine/iplabregions.cc @@ -0,0 +1,344 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright 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 . + */ + +#ifdef _OPENMP +#include +#endif + +#include "improcfun.h" +#include "guidedfilter.h" +#include "procparams.h" +//#define BENCHMARK +#include "StopWatch.h" +#include "sleef.c" + +namespace { + +#ifdef __SSE2__ +void fastlin2log(float *x, float factor, float base, int w) +{ + float baseLog = 1.f / xlogf(base); + vfloat baseLogv = F2V(baseLog); + factor = factor * (base - 1.f); + vfloat factorv = F2V(factor); + vfloat onev = F2V(1.f); + int i = 0; + for (; i < w - 3; i += 4) { + STVFU(x[i], xlogf(LVFU(x[i]) * factorv + onev) * baseLogv); + } + for (; i < w; ++i) { + x[i] = xlogf(x[i] * factor + 1.f) * baseLog; + } +} +#endif + +} + +namespace rtengine { + +void ImProcFunctions::labColorCorrectionRegions(LabImage *lab) +{ + if (!params->colorToning.enabled || params->colorToning.method != "LabRegions") { + return; + } +BENCHFUN + int n = params->colorToning.labregions.size(); + int show_mask_idx = params->colorToning.labregionsShowMask; + if (show_mask_idx >= n) { + show_mask_idx = -1; + } + std::vector> hmask(n); + std::vector> cmask(n); + std::vector> lmask(n); + + const int begin_idx = max(show_mask_idx, 0); + const int end_idx = (show_mask_idx < 0 ? n : show_mask_idx+1); + + for (int i = begin_idx; i < end_idx; ++i) { + auto &r = params->colorToning.labregions[i]; + if (!r.hueMask.empty() && r.hueMask[0] != FCT_Linear) { + hmask[i].reset(new FlatCurve(r.hueMask, true)); + } + if (!r.chromaticityMask.empty() && r.chromaticityMask[0] != FCT_Linear) { + cmask[i].reset(new FlatCurve(r.chromaticityMask, false)); + } + if (!r.lightnessMask.empty() && r.lightnessMask[0] != FCT_Linear) { + lmask[i].reset(new FlatCurve(r.lightnessMask, false)); + } + } + + std::vector> abmask(n); + std::vector> Lmask(n); + for (int i = begin_idx; i < end_idx; ++i) { + abmask[i](lab->W, lab->H); + Lmask[i](lab->W, lab->H); + } + + array2D guide(lab->W, lab->H); + + // magic constant c_factor: normally chromaticity is in [0; 42000] (see color.h), but here we use the constant to match how the chromaticity pipette works (see improcfun.cc lines 4705-4706 and color.cc line 1930 + constexpr float c_factor = 327.68f / 48000.f; + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + float cBuffer[lab->W]; + float hBuffer[lab->W]; +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic, 16) +#endif + for (int y = 0; y < lab->H; ++y) { +#ifdef __SSE2__ + // vectorized precalculation + Color::Lab2Lch(lab->a[y], lab->b[y], cBuffer, hBuffer, lab->W); + fastlin2log(cBuffer, c_factor, 10.f, lab->W); +#endif + for (int x = 0; x < lab->W; ++x) { + const float l = lab->L[y][x] / 32768.f; + guide[y][x] = LIM01(l); +#ifdef __SSE2__ + // use precalculated values + const float c = cBuffer[x]; + float h = hBuffer[x]; +#else + float c, h; + Color::Lab2Lch(lab->a[y][x], lab->b[y][x], c, h); + c = xlin2log(c * c_factor, 10.f); +#endif + h = Color::huelab_to_huehsv2(h); + h += 1.f/6.f; // offset the hue because we start from purple instead of red + if (h > 1.f) { + h -= 1.f; + } + h = xlin2log(h, 3.f); + + for (int i = begin_idx; i < end_idx; ++i) { + auto &hm = hmask[i]; + auto &cm = cmask[i]; + auto &lm = lmask[i]; + float blend = LIM01((hm ? hm->getVal(h) : 1.f) * (cm ? cm->getVal(c) : 1.f) * (lm ? lm->getVal(l) : 1.f)); + Lmask[i][y][x] = abmask[i][y][x] = blend; + } + } + } + } + + for (int i = begin_idx; i < end_idx; ++i) { + float blur = params->colorToning.labregions[i].maskBlur; + blur = blur < 0.f ? -1.f/blur : 1.f + blur; + int r1 = max(int(4 / scale * blur + 0.5), 1); + int r2 = max(int(25 / scale * blur + 0.5), 1); + rtengine::guidedFilter(guide, abmask[i], abmask[i], r1, 0.001, multiThread); + rtengine::guidedFilter(guide, Lmask[i], Lmask[i], r2, 0.0001, multiThread); + } + + if (show_mask_idx >= 0) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < lab->H; ++y) { + for (int x = 0; x < lab->W; ++x) { + auto blend = abmask[show_mask_idx][y][x]; + lab->a[y][x] = 0.f; + lab->b[y][x] = blend * 42000.f; + lab->L[y][x] = LIM(lab->L[y][x] + 32768.f * blend, 0.f, 32768.f); + } + } + + return; + } + + const auto abcoord = + [](float x) -> float + { + return /*12000.f **/ SGN(x) * xlog2lin(std::abs(x), 4.f); + }; + + float abca[n]; + float abcb[n]; + float rs[n]; + float slope[n]; + float offset[n]; + float power[n]; + int channel[n]; + for (int i = 0; i < n; ++i) { + auto &r = params->colorToning.labregions[i]; + abca[i] = abcoord(r.a); + abcb[i] = abcoord(r.b); + rs[i] = 1.f + r.saturation / (SGN(r.saturation) > 0 ? 50.f : 100.f); + slope[i] = r.slope; + offset[i] = r.offset; + power[i] = r.power; + channel[i] = r.channel; + } + + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + TMatrix iws = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); + + const auto CDL = + [=](float &l, float &a, float &b, float slope, float offset, float power, float saturation) -> void + { + if (slope != 1.f || offset != 0.f || power != 1.f || saturation != 1.f) { + float rgb[3]; + float x, y, z; + Color::Lab2XYZ(l, a, b, x, y, z); + Color::xyz2rgb(x, y, z, rgb[0], rgb[1], rgb[2], iws); + for (int i = 0; i < 3; ++i) { + rgb[i] = (pow_F(max((rgb[i] / 65535.f) * slope + offset, 0.f), power)) * 65535.f; + } + if (saturation != 1.f) { + float Y = Color::rgbLuminance(rgb[0], rgb[1], rgb[2], ws); + for (int i = 0; i < 3; ++i) { + rgb[i] = max(Y + saturation * (rgb[i] - Y), 0.f); + } + } + Color::rgbxyz(rgb[0], rgb[1], rgb[2], x, y, z, ws); + Color::XYZ2Lab(x, y, z, l, a, b); + } + }; + + const auto chan = + [=](float prev_l, float prev_a, float prev_b, float &l, float &a, float &b, int channel) -> void + { + if (channel >= 0) { + float prev_rgb[3]; + float rgb[3]; + float x, y, z; + Color::Lab2XYZ(l, a, b, x, y, z); + Color::xyz2rgb(x, y, z, rgb[0], rgb[1], rgb[2], iws); + Color::Lab2XYZ(prev_l, prev_a, prev_b, x, y, z); + Color::xyz2rgb(x, y, z, prev_rgb[0], prev_rgb[1], prev_rgb[2], iws); + prev_rgb[channel] = rgb[channel]; + Color::rgbxyz(prev_rgb[0], prev_rgb[1], prev_rgb[2], x, y, z, ws); + Color::XYZ2Lab(x, y, z, l, a, b); + } + }; + +#ifdef __SSE2__ + const auto CDL_v = + [=](vfloat &l, vfloat &a, vfloat &b, float slope, float offset, float power, float saturation) -> void + { + if (slope != 1.f || offset != 0.f || power != 1.f || saturation != 1.f) { + float ll[4]; + float aa[4]; + float bb[4]; + STVFU(ll[0], l); + STVFU(aa[0], a); + STVFU(bb[0], b); + for (int i = 0; i < 4; ++i) { + CDL(ll[i], aa[i], bb[i], slope, offset, power, saturation); + } + l = LVFU(ll[0]); + a = LVFU(aa[0]); + b = LVFU(bb[0]); + } + }; + + const auto chan_v = + [=](vfloat prev_l, vfloat prev_a, vfloat prev_b, vfloat &l, vfloat &a, vfloat &b, int channel) -> void + { + if (channel >= 0) { + float ll[4]; + float aa[4]; + float bb[4]; + STVFU(ll[0], l); + STVFU(aa[0], a); + STVFU(bb[0], b); + float prev_ll[4]; + float prev_aa[4]; + float prev_bb[4]; + STVFU(prev_ll[0], prev_l); + STVFU(prev_aa[0], prev_a); + STVFU(prev_bb[0], prev_b); + for (int i = 0; i < 4; ++i) { + chan(prev_ll[i], prev_aa[i], prev_bb[i], ll[i], aa[i], bb[i], channel); + } + l = LVFU(ll[0]); + a = LVFU(aa[0]); + b = LVFU(bb[0]); + } + }; +#endif + +#ifdef _OPENMP + #pragma omp parallel if (multiThread) +#endif + { +#ifdef __SSE2__ + vfloat c42000v = F2V(42000.f); + vfloat cm42000v = F2V(-42000.f); +#endif +#ifdef _OPENMP + #pragma omp for +#endif + for (int y = 0; y < lab->H; ++y) { + int x = 0; +#ifdef __SSE2__ + for (; x < lab->W - 3; x += 4) { + vfloat lv = LVFU(lab->L[y][x]); + vfloat av = LVFU(lab->a[y][x]); + vfloat bv = LVFU(lab->b[y][x]); + + for (int i = 0; i < n; ++i) { + vfloat blendv = LVFU(abmask[i][y][x]); + vfloat l_newv = lv; + vfloat a_newv = vclampf(av + lv * F2V(abca[i]), cm42000v, c42000v); + vfloat b_newv = vclampf(bv + lv * F2V(abcb[i]), cm42000v, c42000v); + CDL_v(l_newv, a_newv, b_newv, slope[i], offset[i], power[i], rs[i]); + l_newv = vmaxf(l_newv, ZEROV); + chan_v(lv, av, bv, l_newv, a_newv, b_newv, channel[i]); + lv = vintpf(LVFU(Lmask[i][y][x]), l_newv, lv); + av = vintpf(blendv, a_newv, av); + bv = vintpf(blendv, b_newv, bv); + } + STVFU(lab->L[y][x], lv); + STVFU(lab->a[y][x], av); + STVFU(lab->b[y][x], bv); + } +#endif + for (; x < lab->W; ++x) { + float l = lab->L[y][x]; + float a = lab->a[y][x]; + float b = lab->b[y][x]; + + for (int i = 0; i < n; ++i) { + float blend = abmask[i][y][x]; + float l_new = l; + float a_new = LIM(a + l * abca[i], -42000.f, 42000.f); + float b_new = LIM(b + l * abcb[i], -42000.f, 42000.f); + CDL(l_new, a_new, b_new, slope[i], offset[i], power[i], rs[i]); + l_new = max(l_new, 0.f); + chan(l, a, b, l_new, a_new, b_new, channel[i]); + l = intp(Lmask[i][y][x], l_new, l); + a = intp(blend, a_new, a); + b = intp(blend, b_new, b); + } + lab->L[y][x] = l; + lab->a[y][x] = a; + lab->b[y][x] = b; + } + } + } +} + +} // namespace rtengine diff --git a/rtengine/iplocalcontrast.cc b/rtengine/iplocalcontrast.cc index 24739fb6b..1bf21829e 100644 --- a/rtengine/iplocalcontrast.cc +++ b/rtengine/iplocalcontrast.cc @@ -26,9 +26,10 @@ #include #endif -#include "improcfun.h" -#include "gauss.h" #include "array2D.h" +#include "gauss.h" +#include "improcfun.h" +#include "procparams.h" namespace rtengine { @@ -62,7 +63,7 @@ void ImProcFunctions::localContrast(LabImage *lab) bufval *= (bufval > 0.f) ? light : dark; } - lab->L[y][x] += bufval; + lab->L[y][x] = std::max(0.0001f, lab->L[y][x] + bufval); } } } diff --git a/rtengine/ipresize.cc b/rtengine/ipresize.cc index ba559b2a0..823beb23e 100644 --- a/rtengine/ipresize.cc +++ b/rtengine/ipresize.cc @@ -22,6 +22,7 @@ #include "alignedbuffer.h" #include "opthelper.h" #include "rt_math.h" +#include "procparams.h" #include "sleef.c" //#define PROFILE @@ -54,7 +55,9 @@ void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float sca const float sc = min (scale, 1.0f); const int support = static_cast (2.0f * a / sc) + 1; +#ifdef _OPENMP #pragma omp parallel +#endif { // storage for precomputed parameters for horisontal interpolation float * wwh = new float[support * dst->getWidth()]; @@ -97,7 +100,9 @@ void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float sca } // Phase 2: do actual interpolation +#ifdef _OPENMP #pragma omp for +#endif for (int i = 0; i < dst->getHeight(); i++) { @@ -162,9 +167,9 @@ void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float sca b += wh[k] * lb[jj]; } - 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)); + 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)); } } @@ -178,7 +183,7 @@ void ImProcFunctions::Lanczos (const Imagefloat* src, Imagefloat* dst, float sca } -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; @@ -232,6 +237,7 @@ SSEFUNCTION void ImProcFunctions::Lanczos (const LabImage* src, LabImage* dst, f float* const lb = aligned_buffer_lb.data; // weights for interpolation in y direction float w[support] ALIGNED64; + memset(w, 0, sizeof(w)); // Phase 2: do actual interpolation #ifdef _OPENMP @@ -373,6 +379,7 @@ float ImProcFunctions::resizeScale (const ProcParams* params, int fw, int fh, in } else { dScale = (double)params->resize.height / (double)refh; } + dScale = (dScale > 1.0 && !params->resize.allowUpscaling) ? 1.0 : dScale; break; diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc index e79ee52a3..9d94e9326 100644 --- a/rtengine/ipretinex.cc +++ b/rtengine/ipretinex.cc @@ -36,16 +36,18 @@ */ -#include -#include #include +#include +#include #include -#include "rtengine.h" + #include "gauss.h" -#include "rawimagesource.h" #include "improcfun.h" -#include "opthelper.h" #include "median.h" +#include "opthelper.h" +#include "procparams.h" +#include "rawimagesource.h" +#include "rtengine.h" #include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) @@ -393,7 +395,7 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e pond /= log(elogt); } - auto shmap = ((mapmet == 2 || mapmet == 3 || mapmet == 4) && it == 1) ? new SHMap (W_L, H_L, true) : nullptr; + auto shmap = ((mapmet == 2 || mapmet == 3 || mapmet == 4) && it == 1) ? new SHMap (W_L, H_L) : nullptr; float *buffer = new float[W_L * H_L];; @@ -504,11 +506,11 @@ void RawImageSource::MSR(float** luminance, float** originalLuminance, float **e if(useHslLin) { for (; j < W_L - 3; j += 4) { - _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * (LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); + _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * (vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); } } else { for (; j < W_L - 3; j += 4) { - _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); + _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(vclampf(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) )); } } diff --git a/rtengine/ipshadowshighlights.cc b/rtengine/ipshadowshighlights.cc new file mode 100644 index 000000000..6ce66d9b3 --- /dev/null +++ b/rtengine/ipshadowshighlights.cc @@ -0,0 +1,199 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright 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 "improcfun.h" + +#include "gauss.h" +#include "guidedfilter.h" +#include "opthelper.h" +#include "procparams.h" +#include "sleef.c" + +namespace rtengine { + +void ImProcFunctions::shadowsHighlights(LabImage *lab) +{ + if (!params->sh.enabled || (!params->sh.highlights && !params->sh.shadows)){ + return; + } + + const int width = lab->W; + const int height = lab->H; + const bool lab_mode = params->sh.lab; + + array2D mask(width, height); + array2D L(width, height); + const float radius = float(params->sh.radius) * 10 / scale; + LUTf f(lab_mode ? 32768 : 65536); + + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix(params->icm.workingProfile); + TMatrix iws = ICCStore::getInstance()->workingSpaceInverseMatrix(params->icm.workingProfile); + + const auto rgb2lab = + [&](float R, float G, float B, float &l, float &a, float &b) -> void + { + float x, y, z; + Color::rgbxyz(R, G, B, x, y, z, ws); + Color::XYZ2Lab(x, y, z, l, a, b); + }; + + const auto lab2rgb = + [&](float l, float a, float b, float &R, float &G, float &B) -> void + { + float x, y, z; + Color::Lab2XYZ(l, a, b, x, y, z); + Color::xyz2rgb(x, y, z, R, G, B, iws); + }; + + const auto apply = + [&](int amount, int tonalwidth, bool hl) -> void + { + const float thresh = tonalwidth * 327.68f; + const float scale = hl ? (thresh > 0.f ? 0.9f / thresh : 1.f) : thresh * 0.9f; + +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + float l = lab->L[y][x]; + float l1 = l / 32768.f; + if (hl) { + mask[y][x] = (l > thresh) ? 1.f : pow4(l * scale); + L[y][x] = 1.f - l1; + } else { + mask[y][x] = l <= thresh ? 1.f : pow4(scale / l); + L[y][x] = l1; + } + } + } + + guidedFilter(L, mask, mask, radius, 0.075, multiThread, 4); + + const float base = std::pow(4.f, float(amount)/100.f); + const float gamma = hl ? base : 1.f / base; + + const float contrast = std::pow(2.f, float(amount)/100.f); + DiagonalCurve sh_contrast({ + DCT_NURBS, + 0, 0, + 0.125, std::pow(0.125 / 0.25, contrast) * 0.25, + 0.25, 0.25, + 0.375, std::pow(0.375 / 0.25, contrast) * 0.25, + 1, 1 + }); + + if(!hl) { + if (lab_mode) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int l = 0; l < 32768; ++l) { + auto base = pow_F(l / 32768.f, gamma); + // get a bit more contrast in the shadows + base = sh_contrast.getVal(base); + f[l] = base * 32768.f; + } + } else { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int c = 0; c < 65536; ++c) { + float l, a, b; + float R = c, G = c, B = c; + rgb2lab(R, G, B, l, a, b); + auto base = pow_F(l / 32768.f, gamma); + // get a bit more contrast in the shadows + base = sh_contrast.getVal(base); + l = base * 32768.f; + lab2rgb(l, a, b, R, G, B); + f[c] = G; + } + } + } else { + if (lab_mode) { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int l = 0; l < 32768; ++l) { + auto base = pow_F(l / 32768.f, gamma); + f[l] = base * 32768.f; + } + } else { +#ifdef _OPENMP + #pragma omp parallel for if (multiThread) +#endif + for (int c = 0; c < 65536; ++c) { + float l, a, b; + float R = c, G = c, B = c; + rgb2lab(R, G, B, l, a, b); + auto base = pow_F(l / 32768.f, gamma); + l = base * 32768.f; + lab2rgb(l, a, b, R, G, B); + f[c] = G; + } + } + } + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + float l = lab->L[y][x]; + float blend = LIM01(mask[y][x]); + float orig = 1.f - blend; + if (l >= 0.f && l < 32768.f) { + if (lab_mode) { + lab->L[y][x] = intp(blend, f[l], l); + if (!hl && l > 1.f) { + // when pushing shadows, scale also the chromaticity + float s = max(lab->L[y][x] / l * 0.5f, 1.f) * blend; + float a = lab->a[y][x]; + float b = lab->b[y][x]; + lab->a[y][x] = a * s + a * orig; + lab->b[y][x] = b * s + b * orig; + } + } else { + float rgb[3]; + lab2rgb(l, lab->a[y][x], lab->b[y][x], rgb[0], rgb[1], rgb[2]); + for (int i = 0; i < 3; ++i) { + float c = rgb[i]; + if (!OOG(c)) { + rgb[i] = intp(blend, f[c], c); + } + } + rgb2lab(rgb[0], rgb[1], rgb[2], lab->L[y][x], lab->a[y][x], lab->b[y][x]); + } + } + } + } + }; + + if (params->sh.highlights > 0) { + apply(params->sh.highlights * 0.7, params->sh.htonalwidth, true); + } + + if (params->sh.shadows > 0) { + apply(params->sh.shadows * 0.6, params->sh.stonalwidth, false); + } +} + +} // namespace rtengine diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc index 388567f8a..9d7358fa9 100644 --- a/rtengine/ipsharpen.cc +++ b/rtengine/ipsharpen.cc @@ -16,36 +16,97 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "rtengine.h" + #include "improcfun.h" #include "gauss.h" #include "bilateral2.h" +#include "jaggedarray.h" #include "rt_math.h" +#include "procparams.h" #include "sleef.c" #include "opthelper.h" - +//#define BENCHMARK +#include "StopWatch.h" +#include "rt_algo.h" using namespace std; -namespace rtengine +namespace { + +void sharpenHaloCtrl (float** luminance, float** blurmap, float** base, float** blend, int W, int H, const SharpeningParams &sharpenParam) { -#undef ABS + const float scale = (100.f - sharpenParam.halocontrol_amount) * 0.01f; + const float sharpFac = sharpenParam.amount * 0.01f; + float** nL = base; -#define ABS(a) ((a)<0?-(a):(a)) +#ifdef _OPENMP + #pragma omp parallel for +#endif -extern const Settings* settings; -SSEFUNCTION void ImProcFunctions::dcdamping (float** aI, float** aO, float damping, int W, int H) + for (int i = 2; i < H - 2; i++) { + float max1 = 0, max2 = 0, min1 = 0, min2 = 0; + + for (int j = 2; j < W - 2; j++) { + // compute 3 iterations, only forward + float np1 = 2.f * (nL[i - 2][j] + nL[i - 2][j + 1] + nL[i - 2][j + 2] + nL[i - 1][j] + nL[i - 1][j + 1] + nL[i - 1][j + 2] + nL[i] [j] + nL[i] [j + 1] + nL[i] [j + 2]) / 27.f + nL[i - 1][j + 1] / 3.f; + float np2 = 2.f * (nL[i - 1][j] + nL[i - 1][j + 1] + nL[i - 1][j + 2] + nL[i] [j] + nL[i] [j + 1] + nL[i] [j + 2] + nL[i + 1][j] + nL[i + 1][j + 1] + nL[i + 1][j + 2]) / 27.f + nL[i] [j + 1] / 3.f; + float np3 = 2.f * (nL[i] [j] + nL[i] [j + 1] + nL[i] [j + 2] + nL[i + 1][j] + nL[i + 1][j + 1] + nL[i + 1][j + 2] + nL[i + 2][j] + nL[i + 2][j + 1] + nL[i + 2][j + 2]) / 27.f + nL[i + 1][j + 1] / 3.f; + + // Max/Min of all these deltas and the last two max/min + float maxn = rtengine::max(np1, np2, np3); + float minn = rtengine::min(np1, np2, np3); + float max_ = rtengine::max(max1, max2, maxn); + float min_ = rtengine::min(min1, min2, minn); + + // Shift the queue + max1 = max2; + max2 = maxn; + min1 = min2; + min2 = minn; + float labL = luminance[i][j]; + + if (max_ < labL) { + max_ = labL; + } + + if (min_ > labL) { + min_ = labL; + } + + // deviation from the environment as measurement + float diff = nL[i][j] - blurmap[i][j]; + + constexpr float upperBound = 2000.f; // WARNING: Duplicated value, it's baaaaaad ! + float delta = sharpenParam.threshold.multiply( + rtengine::min(fabsf(diff), upperBound), // X axis value = absolute value of the difference + sharpFac * diff // Y axis max value = sharpening.amount * signed difference + ); + float newL = labL + delta; + + // applying halo control + if (newL > max_) { + newL = max_ + (newL - max_) * scale; + } else if (newL < min_) { + newL = min_ - (min_ - newL) * scale; + } + + luminance[i][j] = intp(blend[i][j], newL, luminance[i][j]); + } + } +} + +void dcdamping (float** aI, float** aO, float damping, int W, int H) { const float dampingFac = -2.0 / (damping * damping); #ifdef __SSE2__ - __m128 Iv, Ov, Uv, zerov, onev, fourv, fivev, dampingFacv, Tv, Wv, Lv; - zerov = _mm_setzero_ps( ); - onev = F2V( 1.0f ); - fourv = F2V( 4.0f ); - fivev = F2V( 5.0f ); - dampingFacv = F2V( dampingFac ); + vfloat Iv, Ov, Uv, zerov, onev, fourv, fivev, dampingFacv, Tv, Wv, Lv; + zerov = _mm_setzero_ps(); + onev = F2V(1.f); + fourv = F2V(4.f); + fivev = F2V(5.f); + dampingFacv = F2V(dampingFac); #endif #ifdef _OPENMP #pragma omp for @@ -56,8 +117,8 @@ SSEFUNCTION void ImProcFunctions::dcdamping (float** aI, float** aO, float dampi #ifdef __SSE2__ for (; j < W - 3; j += 4) { - Iv = LVFU( aI[i][j] ); - Ov = LVFU( aO[i][j] ); + Iv = LVFU(aI[i][j]); + Ov = LVFU(aO[i][j]); Lv = xlogf(Iv / Ov); Wv = Ov - Iv; Uv = (Ov * Lv + Wv) * dampingFacv; @@ -68,7 +129,7 @@ SSEFUNCTION void ImProcFunctions::dcdamping (float** aI, float** aO, float dampi Uv = (Wv / Iv) * Uv + onev; Uv = vselfzero(vmaskf_gt(Iv, zerov), Uv); Uv = vselfzero(vmaskf_gt(Ov, zerov), Uv); - STVFU( aI[i][j], Uv ); + STVFU(aI[i][j], Uv); } #endif @@ -83,36 +144,65 @@ SSEFUNCTION void ImProcFunctions::dcdamping (float** aI, float** aO, float dampi } float U = (O * xlogf(I / O) - I + O) * dampingFac; - U = min(U, 1.0f); + U = rtengine::min(U, 1.0f); U = U * U * U * U * (5.f - U * 4.f); aI[i][j] = (O - I) / I * U + 1.f; } } } +} + +namespace rtengine +{ + +extern const Settings* settings; + void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, int W, int H, const SharpeningParams &sharpenParam) { - if (sharpenParam.deconvamount < 1) { + if (sharpenParam.deconvamount == 0 && sharpenParam.blurradius < 0.25f) { return; } +BENCHFUN + JaggedArray tmpI(W, H); - float *tmpI[H] ALIGNED16; - - tmpI[0] = new float[W * H]; - - for (int i = 1; i < H; i++) { - tmpI[i] = tmpI[i - 1] + W; - } - +#ifdef _OPENMP + #pragma omp parallel for +#endif for (int i = 0; i < H; i++) { for(int j = 0; j < W; j++) { - tmpI[i][j] = luminance[i][j]; + tmpI[i][j] = max(luminance[i][j], 0.f); } } - float damping = sharpenParam.deconvdamping / 5.0; - bool needdamp = sharpenParam.deconvdamping > 0; - double sigma = sharpenParam.deconvradius / scale; + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = sharpenParam.contrast / 100.f; + buildBlendMask(luminance, blend, W, H, contrast, 1.f); + JaggedArray* blurbuffer = nullptr; + + if (sharpenParam.blurradius >= 0.25f) { + blurbuffer = new JaggedArray(W, H); + JaggedArray &blur = *blurbuffer; +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur(tmpI, blur, W, H, sharpenParam.blurradius); +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + blur[i][j] = intp(blend[i][j], luminance[i][j], std::max(blur[i][j], 0.0f)); + } + } + } + } + const float damping = sharpenParam.deconvdamping / 5.0; + const bool needdamp = sharpenParam.deconvdamping > 0; + const double sigma = sharpenParam.deconvradius / scale; + const float amount = sharpenParam.deconvamount / 100.f; #ifdef _OPENMP #pragma omp parallel @@ -121,53 +211,75 @@ void ImProcFunctions::deconvsharpening (float** luminance, float** tmp, int W, i for (int k = 0; k < sharpenParam.deconviter; k++) { if (!needdamp) { // apply gaussian blur and divide luminance by result of gaussian blur - gaussianBlur (tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); + gaussianBlur(tmpI, tmp, W, H, sigma, nullptr, GAUSS_DIV, luminance); } else { // apply gaussian blur + damping - gaussianBlur (tmpI, tmp, W, H, sigma); - dcdamping (tmp, luminance, damping, W, H); + gaussianBlur(tmpI, tmp, W, H, sigma); + dcdamping(tmp, luminance, damping, W, H); } - - gaussianBlur (tmp, tmpI, W, H, sigma, nullptr, GAUSS_MULT); - + gaussianBlur(tmp, tmpI, W, H, sigma, nullptr, GAUSS_MULT); } // end for - float p2 = sharpenParam.deconvamount / 100.0; - float p1 = 1.0 - p2; - #ifdef _OPENMP #pragma omp for #endif - for (int i = 0; i < H; i++) - for (int j = 0; j < W; j++) { - luminance[i][j] = luminance[i][j] * p1 + max(tmpI[i][j], 0.0f) * p2; + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + luminance[i][j] = intp(blend[i][j] * amount, max(tmpI[i][j], 0.0f), luminance[i][j]); } + } + + if (sharpenParam.blurradius >= 0.25f) { + JaggedArray &blur = *blurbuffer; +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + luminance[i][j] = intp(blend[i][j], luminance[i][j], max(blur[i][j], 0.0f)); + } + } + } } // end parallel - - delete [] tmpI[0]; - + delete blurbuffer; } -void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &sharpenParam) +void ImProcFunctions::sharpening (LabImage* lab, const SharpeningParams &sharpenParam, bool showMask) { - if (!sharpenParam.enabled) { - return; - } - - if (sharpenParam.method == "rld") { - deconvsharpening (lab->L, b2, lab->W, lab->H, sharpenParam); - return; - } - if ((!sharpenParam.enabled) || sharpenParam.amount < 1 || lab->W < 8 || lab->H < 8) { return; } + int W = lab->W, H = lab->H; + + if(showMask) { + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = sharpenParam.contrast / 100.f; + buildBlendMask(lab->L, blend, W, H, contrast, 1.f); +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + lab->L[i][j] = blend[i][j] * 32768.f; + } + } + return; + } + + JaggedArray b2(W, H); + + if (sharpenParam.method == "rld") { + deconvsharpening (lab->L, b2, lab->W, lab->H, sharpenParam); + return; + } +BENCHFUN // Rest is UNSHARP MASK - int W = lab->W, H = lab->H; float** b3 = nullptr; if (sharpenParam.edgesonly) { @@ -178,6 +290,31 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s } } + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = sharpenParam.contrast / 100.f; + buildBlendMask(lab->L, blend, W, H, contrast); + + JaggedArray blur(W, H); + + if (sharpenParam.blurradius >= 0.25f) { +#ifdef _OPENMP + #pragma omp parallel +#endif + { + gaussianBlur(lab->L, blur, W, H, sharpenParam.blurradius); +#ifdef _OPENMP + #pragma omp for +#endif + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + blur[i][j] = intp(blend[i][j], lab->L[i][j], std::max(blur[i][j], 0.0f)); + } + } + } + } + + #ifdef _OPENMP #pragma omp parallel #endif @@ -203,24 +340,18 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { - const float upperBound = 2000.f; // WARNING: Duplicated value, it's baaaaaad ! + constexpr float upperBound = 2000.f; // WARNING: Duplicated value, it's baaaaaad ! float diff = base[i][j] - b2[i][j]; float delta = sharpenParam.threshold.multiply( - min(ABS(diff), upperBound), // X axis value = absolute value of the difference, truncated to the max value of this field + min(fabsf(diff), upperBound), // X axis value = absolute value of the difference, truncated to the max value of this field sharpenParam.amount * diff * 0.01f // Y axis max value ); - lab->L[i][j] = lab->L[i][j] + delta; + lab->L[i][j] = intp(blend[i][j], lab->L[i][j] + delta, lab->L[i][j]); } } else { - float** labCopy = nullptr; - if (!sharpenParam.edgesonly) { // make a deep copy of lab->L - labCopy = new float*[H]; - - for( int i = 0; i < H; i++ ) { - labCopy[i] = new float[W]; - } + JaggedArray labCopy(W, H); #ifdef _OPENMP #pragma omp parallel for @@ -231,18 +362,11 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s labCopy[i][j] = lab->L[i][j]; } - base = labCopy; + sharpenHaloCtrl (lab->L, b2, labCopy, blend, W, H, sharpenParam); + } else { + sharpenHaloCtrl (lab->L, b2, base, blend, W, H, sharpenParam); } - sharpenHaloCtrl (lab->L, b2, base, W, H, sharpenParam); - - if (labCopy) { - for( int i = 0; i < H; i++ ) { - delete[] labCopy[i]; - } - - delete[] labCopy; - } } if (sharpenParam.edgesonly) { @@ -252,69 +376,18 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s delete [] b3; } -} - -void ImProcFunctions::sharpenHaloCtrl (float** luminance, float** blurmap, float** base, int W, int H, const SharpeningParams &sharpenParam) -{ - - float scale = (100.f - sharpenParam.halocontrol_amount) * 0.01f; - float sharpFac = sharpenParam.amount * 0.01f; - float** nL = base; + if (sharpenParam.blurradius >= 0.25f) { #ifdef _OPENMP #pragma omp parallel for #endif - - for (int i = 2; i < H - 2; i++) { - float max1 = 0, max2 = 0, min1 = 0, min2 = 0; - - for (int j = 2; j < W - 2; j++) { - // compute 3 iterations, only forward - float np1 = 2.f * (nL[i - 2][j] + nL[i - 2][j + 1] + nL[i - 2][j + 2] + nL[i - 1][j] + nL[i - 1][j + 1] + nL[i - 1][j + 2] + nL[i] [j] + nL[i] [j + 1] + nL[i] [j + 2]) / 27.f + nL[i - 1][j + 1] / 3.f; - float np2 = 2.f * (nL[i - 1][j] + nL[i - 1][j + 1] + nL[i - 1][j + 2] + nL[i] [j] + nL[i] [j + 1] + nL[i] [j + 2] + nL[i + 1][j] + nL[i + 1][j + 1] + nL[i + 1][j + 2]) / 27.f + nL[i] [j + 1] / 3.f; - float np3 = 2.f * (nL[i] [j] + nL[i] [j + 1] + nL[i] [j + 2] + nL[i + 1][j] + nL[i + 1][j + 1] + nL[i + 1][j + 2] + nL[i + 2][j] + nL[i + 2][j + 1] + nL[i + 2][j + 2]) / 27.f + nL[i + 1][j + 1] / 3.f; - - // Max/Min of all these deltas and the last two max/min - float maxn = max(np1, np2, np3); - float minn = min(np1, np2, np3); - float max_ = max(max1, max2, maxn); - float min_ = min(min1, min2, minn); - - // Shift the queue - max1 = max2; - max2 = maxn; - min1 = min2; - min2 = minn; - float labL = luminance[i][j]; - - if (max_ < labL) { - max_ = labL; + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + lab->L[i][j] = intp(blend[i][j], lab->L[i][j], max(blur[i][j], 0.0f)); } - - if (min_ > labL) { - min_ = labL; - } - - // deviation from the environment as measurement - float diff = nL[i][j] - blurmap[i][j]; - - const float upperBound = 2000.f; // WARNING: Duplicated value, it's baaaaaad ! - float delta = sharpenParam.threshold.multiply( - min(ABS(diff), upperBound), // X axis value = absolute value of the difference - sharpFac * diff // Y axis max value = sharpening.amount * signed difference - ); - float newL = labL + delta; - - // applying halo control - if (newL > max_) { - newL = max_ + (newL - max_) * scale; - } else if (newL < min_) { - newL = min_ - (min_ - newL) * scale; - } - - luminance[i][j] = newL; } } + } // To the extent possible under law, Manuel Llorens @@ -324,7 +397,7 @@ void ImProcFunctions::sharpenHaloCtrl (float** luminance, float** blurmap, float // 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; @@ -564,25 +637,15 @@ void ImProcFunctions::MLsharpen (LabImage* lab) //! \param luminance : Luminance channel of image void ImProcFunctions::MLmicrocontrast(float** luminance, int W, int H) { - if (!params->sharpenMicro.enabled) { + if (!params->sharpenMicro.enabled || params->sharpenMicro.contrast == 100 || params->sharpenMicro.amount < 1.0) { return; } - +BENCHFUN const int k = params->sharpenMicro.matrix ? 1 : 2; - // k=2 matrix 5x5 k=1 matrix 3x3 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 - - if (amount < 0.000001f) { - return; - } - - if (k == 1) { - amount *= 2.7f; //25/9 if 3x3 - } + const int unif = params->sharpenMicro.uniformity; + const float amount = (k == 1 ? 2.7f : 1.f) * params->sharpenMicro.amount / 1500.0f; //amount 2000.0 quasi no artifacts ==> 1500 = maximum, after artifacts, 25/9 if 3x3 if (settings->verbose) { printf ("Micro-contrast amount %f\n", amount); @@ -610,11 +673,15 @@ void ImProcFunctions::MLmicrocontrast(float** luminance, int W, int H) const float Cont4[11] = {0.8f, 0.85f, 0.9f, 0.95f, 1.0f, 1.05f, 1.10f, 1.150f, 1.2f, 1.25f, 1.40f}; const float Cont5[11] = {1.0f, 1.1f, 1.2f, 1.25f, 1.3f, 1.4f, 1.45f, 1.50f, 1.6f, 1.65f, 1.80f}; - const float s = amount; const float sqrt2 = sqrt(2.0); const float sqrt1d25 = sqrt(1.25); float *LM = new float[width * height]; //allocation for Luminance + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = params->sharpenMicro.contrast / 100.f; + buildBlendMask(luminance, blend, W, H, contrast); + #ifdef _OPENMP #pragma omp parallel #endif @@ -646,9 +713,9 @@ void ImProcFunctions::MLmicrocontrast(float** luminance, int W, int H) contrast = std::min(contrast, 1.f); //matrix 5x5 - float temp = v + 4.f *( v * (s + sqrt2 * s)); //begin 3x3 - float temp1 = sqrt2 * s *(LM[offset - width - 1] + LM[offset - width + 1] + LM[offset + width - 1] + LM[offset + width + 1]); - temp1 += s * (LM[offset - width] + LM[offset - 1] + LM[offset + 1] + LM[offset + width]); + float temp = v + 4.f *( v * (amount + sqrt2 * amount)); //begin 3x3 + float temp1 = sqrt2 * amount *(LM[offset - width - 1] + LM[offset - width + 1] + LM[offset + width - 1] + LM[offset + width + 1]); + temp1 += amount * (LM[offset - width] + LM[offset - 1] + LM[offset + 1] + LM[offset + width]); temp -= temp1; @@ -661,19 +728,18 @@ void ImProcFunctions::MLmicrocontrast(float** luminance, int W, int H) temp2 -= sqrt2 * (LM[offset + 2 * width - 2] + LM[offset + 2 * width + 2] + LM[offset - 2 * width - 2] + LM[offset - 2 * width + 2]); temp2 += 18.601126159f * v ; // 18.601126159 = 4 + 4 * sqrt(2) + 8 * sqrt(1.25) - temp2 *= 2.f * s; + temp2 *= 2.f * amount; temp += temp2; } temp = std::max(temp, 0.f); - for(int row = j + k, n = SQR(2*k+1) - 1; row >= j - k; row--) { - for(int offset2 = row * width + i + k; offset2 >= row * width + i - k; offset2--) { + for(int row = j - k; row <= j + k; ++row) { + for(int offset2 = row * width + i - k; offset2 <= row * width + i + k; ++offset2) { if((LM[offset2] - temp) * (v - LM[offset2]) > 0.f) { temp = intp(0.75f, temp, LM[offset2]); goto breakout; } - n--; } } breakout: @@ -743,7 +809,7 @@ void ImProcFunctions::MLmicrocontrast(float** luminance, int W, int H) } else { temp = 0.f; } - luminance[j][i] *= (temp * temp2 + 1.f); + luminance[j][i] = intp(blend[j][i], luminance[j][i] * (temp * temp2 + 1.f), luminance[j][i]); } else { float temp4 = LM[offset] / tempL; // @@ -794,7 +860,7 @@ void ImProcFunctions::MLmicrocontrast(float** luminance, int W, int H) } else { temp = 0.f; } - luminance[j][i] /= (temp * temp4 + 1.f); + luminance[j][i] = intp(blend[j][i], luminance[j][i] / (temp * temp4 + 1.f), luminance[j][i]); } } } @@ -812,12 +878,32 @@ void ImProcFunctions::MLmicrocontrastcam(CieImage* ncie) MLmicrocontrast(ncie->sh_p, ncie->W, ncie->H); } -void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2) +void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2, bool showMask) { if ((!params->sharpening.enabled) || params->sharpening.amount < 1 || ncie->W < 8 || ncie->H < 8) { return; } + int W = ncie->W, H = ncie->H; + + if(showMask) { + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = params->sharpening.contrast / 100.f; + buildBlendMask(ncie->sh_p, blend, W, H, contrast); +#ifdef _OPENMP + #pragma omp parallel for +#endif + + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + ncie->sh_p[i][j] = blend[i][j] * 32768.f; + } + } + return; + } + + if (params->sharpening.method == "rld") { deconvsharpening (ncie->sh_p, b2, ncie->W, ncie->H, params->sharpening); return; @@ -825,7 +911,6 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2) // Rest is UNSHARP MASK - int W = ncie->W, H = ncie->H; float** b3 = nullptr; if (params->sharpening.edgesonly) { @@ -836,6 +921,11 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2) } } + // calculate contrast based blend factors to reduce sharpening in regions with low contrast + JaggedArray blend(W, H); + float contrast = params->sharpening.contrast / 100.f; + buildBlendMask(ncie->sh_p, blend, W, H, contrast); + #ifdef _OPENMP #pragma omp parallel #endif @@ -862,15 +952,15 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2) for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { - const float upperBound = 2000.f; // WARNING: Duplicated value, it's baaaaaad ! + constexpr float upperBound = 2000.f; // WARNING: Duplicated value, it's baaaaaad ! float diff = base[i][j] - b2[i][j]; float delta = params->sharpening.threshold.multiply( - min(ABS(diff), upperBound), // X axis value = absolute value of the difference, truncated to the max value of this field + min(fabsf(diff), upperBound), // X axis value = absolute value of the difference, truncated to the max value of this field params->sharpening.amount * diff * 0.01f // Y axis max value ); if(ncie->J_p[i][j] > 8.0f && ncie->J_p[i][j] < 92.0f) { - ncie->sh_p[i][j] = ncie->sh_p[i][j] + delta; + ncie->sh_p[i][j] = intp(blend[i][j], ncie->sh_p[i][j] + delta, ncie->sh_p[i][j]); } } } else { @@ -896,7 +986,7 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2) base = ncieCopy; } - sharpenHaloCtrl (ncie->sh_p, b2, base, W, H, params->sharpening); + sharpenHaloCtrl (ncie->sh_p, b2, base, blend, W, H, params->sharpening); if(ncieCopy) { for( int i = 0; i < H; i++ ) { diff --git a/rtengine/ipsoftlight.cc b/rtengine/ipsoftlight.cc new file mode 100644 index 000000000..6aca9b8eb --- /dev/null +++ b/rtengine/ipsoftlight.cc @@ -0,0 +1,76 @@ +/* -*- C++ -*- + * + * This file is part of RawTherapee. + * + * Copyright 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 . + */ + +#ifdef _OPENMP +#include +#endif + +#include "improcfun.h" + +#include "procparams.h" + +namespace rtengine { + +namespace { + +inline float sl(float blend, float x) +{ + if (!OOG(x)) { + const float orig = 1.f - blend; + float v = Color::gamma_srgb(x) / MAXVALF; + // Pegtop's formula from + // https://en.wikipedia.org/wiki/Blend_modes#Soft_Light + float v2 = v * v; + float v22 = v2 * 2.f; + v = v2 + v22 - v22 * v; + x = blend * Color::igamma_srgb(v * MAXVALF) + orig * x; + } + return x; +} + +} // namespace + + +void ImProcFunctions::softLight(LabImage *lab) +{ + if (!params->softlight.enabled || !params->softlight.strength) { + return; + } + + Imagefloat working(lab->W, lab->H); + lab2rgb(*lab, working, params->icm.workingProfile); + + const float blend = params->softlight.strength / 100.f; + +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < working.getHeight(); ++y) { + for (int x = 0; x < working.getWidth(); ++x) { + working.r(y, x) = sl(blend, working.r(y, x)); + working.g(y, x) = sl(blend, working.g(y, x)); + working.b(y, x) = sl(blend, working.b(y, x)); + } + } + + rgb2lab(working, *lab, params->icm.workingProfile); +} + +} // namespace rtengine diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index ff976137e..beca624a8 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -18,6 +18,7 @@ */ #include "rtengine.h" #include "improcfun.h" +#include "procparams.h" #ifdef _OPENMP #include #endif @@ -327,25 +328,29 @@ void ImProcFunctions::transform (Imagefloat* original, Imagefloat* transformed, } else { bool highQuality; std::unique_ptr tmpimg; + Imagefloat *dest = transformed; if (!needsCA() && scale != 1) { highQuality = false; } else { 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... + // performed before separately from the 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(); + dest = tmpimg.get(); } } - transformGeneral(highQuality, original, transformed, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get()); + transformGeneral(highQuality, original, dest, cx, cy, sx, sy, oW, oH, fW, fH, pLCPMap.get()); + + if (highQuality && dest != transformed) { + transformLCPCAOnly(dest, transformed, cx, cy, pLCPMap.get()); + } } } @@ -701,7 +706,9 @@ void ImProcFunctions::transformLuminanceOnly (Imagefloat* original, Imagefloat* } bool darkening = (params->vignetting.amount <= 0.0); +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) if (multiThread) +#endif for (int y = 0; y < transformed->getHeight(); y++) { double vig_y_d = applyVignetting ? (double) (y + cy) - vig_h2 : 0.0; @@ -813,7 +820,9 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I #endif // main cycle bool darkening = (params->vignetting.amount <= 0.0); +#ifdef _OPENMP #pragma omp parallel for if (multiThread) +#endif for (int y = 0; y < transformed->getHeight(); y++) { for (int x = 0; x < transformed->getWidth(); x++) { @@ -960,7 +969,9 @@ void ImProcFunctions::transformLCPCAOnly(Imagefloat *original, Imagefloat *trans chTrans[1] = transformed->g.ptrs; chTrans[2] = transformed->b.ptrs; +#ifdef _OPENMP #pragma omp parallel for if (multiThread) +#endif for (int y = 0; y < transformed->getHeight(); y++) { for (int x = 0; x < transformed->getWidth(); x++) { diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index f17d5d9b1..9bb4bc087 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -19,7 +19,6 @@ */ #include "rt_math.h" -//#include #include "rtengine.h" #include "improcfun.h" @@ -28,7 +27,8 @@ #include "../rtgui/thresholdselector.h" #include "curves.h" #include "color.h" - +#include "procparams.h" +#include "StopWatch.h" #ifdef _OPENMP #include #endif @@ -41,10 +41,6 @@ namespace rtengine using namespace procparams; -#define SAT(a,b,c) ((float)max(a,b,c)-(float)min(a,b,c))/(float)max(a,b,c) - -extern const Settings* settings; - void fillCurveArrayVib (DiagonalCurve* diagCurve, LUTf &outCurve) { @@ -75,6 +71,7 @@ void ImProcFunctions::vibrance (LabImage* lab) if (!params->vibrance.enabled) { return; } + BENCHFUN // int skip=1; //scale==1 ? 1 : 16; bool skinCurveIsSet = false; @@ -101,42 +98,23 @@ void ImProcFunctions::vibrance (LabImage* lab) const int width = lab->W; const int height = lab->H; -#ifdef _DEBUG - MyTime t1e, t2e; - t1e.set(); - int negat = 0, moreRGB = 0, negsat = 0, moresat = 0; -#endif - // skin hue curve // I use diagonal because I think it's better - LUTf skin_curve (65536, 0); - if (skinCurveIsSet) { - fillCurveArrayVib (dcurve, skin_curve); - } - - if (dcurve) { - delete dcurve; - dcurve = nullptr; - } - - -// skin_curve.dump("skin_curve"); - - 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.getTopLeft()) / 100.0f) * (1.0f - p00) + p00; - const float maxdp = (limitpastelsatur - p00) / 4.0f; - const float maxds = (1.0 - limitpastelsatur) / 4.0f; + const float chromaPastel = params->vibrance.pastels / 100.f; + const float chromaSatur = params->vibrance.saturated / 100.f; + constexpr float p00 = 0.07f; + const float limitpastelsatur = (static_cast(params->vibrance.psthreshold.getTopLeft()) / 100.f) * (1.f - p00) + p00; + const float maxdp = (limitpastelsatur - p00) / 4.f; + const float maxds = (1.f - limitpastelsatur) / 4.f; const float p0 = p00 + maxdp; - const float p1 = p00 + 2.0f * maxdp; - const float p2 = p00 + 3.0f * maxdp; + const float p1 = p00 + 2.f * maxdp; + const float p2 = p00 + 3.f * maxdp; 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.getBottomLeft()) / 100.0f; - float chromamean = 0.0f; + const float s1 = limitpastelsatur + 2.f * maxds; + const float s2 = limitpastelsatur + 3.f * maxds; + const float transitionweighting = static_cast(params->vibrance.psthreshold.getBottomLeft()) / 100.f; + float chromamean = 0.f; if (chromaPastel != chromaSatur) { //if sliders pastels and saturated are different: transition with a double linear interpolation: between p2 and limitpastelsatur, and between limitpastelsatur and s0 @@ -144,9 +122,9 @@ void ImProcFunctions::vibrance (LabImage* lab) chromamean = maxdp * (chromaSatur - chromaPastel) / (s0 - p2) + chromaPastel; // move chromaMean up or down depending on transitionCtrl - if (transitionweighting > 0.0f) { + if (transitionweighting > 0.f) { chromamean = (chromaSatur - chromamean) * transitionweighting + chromamean; - } else if (transitionweighting < 0.0f) { + } else if (transitionweighting < 0.f) { chromamean = (chromamean - chromaPastel) * transitionweighting + chromamean; } } @@ -157,154 +135,144 @@ void ImProcFunctions::vibrance (LabImage* lab) const float chromaSatur_a = (chromaSatur - chromamean) / (s0 - limitpastelsatur); const float chromaSatur_b = chromaSatur - chromaSatur_a * s0; - const float dhue = 0.15f; //hue transition - const float dchr = 20.0f; //chroma transition - const float skbeg = -0.05f; //begin hue skin - const float skend = 1.60f; //end hue skin - const float xx = 0.5f; //soft : between 0.3 and 1.0 - const float ask = 65535.0f / (skend - skbeg); - const float bsk = -skbeg * ask; + constexpr float dhue = 0.15f; //hue transition + constexpr float dchr = 20.f; //chroma transition + constexpr float skbeg = -0.05f; //begin hue skin + constexpr float skend = 1.60f; //end hue skin + constexpr float xx = 0.5f; //soft : between 0.3 and 1.0 + constexpr float ask = 65535.f / (skend - skbeg); + constexpr float bsk0 = -skbeg; + constexpr float bsk = -skbeg * ask; + + LUTf skin_curve (65536, 0); + + if (skinCurveIsSet) { + fillCurveArrayVib (dcurve, skin_curve); + skin_curve /= ask; + } + + if (dcurve) { + delete dcurve; + dcurve = nullptr; + } const bool highlight = params->toneCurve.hrenabled;//Get the value if "highlight reconstruction" is activated const bool protectskins = params->vibrance.protectskins; const bool avoidcolorshift = params->vibrance.avoidcolorshift; - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); //inverse matrix user select - const 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]} + const float wip[3][3] = { + {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, + {static_cast(wiprof[1][0]), static_cast(wiprof[1][1]), static_cast(wiprof[1][2])}, + {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} }; - -#ifdef _DEBUG - MunsellDebugInfo* MunsDebugInfo = nullptr; - - if (avoidcolorshift) { - MunsDebugInfo = new MunsellDebugInfo(); - } - - #pragma omp parallel default(shared) firstprivate(lab, MunsDebugInfo) reduction(+: negat, moreRGB, negsat, moresat) if (multiThread) -#else - #pragma omp parallel default(shared) if (multiThread) +#ifdef _OPENMP + #pragma omp parallel if (multiThread) #endif { +#ifdef __SSE2__ + float HHbuffer[width] ALIGNED16; + float CCbuffer[width] ALIGNED16; +#endif float sathue[5], sathue2[4]; // adjust sat in function of hue - /* - // Fitting limitpastelsatur into the real 0.07->1.0 range - // limitpastelsatur = limitpastelsatur*(1.0f-p00) + p00; - float p0,p1,p2;//adapt limit of pyramid to psThreshold - float s0,s1,s2; - */ - #ifdef _OPENMP - - if (settings->verbose && omp_get_thread_num() == 0) { -#else - - if (settings->verbose) { -#endif - printf ("vibrance: p0=%1.2f p1=%1.2f p2=%1.2f s0=%1.2f s1=%1.2f s2=%1.2f\n", p0, p1, p2, s0, s1, s2); - printf (" pastel=%f satur=%f limit= %1.2f chromamean=%0.5f\n", 1.0f + chromaPastel, 1.0f + chromaSatur, limitpastelsatur, chromamean); - } - #pragma omp for schedule(dynamic, 16) +#endif - for (int i = 0; i < height; i++) + for (int i = 0; i < height; i++) { +#ifdef __SSE2__ + // vectorized per row calculation of HH and CC + vfloat c327d68v = F2V(327.68f); + int k = 0; + for (; k < width - 3; k += 4) { + vfloat av = LVFU(lab->a[i][k]); + vfloat bv = LVFU(lab->b[i][k]); + STVF(HHbuffer[k], xatan2f(bv, av)); + STVF(CCbuffer[k], vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v); + } + for (; k < width; k++) { + HHbuffer[k] = xatan2f (lab->b[i][k], lab->a[i][k]); + CCbuffer[k] = sqrt (SQR (lab->a[i][k]) + SQR (lab->b[i][k])) / 327.68f; + } +#endif for (int j = 0; j < width; j++) { float LL = lab->L[i][j] / 327.68f; - float CC = sqrt (SQR (lab->a[i][j]) + SQR (lab->b[i][j])) / 327.68f; +#ifdef __SSE2__ + float HH = HHbuffer[j]; + float CC = CCbuffer[j]; +#else float HH = xatan2f (lab->b[i][j], lab->a[i][j]); - - float satredu = 1.0f; //reduct sat in function of skin - - if (protectskins) { - Color::SkinSat (LL, HH, CC, satredu);// for skin colors - } + float CC = sqrt (SQR (lab->a[i][j]) + SQR (lab->b[i][j])) / 327.68f; +#endif // here we work on Chromaticity and Hue // variation of Chromaticity ==> saturation via RGB // Munsell correction, then conversion to Lab float Lprov = LL; float Chprov = CC; - float R, G, B; float2 sincosval; - if (CC == 0.0f) { + if (CC == 0.f) { sincosval.y = 1.f; - sincosval.x = 0.0f; + sincosval.x = 0.f; } else { sincosval.y = lab->a[i][j] / (CC * 327.68f); sincosval.x = lab->b[i][j] / (CC * 327.68f); } -#ifdef _DEBUG - bool neg = false; - bool more_rgb = false; //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, sincosval, Lprov, Chprov, R, G, B, wip, highlight, 0.15f, 0.98f, neg, more_rgb); + float saturation; + Color::gamutLchonly(HH, sincosval, Lprov, Chprov, saturation, wip, highlight, 0.15f, 0.98f); - if (neg) { - negat++; - } + if (Chprov > 6.f) { + float satredu = 1.f; //reduct sat in function of skin - if (more_rgb) { - moreRGB++; - } + if (protectskins) { + Color::SkinSat (LL, HH, CC, satredu);// for skin colors + } -#else - //gamut control : Lab values are in gamut - Color::gamutLchonly (HH, sincosval, Lprov, Chprov, R, G, B, wip, highlight, 0.15f, 0.98f); -#endif - - if (Chprov > 6.0f) { - const float saturation = SAT (R, G, B); - - if (saturation > 0.0f) { - if (satredu != 1.0f) { + if (saturation > 0.f) { + if (satredu != 1.f) { // for skin, no differentiation - sathue [0] = sathue [1] = sathue [2] = sathue [3] = sathue[4] = 1.0f; - sathue2[0] = sathue2[1] = sathue2[2] = sathue2[3] = 1.0f; + sathue [0] = sathue [1] = sathue [2] = sathue [3] = sathue[4] = 1.f; + sathue2[0] = sathue2[1] = sathue2[2] = sathue2[3] = 1.f; } else { //double pyramid: LL and HH //I try to take into account: Munsell response (human vision) and Gamut..(less response for red): preferably using Prophoto or WideGamut //blue: -1.80 -3.14 green = 2.1 3.14 green-yellow=1.4 2.1 red:0 1.4 blue-purple:-0.7 -1.4 purple: 0 -0.7 //these values allow a better and differential response if (LL < 20.0f) { //more for blue-purple, blue and red modulate + sathue[4] = 0.4f; + sathue2[3] = 1.f; if (/*HH> -3.1415f &&*/ HH < -1.5f ) { sathue[0] = 1.3f; //blue sathue[1] = 1.2f; sathue[2] = 1.1f; sathue[3] = 1.05f; - sathue[4] = 0.4f; sathue2[0] = 1.05f; sathue2[1] = 1.1f ; sathue2[2] = 1.05f; - sathue2[3] = 1.0f; } else if (/*HH>=-1.5f &&*/ HH < -0.7f ) { sathue[0] = 1.6f; //blue purple 1.2 1.1 sathue[1] = 1.4f; sathue[2] = 1.3f; sathue[3] = 1.2f ; - sathue[4] = 0.4f; sathue2[0] = 1.2f ; sathue2[1] = 1.15f; sathue2[2] = 1.1f ; - sathue2[3] = 1.0f; } else if (/*HH>=-0.7f &&*/ HH < 0.0f ) { sathue[0] = 1.2f; //purple sathue[1] = 1.0f; sathue[2] = 1.0f; sathue[3] = 1.0f ; - sathue[4] = 0.4f; sathue2[0] = 1.0f ; sathue2[1] = 1.0f ; sathue2[2] = 1.0f ; - sathue2[3] = 1.0f; } // else if( HH>= 0.0f && HH<= 1.4f ) {sathue[0]=1.1f;sathue[1]=1.1f;sathue[2]=1.1f;sathue[3]=1.0f ;sathue[4]=0.4f;sathue2[0]=1.0f ;sathue2[1]=1.0f ;sathue2[2]=1.0f ;sathue2[3]=1.0f;}//red 0.8 0.7 else if (/*HH>= 0.0f &&*/ HH <= 1.4f ) { @@ -312,39 +280,33 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.2f; sathue[2] = 1.1f; sathue[3] = 1.0f ; - sathue[4] = 0.4f; sathue2[0] = 1.0f ; sathue2[1] = 1.0f ; sathue2[2] = 1.0f ; - sathue2[3] = 1.0f; } else if (/*HH> 1.4f &&*/ HH <= 2.1f ) { sathue[0] = 1.0f; //green yellow 1.2 1.1 sathue[1] = 1.0f; sathue[2] = 1.0f; sathue[3] = 1.0f ; - sathue[4] = 0.4f; sathue2[0] = 1.0f ; sathue2[1] = 1.0f ; sathue2[2] = 1.0f ; - sathue2[3] = 1.0f; } else { /*if(HH> 2.1f && HH<= 3.1415f)*/ sathue[0] = 1.4f; //green sathue[1] = 1.3f; sathue[2] = 1.2f; sathue[3] = 1.15f; - sathue[4] = 0.4f; sathue2[0] = 1.15f; sathue2[1] = 1.1f ; sathue2[2] = 1.05f; - sathue2[3] = 1.0f; } } else if (LL < 50.0f) { //more for blue and green, less for red and green-yellow + sathue[4] = 0.4f; if (/*HH> -3.1415f &&*/ HH < -1.5f ) { sathue[0] = 1.5f; //blue sathue[1] = 1.4f; sathue[2] = 1.3f; sathue[3] = 1.2f ; - sathue[4] = 0.4f; sathue2[0] = 1.2f ; sathue2[1] = 1.1f ; sathue2[2] = 1.05f; @@ -354,7 +316,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.2f; sathue[2] = 1.1f; sathue[3] = 1.05f; - sathue[4] = 0.4f; sathue2[0] = 1.05f; sathue2[1] = 1.05f; sathue2[2] = 1.0f ; @@ -364,7 +325,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.0f; sathue[2] = 1.0f; sathue[3] = 1.0f ; - sathue[4] = 0.4f; sathue2[0] = 1.0f ; sathue2[1] = 1.0f ; sathue2[2] = 1.0f ; @@ -376,7 +336,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.0f; sathue[2] = 0.9f; sathue[3] = 0.8f ; - sathue[4] = 0.4f; sathue2[0] = 0.8f ; sathue2[1] = 0.8f ; sathue2[2] = 0.8f ; @@ -386,7 +345,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.1f; sathue[2] = 1.1f; sathue[3] = 1.05f; - sathue[4] = 0.4f; sathue2[0] = 0.9f ; sathue2[1] = 0.8f ; sathue2[2] = 0.7f ; @@ -396,7 +354,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.4f; sathue[2] = 1.3f; sathue[3] = 1.2f ; - sathue[4] = 0.4f; sathue2[0] = 1.2f ; sathue2[1] = 1.1f ; sathue2[2] = 1.05f; @@ -404,12 +361,12 @@ void ImProcFunctions::vibrance (LabImage* lab) } } else if (LL < 80.0f) { //more for green, less for red and green-yellow + sathue[4] = 0.3f; if (/*HH> -3.1415f &&*/ HH < -1.5f ) { sathue[0] = 1.3f; //blue sathue[1] = 1.2f; sathue[2] = 1.15f; sathue[3] = 1.1f ; - sathue[4] = 0.3f; sathue2[0] = 1.1f ; sathue2[1] = 1.1f ; sathue2[2] = 1.05f; @@ -419,7 +376,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.2f; sathue[2] = 1.15f; sathue[3] = 1.1f ; - sathue[4] = 0.3f; sathue2[0] = 1.1f ; sathue2[1] = 1.05f; sathue2[2] = 1.0f ; @@ -429,7 +385,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.0f; sathue[2] = 1.0f ; sathue[3] = 1.0f ; - sathue[4] = 0.3f; sathue2[0] = 1.0f ; sathue2[1] = 1.0f ; sathue2[2] = 1.0f ; @@ -441,7 +396,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.0f; sathue[2] = 0.9f ; sathue[3] = 0.8f ; - sathue[4] = 0.3f; sathue2[0] = 0.8f ; sathue2[1] = 0.8f ; sathue2[2] = 0.8f ; @@ -451,7 +405,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.2f; sathue[2] = 1.1f ; sathue[3] = 1.05f; - sathue[4] = 0.3f; sathue2[0] = 1.0f ; sathue2[1] = 0.9f ; sathue2[2] = 0.8f ; @@ -461,19 +414,18 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.4f; sathue[2] = 1.3f ; sathue[3] = 1.25f; - sathue[4] = 0.3f; sathue2[0] = 1.25f; sathue2[1] = 1.2f ; sathue2[2] = 1.15f; sathue2[3] = 1.05f; } } else { /*if (LL>=80.0f)*/ //more for green-yellow, less for red and purple + sathue[4] = 0.2f; if (/*HH> -3.1415f &&*/ HH < -1.5f ) { sathue[0] = 1.0f; //blue sathue[1] = 1.0f; sathue[2] = 0.9f; sathue[3] = 0.8f; - sathue[4] = 0.2f; sathue2[0] = 0.8f; sathue2[1] = 0.8f ; sathue2[2] = 0.8f ; @@ -483,7 +435,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.0f; sathue[2] = 0.9f; sathue[3] = 0.8f; - sathue[4] = 0.2f; sathue2[0] = 0.8f; sathue2[1] = 0.8f ; sathue2[2] = 0.8f ; @@ -493,7 +444,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.0f; sathue[2] = 1.0f; sathue[3] = 0.9f; - sathue[4] = 0.2f; sathue2[0] = 0.9f; sathue2[1] = 0.9f ; sathue2[2] = 0.8f ; @@ -505,7 +455,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.0f; sathue[2] = 0.9f; sathue[3] = 0.8f; - sathue[4] = 0.2f; sathue2[0] = 0.8f; sathue2[1] = 0.8f ; sathue2[2] = 0.8f ; @@ -515,7 +464,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.5f; sathue[2] = 1.4f; sathue[3] = 1.2f; - sathue[4] = 0.2f; sathue2[0] = 1.1f; sathue2[1] = 1.05f; sathue2[2] = 1.0f ; @@ -525,7 +473,6 @@ void ImProcFunctions::vibrance (LabImage* lab) sathue[1] = 1.3f; sathue[2] = 1.2f; sathue[3] = 1.1f; - sathue[4] = 0.2f; sathue2[0] = 1.1f; sathue2[1] = 1.05f; sathue2[2] = 1.05f; @@ -534,97 +481,83 @@ void ImProcFunctions::vibrance (LabImage* lab) } } - float chmodpastel = 0.f, chmodsat = 0.f; + float chmod = 0.f; // variables to improve transitions float pa, pb;// transition = pa*saturation + pb - float chl00 = chromaPastel * satredu * sathue[4]; - float chl0 = chromaPastel * satredu * sathue[0]; - float chl1 = chromaPastel * satredu * sathue[1]; - float chl2 = chromaPastel * satredu * sathue[2]; - float chl3 = chromaPastel * satredu * sathue[3]; - float chs0 = chromaSatur * satredu * sathue2[0]; - float chs1 = chromaSatur * satredu * sathue2[1]; - float chs2 = chromaSatur * satredu * sathue2[2]; - float chs3 = chromaSatur * satredu * sathue2[3]; - float s3 = 1.0f; // We handle only positive values here ; improve transitions if (saturation < p00) { - chmodpastel = chl00 ; //neutral tones + pa = 0.f; + pb = chromaPastel * sathue[4]; } else if (saturation < p0 ) { + float chl00 = chromaPastel * sathue[4]; + float chl0 = chromaPastel * sathue[0]; pa = (chl00 - chl0) / (p00 - p0); pb = chl00 - pa * p00; - chmodpastel = pa * saturation + pb; } else if (saturation < p1) { + float chl0 = chromaPastel * sathue[0]; + float chl1 = chromaPastel * sathue[1]; pa = (chl0 - chl1) / (p0 - p1); pb = chl0 - pa * p0; - chmodpastel = pa * saturation + pb; } else if (saturation < p2) { + float chl1 = chromaPastel * sathue[1]; + float chl2 = chromaPastel * sathue[2]; pa = (chl1 - chl2) / (p1 - p2); pb = chl1 - pa * p1; - chmodpastel = pa * saturation + pb; } else if (saturation < limitpastelsatur) { + float chl2 = chromaPastel * sathue[2]; + float chl3 = chromaPastel * sathue[3]; pa = (chl2 - chl3) / (p2 - limitpastelsatur); pb = chl2 - pa * p2; - chmodpastel = pa * saturation + pb; } else if (saturation < s0) { + float chl3 = chromaPastel * sathue[3]; + float chs0 = chromaSatur * sathue2[0]; pa = (chl3 - chs0) / (limitpastelsatur - s0) ; pb = chl3 - pa * limitpastelsatur; - chmodsat = pa * saturation + pb; } else if (saturation < s1) { + float chs0 = chromaSatur * sathue2[0]; + float chs1 = chromaSatur * sathue2[1]; pa = (chs0 - chs1) / (s0 - s1); pb = chs0 - pa * s0; - chmodsat = pa * saturation + pb; } else if (saturation < s2) { + float chs1 = chromaSatur * sathue2[1]; + float chs2 = chromaSatur * sathue2[2]; pa = (chs1 - chs2) / (s1 - s2); pb = chs1 - pa * s1; - chmodsat = pa * saturation + pb; } else { - pa = (chs2 - chs3) / (s2 - s3); + float chs2 = chromaSatur * sathue2[2]; + float chs3 = chromaSatur * sathue2[3]; + pa = (chs2 - chs3) / (s2 - 1.f); pb = chs2 - pa * s2; - chmodsat = pa * saturation + pb; } + chmod = pa * saturation + pb; + chmod *= satredu; if (chromaPastel != chromaSatur) { // Pastels if (saturation > p2 && saturation < limitpastelsatur) { float newchromaPastel = chromaPastel_a * saturation + chromaPastel_b; - chmodpastel = newchromaPastel * satredu * sathue[3]; + chmod = newchromaPastel * satredu * sathue[3]; } // Saturated if (saturation < s0 && saturation >= limitpastelsatur) { float newchromaSatur = chromaSatur_a * saturation + chromaSatur_b; - chmodsat = newchromaSatur * satredu * sathue2[0]; + chmod = newchromaSatur * satredu * sathue2[0]; } }// end transition if (saturation <= limitpastelsatur) { - if (chmodpastel > 2.0f ) { - chmodpastel = 2.0f; //avoid too big values - } else if (chmodpastel < -0.93f) { - chmodpastel = -0.93f; //avoid negative values - } + chmod = rtengine::LIM(chmod, -0.93f, 2.f); + Chprov *= 1.0f + chmod; - Chprov *= (1.0f + chmodpastel); - - if (Chprov < 6.0f) { - Chprov = 6.0f; - } } else { //if (saturation > limitpastelsatur) - if (chmodsat > 1.8f ) { - chmodsat = 1.8f; //saturated - } else if (chmodsat < -0.93f) { - chmodsat = -0.93f; - } + chmod = rtengine::LIM(chmod, -0.93f, 1.8f); + Chprov *= 1.0f + chmod; - Chprov *= 1.0f + chmodsat; - - if (Chprov < 6.0f) { - Chprov = 6.0f; - } } + Chprov = rtengine::max(Chprov, 6.f); } } @@ -633,36 +566,36 @@ void ImProcFunctions::vibrance (LabImage* lab) // Vibrance's Skin curve if (skinCurveIsSet) { if (HH > skbeg && HH < skend) { - if (Chprov < 60.0f) { //skin hue : todo ==> transition + if (Chprov < 60.f) { //skin hue : todo ==> transition float HHsk = ask * HH + bsk; - float Hn = (skin_curve[HHsk] - bsk) / ask; - float Hc = (Hn * xx + HH * (1.0f - xx)); + float Hn = skin_curve[HHsk] - bsk0; + float Hc = Hn * xx + HH * (1.f - xx); HH = Hc; hhModified = true; - } else if (Chprov < (60.0f + dchr)) { //transition chroma + } else if (Chprov < (60.f + dchr)) { //transition chroma float HHsk = ask * HH + bsk; - float Hn = (skin_curve[HHsk] - bsk) / ask; - float Hc = (Hn * xx + HH * (1.0f - xx)); + float Hn = skin_curve[HHsk] - bsk0; + float Hc = Hn * xx + HH * (1.f - xx); float aa = (HH - Hc) / dchr ; - float bb = HH - (60.0f + dchr) * aa; + float bb = HH - (60.f + dchr) * aa; HH = aa * Chprov + bb; hhModified = true; } } //transition hue - else if (HH > (skbeg - dhue) && HH <= skbeg && Chprov < (60.0f + dchr * 0.5f)) { + else if (HH > (skbeg - dhue) && HH <= skbeg && Chprov < (60.f + dchr * 0.5f)) { float HHsk = ask * skbeg + bsk; - float Hn = (skin_curve[HHsk] - bsk) / ask; - float Hcc = (Hn * xx + skbeg * (1.0f - xx)); - float adh = (Hcc - (skbeg - dhue)) / (dhue); + float Hn = skin_curve[HHsk] - bsk0; + float Hcc = Hn * xx + skbeg * (1.f - xx); + float adh = (Hcc - (skbeg - dhue)) / dhue; float bdh = Hcc - adh * skbeg; HH = adh * HH + bdh; hhModified = true; - } else if (HH >= skend && HH < (skend + dhue) && Chprov < (60.0f + dchr * 0.5f)) { + } else if (HH >= skend && HH < (skend + dhue) && Chprov < (60.f + dchr * 0.5f)) { float HHsk = ask * skend + bsk; - float Hn = (skin_curve[HHsk] - bsk) / ask; - float Hcc = (Hn * xx + skend * (1.0f - xx)); - float adh = (skend + dhue - Hcc) / (dhue); + float Hn = skin_curve[HHsk] - bsk0; + float Hcc = Hn * xx + skend * (1.f - xx); + float adh = (skend + dhue - Hcc) / dhue; float bdh = Hcc - adh * skend; HH = adh * HH + bdh; hhModified = true; @@ -670,7 +603,6 @@ void ImProcFunctions::vibrance (LabImage* lab) } // end skin hue //Munsell correction -// float2 sincosval; if (!avoidcolorshift && hhModified) { sincosval = xsincosf (HH); } @@ -678,21 +610,18 @@ void ImProcFunctions::vibrance (LabImage* lab) float aprovn, bprovn; bool inGamut; + const float fyy = Color::c1By116 * Lprov + Color::c16By116; + const float yy_ = (Lprov > Color::epskap) ? fyy * fyy*fyy : Lprov / Color::kappaf; do { inGamut = true; if (avoidcolorshift) { float correctionHue = 0.0f; - float correctlum = 0.0f; -#ifdef _DEBUG - Color::AllMunsellLch (/*lumaMuns*/false, Lprov, Lprov, HH, Chprov, CC, correctionHue, correctlum, MunsDebugInfo); -#else - Color::AllMunsellLch (/*lumaMuns*/false, Lprov, Lprov, HH, Chprov, CC, correctionHue, correctlum); -#endif + Color::AllMunsellLch(Lprov, HH, Chprov, CC, correctionHue); if (correctionHue != 0.f || hhModified) { - sincosval = xsincosf (HH + correctionHue); + sincosval = xsincosf(HH + correctionHue); hhModified = false; } } @@ -700,29 +629,21 @@ void ImProcFunctions::vibrance (LabImage* lab) aprovn = Chprov * sincosval.y; bprovn = Chprov * sincosval.x; - float fyy = (0.00862069f * Lprov ) + 0.137932f; - float fxx = (0.002f * aprovn) + fyy; - float fzz = fyy - (0.005f * bprovn); - float xx_ = 65535.f * Color::f2xyz (fxx) * Color::D50x; - // float yy_ = 65535.0f * Color::f2xyz(fyy); - float zz_ = 65535.f * Color::f2xyz (fzz) * Color::D50z; - float yy_ = 65535.f * ((Lprov > Color::epskap) ? fyy * fyy*fyy : Lprov / Color::kappa); + float fxx = 0.002f * aprovn + fyy; + float fzz = fyy - 0.005f * bprovn; + float xx_ = Color::f2xyz(fxx) * Color::D50x; + float zz_ = Color::f2xyz(fzz) * Color::D50z; + float R, G, B; Color::xyz2rgb (xx_, yy_, zz_, R, G, B, wip); - if (R < 0.0f || G < 0.0f || B < 0.0f) { -#ifdef _DEBUG - negsat++; -#endif + if (rtengine::min(R, G, B) < 0.0f) { Chprov *= 0.98f; inGamut = false; } // if "highlight reconstruction" enabled don't control Gamut for highlights - if ((!highlight) && (R > 65535.0f || G > 65535.0f || B > 65535.0f)) { -#ifdef _DEBUG - moresat++; -#endif + if (!highlight && max(R, G, B) > 1.f && min(R, G, B) <= 1.f) { Chprov *= 0.98f; inGamut = false; } @@ -733,27 +654,8 @@ void ImProcFunctions::vibrance (LabImage* lab) lab->a[i][j] = aprovn * 327.68f; lab->b[i][j] = bprovn * 327.68f; } - - } // end of parallelization - -#ifdef _DEBUG - t2e.set(); - - if (settings->verbose) { - printf ("Vibrance (performed in %d usec):\n", t2e.etime (t1e)); - printf (" Gamut: G1negat=%iiter G165535=%iiter G2negsat=%iiter G265535=%iiter\n", negat, moreRGB, negsat, moresat); - - if (MunsDebugInfo) { - printf (" Munsell chrominance: MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad depass=%u\n", MunsDebugInfo->maxdhue[0], MunsDebugInfo->maxdhue[1], MunsDebugInfo->maxdhue[2], MunsDebugInfo->maxdhue[3], MunsDebugInfo->depass); } - } - - if (MunsDebugInfo) { - delete MunsDebugInfo; - } - -#endif - + } // end of parallelization } diff --git a/rtengine/ipwavelet.cc b/rtengine/ipwavelet.cc index 04db1c314..d3595b42c 100644 --- a/rtengine/ipwavelet.cc +++ b/rtengine/ipwavelet.cc @@ -40,6 +40,7 @@ #include "median.h" #include "EdgePreservingDecomposition.h" #include "iccstore.h" +#include "procparams.h" #ifdef _OPENMP #include @@ -140,7 +141,7 @@ struct cont_params { 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, 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) { @@ -148,7 +149,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int // init variables to display Munsell corrections MunsellDebugInfo* MunsDebugInfo = new MunsellDebugInfo(); #endif - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.working); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (params->icm.workingProfile); const double wip[3][3] = { {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, @@ -645,7 +646,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int numthreads = MIN(numthreads, maxnumberofthreadsforwavelet); } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP wavNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); @@ -720,7 +721,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int Lold = lab->L; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -736,7 +737,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int av = LVFU(lab->a[i][j]); bv = LVFU(lab->b[i][j]); huev = xatan2f(bv, av); - chrov = _mm_sqrt_ps(SQRV(av) + SQRV(bv)) / c327d68v; + chrov = vsqrtf(SQRV(av) + SQRV(bv)) / c327d68v; _mm_storeu_ps(&varhue[i1][j1], huev); _mm_storeu_ps(&varchro[i1][j1], chrov); @@ -784,7 +785,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for num_threads(wavNestedLevels) if(wavNestedLevels>1) #endif @@ -868,7 +869,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int 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 @@ -1076,7 +1077,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int 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 @@ -1104,7 +1105,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int bv = LVFU(labco->b[i1][col]); STVF(atan2Buffer[col], xatan2f(bv, av)); - cv = _mm_sqrt_ps(SQRV(av) + SQRV(bv)); + cv = vsqrtf(SQRV(av) + SQRV(bv)); yv = av / cv; xv = bv / cv; xyMask = vmaskf_eq(zerov, cv); @@ -1246,7 +1247,7 @@ SSEFUNCTION void ImProcFunctions::ip_wavelet(LabImage * lab, LabImage * dst, int delete [] varchro; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP omp_set_nested(oldNested); #endif @@ -1271,17 +1272,17 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver //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 @@ -1305,7 +1306,7 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp critical #endif { @@ -1332,10 +1333,10 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver 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 @@ -1425,138 +1426,61 @@ void ImProcFunctions::Eval2 (float ** WavCoeffs_L, int level, MaxN[level] = maxLN; } -float *ImProcFunctions::ContrastDR(float *Source, int W_L, int H_L, float *Contrast) +void ImProcFunctions::CompressDR(float *Source, int W_L, int H_L, float Compression, float DetailBoost) { - int n = W_L * H_L; + const int n = W_L * H_L; - if(Contrast == nullptr) { - Contrast = new float[n]; - } - - memcpy(Contrast, Source, n * sizeof(float)); -#ifdef _RT_NESTED_OPENMP - #pragma omp parallel for -#endif - - for (int i = 0; i < W_L * H_L; i++) { //contrast - Contrast[i] = Source[i] ; - } - - return Contrast; -} - -SSEFUNCTION 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 - #pragma omp parallel -#endif - { - __m128 epsv = _mm_set1_ps( eps ); -#ifdef _RT_NESTED_OPENMP - #pragma omp for -#endif - - for(int ii = 0; ii < n - 3; ii += 4) { - _mm_storeu_ps( &Source[ii], xlogf(LVFU(Source[ii]) + epsv)); - } - } - - for(int ii = n - (n % 4); ii < n; ii++) { - Source[ii] = xlogf(Source[ii] + eps); - } - -#else -#ifdef _RT_NESTED_OPENMP - #pragma omp parallel for -#endif - - for(int ii = 0; ii < n; ii++) { - Source[ii] = xlogf(Source[ii] + eps); - } - -#endif - - float *ucr = ContrastDR(Source, W_L, H_L); - - if(Compressed == nullptr) { - Compressed = ucr; - } - - float temp; + float exponent; if(DetailBoost > 0.f && DetailBoost < 0.05f ) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - temp = 1.2f * xlogf( -betemp); - temp /= 20.f; + exponent = 1.2f * xlogf( -betemp); + exponent /= 20.f; } else if(DetailBoost >= 0.05f && DetailBoost < 0.25f ) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - temp = 1.2f * xlogf( -betemp); - temp /= (-75.f * DetailBoost + 23.75f); + exponent = 1.2f * xlogf( -betemp); + exponent /= (-75.f * DetailBoost + 23.75f); } else if(DetailBoost >= 0.25f) { float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2) - temp = 1.2f * xlogf( -betemp); - temp /= (-2.f * DetailBoost + 5.5f); + exponent = 1.2f * xlogf( -betemp); + exponent /= (-2.f * DetailBoost + 5.5f); + } else { + exponent = (Compression - 1.0f) / 20.f; } - else { - temp = (Compression - 1.0f) / 20.f; - } + exponent += 1.f; + // now calculate Source = pow(Source, exponent) #ifdef __SSE2__ -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel #endif { - __m128 cev, uev, sourcev; - __m128 epsv = _mm_set1_ps( eps ); - __m128 DetailBoostv = _mm_set1_ps( DetailBoost ); - __m128 tempv = _mm_set1_ps( temp ); -#ifdef _RT_NESTED_OPENMP + vfloat exponentv = F2V(exponent); +#ifdef _OPENMP #pragma omp for #endif for(int i = 0; i < n - 3; i += 4) { - cev = xexpf(LVFU(Source[i]) + LVFU(ucr[i]) * (tempv)) - epsv; - uev = xexpf(LVFU(ucr[i])) - epsv; - sourcev = xexpf(LVFU(Source[i])) - epsv; - _mm_storeu_ps( &Source[i], sourcev); - _mm_storeu_ps( &Compressed[i], cev + DetailBoostv * (sourcev - uev) ); + STVFU(Source[i], xexpf(xlogf(LVFU(Source[i])) * exponentv)); } } for(int i = n - (n % 4); i < n; i++) { - float ce = xexpf(Source[i] + ucr[i] * (temp)) - eps; - float ue = xexpf(ucr[i]) - eps; - Source[i] = xexpf(Source[i]) - eps; - Compressed[i] = ce + DetailBoost * (Source[i] - ue); + Source[i] = xexpf(xlogf(Source[i]) * exponent); } #else -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif for(int i = 0; i < n; i++) { - float ce = xexpf(Source[i] + ucr[i] * (temp)) - eps; - float ue = xexpf(ucr[i]) - eps; - Source[i] = xexpf(Source[i]) - eps; - Compressed[i] = ce + DetailBoost * (Source[i] - ue); + Source[i] = xexpf(xlogf(Source[i]) * exponent); } #endif - if(Compressed != ucr) { - delete[] ucr; - } - - return Compressed; - - } void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp, int W_L, int H_L, float max0, float min0) @@ -1572,7 +1496,7 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp min0 = 0.0f; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif @@ -1589,10 +1513,10 @@ void ImProcFunctions::ContrastResid(float * WavCoeffs_L0, struct cont_params &cp } - CompressDR(WavCoeffs_L0, W_L, H_L, Compression, DetailBoost, WavCoeffs_L0); + CompressDR(WavCoeffs_L0, W_L, H_L, Compression, DetailBoost); -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for // removed schedule(dynamic,10) #endif @@ -1624,7 +1548,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat } // max0=32768.f; -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp parallel for #endif @@ -1649,7 +1573,7 @@ void ImProcFunctions::EPDToneMapResid(float * WavCoeffs_L0, unsigned int Iterat 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 @@ -1687,12 +1611,12 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * 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 @@ -1700,14 +1624,14 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * 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 @@ -1722,7 +1646,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp critical #endif { @@ -1782,13 +1706,13 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * 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 @@ -1817,18 +1741,18 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * 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, 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 @@ -1875,7 +1799,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // 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 + //one can also change in calckoe float edd = 3.f; float eddlow = 15.f; float eddlipinfl = 0.005f * cp.edgsens + 0.4f; @@ -1890,7 +1814,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * tmC[i] = &tmCBuffer[i * W_L]; } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -1910,7 +1834,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * 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 @@ -1920,7 +1844,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * 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; @@ -1987,7 +1911,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * 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] @@ -2013,7 +1937,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float * // end } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2048,7 +1972,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, 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 { @@ -2056,7 +1980,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, 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 @@ -2069,7 +1993,7 @@ void ImProcFunctions::WaveletAandBAllAB(wavelet_decomposition &WaveletCoeffs_a, __m128 av = LVFU(WavCoeffs_a0[i * W_L + k]); __m128 bv = LVFU(WavCoeffs_b0[i * W_L + k]); __m128 huev = xatan2f(bv, av); - __m128 chrv = _mm_sqrt_ps(SQRV(av) + SQRV(bv)); + __m128 chrv = vsqrtf(SQRV(av) + SQRV(bv)); STVF(huebuffer[k], huev); STVF(chrbuffer[k], chrv); } @@ -2116,13 +2040,13 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float 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 @@ -2175,7 +2099,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float if(cp.cbena && cp.resena) {//if user select Toning and color balance -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for nowait #endif @@ -2230,7 +2154,7 @@ void ImProcFunctions::WaveletcontAllAB(LabImage * labco, float ** varhue, float } } -#ifdef _RT_NESTED_OPENMP +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -2425,7 +2349,7 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, 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 @@ -2453,7 +2377,7 @@ void ImProcFunctions::finalContAllL (float ** WavCoeffs_L, float * WavCoeffs_L0, } } - int choicelevel = atoi(params->wavelet.Lmethod.data()) - 1; + int choicelevel = params->wavelet.Lmethod - 1; choicelevel = choicelevel == -1 ? 4 : choicelevel; int choiceClevel = 0; @@ -2745,7 +2669,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit 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 @@ -2850,8 +2774,8 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } } else if(cp.EDmet == 1) { //threshold adjuster float MaxPCompare = MaxP[level] * SQR(cp.edg_max / 100.f); //100 instead of b_r...case if b_r < 100 - float MaxNCompare = MaxN[level] * SQR(cp.edg_max / 100.f); //always rduce a little edge for near max values - float edgeSdCompare = (mean[level] + 1.5f * sigma[level]) * SQR(cp.edg_sd / t_r); // 1.5 standard deviation #80% range between mean 50% and 80% + float MaxNCompare = MaxN[level] * SQR(cp.edg_max / 100.f); //always reduce a little edge for near max values + float edgeSdCompare = (mean[level] + 1.5f * sigma[level]) * SQR(cp.edg_sd / t_r); // 1.5 standard deviation #80% range between mean 50% and 80% float edgeMeanCompare = mean[level] * SQR(cp.edg_mean / t_l); float edgeLowCompare = (5.f + SQR(cp.edg_low)); float edgeMeanFactor = cbrt(cp.edg_mean / t_l); @@ -2895,7 +2819,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit edge = edgePrecalc; } - //algorithm that take into account local contrast + //algorithm that takes into account local contrast // I use a thresholdadjuster with // Bottom left ==> minimal low value for local contrast (not 0, but 5...we can change) // 0 10*10 35*35 100*100 substantially correspond to the true distribution of low value, mean, standard-deviation and max (ed 5, 50, 400, 4000 @@ -2943,7 +2867,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit if(edge < 1.f) { edge = 1.f; } - }//mofify effect if sd change + }//modify effect if sd change if (fabs(WavCoeffs_L[dir][k]) < edgeMeanCompare) { edge *= edgeMeanFactor; @@ -3266,7 +3190,7 @@ void ImProcFunctions::ContAllL (float *koeLi[12], float *maxkoeLi, bool lipschit } // 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; } @@ -3524,7 +3448,7 @@ void ImProcFunctions::ContAllAB (LabImage * labco, int maxlvl, float ** varhue, } // 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 --git a/rtengine/jaggedarray.h b/rtengine/jaggedarray.h index 153ed2902..01da776a6 100644 --- a/rtengine/jaggedarray.h +++ b/rtengine/jaggedarray.h @@ -19,6 +19,8 @@ */ #pragma once +#include + #include "noncopyable.h" namespace rtengine @@ -26,60 +28,46 @@ namespace rtengine // These emulate a jagged array, but use only 2 allocations instead of 1 + H. -template -inline T** const allocJaggedArray (const int W, const int H, const bool initZero = false) -{ - T** const a = new T*[H]; - a[0] = new T[H * W]; - - for (int i = 1; i < H; ++i) { - a[i] = a[i - 1] + W; - } - - if (initZero) { - std::memset(a[0], 0, sizeof(T) * W * H); - } - - return a; -} - -template -inline void freeJaggedArray (T** const a) -{ - delete [] a[0]; - delete [] a; -} - -template +template class JaggedArray : public NonCopyable { public: - JaggedArray (const int W, const int H, const bool initZero = false) + JaggedArray(std::size_t width, std::size_t height, bool init_zero = false) : + array( + [width, height, init_zero]() -> T** + { + T** const res = new T*[height]; + res[0] = new T[height * width]; + + for (std::size_t i = 1; i < height; ++i) { + res[i] = res[i - 1] + width; + } + + if (init_zero) { + std::memset(res[0], 0, sizeof(T) * width * height); + } + + return res; + }() + ) { - a = allocJaggedArray (W, H, initZero); - } - ~JaggedArray () - { - if (a) { - freeJaggedArray (a); - a = nullptr; - } } - operator T** const () const + ~JaggedArray () { - return a; + delete[] array[0]; + delete[] array; + } + + operator T** () + { + return array; } private: - T** a; + T** const array; }; -// Declared but not defined to prevent -// explicitly freeing a JaggedArray implicitly cast to T**. -template -void freeJaggedArray (JaggedArray&); - } // rtengine diff --git a/rtengine/klt/trackFeatures.cc b/rtengine/klt/trackFeatures.cc index 474d0f5f5..a99225543 100644 --- a/rtengine/klt/trackFeatures.cc +++ b/rtengine/klt/trackFeatures.cc @@ -23,14 +23,14 @@ typedef float *_FloatWindow; /********************************************************************* * _interpolate - * - * Given a point (x,y) in an image, computes the bilinear interpolated - * gray-level value of the point in the image. + * + * Given a point (x,y) in an image, computes the bilinear interpolated + * gray-level value of the point in the image. */ static float _interpolate( - float x, - float y, + float x, + float y, _KLT_FloatImage img) { int xt = (int) x; /* coordinates of top-left corner */ @@ -61,7 +61,7 @@ static float _interpolate( * _computeIntensityDifference * * Given two images and the window center in both images, - * aligns the images wrt the window and computes the difference + * aligns the images wrt the window and computes the difference * between the two overlaid images. */ @@ -91,7 +91,7 @@ static void _computeIntensityDifference( * _computeGradientSum * * Given two gradients and the window center in both images, - * aligns the gradients wrt the window and computes the sum of the two + * aligns the gradients wrt the window and computes the sum of the two * overlaid gradients. */ @@ -126,7 +126,7 @@ static void _computeGradientSum( * _computeIntensityDifferenceLightingInsensitive * * Given two images and the window center in both images, - * aligns the images wrt the window and computes the difference + * aligns the images wrt the window and computes the difference * between the two overlaid images; normalizes for overall gain and bias. */ @@ -141,7 +141,7 @@ static void _computeIntensityDifferenceLightingInsensitive( int hw = width/2, hh = height/2; float g1, g2, sum1_squared = 0, sum2_squared = 0; int i, j; - + float sum1 = 0, sum2 = 0; float mean1, mean2,alpha,belta; /* Compute values */ @@ -165,7 +165,7 @@ static void _computeIntensityDifferenceLightingInsensitive( g1 = _interpolate(x1+i, y1+j, img1); g2 = _interpolate(x2+i, y2+j, img2); *imgdiff++ = g1- g2*alpha-belta; - } + } } @@ -173,7 +173,7 @@ static void _computeIntensityDifferenceLightingInsensitive( * _computeGradientSumLightingInsensitive * * Given two gradients and the window center in both images, - * aligns the gradients wrt the window and computes the sum of the two + * aligns the gradients wrt the window and computes the sum of the two * overlaid gradients; normalizes for overall gain and bias. */ @@ -184,7 +184,7 @@ static void _computeGradientSumLightingInsensitive( _KLT_FloatImage grady2, _KLT_FloatImage img1, /* images */ _KLT_FloatImage img2, - + float x1, float y1, /* center of window in 1st img */ float x2, float y2, /* center of window in 2nd img */ int width, int height, /* size of window */ @@ -194,7 +194,7 @@ static void _computeGradientSumLightingInsensitive( int hw = width/2, hh = height/2; float g1, g2, sum1_squared = 0, sum2_squared = 0; int i, j; - + float mean1, mean2, alpha; for (j = -hh ; j <= hh ; j++) for (i = -hw ; i <= hw ; i++) { @@ -205,7 +205,7 @@ static void _computeGradientSumLightingInsensitive( mean1 = sum1_squared/(width*height); mean2 = sum2_squared/(width*height); alpha = (float) sqrt(mean1/mean2); - + /* Compute values */ for (j = -hh ; j <= hh ; j++) for (i = -hw ; i <= hw ; i++) { @@ -215,7 +215,7 @@ static void _computeGradientSumLightingInsensitive( g1 = _interpolate(x1+i, y1+j, grady1); g2 = _interpolate(x2+i, y2+j, grady2); *grady++ = g1+ g2*alpha; - } + } } /********************************************************************* @@ -229,8 +229,8 @@ static void _compute2by2GradientMatrix( int width, /* size of window */ int height, float *gxx, /* return values */ - float *gxy, - float *gyy) + float *gxy, + float *gyy) { float gx, gy; @@ -246,8 +246,8 @@ static void _compute2by2GradientMatrix( *gyy += gy*gy; } } - - + + /********************************************************************* * _compute2by1ErrorVector * @@ -267,7 +267,7 @@ static void _compute2by1ErrorVector( int i; /* Compute values */ - *ex = 0; *ey = 0; + *ex = 0; *ey = 0; for (i = 0 ; i < width * height ; i++) { diff = *imgdiff++; *ex += diff * (*gradx++); @@ -297,7 +297,7 @@ static int _solveEquation( { float det = gxx*gyy - gxy*gxy; - + if (det < small) return KLT_SMALL_DET; *dx = (gyy*ex - gxy*ey)/det; @@ -309,7 +309,7 @@ static int _solveEquation( /********************************************************************* * _allocateFloatWindow */ - + static _FloatWindow _allocateFloatWindow( int width, int height) @@ -347,7 +347,7 @@ static void _printFloatWindow( } } */ - + /********************************************************************* * _sumAbsFloatWindow @@ -385,10 +385,10 @@ static int _trackFeature( float y1, float *x2, /* starting location of search in second image */ float *y2, - _KLT_FloatImage img1, + _KLT_FloatImage img1, _KLT_FloatImage gradx1, _KLT_FloatImage grady1, - _KLT_FloatImage img2, + _KLT_FloatImage img2, _KLT_FloatImage gradx2, _KLT_FloatImage grady2, int width, /* size of window */ @@ -410,7 +410,7 @@ static int _trackFeature( int nr = img1->nrows; float one_plus_eps = 1.001f; /* To prevent rounding errors */ - + /* Allocate memory for windows */ imgdiff = _allocateFloatWindow(width, height); gradx = _allocateFloatWindow(width, height); @@ -430,24 +430,24 @@ static int _trackFeature( /* Compute gradient and difference windows */ if (lighting_insensitive) { - _computeIntensityDifferenceLightingInsensitive(img1, img2, x1, y1, *x2, *y2, + _computeIntensityDifferenceLightingInsensitive(img1, img2, x1, y1, *x2, *y2, width, height, imgdiff); - _computeGradientSumLightingInsensitive(gradx1, grady1, gradx2, grady2, + _computeGradientSumLightingInsensitive(gradx1, grady1, gradx2, grady2, img1, img2, x1, y1, *x2, *y2, width, height, gradx, grady); } else { - _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, + _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, width, height, imgdiff); - _computeGradientSum(gradx1, grady1, gradx2, grady2, + _computeGradientSum(gradx1, grady1, gradx2, grady2, x1, y1, *x2, *y2, width, height, gradx, grady); } - + /* Use these windows to construct matrices */ - _compute2by2GradientMatrix(gradx, grady, width, height, + _compute2by2GradientMatrix(gradx, grady, width, height, &gxx, &gxy, &gyy); _compute2by1ErrorVector(imgdiff, gradx, grady, width, height, step_factor, &ex, &ey); - + /* Using matrices, solve equation for new displacement */ status = _solveEquation(gxx, gxy, gyy, ex, ey, small, &dx, &dy); if (status == KLT_SMALL_DET) break; @@ -459,19 +459,19 @@ static int _trackFeature( } while ((fabs(dx)>=th || fabs(dy)>=th) && iteration < max_iterations); /* Check whether window is out of bounds */ - if (*x2-hw < 0.0f || nc-(*x2+hw) < one_plus_eps || + if (*x2-hw < 0.0f || nc-(*x2+hw) < one_plus_eps || *y2-hh < 0.0f || nr-(*y2+hh) < one_plus_eps) status = KLT_OOB; /* Check whether residue is too large */ if (status == KLT_TRACKED) { if (lighting_insensitive) - _computeIntensityDifferenceLightingInsensitive(img1, img2, x1, y1, *x2, *y2, + _computeIntensityDifferenceLightingInsensitive(img1, img2, x1, y1, *x2, *y2, width, height, imgdiff); else - _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, + _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, width, height, imgdiff); - if (_sumAbsFloatWindow(imgdiff, width, height)/(width*height) > max_residue) + if (_sumAbsFloatWindow(imgdiff, width, height)/(width*height) > max_residue) status = KLT_LARGE_RESIDUE; } @@ -505,25 +505,25 @@ static KLT_BOOL _outOfBounds( -/********************************************************************** +/********************************************************************** * CONSISTENCY CHECK OF FEATURES BY AFFINE MAPPING (BEGIN) -* -* Created by: Thorsten Thormaehlen (University of Hannover) June 2004 +* +* Created by: Thorsten Thormaehlen (University of Hannover) June 2004 * thormae@tnt.uni-hannover.de -* +* * Permission is granted to any individual or institution to use, copy, modify, -* and distribute this part of the software, provided that this complete authorship -* and permission notice is maintained, intact, in all copies. +* and distribute this part of the software, provided that this complete authorship +* and permission notice is maintained, intact, in all copies. * * This software is provided "as is" without express or implied warranty. * * * The following static functions are helpers for the affine mapping. -* They all start with "_am". +* They all start with "_am". * There are also small changes in other files for the * affine mapping these are all marked by "for affine mapping" -* -* Thanks to Kevin Koeser (koeser@mip.informatik.uni-kiel.de) for fixing a bug +* +* Thanks to Kevin Koeser (koeser@mip.informatik.uni-kiel.de) for fixing a bug */ #define SWAP_ME(X,Y) {temp=(X);(X)=(Y);(Y)=temp;} @@ -613,7 +613,7 @@ static int _am_gauss_jordan_elimination(float **a, int n, float **b, int m) /********************************************************************* * _am_getGradientWinAffine * - * aligns the gradients with the affine transformed window + * aligns the gradients with the affine transformed window */ static void _am_getGradientWinAffine( @@ -628,7 +628,7 @@ static void _am_getGradientWinAffine( int hw = width/2, hh = height/2; int i, j; float mi, mj; - + /* Compute values */ for (j = -hh ; j <= hh ; j++) for (i = -hw ; i <= hw ; i++) { @@ -637,19 +637,19 @@ static void _am_getGradientWinAffine( *out_gradx++ = _interpolate(x+mi, y+mj, in_gradx); *out_grady++ = _interpolate(x+mi, y+mj, in_grady); } - + } ///********************************************************************* // * _computeAffineMappedImage // * used only for DEBUG output -// * +// * //*/ // //static void _am_computeAffineMappedImage( // _KLT_FloatImage img, /* images */ // float x, float y, /* center of window */ -// float Axx, float Ayx , float Axy, float Ayy, /* affine mapping */ +// float Axx, float Ayx , float Axy, float Ayy, /* affine mapping */ // int width, int height, /* size of window */ // _FloatWindow imgdiff) /* output */ //{ @@ -679,14 +679,14 @@ static void _am_getSubFloatImage( int hw = window->ncols/2, hh = window->nrows/2; int x0 = (int) x; int y0 = (int) y; - float * windata = window->data; + float * windata = window->data; int offset; int i, j; assert(x0 - hw >= 0); assert(y0 - hh >= 0); assert(x0 + hw <= img->ncols); - assert(y0 + hh <= img->nrows); + assert(y0 + hh <= img->nrows); /* copy values */ for (j = -hh ; j <= hh ; j++) @@ -700,10 +700,10 @@ static void _am_getSubFloatImage( * _am_computeIntensityDifferenceAffine * * Given two images and the window center in both images, - * aligns the images with the window and computes the difference + * aligns the images with the window and computes the difference * between the two overlaid images using the affine mapping. * A = [ Axx Axy] - * [ Ayx Ayy] + * [ Ayx Ayy] */ static void _am_computeIntensityDifferenceAffine( @@ -711,7 +711,7 @@ static void _am_computeIntensityDifferenceAffine( _KLT_FloatImage img2, float x1, float y1, /* center of window in 1st img */ float x2, float y2, /* center of window in 2nd img */ - float Axx, float Ayx , float Axy, float Ayy, /* affine mapping */ + float Axx, float Ayx , float Axy, float Ayy, /* affine mapping */ int width, int height, /* size of window */ _FloatWindow imgdiff) /* output */ { @@ -746,15 +746,15 @@ static void _am_compute6by6GradientMatrix( int hw = width/2, hh = height/2; int i, j; float gx, gy, gxx, gxy, gyy, x, y, xx, xy, yy; - - - /* Set values to zero */ + + + /* Set values to zero */ for (j = 0 ; j < 6 ; j++) { for (i = j ; i < 6 ; i++) { T[j][i] = 0.0; } } - + for (j = -hh ; j <= hh ; j++) { for (i = -hw ; i <= hw ; i++) { gx = *gradx++; @@ -762,41 +762,41 @@ static void _am_compute6by6GradientMatrix( gxx = gx * gx; gxy = gx * gy; gyy = gy * gy; - x = (float) i; - y = (float) j; + x = (float) i; + y = (float) j; xx = x * x; xy = x * y; yy = y * y; - - T[0][0] += xx * gxx; + + T[0][0] += xx * gxx; T[0][1] += xx * gxy; T[0][2] += xy * gxx; T[0][3] += xy * gxy; T[0][4] += x * gxx; T[0][5] += x * gxy; - + T[1][1] += xx * gyy; T[1][2] += xy * gxy; T[1][3] += xy * gyy; T[1][4] += x * gxy; T[1][5] += x * gyy; - + T[2][2] += yy * gxx; T[2][3] += yy * gxy; T[2][4] += y * gxx; T[2][5] += y * gxy; - + T[3][3] += yy * gyy; T[3][4] += y * gxy; - T[3][5] += y * gyy; + T[3][5] += y * gyy; - T[4][4] += gxx; + T[4][4] += gxx; T[4][5] += gxy; - - T[5][5] += gyy; + + T[5][5] += gyy; } } - + for (j = 0 ; j < 5 ; j++) { for (i = j+1 ; i < 6 ; i++) { T[i][j] = T[j][i]; @@ -824,9 +824,9 @@ static void _am_compute6by1ErrorVector( int i, j; float diff, diffgradx, diffgrady; - /* Set values to zero */ - for(i = 0; i < 6; i++) e[i][0] = 0.0; - + /* Set values to zero */ + for(i = 0; i < 6; i++) e[i][0] = 0.0; + /* Compute values */ for (j = -hh ; j <= hh ; j++) { for (i = -hw ; i <= hw ; i++) { @@ -835,15 +835,15 @@ static void _am_compute6by1ErrorVector( diffgrady = diff * (*grady++); e[0][0] += diffgradx * i; e[1][0] += diffgrady * i; - e[2][0] += diffgradx * j; - e[3][0] += diffgrady * j; + e[2][0] += diffgradx * j; + e[3][0] += diffgrady * j; e[4][0] += diffgradx; - e[5][0] += diffgrady; + e[5][0] += diffgrady; } } - + for(i = 0; i < 6; i++) e[i][0] *= 0.5; - + } @@ -862,37 +862,37 @@ static void _am_compute4by4GradientMatrix( int hw = width/2, hh = height/2; int i, j; float gx, gy, x, y; - - - /* Set values to zero */ + + + /* Set values to zero */ for (j = 0 ; j < 4 ; j++) { for (i = 0 ; i < 4 ; i++) { T[j][i] = 0.0; } } - + for (j = -hh ; j <= hh ; j++) { for (i = -hw ; i <= hw ; i++) { gx = *gradx++; gy = *grady++; - x = (float) i; - y = (float) j; + x = (float) i; + y = (float) j; T[0][0] += (x*gx+y*gy) * (x*gx+y*gy); T[0][1] += (x*gx+y*gy)*(x*gy-y*gx); T[0][2] += (x*gx+y*gy)*gx; T[0][3] += (x*gx+y*gy)*gy; - + T[1][1] += (x*gy-y*gx) * (x*gy-y*gx); T[1][2] += (x*gy-y*gx)*gx; T[1][3] += (x*gy-y*gx)*gy; - + T[2][2] += gx*gx; T[2][3] += gx*gy; - + T[3][3] += gy*gy; } } - + for (j = 0 ; j < 3 ; j++) { for (i = j+1 ; i < 4 ; i++) { T[i][j] = T[j][i]; @@ -918,9 +918,9 @@ static void _am_compute4by1ErrorVector( int i, j; float diff, diffgradx, diffgrady; - /* Set values to zero */ - for(i = 0; i < 4; i++) e[i][0] = 0.0; - + /* Set values to zero */ + for(i = 0; i < 4; i++) e[i][0] = 0.0; + /* Compute values */ for (j = -hh ; j <= hh ; j++) { for (i = -hw ; i <= hw ; i++) { @@ -933,9 +933,9 @@ static void _am_compute4by1ErrorVector( e[3][0] += diffgrady; } } - + for(i = 0; i < 4; i++) e[i][0] *= 0.5; - + } @@ -950,7 +950,7 @@ static void _am_compute4by1ErrorVector( * KLT_TRACKED otherwise. */ -/* if you enalbe the DEBUG_AFFINE_MAPPING make sure you have created a directory "./debug" */ +/* if you enable the DEBUG_AFFINE_MAPPING make sure you have created a directory "./debug" */ /* #define DEBUG_AFFINE_MAPPING */ #ifdef DEBUG_AFFINE_MAPPING @@ -963,10 +963,10 @@ static int _am_trackFeatureAffine( float y1, float *x2, /* starting location of search in second image */ float *y2, - _KLT_FloatImage img1, + _KLT_FloatImage img1, _KLT_FloatImage gradx1, _KLT_FloatImage grady1, - _KLT_FloatImage img2, + _KLT_FloatImage img2, _KLT_FloatImage gradx2, _KLT_FloatImage grady2, int width, /* size of window */ @@ -980,7 +980,7 @@ static int _am_trackFeatureAffine( int lighting_insensitive, /* whether to normalize for gain and bias */ int affine_map, /* whether to evaluates the consistency of features with affine mapping */ float mdd, /* difference between the displacements */ - float *Axx, float *Ayx, + float *Axx, float *Ayx, float *Axy, float *Ayy) /* used affine mapping */ { @@ -996,7 +996,7 @@ static int _am_trackFeatureAffine( int nc2 = img2->ncols; int nr2 = img2->nrows; float **a; - float **T; + float **T; float one_plus_eps = 1.001f; /* To prevent rounding errors */ float old_x2 = *x2; float old_y2 = *y2; @@ -1007,7 +1007,7 @@ static int _am_trackFeatureAffine( _KLT_FloatImage aff_diff_win = _KLTCreateFloatImage(width,height); printf("starting location x2=%f y2=%f\n", *x2, *y2); #endif - + /* Allocate memory for windows */ imgdiff = _allocateFloatWindow(width, height); gradx = _allocateFloatWindow(width, height); @@ -1019,7 +1019,7 @@ static int _am_trackFeatureAffine( do { if(!affine_map) { /* pure translation tracker */ - + /* If out of bounds, exit loop */ if ( x1-hw < 0.0f || nc1-( x1+hw) < one_plus_eps || *x2-hw < 0.0f || nc2-(*x2+hw) < one_plus_eps || @@ -1028,47 +1028,47 @@ static int _am_trackFeatureAffine( status = KLT_OOB; break; } - + /* Compute gradient and difference windows */ if (lighting_insensitive) { - _computeIntensityDifferenceLightingInsensitive(img1, img2, x1, y1, *x2, *y2, + _computeIntensityDifferenceLightingInsensitive(img1, img2, x1, y1, *x2, *y2, width, height, imgdiff); - _computeGradientSumLightingInsensitive(gradx1, grady1, gradx2, grady2, + _computeGradientSumLightingInsensitive(gradx1, grady1, gradx2, grady2, img1, img2, x1, y1, *x2, *y2, width, height, gradx, grady); } else { - _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, + _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, width, height, imgdiff); - _computeGradientSum(gradx1, grady1, gradx2, grady2, + _computeGradientSum(gradx1, grady1, gradx2, grady2, x1, y1, *x2, *y2, width, height, gradx, grady); } - -#ifdef DEBUG_AFFINE_MAPPING + +#ifdef DEBUG_AFFINE_MAPPING aff_diff_win->data = imgdiff; sprintf(fname, "./debug/kltimg_trans_diff_win%03d.%03d.pgm", glob_index, counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); printf("iter = %d translation tracker res: %f\n", iteration, _sumAbsFloatWindow(imgdiff, width, height)/(width*height)); #endif - + /* Use these windows to construct matrices */ - _compute2by2GradientMatrix(gradx, grady, width, height, + _compute2by2GradientMatrix(gradx, grady, width, height, &gxx, &gxy, &gyy); _compute2by1ErrorVector(imgdiff, gradx, grady, width, height, step_factor, &ex, &ey); - + /* Using matrices, solve equation for new displacement */ status = _solveEquation(gxx, gxy, gyy, ex, ey, small, &dx, &dy); convergence = (fabs(dx) < th && fabs(dy) < th); - + *x2 += dx; *y2 += dy; - + }else{ /* affine tracker */ - + float ul_x = *Axx * (-hw) + *Axy * hh + *x2; /* upper left corner */ - float ul_y = *Ayx * (-hw) + *Ayy * hh + *y2; + float ul_y = *Ayx * (-hw) + *Ayy * hh + *y2; float ll_x = *Axx * (-hw) + *Axy * (-hh) + *x2; /* lower left corner */ float ll_y = *Ayx * (-hw) + *Ayy * (-hh) + *y2; float ur_x = *Axx * hw + *Axy * hh + *x2; /* upper right corner */ @@ -1098,25 +1098,25 @@ static int _am_trackFeatureAffine( sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_1.pgm", glob_index, counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); - + _am_computeAffineMappedImage(img2, *x2, *y2, *Axx, *Ayx , *Axy, *Ayy, width, height, imgdiff); aff_diff_win->data = imgdiff; sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_2.pgm", glob_index, counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); #endif - + _am_computeIntensityDifferenceAffine(img1, img2, x1, y1, *x2, *y2, *Axx, *Ayx , *Axy, *Ayy, width, height, imgdiff); -#ifdef DEBUG_AFFINE_MAPPING +#ifdef DEBUG_AFFINE_MAPPING aff_diff_win->data = imgdiff; sprintf(fname, "./debug/kltimg_aff_diff_win%03d.%03d_3.pgm", glob_index,counter); printf("%s\n", fname); _KLTWriteAbsFloatImageToPGM(aff_diff_win, fname,256.0); - + printf("iter = %d affine tracker res: %f\n", iteration, _sumAbsFloatWindow(imgdiff, width, height)/(width*height)); -#endif - +#endif + _am_getGradientWinAffine(gradx2, grady2, *x2, *y2, *Axx, *Ayx , *Axy, *Ayy, width, height, gradx, grady); @@ -1124,24 +1124,24 @@ static int _am_trackFeatureAffine( case 1: _am_compute4by1ErrorVector(imgdiff, gradx, grady, width, height, a); _am_compute4by4GradientMatrix(gradx, grady, width, height, T); - + status = _am_gauss_jordan_elimination(T,4,a,1); - + *Axx += a[0][0]; *Ayx += a[1][0]; *Ayy = *Axx; *Axy = -(*Ayx); - + dx = a[2][0]; dy = a[3][0]; - + break; case 2: _am_compute6by1ErrorVector(imgdiff, gradx, grady, width, height, a); _am_compute6by6GradientMatrix(gradx, grady, width, height, T); - + status = _am_gauss_jordan_elimination(T,6,a,1); - + *Axx += a[0][0]; *Ayx += a[1][0]; *Axy += a[2][0]; @@ -1149,30 +1149,30 @@ static int _am_trackFeatureAffine( dx = a[4][0]; dy = a[5][0]; - + break; } - + *x2 += dx; *y2 += dy; - + /* old upper left corner - new upper left corner */ - ul_x -= *Axx * (-hw) + *Axy * hh + *x2; - ul_y -= *Ayx * (-hw) + *Ayy * hh + *y2; + ul_x -= *Axx * (-hw) + *Axy * hh + *x2; + ul_y -= *Ayx * (-hw) + *Ayy * hh + *y2; /* old lower left corner - new lower left corner */ - ll_x -= *Axx * (-hw) + *Axy * (-hh) + *x2; + ll_x -= *Axx * (-hw) + *Axy * (-hh) + *x2; ll_y -= *Ayx * (-hw) + *Ayy * (-hh) + *y2; /* old upper right corner - new upper right corner */ - ur_x -= *Axx * hw + *Axy * hh + *x2; + ur_x -= *Axx * hw + *Axy * hh + *x2; ur_y -= *Ayx * hw + *Ayy * hh + *y2; /* old lower right corner - new lower right corner */ - lr_x -= *Axx * hw + *Axy * (-hh) + *x2; + lr_x -= *Axx * hw + *Axy * (-hh) + *x2; lr_y -= *Ayx * hw + *Ayy * (-hh) + *y2; -#ifdef DEBUG_AFFINE_MAPPING +#ifdef DEBUG_AFFINE_MAPPING printf ("iter = %d, ul_x=%f ul_y=%f ll_x=%f ll_y=%f ur_x=%f ur_y=%f lr_x=%f lr_y=%f \n", iteration, ul_x, ul_y, ll_x, ll_y, ur_x, ur_y, lr_x, lr_y); -#endif +#endif convergence = (fabs(dx) < th && fabs(dy) < th && fabs(ul_x) < th_aff && fabs(ul_y) < th_aff && @@ -1180,19 +1180,19 @@ static int _am_trackFeatureAffine( fabs(ur_x) < th_aff && fabs(ur_y) < th_aff && fabs(lr_x) < th_aff && fabs(lr_y) < th_aff); } - + if (status == KLT_SMALL_DET) break; iteration++; -#ifdef DEBUG_AFFINE_MAPPING +#ifdef DEBUG_AFFINE_MAPPING printf ("iter = %d, x1=%f, y1=%f, x2=%f, y2=%f, Axx=%f, Ayx=%f , Axy=%f, Ayy=%f \n",iteration, x1, y1, *x2, *y2, *Axx, *Ayx , *Axy, *Ayy); -#endif - } while ( !convergence && iteration < max_iterations); +#endif + } while ( !convergence && iteration < max_iterations); /*} while ( (fabs(dx)>=th || fabs(dy)>=th || (affine_map && iteration < 8) ) && iteration < max_iterations); */ _am_free_matrix(T); _am_free_matrix(a); /* Check whether window is out of bounds */ - if (*x2-hw < 0.0f || nc2-(*x2+hw) < one_plus_eps || + if (*x2-hw < 0.0f || nc2-(*x2+hw) < one_plus_eps || *y2-hh < 0.0f || nr2-(*y2+hh) < one_plus_eps) status = KLT_OOB; @@ -1203,7 +1203,7 @@ static int _am_trackFeatureAffine( /* Check whether residue is too large */ if (status == KLT_TRACKED) { if(!affine_map){ - _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, + _computeIntensityDifference(img1, img2, x1, y1, *x2, *y2, width, height, imgdiff); }else{ _am_computeIntensityDifferenceAffine(img1, img2, x1, y1, *x2, *y2, *Axx, *Ayx , *Axy, *Ayy, @@ -1211,8 +1211,8 @@ static int _am_trackFeatureAffine( } #ifdef DEBUG_AFFINE_MAPPING printf("iter = %d final_res = %f\n", iteration, _sumAbsFloatWindow(imgdiff, width, height)/(width*height)); -#endif - if (_sumAbsFloatWindow(imgdiff, width, height)/(width*height) > max_residue) +#endif + if (_sumAbsFloatWindow(imgdiff, width, height)/(width*height) > max_residue) status = KLT_LARGE_RESIDUE; } @@ -1222,8 +1222,8 @@ static int _am_trackFeatureAffine( #ifdef DEBUG_AFFINE_MAPPING printf("iter = %d status=%d\n", iteration, status); _KLTFreeFloatImage( aff_diff_win ); -#endif - +#endif + /* Return appropriate value */ return status; } @@ -1313,7 +1313,7 @@ void KLTTrackFeatures( pyramid1_gradx = _KLTCreatePyramid(ncols, nrows, (int) subsampling, tc->nPyramidLevels); pyramid1_grady = _KLTCreatePyramid(ncols, nrows, (int) subsampling, tc->nPyramidLevels); for (i = 0 ; i < tc->nPyramidLevels ; i++) - _KLTComputeGradients(pyramid1->img[i], tc->grad_sigma, + _KLTComputeGradients(pyramid1->img[i], tc->grad_sigma, pyramid1_gradx->img[i], pyramid1_grady->img[i]); } @@ -1327,7 +1327,7 @@ void KLTTrackFeatures( pyramid2_gradx = _KLTCreatePyramid(ncols, nrows, (int) subsampling, tc->nPyramidLevels); pyramid2_grady = _KLTCreatePyramid(ncols, nrows, (int) subsampling, tc->nPyramidLevels); for (i = 0 ; i < tc->nPyramidLevels ; i++) - _KLTComputeGradients(pyramid2->img[i], tc->grad_sigma, + _KLTComputeGradients(pyramid2->img[i], tc->grad_sigma, pyramid2_gradx->img[i], pyramid2_grady->img[i]); @@ -1372,11 +1372,11 @@ void KLTTrackFeatures( xloc *= subsampling; yloc *= subsampling; xlocout *= subsampling; ylocout *= subsampling; - val = _trackFeature(xloc, yloc, + val = _trackFeature(xloc, yloc, &xlocout, &ylocout, - pyramid1->img[r], - pyramid1_gradx->img[r], pyramid1_grady->img[r], - pyramid2->img[r], + pyramid1->img[r], + pyramid1_gradx->img[r], pyramid1_grady->img[r], + pyramid2->img[r], pyramid2_gradx->img[r], pyramid2_grady->img[r], tc->window_width, tc->window_height, tc->step_factor, @@ -1449,7 +1449,7 @@ void KLTTrackFeatures( if (tc->affineConsistencyCheck >= 0 && val == KLT_TRACKED) { /*for affine mapping*/ int border = 2; /* add border for interpolation */ -#ifdef DEBUG_AFFINE_MAPPING +#ifdef DEBUG_AFFINE_MAPPING glob_index = indx; #endif @@ -1467,10 +1467,10 @@ void KLTTrackFeatures( /* affine tracking */ val = _am_trackFeatureAffine(featurelist->feature[indx]->aff_x, featurelist->feature[indx]->aff_y, &xlocout, &ylocout, - featurelist->feature[indx]->aff_img, - featurelist->feature[indx]->aff_img_gradx, + featurelist->feature[indx]->aff_img, + featurelist->feature[indx]->aff_img_gradx, featurelist->feature[indx]->aff_img_grady, - pyramid2->img[0], + pyramid2->img[0], pyramid2_gradx->img[0], pyramid2_grady->img[0], tc->affine_window_width, tc->affine_window_height, tc->step_factor, @@ -1478,14 +1478,14 @@ void KLTTrackFeatures( tc->min_determinant, tc->min_displacement, tc->affine_min_displacement, - tc->affine_max_residue, + tc->affine_max_residue, tc->lighting_insensitive, tc->affineConsistencyCheck, tc->affine_max_displacement_differ, &featurelist->feature[indx]->aff_Axx, &featurelist->feature[indx]->aff_Ayx, &featurelist->feature[indx]->aff_Axy, - &featurelist->feature[indx]->aff_Ayy + &featurelist->feature[indx]->aff_Ayy ); featurelist->feature[indx]->val = val; if(val != KLT_TRACKED){ @@ -1538,5 +1538,3 @@ void KLTTrackFeatures( } } - - diff --git a/rtengine/labimage.cc b/rtengine/labimage.cc index bcadda0ed..81b1a4303 100644 --- a/rtengine/labimage.cc +++ b/rtengine/labimage.cc @@ -64,7 +64,7 @@ void LabImage::getPipetteData (float &v1, float &v2, float &v3, int posX, int po v3 = n ? accumulator_b / float(n) : 0.f; } -void LabImage::allocLab(int w, int h) +void LabImage::allocLab(size_t w, size_t h) { L = new float*[h]; a = new float*[h]; @@ -73,19 +73,19 @@ void LabImage::allocLab(int w, int h) data = new float [w * h * 3]; float * index = data; - for (int i = 0; i < h; i++) { + for (size_t i = 0; i < h; i++) { L[i] = index + i * w; } index += w * h; - for (int i = 0; i < h; i++) { + for (size_t i = 0; i < h; i++) { a[i] = index + i * w; } index += w * h; - for (int i = 0; i < h; i++) { + for (size_t i = 0; i < h; i++) { b[i] = index + i * w; } } @@ -101,6 +101,6 @@ void LabImage::deleteLab() void LabImage::reallocLab() { allocLab(W, H); -}; +} } diff --git a/rtengine/labimage.h b/rtengine/labimage.h index 93f3887b6..28bb891a9 100644 --- a/rtengine/labimage.h +++ b/rtengine/labimage.h @@ -25,7 +25,7 @@ namespace rtengine class LabImage { private: - void allocLab(int w, int h); + void allocLab(size_t w, size_t h); public: int W, H; diff --git a/rtengine/lcp.cc b/rtengine/lcp.cc index baaa88767..7156f17e2 100644 --- a/rtengine/lcp.cc +++ b/rtengine/lcp.cc @@ -29,6 +29,7 @@ #include "lcp.h" +#include "procparams.h" #include "settings.h" namespace rtengine @@ -760,12 +761,13 @@ void XMLCALL rtengine::LCPProfile::XmlStartHandler(void* pLCPProfile, const char ++src; } - strcpy(pProf->lastTag, src); - + strncpy(pProf->lastTag, src, sizeof(pProf->lastTag) - 1); + pProf->lastTag[sizeof(pProf->lastTag) - 1] = 0; const std::string src_str = src; if (src_str == "VignetteModelPiecewiseParam") { - strcpy(pProf->inInvalidTag, src); + strncpy(pProf->inInvalidTag, src, sizeof(pProf->inInvalidTag) - 1); + pProf->inInvalidTag[sizeof(pProf->inInvalidTag) - 1] = 0; } if (src_str == "CameraProfiles") { @@ -931,7 +933,12 @@ std::shared_ptr rtengine::LCPStore::getProfile(const Glib: std::shared_ptr res; if (!cache.get(filename, res)) { - res.reset(new LCPProfile(filename)); + try { + res.reset(new LCPProfile(filename)); + } catch (...) { + return nullptr; + } + cache.set(filename, res); } @@ -1131,7 +1138,7 @@ void rtengine::LCPMapper::correctCA(double& x, double& y, int cx, int cy, int ch 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; @@ -1169,7 +1176,7 @@ SSEFUNCTION void rtengine::LCPMapper::processVignetteLine(int width, int y, floa } } -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 --git a/rtengine/lcp.h b/rtengine/lcp.h index b50fd335e..2d9707907 100644 --- a/rtengine/lcp.h +++ b/rtengine/lcp.h @@ -131,8 +131,8 @@ private: bool inPerspect; bool inAlternateLensID; bool inAlternateLensNames; - char lastTag[256]; - char inInvalidTag[256]; + char lastTag[257]; + char inInvalidTag[257]; LCPPersModel* pCurPersModel; LCPModelCommon* pCurCommon; @@ -153,7 +153,7 @@ public: Glib::ustring getDefaultCommonDirectory() const; private: - LCPStore(unsigned int _cache_size = 32); + explicit LCPStore(unsigned int _cache_size = 32); // Maps file name to profile as cache mutable Cache> cache; @@ -190,11 +190,11 @@ public: ); - 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 cx, int cy, int channel) const; - void processVignetteLine(int width, int y, float* line) const; - void processVignetteLine3Channels(int width, int y, float* line) const; + void correctDistortion(double &x, double &y, int cx, int cy, double scale) const override; // MUST be the first stage + bool isCACorrectionAvailable() 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; private: bool enableCA; // is the mapper capable if CA correction? diff --git a/rtengine/lj92.c b/rtengine/lj92.c new file mode 100644 index 000000000..d72075a62 --- /dev/null +++ b/rtengine/lj92.c @@ -0,0 +1,698 @@ +/* +lj92.c +(c) Andrew Baldwin 2014 + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include +#include +#include +#include + +#include "lj92.h" + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; + +//#define SLOW_HUFF +//#define DEBUG + +typedef struct _ljp { + u8* data; + u8* dataend; + int datalen; + int scanstart; + int ix; + int x; // Width + int y; // Height + int bits; // Bit depth + int writelen; // Write rows this long + int skiplen; // Skip this many values after each row + u16* linearize; // Linearization table + int linlen; + int sssshist[16]; + + // Huffman table - only one supported, and probably needed +#ifdef SLOW_HUFF + int* maxcode; + int* mincode; + int* valptr; + u8* huffval; + int* huffsize; + int* huffcode; +#else + u16* hufflut; + int huffbits; +#endif + // Parse state + int cnt; + u32 b; + u16* image; + u16* rowcache; + u16* outrow[2]; +} ljp; + +static int find(ljp* self) { + int ix = self->ix; + u8* data = self->data; + while (data[ix] != 0xFF && ix<(self->datalen-1)) { + ix += 1; + } + ix += 2; + if (ix>=self->datalen) return -1; + self->ix = ix; + return data[ix-1]; +} + +#define BEH(ptr) ((((int)(*&ptr))<<8)|(*(&ptr+1))) + +static int parseHuff(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + u8* huffhead = &self->data[self->ix]; // xstruct.unpack('>HB16B',self.data[self.ix:self.ix+19]) + u8* bits = &huffhead[2]; + bits[0] = 0; // Because table starts from 1 + unsigned int hufflen = BEH(huffhead[0]); + if ((self->ix + hufflen) >= self->datalen) return ret; +#ifdef SLOW_HUFF + u8* huffval = calloc(hufflen - 19,sizeof(u8)); + if (huffval == NULL) return LJ92_ERROR_NO_MEMORY; + self->huffval = huffval; + for (int hix=0;hix<(hufflen-19);hix++) { + huffval[hix] = self->data[self->ix+19+hix]; +#ifdef DEBUG + printf("huffval[%d]=%d\n",hix,huffval[hix]); +#endif + } + self->ix += hufflen; + // Generate huffman table + int k = 0; + int i = 1; + int j = 1; + int huffsize_needed = 1; + // First calculate how long huffsize needs to be + while (i<=16) { + while (j<=bits[i]) { + huffsize_needed++; + k = k+1; + j = j+1; + } + i = i+1; + j = 1; + } + // Now allocate and do it + int* huffsize = calloc(huffsize_needed,sizeof(int)); + if (huffsize == NULL) return LJ92_ERROR_NO_MEMORY; + self->huffsize = huffsize; + k = 0; + i = 1; + j = 1; + // First calculate how long huffsize needs to be + int hsix = 0; + while (i<=16) { + while (j<=bits[i]) { + huffsize[hsix++] = i; + k = k+1; + j = j+1; + } + i = i+1; + j = 1; + } + huffsize[hsix++] = 0; + + // Calculate the size of huffcode array + int huffcode_needed = 0; + k = 0; + int code = 0; + int si = huffsize[0]; + while (1) { + while (huffsize[k] == si) { + huffcode_needed++; + code = code+1; + k = k+1; + } + if (huffsize[k] == 0) + break; + while (huffsize[k] != si) { + code = code << 1; + si = si + 1; + } + } + // Now fill it + int* huffcode = calloc(huffcode_needed,sizeof(int)); + if (huffcode == NULL) return LJ92_ERROR_NO_MEMORY; + self->huffcode = huffcode; + int hcix = 0; + k = 0; + code = 0; + si = huffsize[0]; + while (1) { + while (huffsize[k] == si) { + huffcode[hcix++] = code; + code = code+1; + k = k+1; + } + if (huffsize[k] == 0) + break; + while (huffsize[k] != si) { + code = code << 1; + si = si + 1; + } + } + + i = 0; + j = 0; + + int* maxcode = calloc(17,sizeof(int)); + if (maxcode == NULL) return LJ92_ERROR_NO_MEMORY; + self->maxcode = maxcode; + int* mincode = calloc(17,sizeof(int)); + if (mincode == NULL) return LJ92_ERROR_NO_MEMORY; + self->mincode = mincode; + int* valptr = calloc(17,sizeof(int)); + if (valptr == NULL) return LJ92_ERROR_NO_MEMORY; + self->valptr = valptr; + + while (1) { + while (1) { + i++; + if (i>16) + break; + if (bits[i]!=0) + break; + maxcode[i] = -1; + } + if (i>16) + break; + valptr[i] = j; + mincode[i] = huffcode[j]; + j = j+bits[i]-1; + maxcode[i] = huffcode[j]; + j++; + } + free(huffsize); + self->huffsize = NULL; + free(huffcode); + self->huffcode = NULL; + ret = LJ92_ERROR_NONE; +#else + /* Calculate huffman direct lut */ + // How many bits in the table - find highest entry + u8* huffvals = &self->data[self->ix+19]; + int maxbits = 16; + while (maxbits>0) { + if (bits[maxbits]) break; + maxbits--; + } + self->huffbits = maxbits; + /* Now fill the lut */ + u16* hufflut = (u16*)malloc((1<hufflut = hufflut; + int i = 0; + int hv = 0; + int rv = 0; + int vl = 0; // i + int hcode; + int bitsused = 1; +#ifdef DEBUG + printf("%04x:%x:%d:%x\n",i,huffvals[hv],bitsused,1<<(maxbits-bitsused)); +#endif + while (i<1<maxbits) { + break; // Done. Should never get here! + } + if (vl >= bits[bitsused]) { + bitsused++; + vl = 0; + continue; + } + if (rv == 1 << (maxbits-bitsused)) { + rv = 0; + vl++; + hv++; +#ifdef DEBUG + printf("%04x:%x:%d:%x\n",i,huffvals[hv],bitsused,1<<(maxbits-bitsused)); +#endif + continue; + } + hcode = huffvals[hv]; + hufflut[i] = hcode<<8 | bitsused; + //printf("%d %d %d\n",i,bitsused,hcode); + i++; + rv++; + } + ret = LJ92_ERROR_NONE; +#endif + return ret; +} + +static int parseSof3(ljp* self) { + if (self->ix+6 >= self->datalen) return LJ92_ERROR_CORRUPT; + self->y = BEH(self->data[self->ix+3]); + self->x = BEH(self->data[self->ix+5]); + self->bits = self->data[self->ix+2]; + self->ix += BEH(self->data[self->ix]); + return LJ92_ERROR_NONE; +} + +static int parseBlock(ljp* self,int marker) { + self->ix += BEH(self->data[self->ix]); + if (self->ix >= self->datalen) return LJ92_ERROR_CORRUPT; + return LJ92_ERROR_NONE; +} + +#ifdef SLOW_HUFF +static int nextbit(ljp* self) { + u32 b = self->b; + if (self->cnt == 0) { + u8* data = &self->data[self->ix]; + u32 next = *data++; + b = next; + if (next == 0xff) { + data++; + self->ix++; + } + self->ix++; + self->cnt = 8; + } + int bit = b >> 7; + self->cnt--; + self->b = (b << 1)&0xFF; + return bit; +} + +static int decode(ljp* self) { + int i = 1; + int code = nextbit(self); + while (code > self->maxcode[i]) { + i++; + code = (code << 1) + nextbit(self); + } + int j = self->valptr[i]; + j = j + code - self->mincode[i]; + int value = self->huffval[j]; + return value; +} + +static int receive(ljp* self,int ssss) { + int i = 0; + int v = 0; + while (i != ssss) { + i++; + v = (v<<1) + nextbit(self); + } + return v; +} + +static int extend(ljp* self,int v,int t) { + int vt = 1<<(t-1); + if (v < vt) { + vt = (-1 << t) + 1; + v = v + vt; + } + return v; +} +#endif + +inline static int nextdiff(ljp* self, int Px) { +#ifdef SLOW_HUFF + int t = decode(self); + int diff = receive(self,t); + diff = extend(self,diff,t); + //printf("%d %d %d %x\n",Px+diff,Px,diff,t);//,index,usedbits); +#else + u32 b = self->b; + int cnt = self->cnt; + int huffbits = self->huffbits; + int ix = self->ix; + int next; + while (cnt < huffbits) { + next = *(u16*)&self->data[ix]; + int one = next&0xFF; + int two = next>>8; + b = (b<<16)|(one<<8)|two; + cnt += 16; + ix += 2; + if (one==0xFF) { + //printf("%x %x %x %x %d\n",one,two,b,b>>8,cnt); + b >>= 8; + cnt -= 8; + } else if (two==0xFF) ix++; + } + int index = b >> (cnt - huffbits); + u16 ssssused = self->hufflut[index]; + int usedbits = ssssused&0xFF; + int t = ssssused>>8; + self->sssshist[t]++; + cnt -= usedbits; + int keepbitsmask = (1 << cnt)-1; + b &= keepbitsmask; + while (cnt < t) { + next = *(u16*)&self->data[ix]; + int one = next&0xFF; + int two = next>>8; + b = (b<<16)|(one<<8)|two; + cnt += 16; + ix += 2; + if (one==0xFF) { + b >>= 8; + cnt -= 8; + } else if (two==0xFF) ix++; + } + cnt -= t; + int diff = b >> cnt; + int vt = 1<<(t-1); + if (diff < vt) { + vt = (-1 << t) + 1; + diff += vt; + } + keepbitsmask = (1 << cnt)-1; + self->b = b & keepbitsmask; + self->cnt = cnt; + self->ix = ix; + //printf("%d %d\n",t,diff); + //printf("%d %d %d %x %x %d\n",Px+diff,Px,diff,t,index,usedbits); +#ifdef DEBUG +#endif +#endif + return diff; +} + +static int parsePred6(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + self->ix = self->scanstart; + //int compcount = self->data[self->ix+2]; + self->ix += BEH(self->data[self->ix]); + self->cnt = 0; + self->b = 0; + int write = self->writelen; + // Now need to decode huffman coded values + int c = 0; + int pixels = self->y * self->x; + u16* out = self->image; + u16* temprow; + u16* thisrow = self->outrow[0]; + u16* lastrow = self->outrow[1]; + + // First pixel predicted from base value + int diff; + int Px; + int col = 0; + int row = 0; + int left = 0; + int linear; + + // First pixel + diff = nextdiff(self,0); + Px = 1 << (self->bits-1); + left = Px + diff; + if (self->linearize) + linear = self->linearize[left]; + else + linear = left; + thisrow[col++] = left; + out[c++] = linear; + if (self->ix >= self->datalen) return ret; + --write; + int rowcount = self->x-1; + while (rowcount--) { + diff = nextdiff(self,0); + Px = left; + left = Px + diff; + if (self->linearize) + linear = self->linearize[left]; + else + linear = left; + thisrow[col++] = left; + out[c++] = linear; + //printf("%d %d %d %d %x\n",col-1,diff,left,thisrow[col-1],&thisrow[col-1]); + if (self->ix >= self->datalen) return ret; + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + } + temprow = lastrow; + lastrow = thisrow; + thisrow = temprow; + row++; + //printf("%x %x\n",thisrow,lastrow); + while (clinearize) { + if (left>self->linlen) return LJ92_ERROR_CORRUPT; + linear = self->linearize[left]; + } else + linear = left; + thisrow[col++] = left; + //printf("%d %d %d %d\n",col,diff,left,lastrow[col]); + out[c++] = linear; + if (self->ix >= self->datalen) break; + rowcount = self->x-1; + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + while (rowcount--) { + diff = nextdiff(self,0); + Px = lastrow[col] + ((left - lastrow[col-1])>>1); + left = Px + diff; + //printf("%d %d %d %d %d %x\n",col,diff,left,lastrow[col],lastrow[col-1],&lastrow[col]); + if (self->linearize) { + if (left>self->linlen) return LJ92_ERROR_CORRUPT; + linear = self->linearize[left]; + } else + linear = left; + thisrow[col++] = left; + out[c++] = linear; + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + } + temprow = lastrow; + lastrow = thisrow; + thisrow = temprow; + if (self->ix >= self->datalen) break; + } + if (c >= pixels) ret = LJ92_ERROR_NONE; + return ret; +} + +static int parseScan(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + memset(self->sssshist,0,sizeof(self->sssshist)); + self->ix = self->scanstart; + int compcount = self->data[self->ix+2]; + int pred = self->data[self->ix+3+2*compcount]; + if (pred<0 || pred>7) return ret; + if (pred==6) return parsePred6(self); // Fast path + self->ix += BEH(self->data[self->ix]); + self->cnt = 0; + self->b = 0; + int write = self->writelen; + // Now need to decode huffman coded values + int c = 0; + int pixels = self->y * self->x; + u16* out = self->image; + u16* thisrow = self->outrow[0]; + u16* lastrow = self->outrow[1]; + + // First pixel predicted from base value + int diff; + int Px = 0; + int col = 0; + int row = 0; + int left = 0; + while (cbits-1); + } else if (row==0) { + Px = left; + } else if (col==0) { + Px = lastrow[col]; // Use value above for first pixel in row + } else { + switch (pred) { + case 0: + Px = 0; break; // No prediction... should not be used + case 1: + Px = left; break; + case 2: + Px = lastrow[col]; break; + case 3: + Px = lastrow[col-1];break; + case 4: + Px = left + lastrow[col] - lastrow[col-1];break; + case 5: + Px = left + ((lastrow[col] - lastrow[col-1])>>1);break; + /* case 6 has a shortcut above + case 6: + Px = lastrow[col] + ((left - lastrow[col-1])>>1);break; + */ + case 7: + Px = (left + lastrow[col])>>1;break; + } + } + diff = nextdiff(self,Px); + left = Px + diff; + //printf("%d %d %d\n",c,diff,left); + int linear; + if (self->linearize) { + if (left>self->linlen) return LJ92_ERROR_CORRUPT; + linear = self->linearize[left]; + } else + linear = left; + thisrow[col] = left; + out[c++] = linear; + if (++col==self->x) { + col = 0; + row++; + u16* temprow = lastrow; + lastrow = thisrow; + thisrow = temprow; + } + if (--write==0) { + out += self->skiplen; + write = self->writelen; + } + if (self->ix >= self->datalen+2) break; + } + if (c >= pixels) ret = LJ92_ERROR_NONE; + /*for (int h=0;h<17;h++) { + printf("ssss:%d=%d (%f)\n",h,self->sssshist[h],(float)self->sssshist[h]/(float)(pixels)); + }*/ + return ret; +} + +static int parseImage(ljp* self) { + int ret = LJ92_ERROR_NONE; + while (1) { + int nextMarker = find(self); + if (nextMarker == 0xc4) + ret = parseHuff(self); + else if (nextMarker == 0xc3) + ret = parseSof3(self); + else if (nextMarker == 0xfe)// Comment + ret = parseBlock(self,nextMarker); + else if (nextMarker == 0xd9) // End of image + break; + else if (nextMarker == 0xda) { + self->scanstart = self->ix; + ret = LJ92_ERROR_NONE; + break; + } else if (nextMarker == -1) { + ret = LJ92_ERROR_CORRUPT; + break; + } else + ret = parseBlock(self,nextMarker); + if (ret != LJ92_ERROR_NONE) break; + } + return ret; +} + +static int findSoI(ljp* self) { + int ret = LJ92_ERROR_CORRUPT; + if (find(self)==0xd8) + ret = parseImage(self); + return ret; +} + +static void free_memory(ljp* self) { +#ifdef SLOW_HUFF + free(self->maxcode); + self->maxcode = NULL; + free(self->mincode); + self->mincode = NULL; + free(self->valptr); + self->valptr = NULL; + free(self->huffval); + self->huffval = NULL; + free(self->huffsize); + self->huffsize = NULL; + free(self->huffcode); + self->huffcode = NULL; +#else + free(self->hufflut); + self->hufflut = NULL; +#endif + free(self->rowcache); + self->rowcache = NULL; +} + +int lj92_open(lj92* lj, + uint8_t* data, int datalen, + int* width,int* height, int* bitdepth) { + ljp* self = (ljp*)calloc(sizeof(ljp),1); + if (self==NULL) return LJ92_ERROR_NO_MEMORY; + + self->data = (u8*)data; + self->dataend = self->data + datalen; + self->datalen = datalen; + + int ret = findSoI(self); + + if (ret == LJ92_ERROR_NONE) { + u16* rowcache = (u16*)calloc(self->x * 2,sizeof(u16)); + if (rowcache == NULL) ret = LJ92_ERROR_NO_MEMORY; + else { + self->rowcache = rowcache; + self->outrow[0] = rowcache; + self->outrow[1] = &rowcache[self->x]; + } + } + + if (ret != LJ92_ERROR_NONE) { // Failed, clean up + *lj = NULL; + free_memory(self); + free(self); + } else { + *width = self->x; + *height = self->y; + *bitdepth = self->bits; + *lj = self; + } + return ret; +} + +int lj92_decode(lj92 lj, + uint16_t* target,int writeLength, int skipLength, + uint16_t* linearize,int linearizeLength) { + int ret = LJ92_ERROR_NONE; + ljp* self = lj; + if (self == NULL) return LJ92_ERROR_BAD_HANDLE; + self->image = target; + self->writelen = writeLength; + self->skiplen = skipLength; + self->linearize = linearize; + self->linlen = linearizeLength; + ret = parseScan(self); + return ret; +} + +void lj92_close(lj92 lj) { + ljp* self = lj; + if (self != NULL) + free_memory(self); + free(self); +} diff --git a/rtengine/lj92.h b/rtengine/lj92.h new file mode 100644 index 000000000..bc8bf7604 --- /dev/null +++ b/rtengine/lj92.h @@ -0,0 +1,68 @@ +/* +lj92.h +(c) Andrew Baldwin 2014 + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef LJ92_H +#define LJ92_H + +#ifdef __cplusplus +extern "C" +{ +#endif +enum LJ92_ERRORS { + LJ92_ERROR_NONE = 0, + LJ92_ERROR_CORRUPT = -1, + LJ92_ERROR_NO_MEMORY = -2, + LJ92_ERROR_BAD_HANDLE = -3, + LJ92_ERROR_TOO_WIDE = -4, +}; + +typedef struct _ljp* lj92; + +/* Parse a lossless JPEG (1992) structure returning + * - a handle that can be used to decode the data + * - width/height/bitdepth of the data + * Returns status code. + * If status == LJ92_ERROR_NONE, handle must be closed with lj92_close + */ +int lj92_open(lj92* lj, // Return handle here + uint8_t* data,int datalen, // The encoded data + int* width,int* height,int* bitdepth); // Width, height and bitdepth + +/* Release a decoder object */ +void lj92_close(lj92 lj); + +/* + * Decode previously opened lossless JPEG (1992) into a 2D tile of memory + * Starting at target, write writeLength 16bit values, then skip 16bit skipLength value before writing again + * If linearize is not NULL, use table at linearize to convert data values from output value to target value + * Data is only correct if LJ92_ERROR_NONE is returned + */ +int lj92_decode(lj92 lj, + uint16_t* target, int writeLength, int skipLength, // The image is written to target as a tile + uint16_t* linearize, int linearizeLength); // If not null, linearize the data using this table + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/rtengine/myfile.cc b/rtengine/myfile.cc index 920421188..28d187e4c 100644 --- a/rtengine/myfile.cc +++ b/rtengine/myfile.cc @@ -107,7 +107,7 @@ IMFILE* fopen (const char* fname) void* data = mmap(nullptr, stat_buffer.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if ( data == MAP_FAILED ) { - printf("no mmap\n"); + printf("no mmap %s\n", fname); close(fd); return nullptr; } diff --git a/rtengine/opthelper.h b/rtengine/opthelper.h index 6b1830aa5..ce1f620e1 100644 --- a/rtengine/opthelper.h +++ b/rtengine/opthelper.h @@ -26,49 +26,14 @@ #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__ - #if __SIZEOF_POINTER__ == 4 && __GNUC__ >= 7 // there seems to be a bug with __builtin_expect on 32bit systems when using gcc >= 7 - #define LIKELY(x) (x) - #define UNLIKELY(x) (x) - #else - #define LIKELY(x) __builtin_expect (!!(x), 1) - #define UNLIKELY(x) __builtin_expect (!!(x), 0) - #endif - #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 LIKELY(x) __builtin_expect (!!(x), 1) + #define UNLIKELY(x) __builtin_expect (!!(x), 0) + #define ALIGNED64 __attribute__ ((aligned (64))) + #define ALIGNED16 __attribute__ ((aligned (16))) #else #define RESTRICT #define LIKELY(x) (x) @@ -76,7 +41,4 @@ #define ALIGNED64 #define ALIGNED16 #endif - #if defined _OPENMP - #define _RT_NESTED_OPENMP - #endif #endif diff --git a/rtengine/pdaflinesfilter.cc b/rtengine/pdaflinesfilter.cc new file mode 100644 index 000000000..0c5b2d786 --- /dev/null +++ b/rtengine/pdaflinesfilter.cc @@ -0,0 +1,301 @@ +/* -*- 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 "pdaflinesfilter.h" +#include "settings.h" +#include +#include "camconst.h" + +namespace rtengine { + +extern const Settings *settings; + + +namespace { + +class PDAFGreenEqulibrateThreshold: public RawImageSource::GreenEqulibrateThreshold { + static constexpr float BASE_THRESHOLD = 0.5f; + static constexpr int TILE_SIZE = 200; + static constexpr float AREA = TILE_SIZE * TILE_SIZE; + static constexpr int PIXEL_COUNT_FACTOR = 12; + +public: + PDAFGreenEqulibrateThreshold(int w, int h): + RawImageSource::GreenEqulibrateThreshold(BASE_THRESHOLD), + w_(w), + h_(h) + { + int ctiles = w_ / TILE_SIZE; + int rtiles = h_ / TILE_SIZE; + tiles_.resize(rtiles+1, std::vector(ctiles+1)); + } + + void processTiles() + { + for(size_t i = 0; i < tiles_.size(); ++i) { + for(size_t j = 0; j < tiles_[i].size(); ++j) { + tiles_[i][j] = tiles_[i][j] * PIXEL_COUNT_FACTOR / (AREA * AREA); + } + } + } + + void increment(int row, int col) + { + auto &r = tiles_[row / TILE_SIZE]; + ++r[col / TILE_SIZE]; + } + + float operator()(int row, int col) const override + { + int y = row / TILE_SIZE; + int x = col / TILE_SIZE; + + int cy = y * TILE_SIZE + TILE_SIZE/2; + int cx = x * TILE_SIZE + TILE_SIZE/2; + + int x1 = col > cx ? x+1 : x-1; + int y1 = row > cy ? y+1 : y-1; + + float fxy = tile_factor(y, x); + float f = 0.f; + + if (x1 >= 0 && size_t(x1) < tiles_[y].size()) { + if (y1 >= 0 && size_t(y1) < tiles_.size()) { + // bilinear interpolation + float fx1y = tile_factor(y, x1); + float fx1y1 = tile_factor(y1, x1); + float fxy1 = tile_factor(y1, x); + + // x direction + int d = std::abs(cx - col); + float f1 = fxy * (TILE_SIZE - d) + fx1y * float(d); + float f2 = fxy1 * (TILE_SIZE - d) + fx1y1 * float(d); + // y direction + d = std::abs(cy - row); + f = (f1 * (TILE_SIZE - d) + f2 * float(d)); + } else { + float f2 = tile_factor(y, x1); + int d = std::abs(cx - col); + f = (fxy * float(TILE_SIZE - d) + f2 * float(d)) * TILE_SIZE; + } + } else if (y1 >= 0 && size_t(y1) < tiles_.size()) { + float f2 = tile_factor(y1, x); + int d = std::abs(cy - row); + f = (fxy * float(TILE_SIZE - d) + f2 * float(d)) * TILE_SIZE; + } else { + f = fxy * AREA; + } + + return thresh_ * f; + } + + void print() const + { + std::cout << "PDAFGreenEqulibrateThreshold:\n"; + for (size_t row = 0; row < tiles_.size(); ++row) { + for (size_t col = 0; col < tiles_.size(); ++col) { + std::cout << " " << tile_factor(row, col); + } + std::cout << std::endl; + } + } + +private: + float tile_factor(int y, int x) const + { + return tiles_[y][x]; + } + + int w_; + int h_; + std::vector> tiles_; +}; + + +class PDAFLineDenoiseRowFilter: public RawImageSource::CFALineDenoiseRowBlender { +public: + PDAFLineDenoiseRowFilter(const std::vector &pattern, int offset): + pattern_(pattern), + offset_(offset) + {} + + float operator()(int row) const override + { + static constexpr float BORDER[] = { 1.f, 1.f, 0.8f, 0.5f, 0.2f }; + static constexpr int BORDER_WIDTH = sizeof(BORDER)/sizeof(float) - 1; + + if (!pattern_.empty()) { + int key = (row - offset_) % pattern_.back(); + auto it = std::lower_bound(pattern_.begin(), pattern_.end(), key); + + int b = *it; + int d = b - key; + + if (it > pattern_.begin()) { + int b2 = *(it-1); + int d2 = key - b2; + d = std::min(d, d2); + } + float f = (d <= BORDER_WIDTH) ? BORDER[d] : 0.f; + return f; + } + return 0.f; + } + +private: + std::vector pattern_; + int offset_; +}; + +} // namespace + + + +PDAFLinesFilter::PDAFLinesFilter(RawImage *ri): + ri_(ri), + W_(ri->get_width()), + H_(ri->get_height()), + offset_(0) +{ + gthresh_ = new PDAFGreenEqulibrateThreshold(W_, H_); + + CameraConstantsStore* ccs = CameraConstantsStore::getInstance(); + CameraConst *cc = ccs->get(ri_->get_maker().c_str(), ri_->get_model().c_str()); + + if (cc) { + pattern_ = cc->get_pdafPattern(); + if(!pattern_.empty()) { + offset_ = cc->get_pdafOffset(); + } + } +} + + +PDAFLinesFilter::~PDAFLinesFilter() +{ + delete gthresh_; +} + + +RawImageSource::GreenEqulibrateThreshold &PDAFLinesFilter::greenEqThreshold() +{ + return *gthresh_; +} + + +std::unique_ptr PDAFLinesFilter::lineDenoiseRowBlender() +{ + return std::unique_ptr(new PDAFLineDenoiseRowFilter(pattern_, offset_)); +} + + +int PDAFLinesFilter::markLine(array2D &rawData, PixelsMap &bpMap, int y) +{ + rowmap_.clear(); + rowmap_.resize((W_+1)/2, false); + int marked = 0; + + for (int x = 1 + (ri_->FC(y, 0) & 1); x < W_-1; x += 2) { + const float + g0 = rawData[y][x], + g1 = rawData[y-1][x+1], + g2 = rawData[y+1][x+1], + g3 = rawData[y-1][x-1], + g4 = rawData[y+1][x-1]; + if (g0 > max(g1, g2, g3, g4)) { + const float gu = g2 + g4; + const float gd = g1 + g3; + const float gM = max(gu, gd); + const float gm = min(gu, gd); + const float d = (gM - gm) / gM; + if (d < 0.2f && (1.f - (gm + gM)/(4.f * g0)) > std::min(d, 0.1f)) { + rowmap_[x/2] = true; + } + } + } + + PDAFGreenEqulibrateThreshold *m = static_cast(gthresh_); + + for (int x = 2 + (ri_->FC(y, 1) & 1); x < W_-2; x += 2) { + const int i = x/2; + if (rowmap_[i+1]) { + if (rowmap_[i]) { + if (rowmap_[i-1]) { + for (int xx = x-2; xx <= x+2; ++xx) { + if (!bpMap.get(xx, y)) { + bpMap.set(xx, y); + m->increment(y, xx); + ++marked; + } + } + } + } else { + x += 2; + } + } else { + x += 4; + } + } + + return marked; +} + + +int PDAFLinesFilter::mark(array2D &rawData, PixelsMap &bpMap) +{ + + if (pattern_.empty()) { + if (settings->verbose) { + std::cout << "no PDAF pattern known for " << ri_->get_maker() << " " << ri_->get_model() << std::endl; + } + return 0; + } + + size_t idx = 0; + int off = offset_; + + int found = 0; + for (int y = 1; y < H_-1; ++y) { + int yy = pattern_[idx] + off; + if (y == yy) { + int n = markLine(rawData, bpMap, y) + markLine(rawData, bpMap, y-1) + markLine(rawData, bpMap, y+1); + if (n) { + found += n; + if (settings->verbose) { + std::cout << "marked " << n << " pixels in PDAF line at " << y << std::endl; + } + } + } else if (y > yy) { + ++idx; + if (idx >= pattern_.size()) { + idx = 0; + off += pattern_.back(); + } + } + } + + if (settings->verbose) { + static_cast(gthresh_)->print(); + } + static_cast(gthresh_)->processTiles(); + return found; +} + +} // namespace rtengine diff --git a/rtengine/pdaflinesfilter.h b/rtengine/pdaflinesfilter.h new file mode 100644 index 000000000..b1f7bf650 --- /dev/null +++ b/rtengine/pdaflinesfilter.h @@ -0,0 +1,49 @@ +/* -*- 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 . + */ + +#pragma once + +#include "rawimagesource.h" +#include + +namespace rtengine { + +class PDAFLinesFilter { +public: + explicit PDAFLinesFilter(RawImage *ri); + ~PDAFLinesFilter(); + + int mark(array2D &rawData, PixelsMap &bpMap); + RawImageSource::GreenEqulibrateThreshold &greenEqThreshold(); + std::unique_ptr lineDenoiseRowBlender(); + +private: + int markLine(array2D &rawData, PixelsMap &bpMap, int y); + + RawImage *ri_; + int W_; + int H_; + std::vector pattern_; + int offset_; + std::vector rowmap_; + RawImageSource::GreenEqulibrateThreshold *gthresh_; +}; + +} // namespace rtengine diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 511e4c95d..befa0d4c6 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -2,7 +2,7 @@ // // Algorithm for Pentax/Sony Pixel Shift raw files with motion detection // -// Copyright (C) 2016 - 2017 Ingo Weyrich +// Copyright (C) 2016 - 2018 Ingo Weyrich // // // pixelshift.cc is free software: you can redistribute it and/or modify @@ -26,7 +26,8 @@ #include "procparams.h" #include "gauss.h" #include "median.h" - +//#define BENCHMARK +#include "StopWatch.h" namespace { @@ -63,16 +64,12 @@ float nonGreenDiffCross(float right, float left, float top, float bottom, float return std::min(hDiff, vDiff) - stddev; } -void paintMotionMask(int index, bool showMotion, bool showOnlyMask, float *maskDest, float *nonMaskDest0, float *nonMaskDest1) +void paintMotionMask(int index, bool showMotion, float *maskDest, float *nonMaskDest0, float *nonMaskDest1) { if(showMotion) { - if(!showOnlyMask) { - // if showMotion is enabled colourize the pixel - maskDest[index] = 13500.f; - nonMaskDest1[index] = nonMaskDest0[index] = 0.f; - } else { - maskDest[index] = nonMaskDest0[index] = nonMaskDest1[index] = 65535.f; - } + // if showMotion is enabled colourize the pixel + maskDest[index] = 13500.f; + nonMaskDest1[index] = nonMaskDest0[index] = 0.f; } } @@ -271,7 +268,7 @@ void floodFill4(int xStart, int xEnd, int yStart, int yEnd, array2D &ma } } -void calcFrameBrightnessFactor(unsigned int frame, uint32_t datalen, LUT *histo[4], float brightnessFactor[4]) +void calcFrameBrightnessFactor(unsigned int frame, uint32_t datalen, LUTu *histo[4], float brightnessFactor[4]) { float medians[4]; @@ -298,48 +295,52 @@ void calcFrameBrightnessFactor(unsigned int frame, uint32_t datalen, LUT redTmp(winw, winh); multi_array2D greenTmp(winw, winh); multi_array2D blueTmp(winw, winh); for(int i = 0; i < 3; i++) { - if(bayerParams.pixelShiftLmmse) { + if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.lmmse_iterations); + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { + dual_demosaic_RT (true, rawParamsIn, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], bayerParams.dualDemosaicContrast, true); } else { - amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i]); + amaze_demosaic_RT(winx, winy, winw, winh, *(rawDataFrames[i + 1]), redTmp[i], greenTmp[i], blueTmp[i], options.chunkSizeAMAZE, options.measure); } } @@ -361,16 +362,19 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA } } } else { - if(bayerParams.pixelShiftLmmse) { + if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE)) { lmmse_interpolate_omp(winw, winh, rawData, red, green, blue, bayerParams.lmmse_iterations); + } else if (bayerParams.pixelShiftDemosaicMethod == bayerParams.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZEVNG4)) { + RAWParams rawParamsTmp = rawParamsIn; + rawParamsTmp.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4); + dual_demosaic_RT (true, rawParamsTmp, winw, winh, rawData, red, green, blue, bayerParams.dualDemosaicContrast, true); } else { - amaze_demosaic_RT(winx, winy, winw, winh, rawData, red, green, blue); + amaze_demosaic_RT(winx, winy, winw, winh, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); } } } } - const bool adaptive = bayerParams.pixelShiftAutomatic; constexpr float stddevFactorGreen = 25.f; constexpr float stddevFactorRed = 25.f; constexpr float stddevFactorBlue = 25.f; @@ -382,12 +386,12 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA constexpr float greenWeight = 2.f; const bool blurMap = bayerParams.pixelShiftBlur; const float sigma = bayerParams.pixelShiftSigma; - constexpr float threshold = 3.f + 9.f; + constexpr float noMotion = 0.99f; + constexpr float threshold = 3.f + 9 * noMotion; const bool holeFill = bayerParams.pixelShiftHoleFill; const bool equalBrightness = bayerParams.pixelShiftEqualBright; const bool equalChannel = bayerParams.pixelShiftEqualBrightChannel; - const bool smoothTransitions = blurMap && bayerParams.pixelShiftSmoothFactor > 0. && !showOnlyMask; - const float smoothFactor = 1.0 - bayerParams.pixelShiftSmoothFactor; + const bool smoothTransitions = blurMap && bayerParams.pixelShiftSmoothFactor > 0.; static const float nReadK3II[] = { 3.4f, // ISO 100 3.1f, // ISO 125 @@ -421,6 +425,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA static const float ePerIsoK3II = 0.35f; + // currently we use the same values for K-1 and K-1 Mark II, though for the K-1 Mark II the values seem a bit aggressive static const float nReadK1[] = { 3.45f, // ISO 100 3.15f, // ISO 125 3.45f, // ISO 160 @@ -454,15 +459,21 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA 2.4f, // ISO 102400 2.4f, // ISO 128000 2.4f, // ISO 160000 - 2.4f // ISO 204800 + 2.4f, // ISO 204800 + 2.4f, // ISO 256000 // these are for K-1 Mark II to avoid crashes when using high-ISO files + 2.4f, // ISO 320000 + 2.4f, // ISO 409600 + 2.4f, // ISO 512000 + 2.4f, // ISO 640000 + 2.4f // ISO 819200 }; static const float ePerIsoK1 = 0.75f; // currently nReadK70 is used for K-70 and KP - static const float nReadK70[] = { 4.0f, // ISO 100 - 4.0f, // ISO 125 - 4.0f, // ISO 160 + static const float nReadK70[] = { 4.0f, // ISO 100 + 4.0f, // ISO 125 + 4.0f, // ISO 160 4.0f, // ISO 200 4.0f, // ISO 250 4.0f, // ISO 320 @@ -504,40 +515,41 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA 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 + // preliminary ILCE-7RM3 data, good fidelity except from A) small inaccuracy at places + // due to integer scaling quantization, B) much different noise behaviour 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 - }; + 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) { @@ -545,7 +557,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA plistener->setProgress(0.0); } - if(adaptive && blurMap && smoothFactor == 0.f && !showMotion) { + if(motionDetection && blurMap && smoothFactor == 0.f && !showMotion) { if(plistener) { plistener->setProgress(1.0); } @@ -553,8 +565,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA return; } - const float scaleGreen = 1.f / scale_mul[1]; - float nRead; float eperIsoModel; @@ -563,7 +573,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA if(model.find("K-3") != string::npos) { nRead = nReadK3II[nReadIndex]; eperIsoModel = ePerIsoK3II; - } else if(model.find("K-1") != string::npos) { + } else if(model.find("K-1") != string::npos) { // this also matches K-1 Mark II nRead = nReadK1[nReadIndex]; eperIsoModel = ePerIsoK1; } else if(model.find("ILCE-7RM3") != string::npos) { @@ -574,12 +584,12 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA eperIsoModel = ePerIsoK70; } - eperIsoModel *= pow(2.f, eperIso); + eperIsoModel *= pow(2.f, eperIso - 1.f); eperIso = eperIsoModel * (100.f / (rawWpCorrection * idata->getISOSpeed())); const float eperIsoRed = (eperIso / scale_mul[0]) * (65535.f / (c_white[0] - c_black[0])); - const float eperIsoGreen = (eperIso * scaleGreen) * (65535.f / (c_white[1] - c_black[1])); + const float eperIsoGreen = (eperIso / scale_mul[1]) * (65535.f / (c_white[1] - c_black[1])); const float eperIsoBlue = (eperIso / scale_mul[2]) * (65535.f / (c_white[2] - c_black[2])); const float clippedRed = 65535.f / scale_mul[0]; @@ -587,41 +597,35 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA nRead *= nRead; - // calculate average green brightness for each frame + // calculate channel median brightness for each frame float greenBrightness[4] = {1.f, 1.f, 1.f, 1.f}; float redBrightness[4] = {1.f, 1.f, 1.f, 1.f}; float blueBrightness[4] = {1.f, 1.f, 1.f, 1.f}; if(equalBrightness) { if(rawDirty) { - LUT *histogreen[4]; - LUT *histored[4]; - LUT *histoblue[4]; + LUTu *histogreen[4]; + LUTu *histored[4]; + LUTu *histoblue[4]; for(int i = 0; i < 4; ++i) { - histogreen[i] = new LUT(65536); - histogreen[i]->clear(); - histored[i] = new LUT(65536); - histored[i]->clear(); - histoblue[i] = new LUT(65536); - histoblue[i]->clear(); + histogreen[i] = new LUTu(65536, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + histored[i] = new LUTu(65536, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + histoblue[i] = new LUTu(65536, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); } #ifdef _OPENMP #pragma omp parallel #endif { - LUT *histogreenThr[4]; - LUT *historedThr[4]; - LUT *histoblueThr[4]; + LUTu *histogreenThr[4]; + LUTu *historedThr[4]; + LUTu *histoblueThr[4]; for(int i = 0; i < 4; ++i) { - histogreenThr[i] = new LUT(65536); - histogreenThr[i]->clear(); - historedThr[i] = new LUT(65536); - historedThr[i]->clear(); - histoblueThr[i] = new LUT(65536); - histoblueThr[i]->clear(); + histogreenThr[i] = new LUTu(65536, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + historedThr[i] = new LUTu(65536, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); + histoblueThr[i] = new LUTu(65536, LUT_CLIP_BELOW | LUT_CLIP_ABOVE, true); } #ifdef _OPENMP @@ -698,7 +702,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA } - if(adaptive) { + if(motionDetection) { // fill channels psRed and psBlue array2D psRed(winw + 32, winh); // increase width to avoid cache conflicts array2D psBlue(winw + 32, winh); @@ -711,8 +715,8 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA float *nonGreenDest0 = psRed[i]; float *nonGreenDest1 = psBlue[i]; float ngbright[2][4] = {{redBrightness[0], redBrightness[1], redBrightness[2], redBrightness[3]}, - {blueBrightness[0], blueBrightness[1], blueBrightness[2], blueBrightness[3]} - }; + {blueBrightness[0], blueBrightness[1], blueBrightness[2], blueBrightness[3]} + }; int ng = 0; int j = winx + 1; int c = FC(i, j); @@ -775,7 +779,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA unsigned int offset = FC(i, winx + border - offsX) & 1; for(int j = winx + border - offsX; j < winw - (border + offsX); ++j, offset ^= 1) { - psMask[i][j] = 1.f; + psMask[i][j] = noMotion; if(checkGreen) { if(greenDiff((*rawDataFrames[1 - offset])[i - offset + 1][j] * greenBrightness[1 - offset], (*rawDataFrames[3 - offset])[i + offset][j + 1] * greenBrightness[3 - offset], stddevFactorGreen, eperIsoGreen, nRead, prnu) > 0.f) { @@ -787,12 +791,12 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA if(checkNonGreenCross) { // check red cross - float redTop = psRed[i - 1][ j ]; - float redLeft = psRed[ i ][j - 1]; - float redCentre = psRed[ i ][ j ]; - float redRight = psRed[ i ][j + 1]; - float redBottom = psRed[i + 1][ j ]; - float redDiff = nonGreenDiffCross(redRight, redLeft, redTop, redBottom, redCentre, clippedRed, stddevFactorRed, eperIsoRed, nRead, prnu); + float redTop = psRed[i - 1][j]; + float redLeft = psRed[i][j - 1]; + float redCentre = psRed[i][j]; + float redRight = psRed[i][j + 1]; + float redBottom = psRed[i + 1][j]; + float redDiff = nonGreenDiffCross(redRight, redLeft, redTop, redBottom, redCentre, clippedRed, stddevFactorRed, eperIsoRed, nRead, prnu); if(redDiff > 0.f) { psMask[i][j] = redBlueWeight; @@ -800,12 +804,12 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA } // check blue cross - float blueTop = psBlue[i - 1][ j ]; - float blueLeft = psBlue[ i ][j - 1]; - float blueCentre = psBlue[ i ][ j ]; - float blueRight = psBlue[ i ][j + 1]; - float blueBottom = psBlue[i + 1][ j ]; - float blueDiff = nonGreenDiffCross(blueRight, blueLeft, blueTop, blueBottom, blueCentre, clippedBlue, stddevFactorBlue, eperIsoBlue, nRead, prnu); + float blueTop = psBlue[i - 1][j]; + float blueLeft = psBlue[i][j - 1]; + float blueCentre = psBlue[i][j]; + float blueRight = psBlue[i][j + 1]; + float blueBottom = psBlue[i + 1][j]; + float blueDiff = nonGreenDiffCross(blueRight, blueLeft, blueTop, blueBottom, blueCentre, clippedBlue, stddevFactorBlue, eperIsoBlue, nRead, prnu); if(blueDiff > 0.f) { psMask[i][j] = redBlueWeight; @@ -829,7 +833,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA if(plistener) { plistener->setProgress(0.6); } - } array2D mask(winw, winh, ARRAY2D_CLEAR_DATA); @@ -885,7 +888,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) { #ifdef __SSE2__ - // pow() is expensive => precalculate blend factor using SSE + // pow() is expensive => pre calculate blend factor using SSE if(smoothTransitions) { // vfloat onev = F2V(1.f); vfloat smoothv = F2V(smoothFactor); @@ -912,38 +915,34 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA unsigned int offset = FC(i, winx + border - offsX) & 1; for(int j = winx + border - offsX; j < winw - (border + offsX); ++j, offset ^= 1) { - if(mask[i][j] == 255) { - paintMotionMask(j + offsX, showMotion, showOnlyMask, greenDest, redDest, blueDest); - } else if(showOnlyMask) { // we want only motion mask => paint areas without motion in pure black - redDest[j + offsX] = greenDest[j + offsX] = blueDest[j + offsX] = 0.f; - } else { - if(smoothTransitions) { + if(showOnlyMask) { + if(smoothTransitions) { // we want only motion mask => paint areas according to their motion (dark = no motion, bright = motion) #ifdef __SSE2__ - // use precalculated blend factor + // use pre calculated blend factor const float blend = psMask[i][j]; #else 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] ); - 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]); + redDest[j + offsX] = greenDest[j + offsX] = blueDest[j + offsX] = blend * 32768.f; + } else { + redDest[j + offsX] = greenDest[j + offsX] = blueDest[j + offsX] = mask[i][j] == 255 ? 65535.f : 0.f; + } + } else if(mask[i][j] == 255) { + paintMotionMask(j + offsX, showMotion, greenDest, redDest, blueDest); + } else { + if(smoothTransitions) { +#ifdef __SSE2__ + // use pre calculated blend factor + const float blend = psMask[i][j]; +#else + 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, showMotion ? 0.f : redDest[j + offsX], psRed[i][j] ); + greenDest[j + offsX] = intp(blend, showMotion ? 13500.f : 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, showMotion ? 0.f : blueDest[j + offsX], psBlue[i][j]); } else { redDest[j + offsX] = psRed[i][j]; - 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; - } + 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]; } } @@ -952,7 +951,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA } else { // motion detection off => combine the 4 raw frames float ngbright[2][4] = {{redBrightness[0], redBrightness[1], redBrightness[2], redBrightness[3]}, - {blueBrightness[0], blueBrightness[1], blueBrightness[2], blueBrightness[3]} + {blueBrightness[0], blueBrightness[1], blueBrightness[2], blueBrightness[3]} }; #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -976,14 +975,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA for(; j < winw - 1; ++j) { // set red, green and blue values - 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; - } + 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 --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index 0b3610de2..e62a1adea 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -18,11 +18,13 @@ */ #include "previewimage.h" + #include "iimage.h" -#include "utils.h" #include "iimage.h" -#include "rtthumbnail.h" +#include "procparams.h" #include "rawimagesource.h" +#include "rtthumbnail.h" +#include "utils.h" using namespace rtengine; using namespace procparams; @@ -77,7 +79,9 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext previewImage = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, w, h); previewImage->flush(); +#ifdef _OPENMP #pragma omp parallel for +#endif for (unsigned int i = 0; i < (unsigned int)(h); ++i) { const unsigned char *src = data + i * w * 3; unsigned char *dst = previewImage->get_data() + i * w * 4; @@ -107,18 +111,21 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext ColorTemp wb = rawImage.getWB (); rawImage.getFullSize (fw, fh, TR_NONE); PreviewProps pp (0, 0, fw, fh, 1); - params.icm.input = Glib::ustring("(embedded)"); + params.icm.inputProfile = Glib::ustring("(embedded)"); 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::getMethodString(RAWParams::XTransSensor::Method::FAST); rawImage.preprocess(params.raw, params.lensProf, params.coarse); - rawImage.demosaic(params.raw); + double contrastThresholdDummy = 0.0; + rawImage.demosaic(params.raw, false, contrastThresholdDummy); Imagefloat image(fw, fh); rawImage.getImage (wb, TR_NONE, &image, pp, params.toneCurve, params.raw); rtengine::Image8 output(fw, fh); rawImage.convertColorSpace(&image, params.icm, wb); +#ifdef _OPENMP #pragma omp parallel for schedule(dynamic, 10) +#endif for (int i = 0; i < fh; ++i) for (int j = 0; j < fw; ++j) { image.r(i, j) = Color::gamma2curve[image.r(i, j)]; @@ -138,7 +145,9 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext previewImage = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, w, h); previewImage->flush(); - #pragma omp parallel for +#ifdef _OPENMP + #pragma omp parallel for +#endif for (unsigned int i = 0; i < (unsigned int)(h); i++) { const unsigned char *src = data + i * w * 3; unsigned char *dst = previewImage->get_data() + i * w * 4; diff --git a/rtengine/processingjob.h b/rtengine/processingjob.h index c7f49192e..b2a81e4c2 100644 --- a/rtengine/processingjob.h +++ b/rtengine/processingjob.h @@ -20,6 +20,7 @@ #define _PROCESSINGJOB_ #include "rtengine.h" +#include "procparams.h" namespace rtengine { @@ -43,14 +44,14 @@ public: iImage->increaseRef(); } - ~ProcessingJobImpl () + ~ProcessingJobImpl () override { if (initialImage) { initialImage->decreaseRef(); } } - bool fastPipeline() const { return fast; } + bool fastPipeline() const override { return fast; } }; } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 8c2d8942f..8eea8459f 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -70,10 +70,10 @@ enum ProcEventCode { EvToneCurveMode1 = 40, EvToneCurve2 = 41, EvToneCurveMode2 = 42, - EvLDNRadius = 43, // obsolete - EvLDNEdgeTolerance = 44, // obsolete - EvCDNEnabled = 45, // obsolete - EvBlendCMSMatrix = 46, // obsolete + obsolete_43 = 43, // obsolete + obsolete_44 = 44, // obsolete + obsolete_45 = 45, // obsolete + obsolete_46 = 46, // obsolete EvDCPToneCurve = 47, EvDCPIlluminant = 48, EvSHEnabled = 49, @@ -93,7 +93,7 @@ enum ProcEventCode { EvCrop = 63, EvCACorr = 64, EvHREnabled = 65, - EvHRAmount = 66, //obsolete + obsolete_66 = 66, //obsolete EvHRMethod = 67, EvWProfile = 68, EvOProfile = 69, @@ -138,7 +138,7 @@ enum ProcEventCode { EvResizeBoundingBox = 108, EvResizeAppliesTo = 109, EvLAvoidColorShift = 110, - EvLSatLimiter = 111, // obsolete + obsolete_111 = 111, // obsolete EvLRSTProtection = 112, EvDemosaicDCBIter = 113, EvDemosaicFalseColorIter = 114, @@ -151,7 +151,7 @@ enum ProcEventCode { EvPreProcessAutoDF = 121, EvPreProcessDFFile = 122, EvPreProcessExpCorrLinear = 123, - EvPreProcessExpCorrPH = 124, + obsolete_124 = 124, // obsolete EvFlatFieldFile = 125, EvFlatFieldAutoSelect = 126, EvFlatFieldBlurRadius = 127, @@ -472,31 +472,31 @@ enum ProcEventCode { EvOBPCompens = 442, EvWBtempBias = 443, EvRawImageNum = 444, - EvPixelShiftMotion = 445, - EvPixelShiftMotionCorrection = 446, - EvPixelShiftStddevFactorGreen = 447, +// EvPixelShiftMotion = 445, +// EvPixelShiftMotionCorrection = 446, +// EvPixelShiftStddevFactorGreen = 447, EvPixelShiftEperIso = 448, - EvPixelShiftNreadIso = 449, - EvPixelShiftPrnu = 450, +// EvPixelShiftNreadIso = 449, +// EvPixelShiftPrnu = 450, EvPixelshiftShowMotion = 451, EvPixelshiftShowMotionMaskOnly = 452, - EvPixelShiftAutomatic = 453, - EvPixelShiftNonGreenHorizontal = 454, - EvPixelShiftNonGreenVertical = 455, +// EvPixelShiftAutomatic = 453, +// EvPixelShiftNonGreenHorizontal = 454, +// EvPixelShiftNonGreenVertical = 455, EvPixelShiftNonGreenCross = 456, - EvPixelShiftStddevFactorRed = 457, - EvPixelShiftStddevFactorBlue = 458, - EvPixelShiftGreenAmaze = 459, - EvPixelShiftNonGreenAmaze = 460, +// EvPixelShiftStddevFactorRed = 457, +// EvPixelShiftStddevFactorBlue = 458, +// EvPixelShiftGreenAmaze = 459, +// EvPixelShiftNonGreenAmaze = 460, EvPixelShiftGreen = 461, - EvPixelShiftRedBlueWeight = 462, +// EvPixelShiftRedBlueWeight = 462, EvPixelShiftBlur = 463, EvPixelShiftSigma = 464, - EvPixelShiftSum = 465, - EvPixelShiftExp0 = 466, +// EvPixelShiftSum = 465, +// EvPixelShiftExp0 = 466, EvPixelShiftHoleFill = 467, EvPixelShiftMedian = 468, - EvPixelShiftMedian3 = 469, +// EvPixelShiftMedian3 = 469, EvPixelShiftMotionMethod = 470, EvPixelShiftSmooth = 471, EvPixelShiftLmmse = 472, @@ -520,7 +520,7 @@ enum ProcEventCode { EvWBEnabled = 490, EvRGBEnabled = 491, EvLEnabled = 492, - EvPixelShiftOneGreen = 493, +// EvPixelShiftOneGreen = 493, can be reused NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 3c5a1b9a8..550b8143b 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -33,66 +33,58 @@ #include "../rtgui/version.h" using namespace std; -extern Options options; namespace { -Glib::ustring expandRelativePath (const Glib::ustring &procparams_fname, const Glib::ustring &prefix, Glib::ustring embedded_fname) +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)) { + 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) { + if (embedded_fname.length() < prefix.length() || embedded_fname.substr(0, prefix.length()) != prefix) { return embedded_fname; } - embedded_fname = embedded_fname.substr (prefix.length()); + embedded_fname = embedded_fname.substr(prefix.length()); } - if (Glib::path_is_absolute (embedded_fname)) { + 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; + 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) +Glib::ustring relativePathIfInside(const Glib::ustring &procparams_fname, bool fnameAbsolute, Glib::ustring embedded_fname) { - if (fnameAbsolute || embedded_fname == "" || !Glib::path_is_absolute (procparams_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); + 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)) { + 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; + 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) { + 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()) { - curve.push_back (FCT_Linear); - } + return prefix + embedded_fname.substr(dir1.length()); } void getFromKeyfile( @@ -143,7 +135,7 @@ void getFromKeyfile( ) { value = keyfile.get_double_list(group_name, key); - avoidEmptyCurve(value); + rtengine::sanitizeCurve(value); } template @@ -165,6 +157,7 @@ bool assignFromKeyfile( return true; } + return false; } @@ -197,6 +190,7 @@ bool assignFromKeyfile( return true; } + return false; } @@ -275,6 +269,7 @@ bool saveToKeyfile( putToKeyfile(group_name, key, value, keyfile); return true; } + return false; } @@ -296,6 +291,7 @@ bool saveToKeyfile( return true; } } + return false; } @@ -323,16 +319,18 @@ ToneCurveParams::ToneCurveParams() : curve2{ DCT_Linear }, - curveMode(ToneCurveParams::TcMode::STD), - curveMode2(ToneCurveParams::TcMode::STD), + curveMode(ToneCurveMode::STD), + curveMode2(ToneCurveMode::STD), brightness(0), black(0), contrast(0), saturation(0), shcompr(50), hlcompr(0), - hlcomprthresh(33), - histmatching(false) + hlcomprthresh(0), + histmatching(false), + fromHistMatching(false), + clampOOG(true) { } @@ -355,7 +353,9 @@ bool ToneCurveParams::operator ==(const ToneCurveParams& other) const && shcompr == other.shcompr && hlcompr == other.hlcompr && hlcomprthresh == other.hlcomprthresh - && histmatching == other.histmatching; + && histmatching == other.histmatching + && fromHistMatching == other.fromHistMatching + && clampOOG == other.clampOOG; } bool ToneCurveParams::operator !=(const ToneCurveParams& other) const @@ -609,6 +609,75 @@ bool LocalContrastParams::operator!=(const LocalContrastParams &other) const const double ColorToningParams::LABGRID_CORR_MAX = 12000.f; +const double ColorToningParams::LABGRID_CORR_SCALE = 3.f; + +ColorToningParams::LabCorrectionRegion::LabCorrectionRegion(): + a(0), + b(0), + saturation(0), + slope(1), + offset(0), + power(1), + hueMask{ + FCT_MinMaxCPoints, + 0.166666667, + 1., + 0.35, + 0.35, + 0.8287775246, + 1., + 0.35, + 0.35 + }, + chromaticityMask{ + FCT_MinMaxCPoints, + 0., + 1., + 0.35, + 0.35, + 1., + 1., + 0.35, + 0.35 + }, + lightnessMask{ + FCT_MinMaxCPoints, + 0., + 1., + 0.35, + 0.35, + 1., + 1., + 0.35, + 0.35 + }, + maskBlur(0), + channel(ColorToningParams::LabCorrectionRegion::CHAN_ALL) +{ +} + + +bool ColorToningParams::LabCorrectionRegion::operator==(const LabCorrectionRegion &other) const +{ + return a == other.a + && b == other.b + && saturation == other.saturation + && slope == other.slope + && offset == other.offset + && power == other.power + && hueMask == other.hueMask + && chromaticityMask == other.chromaticityMask + && lightnessMask == other.lightnessMask + && maskBlur == other.maskBlur + && channel == other.channel; +} + + +bool ColorToningParams::LabCorrectionRegion::operator!=(const LabCorrectionRegion &other) const +{ + return !(*this == other); +} + ColorToningParams::ColorToningParams() : enabled(false), @@ -667,7 +736,7 @@ ColorToningParams::ColorToningParams() : 1.00, 1.00 }, - method("Lab"), + method("LabRegions"), twocolor("Std"), redlow(0.0), greenlow(0.0), @@ -684,7 +753,9 @@ ColorToningParams::ColorToningParams() : labgridALow(0.0), labgridBLow(0.0), labgridAHigh(0.0), - labgridBHigh(0.0) + labgridBHigh(0.0), + labregions{LabCorrectionRegion()}, + labregionsShowMask(-1) { } @@ -720,7 +791,9 @@ bool ColorToningParams::operator ==(const ColorToningParams& other) const && labgridALow == other.labgridALow && labgridBLow == other.labgridBLow && labgridAHigh == other.labgridAHigh - && labgridBHigh == other.labgridBHigh; + && labgridBHigh == other.labgridBHigh + && labregions == other.labregions + && labregionsShowMask == other.labregionsShowMask; } bool ColorToningParams::operator !=(const ColorToningParams& other) const @@ -732,10 +805,10 @@ void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vecto { // check if non null first if (!redlow && !greenlow && !bluelow && !redmed && !greenmed && !bluemed && !redhigh && !greenhigh && !bluehigh) { - colorCurve.resize (1); - colorCurve.at (0) = FCT_Linear; - opacityCurve.resize (1); - opacityCurve.at (0) = FCT_Linear; + colorCurve.resize(1); + colorCurve.at(0) = FCT_Linear; + opacityCurve.resize(1); + opacityCurve.at(0) = FCT_Linear; return; } @@ -748,9 +821,9 @@ void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vecto float minTmp, maxTmp; // Fill the shadow mixer values of the Color TOning tool - low[0] = float (redlow ) / 100.f; // [-1. ; +1.] + low[0] = float (redlow) / 100.f; // [-1. ; +1.] low[1] = float (greenlow) / 100.f; // [-1. ; +1.] - low[2] = float (bluelow ) / 100.f; // [-1. ; +1.] + low[2] = float (bluelow) / 100.f; // [-1. ; +1.] minTmp = min (low[0], low[1], low[2]); maxTmp = max (low[0], low[1], low[2]); @@ -790,9 +863,9 @@ void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vecto } // Fill the mid-tones mixer values of the Color TOning tool - med[0] = float (redmed ) / 100.f; // [-1. ; +1.] + med[0] = float (redmed) / 100.f; // [-1. ; +1.] med[1] = float (greenmed) / 100.f; // [-1. ; +1.] - med[2] = float (bluemed ) / 100.f; // [-1. ; +1.] + med[2] = float (bluemed) / 100.f; // [-1. ; +1.] minTmp = min (med[0], med[1], med[2]); maxTmp = max (med[0], med[1], med[2]); @@ -832,9 +905,9 @@ void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vecto } // Fill the highlight mixer values of the Color TOning tool - high[0] = float (redhigh ) / 100.f; // [-1. ; +1.] + high[0] = float (redhigh) / 100.f; // [-1. ; +1.] high[1] = float (greenhigh) / 100.f; // [-1. ; +1.] - high[2] = float (bluehigh ) / 100.f; // [-1. ; +1.] + high[2] = float (bluehigh) / 100.f; // [-1. ; +1.] minTmp = min (high[0], high[1], high[2]); maxTmp = max (high[0], high[1], high[2]); @@ -877,97 +950,97 @@ void ColorToningParams::mixerToCurve(std::vector& colorCurve, std::vecto 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); - opacityCurve.at (0) = FCT_MinMaxCPoints; + colorCurve.resize(medSat != 0.f ? 13 : 9); + colorCurve.at(0) = FCT_MinMaxCPoints; + opacityCurve.resize(13); + opacityCurve.at(0) = FCT_MinMaxCPoints; float h, s, l; int idx = 1; if (lowSat == 0.f) { if (medSat != 0.f) { - Color::rgb2hsl (med[0], med[1], med[2], h, s, l); + Color::rgb2hsl(med[0], med[1], med[2], h, s, l); } else { // highSat can't be null if the 2 other ones are! - Color::rgb2hsl (high[0], high[1], high[2], h, s, l); + Color::rgb2hsl(high[0], high[1], high[2], h, s, l); } } else { - Color::rgb2hsl (low[0], low[1], low[2], h, s, l); + Color::rgb2hsl(low[0], low[1], low[2], h, s, l); } - colorCurve.at (idx++) = xPosLow; - colorCurve.at (idx++) = h; - colorCurve.at (idx++) = 0.35; - colorCurve.at (idx++) = 0.35; + colorCurve.at(idx++) = xPosLow; + colorCurve.at(idx++) = h; + colorCurve.at(idx++) = 0.35; + colorCurve.at(idx++) = 0.35; if (medSat != 0.f) { - Color::rgb2hsl (med[0], med[1], med[2], h, s, l); - colorCurve.at (idx++) = xPosMed; - colorCurve.at (idx++) = h; - colorCurve.at (idx++) = 0.35; - colorCurve.at (idx++) = 0.35; + Color::rgb2hsl(med[0], med[1], med[2], h, s, l); + colorCurve.at(idx++) = xPosMed; + colorCurve.at(idx++) = h; + colorCurve.at(idx++) = 0.35; + colorCurve.at(idx++) = 0.35; } if (highSat == 0.f) { if (medSat != 0.f) { - Color::rgb2hsl (med[0], med[1], med[2], h, s, l); + Color::rgb2hsl(med[0], med[1], med[2], h, s, l); } else { // lowSat can't be null if the 2 other ones are! - Color::rgb2hsl (low[0], low[1], low[2], h, s, l); + Color::rgb2hsl(low[0], low[1], low[2], h, s, l); } } else { - Color::rgb2hsl (high[0], high[1], high[2], h, s, l); + Color::rgb2hsl(high[0], high[1], high[2], h, s, l); } - colorCurve.at (idx++) = xPosHigh; - colorCurve.at (idx++) = h; - colorCurve.at (idx++) = 0.35; - colorCurve.at (idx) = 0.35; + colorCurve.at(idx++) = xPosHigh; + colorCurve.at(idx++) = h; + colorCurve.at(idx++) = 0.35; + colorCurve.at(idx) = 0.35; - opacityCurve.at (1) = xPosLow; - opacityCurve.at (2) = double (lowSat); - opacityCurve.at (3) = 0.35; - opacityCurve.at (4) = 0.35; - opacityCurve.at (5) = xPosMed; - opacityCurve.at (6) = double (medSat); - opacityCurve.at (7) = 0.35; - opacityCurve.at (8) = 0.35; - opacityCurve.at (9) = xPosHigh; - opacityCurve.at (10) = double (highSat); - opacityCurve.at (11) = 0.35; - opacityCurve.at (12) = 0.35; + opacityCurve.at(1) = xPosLow; + opacityCurve.at(2) = double (lowSat); + opacityCurve.at(3) = 0.35; + opacityCurve.at(4) = 0.35; + opacityCurve.at(5) = xPosMed; + opacityCurve.at(6) = double (medSat); + opacityCurve.at(7) = 0.35; + opacityCurve.at(8) = 0.35; + opacityCurve.at(9) = xPosHigh; + opacityCurve.at(10) = double (highSat); + opacityCurve.at(11) = 0.35; + opacityCurve.at(12) = 0.35; } void ColorToningParams::slidersToCurve(std::vector& colorCurve, std::vector& opacityCurve) const { 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); - opacityCurve.at (0) = FCT_Linear; + colorCurve.resize(1); + colorCurve.at(0) = FCT_Linear; + opacityCurve.resize(1); + opacityCurve.at(0) = FCT_Linear; return; } - colorCurve.resize (9); - colorCurve.at (0) = FCT_MinMaxCPoints; - colorCurve.at (1) = 0.26 + 0.12 * double (balance) / 100.; - 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.getTop()) / 360.; - colorCurve.at (7) = 0.35; - colorCurve.at (8) = 0.35; + colorCurve.resize(9); + colorCurve.at(0) = FCT_MinMaxCPoints; + colorCurve.at(1) = 0.26 + 0.12 * double (balance) / 100.; + 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.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.getBottom()) / 100.; - opacityCurve.at (3) = 0.35; - opacityCurve.at (4) = 0.35; - opacityCurve.at (5) = colorCurve.at (5); - opacityCurve.at (6) = double (hlColSat.getBottom()) / 100.; - opacityCurve.at (7) = 0.35; - opacityCurve.at (8) = 0.35; + opacityCurve.resize(9); + opacityCurve.at(0) = FCT_MinMaxCPoints; + opacityCurve.at(1) = colorCurve.at(1); + 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.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], bool& opautili) const @@ -979,9 +1052,9 @@ void ColorToningParams::getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurv std::vector cCurve, oCurve; if (method == "RGBSliders" || method == "Splitlr") { - slidersToCurve (cCurve, oCurve); + slidersToCurve(cCurve, oCurve); } else if (method == "Splitco") { - mixerToCurve (cCurve, oCurve); + mixerToCurve(cCurve, oCurve); } else { cCurve = this->colorCurve; oCurve = this->opacityCurve; @@ -996,19 +1069,21 @@ void ColorToningParams::getCurves(ColorGradientCurve& colorCurveLUT, OpacityCurv satur = 0.9f; } - colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); - opacityCurveLUT.Set (oCurve, opautili); + colorCurveLUT.SetXYZ(cCurve, xyz_rgb, satur, lumin); + opacityCurveLUT.Set(oCurve, opautili); } else if (method == "Splitlr" || method == "Splitco") { - colorCurveLUT.SetXYZ (cCurve, xyz_rgb, satur, lumin); - opacityCurveLUT.Set (oCurve, opautili); - } else if (method.substr (0, 3) == "RGB") { - colorCurveLUT.SetRGB (cCurve); - opacityCurveLUT.Set (oCurve, opautili); + colorCurveLUT.SetXYZ(cCurve, xyz_rgb, satur, lumin); + opacityCurveLUT.Set(oCurve, opautili); + } else if (method.substr(0, 3) == "RGB") { + colorCurveLUT.SetRGB(cCurve); + opacityCurveLUT.Set(oCurve, opautili); } } SharpeningParams::SharpeningParams() : enabled(false), + contrast(20.0), + blurradius(0.2), radius(0.5), amount(200), threshold(20, 80, 2000, 1200, false), @@ -1018,10 +1093,10 @@ SharpeningParams::SharpeningParams() : halocontrol(false), halocontrol_amount(85), method("usm"), - deconvamount(75), + deconvamount(100), deconvradius(0.75), deconviter(30), - deconvdamping(20) + deconvdamping(0) { } @@ -1029,6 +1104,8 @@ bool SharpeningParams::operator ==(const SharpeningParams& other) const { return enabled == other.enabled + && contrast == other.contrast + && blurradius == other.blurradius && radius == other.radius && amount == other.amount && threshold == other.threshold @@ -1075,7 +1152,8 @@ SharpenMicroParams::SharpenMicroParams() : enabled(false), matrix(false), amount(20.0), - uniformity(50.0) + contrast(20.0), + uniformity(5) { } @@ -1085,6 +1163,7 @@ bool SharpenMicroParams::operator ==(const SharpenMicroParams& other) const enabled == other.enabled && matrix == other.matrix && amount == other.amount + && contrast == other.contrast && uniformity == other.uniformity; } @@ -1187,7 +1266,7 @@ const std::vector& WBParams::getWbEntries() {"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} + {"Custom", WBEntry::Type::CUSTOM, M("TP_WBALANCE_CUSTOM"), 0, 1.f, 1.f, 0.f} }; return wb_entries; @@ -1433,7 +1512,7 @@ bool DirPyrDenoiseParams::operator !=(const DirPyrDenoiseParams& other) const return !(*this == other); } -void DirPyrDenoiseParams::getCurves (NoiseCurve &lCurve, NoiseCurve &cCurve) const +void DirPyrDenoiseParams::getCurves(NoiseCurve &lCurve, NoiseCurve &cCurve) const { lCurve.Set(this->lcurve); cCurve.Set(this->cccurve); @@ -1513,8 +1592,9 @@ bool SpotParams::operator !=(const SpotParams& other) const FattalToneMappingParams::FattalToneMappingParams() : enabled(false), - threshold(0), - amount(30) + threshold(30), + amount(20), + anchor(50) { } @@ -1523,7 +1603,8 @@ bool FattalToneMappingParams::operator ==(const FattalToneMappingParams& other) return enabled == other.enabled && threshold == other.threshold - && amount == other.amount; + && amount == other.amount + && anchor == other.anchor; } bool FattalToneMappingParams::operator !=(const FattalToneMappingParams& other) const @@ -1533,12 +1614,12 @@ bool FattalToneMappingParams::operator !=(const FattalToneMappingParams& other) SHParams::SHParams() : enabled(false), - hq(false), highlights(0), - htonalwidth(80), + htonalwidth(70), shadows(0), - stonalwidth(80), - radius(40) + stonalwidth(30), + radius(40), + lab(false) { } @@ -1546,12 +1627,12 @@ 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; + && radius == other.radius + && lab == other.lab; } bool SHParams::operator !=(const SHParams& other) const @@ -1596,10 +1677,10 @@ void CropParams::mapToResized(int resizedWidth, int resizedHeight, int scale, in 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)); + 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)); } } @@ -1684,7 +1765,9 @@ bool LensProfParams::operator ==(const LensProfParams& other) const && useCA == other.useCA && lfCameraMake == other.lfCameraMake && lfCameraModel == other.lfCameraModel - && lfLens == other.lfLens; + && lfLens == other.lfLens + && useDist == other.useDist + && useVign == other.useVign; } bool LensProfParams::operator !=(const LensProfParams& other) const @@ -1735,6 +1818,7 @@ LensProfParams::LcMode LensProfParams::getMethodNumber(const Glib::ustring& mode return static_cast(i); } } + return LcMode::NONE; } @@ -1831,19 +1915,19 @@ bool VignettingParams::operator !=(const VignettingParams& other) const ChannelMixerParams::ChannelMixerParams() : enabled(false), red{ - 100, + 1000, 0, 0 }, green{ 0, - 100, + 1000, 0 }, blue{ 0, 0, - 100 + 1000 } { } @@ -1853,6 +1937,7 @@ 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] @@ -1862,6 +1947,7 @@ bool ChannelMixerParams::operator ==(const ChannelMixerParams& other) const return false; } } + return true; } @@ -1887,7 +1973,7 @@ BlackWhiteParams::BlackWhiteParams() : enabledcc(true), enabled(false), filter("None"), - setting("NormalContrast"), + setting("RGB-Rel"), method("Desaturation"), mixerRed(33), mixerOrange(33), @@ -1961,7 +2047,8 @@ ResizeParams::ResizeParams() : method("Lanczos"), dataspec(3), width(900), - height(900) + height(900), + allowUpscaling(false) { } @@ -1974,7 +2061,8 @@ bool ResizeParams::operator ==(const ResizeParams& other) const && method == other.method && dataspec == other.dataspec && width == other.width - && height == other.height; + && height == other.height + && allowUpscaling == other.allowUpscaling; } bool ResizeParams::operator !=(const ResizeParams& other) const @@ -1982,43 +2070,41 @@ bool ResizeParams::operator !=(const ResizeParams& other) const return !(*this == other); } -const Glib::ustring ColorManagementParams::NoICMString = Glib::ustring ("No ICM: sRGB output"); +const Glib::ustring ColorManagementParams::NoICMString = Glib::ustring("No ICM: sRGB output"); ColorManagementParams::ColorManagementParams() : - input("(cameraICC)"), + inputProfile("(cameraICC)"), toneCurve(false), applyLookTable(false), applyBaselineExposureOffset(true), applyHueSatMap(true), dcpIlluminant(0), - working("ProPhoto"), - output("RT_sRGB"), + workingProfile("ProPhoto"), + workingTRC("none"), + workingTRCGamma(2.4), + workingTRCSlope(12.92310), + outputProfile(options.rtSettings.srgb), outputIntent(RI_RELATIVE), - outputBPC(true), - gamma("default"), - gampos(2.22), - slpos(4.5), - freegamma(false) + outputBPC(true) { } bool ColorManagementParams::operator ==(const ColorManagementParams& other) const { return - input == other.input + inputProfile == other.inputProfile && toneCurve == other.toneCurve && applyLookTable == other.applyLookTable && applyBaselineExposureOffset == other.applyBaselineExposureOffset && applyHueSatMap == other.applyHueSatMap && dcpIlluminant == other.dcpIlluminant - && working == other.working - && output == other.output + && workingProfile == other.workingProfile + && workingTRC == other.workingTRC + && workingTRCGamma == other.workingTRCGamma + && workingTRCSlope == other.workingTRCSlope + && outputProfile == other.outputProfile && outputIntent == other.outputIntent - && outputBPC == other.outputBPC - && gamma == other.gamma - && gampos == other.gampos - && slpos == other.slpos - && freegamma == other.freegamma; + && outputBPC == other.outputBPC; } bool ColorManagementParams::operator !=(const ColorManagementParams& other) const @@ -2129,7 +2215,7 @@ WaveletParams::WaveletParams() : expfinal(false), exptoning(false), expnoise(false), - Lmethod("4_"), + Lmethod(4), CLmethod("all"), Backmethod("grey"), Tilesmethod("full"), @@ -2289,11 +2375,11 @@ void WaveletParams::getCurves( WavOpacityCurveWL& opacityCurveLUTWL ) const { - cCurve.Set (this->ccwcurve); - opacityCurveLUTRG.Set (this->opacityCurveRG); - opacityCurveLUTBY.Set (this->opacityCurveBY); - opacityCurveLUTW.Set (this->opacityCurveW); - opacityCurveLUTWL.Set (this->opacityCurveWL); + cCurve.Set(this->ccwcurve); + opacityCurveLUTRG.Set(this->opacityCurveRG); + opacityCurveLUTBY.Set(this->opacityCurveBY); + opacityCurveLUTW.Set(this->opacityCurveW); + opacityCurveLUTWL.Set(this->opacityCurveWL); } @@ -2387,8 +2473,52 @@ bool FilmSimulationParams::operator !=(const FilmSimulationParams& other) const return !(*this == other); } + +SoftLightParams::SoftLightParams() : + enabled(false), + strength(30) +{ +} + +bool SoftLightParams::operator ==(const SoftLightParams& other) const +{ + return + enabled == other.enabled + && strength == other.strength; +} + +bool SoftLightParams::operator !=(const SoftLightParams& other) const +{ + return !(*this == other); +} + + +DehazeParams::DehazeParams() : + enabled(false), + strength(50), + showDepthMap(false), + depth(25) +{ +} + +bool DehazeParams::operator ==(const DehazeParams& other) const +{ + return + enabled == other.enabled + && strength == other.strength + && showDepthMap == other.showDepthMap + && depth == other.depth; +} + +bool DehazeParams::operator !=(const DehazeParams& other) const +{ + return !(*this == other); +} + + RAWParams::BayerSensor::BayerSensor() : method(getMethodString(Method::AMAZE)), + border(4), imageNum(0), ccSteps(0), black0(0.0), @@ -2397,41 +2527,28 @@ RAWParams::BayerSensor::BayerSensor() : black3(0.0), twogreen(true), linenoise(0), + linenoiseDirection(LineNoiseDirection::BOTH), greenthresh(0), dcb_iterations(2), lmmse_iterations(2), - pixelShiftMotion(0), - pixelShiftMotionCorrection(PSMotionCorrection::GRID_3X3_NEW), + dualDemosaicAutoContrast(true), + dualDemosaicContrast(20), 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) + pixelShiftDemosaicMethod(getPSDemosaicMethodString(PSDemosaicMethod::AMAZE)), + dcb_enhance(true), + pdafLinesFilter(false) { } @@ -2439,6 +2556,7 @@ bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const { return method == other.method + && border == other.border && imageNum == other.imageNum && ccSteps == other.ccSteps && black0 == other.black0 @@ -2447,41 +2565,28 @@ bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const && black3 == other.black3 && twogreen == other.twogreen && linenoise == other.linenoise + && linenoiseDirection == other.linenoiseDirection && greenthresh == other.greenthresh && dcb_iterations == other.dcb_iterations && lmmse_iterations == other.lmmse_iterations - && pixelShiftMotion == other.pixelShiftMotion - && pixelShiftMotionCorrection == other.pixelShiftMotionCorrection + && dualDemosaicAutoContrast == other.dualDemosaicAutoContrast + && dualDemosaicContrast == other.dualDemosaicContrast && 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; + && pixelShiftDemosaicMethod == other.pixelShiftDemosaicMethod + && dcb_enhance == other.dcb_enhance + && pdafLinesFilter == other.pdafLinesFilter; } bool RAWParams::BayerSensor::operator !=(const BayerSensor& other) const @@ -2491,53 +2596,39 @@ bool RAWParams::BayerSensor::operator !=(const BayerSensor& other) const 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; + pixelShiftDemosaicMethod = getPSDemosaicMethodString(PSDemosaicMethod::AMAZE); } const std::vector& RAWParams::BayerSensor::getMethodStrings() { static const std::vector method_strings { "amaze", - "igv", + "amazevng4", + "rcd", + "rcdvng4", + "dcb", + "dcbvng4", "lmmse", + "igv", + "ahd", "eahd", "hphd", "vng4", - "dcb", - "ahd", - "rcd", "fast", "mono", - "none", - "pixelshift" + "pixelshift", + "none" }; return method_strings; } @@ -2547,8 +2638,28 @@ Glib::ustring RAWParams::BayerSensor::getMethodString(Method method) return getMethodStrings()[toUnderlying(method)]; } +const std::vector& RAWParams::BayerSensor::getPSDemosaicMethodStrings() +{ + static const std::vector method_strings { + "amaze", + "amazevng4", + "lmmse" + }; + return method_strings; +} + +Glib::ustring RAWParams::BayerSensor::getPSDemosaicMethodString(PSDemosaicMethod method) +{ + return getPSDemosaicMethodStrings()[toUnderlying(method)]; +} + + + RAWParams::XTransSensor::XTransSensor() : method(getMethodString(Method::THREE_PASS)), + dualDemosaicAutoContrast(true), + dualDemosaicContrast(20), + border(7), ccSteps(0), blackred(0.0), blackgreen(0.0), @@ -2560,6 +2671,9 @@ bool RAWParams::XTransSensor::operator ==(const XTransSensor& other) const { return method == other.method + && dualDemosaicAutoContrast == other.dualDemosaicAutoContrast + && dualDemosaicContrast == other.dualDemosaicContrast + && border == other.border && ccSteps == other.ccSteps && blackred == other.blackred && blackgreen == other.blackgreen @@ -2574,7 +2688,9 @@ bool RAWParams::XTransSensor::operator !=(const XTransSensor& other) const const std::vector& RAWParams::XTransSensor::getMethodStrings() { static const std::vector method_strings { + "4-pass", "3-pass (best)", + "2-pass", "1-pass (medium)", "fast", "mono", @@ -2596,10 +2712,11 @@ RAWParams::RAWParams() : ff_AutoClipControl(false), ff_clipControl(0), ca_autocorrect(false), + ca_avoidcolourshift(true), + caautoiterations(2), cared(0.0), cablue(0.0), expos(1.0), - preser(0.0), hotPixelFilter(false), deadPixelFilter(false), hotdeadpix_thresh(100) @@ -2620,10 +2737,11 @@ bool RAWParams::operator ==(const RAWParams& other) const && ff_AutoClipControl == other.ff_AutoClipControl && ff_clipControl == other.ff_clipControl && ca_autocorrect == other.ca_autocorrect + && ca_avoidcolourshift == other.ca_avoidcolourshift + && caautoiterations == other.caautoiterations && cared == other.cared && cablue == other.cablue && expos == other.expos - && preser == other.preser && hotPixelFilter == other.hotPixelFilter && deadPixelFilter == other.deadPixelFilter && hotdeadpix_thresh == other.hotdeadpix_thresh; @@ -2667,12 +2785,12 @@ bool MetaDataParams::operator!=(const MetaDataParams &other) const } -ProcParams::ProcParams () +ProcParams::ProcParams() { - setDefaults (); + setDefaults(); } -void ProcParams::setDefaults () +void ProcParams::setDefaults() { toneCurve = ToneCurveParams(); @@ -2691,6 +2809,7 @@ void ProcParams::setDefaults () sharpening = SharpeningParams(); prsharpening = SharpeningParams(); + prsharpening.contrast = 15.0; prsharpening.method = "rld"; prsharpening.deconvamount = 100; prsharpening.deconvradius = 0.45; @@ -2753,11 +2872,15 @@ void ProcParams::setDefaults () filmSimulation = FilmSimulationParams(); + softlight = SoftLightParams(); + + dehaze = DehazeParams(); + raw = RAWParams(); metadata = MetaDataParams(); - exif.clear (); - iptc.clear (); + exif.clear(); + iptc.clear(); rank = 0; colorlabel = 0; @@ -2768,7 +2891,7 @@ void ProcParams::setDefaults () int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bool fnameAbsolute, ParamsEdited* pedited) { - if (fname.empty () && fname2.empty ()) { + if (fname.empty() && fname2.empty()) { return 0; } @@ -2778,8 +2901,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo Glib::KeyFile keyFile; // Version - keyFile.set_string ("Version", "AppVersion", RTVERSION); - keyFile.set_integer ("Version", "Version", PPVERSION); + keyFile.set_string("Version", "AppVersion", RTVERSION); + keyFile.set_integer("Version", "Version", PPVERSION); saveToKeyfile(!pedited || pedited->general.rank, "General", "Rank", rank, keyFile); saveToKeyfile(!pedited || pedited->general.colorlabel, "General", "ColorLabel", colorlabel, keyFile); @@ -2797,18 +2920,20 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); + saveToKeyfile(!pedited || pedited->toneCurve.fromHistMatching, "Exposure", "CurveFromHistogramMatching", toneCurve.fromHistMatching, keyFile); + saveToKeyfile(!pedited || pedited->toneCurve.clampOOG, "Exposure", "ClampOOG", toneCurve.clampOOG, 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"} + const std::map tc_mapping = { + {ToneCurveMode::STD, "Standard"}, + {ToneCurveMode::FILMLIKE, "FilmLike"}, + {ToneCurveMode::SATANDVALBLENDING, "SatAndValueBlending"}, + {ToneCurveMode::WEIGHTEDSTD, "WeightedStd"}, + {ToneCurveMode::LUMINANCE, "Luminance"}, + {ToneCurveMode::PERCEPTUAL, "Perceptual"} }; saveToKeyfile(!pedited || pedited->toneCurve.curveMode, "Exposure", "CurveMode", tc_mapping, toneCurve.curveMode, keyFile); @@ -2857,23 +2982,24 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); - + // 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); + 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); + 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); + Glib::ArrayHandle bmix(chmixer.blue, 3, Glib::OWNERSHIP_NONE); + keyFile.set_integer_list("Channel Mixer", "Blue", bmix); } // Black & White @@ -2945,8 +3071,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // Sharpening saveToKeyfile(!pedited || pedited->sharpening.enabled, "Sharpening", "Enabled", sharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->sharpening.contrast, "Sharpening", "Contrast", sharpening.contrast, 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.blurradius, "Sharpening", "BlurRadius", sharpening.blurradius, 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); @@ -2979,6 +3107,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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.contrast, "SharpenMicro", "Contrast", sharpenMicro.contrast, keyFile); saveToKeyfile(!pedited || pedited->sharpenMicro.uniformity, "SharpenMicro", "Uniformity", sharpenMicro.uniformity, keyFile); // WB @@ -3058,6 +3187,12 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->defringe.threshold, "Defringing", "Threshold", defringe.threshold, keyFile); saveToKeyfile(!pedited || pedited->defringe.huecurve, "Defringing", "HueCurve", defringe.huecurve, keyFile); +// Dehaze + saveToKeyfile(!pedited || pedited->dehaze.enabled, "Dehaze", "Enabled", dehaze.enabled, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.strength, "Dehaze", "Strength", dehaze.strength, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.showDepthMap, "Dehaze", "ShowDepthMap", dehaze.showDepthMap, keyFile); + saveToKeyfile(!pedited || pedited->dehaze.depth, "Dehaze", "Depth", dehaze.depth, 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); @@ -3067,13 +3202,17 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); @@ -3098,15 +3237,16 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); + saveToKeyfile(!pedited || pedited->sh.lab, "Shadows & Highlights", "Lab", sh.lab, keyFile); // Crop saveToKeyfile(!pedited || pedited->crop.enabled, "Crop", "Enabled", crop.enabled, keyFile); @@ -3134,8 +3274,8 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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.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); @@ -3180,9 +3320,11 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); + saveToKeyfile(!pedited || pedited->resize.allowUpscaling, "Resize", "AllowUpscaling", resize.allowUpscaling, keyFile); // Post resize sharpening saveToKeyfile(!pedited || pedited->prsharpening.enabled, "PostResizeSharpening", "Enabled", prsharpening.enabled, keyFile); + saveToKeyfile(!pedited || pedited->prsharpening.contrast, "PostResizeSharpening", "Contrast", prsharpening.contrast, 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); @@ -3198,14 +3340,17 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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.inputProfile, "Color Management", "InputProfile", relativePathIfInside(fname, fnameAbsolute, icm.inputProfile), 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.workingProfile, "Color Management", "WorkingProfile", icm.workingProfile, keyFile); + saveToKeyfile(!pedited || pedited->icm.workingTRC, "Color Management", "WorkingTRC", icm.workingTRC, keyFile); + saveToKeyfile(!pedited || pedited->icm.workingTRCGamma, "Color Management", "WorkingTRCGamma", icm.workingTRCGamma, keyFile); + saveToKeyfile(!pedited || pedited->icm.workingTRCSlope, "Color Management", "WorkingTRCSlope", icm.workingTRCSlope, keyFile); + saveToKeyfile(!pedited || pedited->icm.outputProfile, "Color Management", "OutputProfile", icm.outputProfile, keyFile); saveToKeyfile( !pedited || pedited->icm.outputIntent, "Color Management", @@ -3221,10 +3366,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); @@ -3365,6 +3506,10 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->hsvequalizer.scurve, "HSV Equalizer", "SCurve", hsvequalizer.scurve, keyFile); saveToKeyfile(!pedited || pedited->hsvequalizer.vcurve, "HSV Equalizer", "VCurve", hsvequalizer.vcurve, keyFile); +// Soft Light + saveToKeyfile(!pedited || pedited->softlight.enabled, "SoftLight", "Enabled", softlight.enabled, keyFile); + saveToKeyfile(!pedited || pedited->softlight.strength, "SoftLight", "Strength", softlight.strength, 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); @@ -3407,23 +3552,44 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); + if (!pedited || pedited->colorToning.labregions) { + for (size_t j = 0; j < colorToning.labregions.size(); ++j) { + std::string n = std::to_string(j+1); + auto &l = colorToning.labregions[j]; + putToKeyfile("ColorToning", Glib::ustring("LabRegionA_") + n, l.a, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionB_") + n, l.b, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionSaturation_") + n, l.saturation, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionSlope_") + n, l.slope, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionOffset_") + n, l.offset, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionPower_") + n, l.power, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionHueMask_") + n, l.hueMask, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionChromaticityMask_") + n, l.chromaticityMask, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionLightnessMask_") + n, l.lightnessMask, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionMaskBlur_") + n, l.maskBlur, keyFile); + putToKeyfile("ColorToning", Glib::ustring("LabRegionChannel_") + n, l.channel, keyFile); + } + } + saveToKeyfile(!pedited || pedited->colorToning.labregionsShowMask, "ColorToning", "LabRegionsShowMask", colorToning.labregionsShowMask, keyFile); // Raw - saveToKeyfile(!pedited || pedited->raw.darkFrame, "RAW", "DarkFrame", relativePathIfInside (fname, fnameAbsolute, raw.dark_frame), keyFile); + 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_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.ca_avoidcolourshift, "RAW", "CAAvoidColourshift", raw.ca_avoidcolourshift, keyFile); + saveToKeyfile(!pedited || pedited->raw.caautoiterations, "RAW", "CAAutoIterations", raw.caautoiterations, 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.border, "RAW Bayer", "Border", raw.bayersensor.border, 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); @@ -3432,42 +3598,32 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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.linenoise, "RAW Bayer", "LineDenoiseDirection", toUnderlying(raw.bayersensor.linenoiseDirection), 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.dualDemosaicAutoContrast, "RAW Bayer", "DualDemosaicAutoContrast", raw.bayersensor.dualDemosaicAutoContrast, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.dualDemosaicContrast, "RAW Bayer", "DualDemosaicContrast", raw.bayersensor.dualDemosaicContrast, 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.bayersensor.pixelShiftDemosaicMethod, "RAW Bayer", "pixelShiftDemosaicMethod", raw.bayersensor.pixelShiftDemosaicMethod, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.pdafLinesFilter, "RAW Bayer", "PDAFLinesFilter", raw.bayersensor.pdafLinesFilter, keyFile); saveToKeyfile(!pedited || pedited->raw.xtranssensor.method, "RAW X-Trans", "Method", raw.xtranssensor.method, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.dualDemosaicAutoContrast, "RAW X-Trans", "DualDemosaicAutoContrast", raw.xtranssensor.dualDemosaicAutoContrast, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.dualDemosaicContrast, "RAW X-Trans", "DualDemosaicContrast", raw.xtranssensor.dualDemosaicContrast, keyFile); + saveToKeyfile(!pedited || pedited->raw.xtranssensor.border, "RAW X-Trans", "Border", raw.xtranssensor.border, 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); @@ -3475,7 +3631,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // Raw exposition saveToKeyfile(!pedited || pedited->raw.exPos, "RAW", "PreExposure", raw.expos, keyFile); - saveToKeyfile(!pedited || pedited->raw.exPreser, "RAW", "PrePreserv", raw.preser, keyFile); // MetaData saveToKeyfile(!pedited || pedited->metadata.mode, "MetaData", "Mode", metadata.mode, keyFile); @@ -3483,7 +3638,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo // 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); + keyFile.set_string("Exif", i->first, i->second); } } @@ -3491,7 +3646,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo 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); + keyFile.set_string_list("IPTC", i->first, values); } } @@ -3499,16 +3654,16 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo } catch (Glib::KeyFileError&) {} - if (sPParams.empty ()) { + if (sPParams.empty()) { return 1; } int error1, error2; - error1 = write (fname, sPParams); + error1 = write(fname, sPParams); - if (!fname2.empty ()) { + if (!fname2.empty()) { - error2 = write (fname2, sPParams); + error2 = write(fname2, sPParams); // If at least one file has been saved, it's a success return error1 & error2; } else { @@ -3518,7 +3673,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) { - setlocale (LC_NUMERIC, "C"); // to set decimal point to "." + setlocale(LC_NUMERIC, "C"); // to set decimal point to "." if (fname.empty()) { return 1; @@ -3528,39 +3683,40 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) try { if (pedited) { - pedited->set (false); + pedited->set(false); } if (!Glib::file_test(fname, Glib::FILE_TEST_EXISTS) || - !keyFile.load_from_file(fname)) { + !keyFile.load_from_file(fname)) { return 1; } ppVersion = PPVERSION; appVersion = RTVERSION; - if (keyFile.has_group ("Version")) { - if (keyFile.has_key ("Version", "AppVersion")) { - appVersion = keyFile.get_string ("Version", "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_key("Version", "Version")) { + ppVersion = keyFile.get_integer("Version", "Version"); } } - if (keyFile.has_group ("General")) { + 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 (keyFile.has_group ("Exposure")) { + 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 + 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); @@ -3570,17 +3726,18 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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. } - 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} + const std::map tc_mapping = { + {"Standard", ToneCurveMode::STD}, + {"FilmLike", ToneCurveMode::FILMLIKE}, + {"SatAndValueBlending", ToneCurveMode::SATANDVALBLENDING}, + {"WeightedStd", ToneCurveMode::WEIGHTEDSTD}, + {"Luminance", ToneCurveMode::LUMINANCE}, + {"Perceptual", ToneCurveMode::PERCEPTUAL} }; assignFromKeyfile(keyFile, "Exposure", "CurveMode", pedited, tc_mapping, toneCurve.curveMode, pedited->toneCurve.curveMode); @@ -3590,32 +3747,51 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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 (ppVersion < 340) { + toneCurve.fromHistMatching = false; + if (pedited) { + pedited->toneCurve.fromHistMatching = true; + } + } else { + assignFromKeyfile(keyFile, "Exposure", "CurveFromHistogramMatching", pedited, toneCurve.fromHistMatching, pedited->toneCurve.fromHistMatching); + } + assignFromKeyfile(keyFile, "Exposure", "ClampOOG", pedited, toneCurve.clampOOG, pedited->toneCurve.clampOOG); } - if (keyFile.has_group ("HLRecovery")) { + 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 (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->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("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)); + 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 (ppVersion < 338) { + for (int i = 0; i < 3; ++i) { + chmixer.red[i] *= 10; + chmixer.green[i] *= 10; + chmixer.blue[i] *= 10; + } } if (pedited) { @@ -3626,7 +3802,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_group ("Black & White")) { + 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); @@ -3679,7 +3855,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) ); } - if (keyFile.has_group ("Retinex")) { + 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); @@ -3729,16 +3905,17 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Local Contrast", "Lightness", pedited, localContrast.lightness, pedited->localContrast.lightness); } - if (keyFile.has_group ("Luminance Curve")) { + 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->labCurve.enabled = true; } } - + assignFromKeyfile(keyFile, "Luminance Curve", "Brightness", pedited, labCurve.brightness, pedited->labCurve.brightness); assignFromKeyfile(keyFile, "Luminance Curve", "Contrast", pedited, labCurve.contrast, pedited->labCurve.contrast); @@ -3749,8 +3926,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) // 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("Luminance Curve", "Chromaticity")) { + labCurve.chromaticity = keyFile.get_integer("Luminance Curve", "Chromaticity"); if (ppVersion >= 303 && ppVersion < 314 && labCurve.chromaticity == -100) { blackwhite.enabled = true; @@ -3770,8 +3947,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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")) { + if (keyFile.has_key("Luminance Curve", "BWtoning")) { + if (keyFile.get_boolean("Luminance Curve", "BWtoning")) { labCurve.chromaticity = -100; if (pedited) { @@ -3792,20 +3969,29 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Luminance Curve", "ClCurve", pedited, labCurve.clcurve, pedited->labCurve.clcurve); } - if (keyFile.has_group ("Sharpening")) { + if (keyFile.has_group("Sharpening")) { assignFromKeyfile(keyFile, "Sharpening", "Enabled", pedited, sharpening.enabled, pedited->sharpening.enabled); + if (ppVersion >= 334) { + assignFromKeyfile(keyFile, "Sharpening", "Contrast", pedited, sharpening.contrast, pedited->sharpening.contrast); + } else { + sharpening.contrast = 0; + if (pedited) { + pedited->sharpening.contrast = true; + } + } assignFromKeyfile(keyFile, "Sharpening", "Radius", pedited, sharpening.radius, pedited->sharpening.radius); + assignFromKeyfile(keyFile, "Sharpening", "BlurRadius", pedited, sharpening.blurradius, pedited->sharpening.blurradius); assignFromKeyfile(keyFile, "Sharpening", "Amount", pedited, sharpening.amount, pedited->sharpening.amount); - if (keyFile.has_key ("Sharpening", "Threshold")) { + 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 + 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"); + 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)); + sharpening.threshold.setValues(thresh[0], thresh[1], min(thresh[2], 2000), min(thresh[3], 2000)); } } @@ -3826,34 +4012,48 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Sharpening", "DeconvIterations", pedited, sharpening.deconviter, pedited->sharpening.deconviter); } - if (keyFile.has_group ("SharpenEdge")) { + 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); } - if (keyFile.has_group ("SharpenMicro")) { + 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 (ppVersion >= 334) { + assignFromKeyfile(keyFile, "SharpenMicro", "Contrast", pedited, sharpenMicro.contrast, pedited->sharpenMicro.contrast); + } else { + sharpenMicro.contrast = 0; + if (pedited) { + pedited->sharpenMicro.contrast = true; + } + } + if (ppVersion >= 346) { + assignFromKeyfile(keyFile, "SharpenMicro", "Uniformity", pedited, sharpenMicro.uniformity, pedited->sharpenMicro.uniformity); + } else { + double temp; + assignFromKeyfile(keyFile, "SharpenMicro", "Uniformity", pedited, temp, pedited->sharpenMicro.uniformity); + sharpenMicro.uniformity = temp / 10; + } } - if (keyFile.has_group ("Vibrance")) { + 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 ("Vibrance", "PSThreshold")) { + if (keyFile.has_key("Vibrance", "PSThreshold")) { if (ppVersion < 302) { - int thresh = keyFile.get_integer ("Vibrance", "PSThreshold"); - vibrance.psthreshold.setValues (thresh, thresh); + int thresh = keyFile.get_integer("Vibrance", "PSThreshold"); + vibrance.psthreshold.setValues(thresh, thresh); } else { - const std::vector thresh = keyFile.get_integer_list ("Vibrance", "PSThreshold"); + const std::vector thresh = keyFile.get_integer_list("Vibrance", "PSThreshold"); - if (thresh.size() >= 2 ) { - vibrance.psthreshold.setValues (thresh[0], thresh[1]); + if (thresh.size() >= 2) { + vibrance.psthreshold.setValues(thresh[0], thresh[1]); } } @@ -3868,7 +4068,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Vibrance", "SkinTonesCurve", pedited, vibrance.skintonescurve, pedited->vibrance.skintonescurve); } - if (keyFile.has_group ("White Balance")) { + 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); @@ -3877,12 +4077,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "White Balance", "TemperatureBias", pedited, wb.tempBias, pedited->wb.tempBias); } - if (keyFile.has_group ("Defringing")) { + 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 ("Defringing", "Threshold")) { - defringe.threshold = (float)keyFile.get_integer ("Defringing", "Threshold"); + if (keyFile.has_key("Defringing", "Threshold")) { + defringe.threshold = (float)keyFile.get_integer("Defringing", "Threshold"); if (pedited) { pedited->defringe.threshold = true; @@ -3890,13 +4090,13 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } if (ppVersion < 310) { - defringe.threshold = sqrt (defringe.threshold * 33.f / 5.f); + defringe.threshold = sqrt(defringe.threshold * 33.f / 5.f); } assignFromKeyfile(keyFile, "Defringing", "HueCurve", pedited, defringe.huecurve, pedited->defringe.huecurve); } - if (keyFile.has_group ("Color appearance")) { + 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); @@ -3962,12 +4162,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } - if (keyFile.has_group ("Impulse Denoising")) { + 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_group ("Directional Pyramid Denoising")) {//TODO: No longer an accurate description for FT denoise + 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); @@ -3983,6 +4183,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "C2Method", pedited, dirpyrDenoise.C2method, pedited->dirpyrDenoise.C2method); + if (dirpyrDenoise.C2method == "PREV") { dirpyrDenoise.C2method = "MANU"; } @@ -4001,7 +4202,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Directional Pyramid Denoising", "Passes", pedited, dirpyrDenoise.passes, pedited->dirpyrDenoise.passes); } - if (keyFile.has_group ("EPD")) { + 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); @@ -4010,52 +4211,63 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "EPD", "ReweightingIterates", pedited, epd.reweightingIterates, pedited->epd.reweightingIterates); } - if (keyFile.has_group ("FattalToneMapping")) { + 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")) { + if (keyFile.has_group ("Shadows & Highlights") && ppVersion >= 333) { 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 (ppVersion >= 344) { + assignFromKeyfile(keyFile, "Shadows & Highlights", "Lab", pedited, sh.lab, pedited->sh.lab); + } else { + sh.lab = true; + } + 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.); + localContrast.amount = float(lc) / 30.; + if (pedited) { pedited->localContrast.amount = true; } + localContrast.enabled = sh.enabled; + if (pedited) { pedited->localContrast.enabled = true; } + localContrast.radius = sh.radius; + if (pedited) { pedited->localContrast.radius = true; } } } - if (keyFile.has_group ("Crop")) { + 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 ("Crop", "W")) { - crop.w = std::max (keyFile.get_integer ("Crop", "W"), 1); + 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 (keyFile.has_key("Crop", "H")) { + crop.h = std::max(keyFile.get_integer("Crop", "H"), 1); if (pedited) { pedited->crop.h = true; @@ -4078,39 +4290,40 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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 (keyFile.has_group ("Coarse Transformation")) { + 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 (keyFile.has_group ("Rotation")) { + if (keyFile.has_group("Rotation")) { assignFromKeyfile(keyFile, "Rotation", "Degree", pedited, rotate.degree, pedited->rotate.degree); } - if (keyFile.has_group ("Common Properties for Transformations")) { + if (keyFile.has_group("Common Properties for Transformations")) { assignFromKeyfile(keyFile, "Common Properties for Transformations", "AutoFill", pedited, commonTrans.autofill, pedited->commonTrans.autofill); } - if (keyFile.has_group ("Distortion")) { + if (keyFile.has_group("Distortion")) { assignFromKeyfile(keyFile, "Distortion", "Amount", pedited, distortion.amount, pedited->distortion.amount); } - if (keyFile.has_group ("LensProfile")) { - if (keyFile.has_key ("LensProfile", "LcMode")) { - lensProf.lcMode = lensProf.getMethodNumber (keyFile.get_string ("LensProfile", "LcMode")); + 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 (keyFile.has_key("LensProfile", "LCPFile")) { + lensProf.lcpFile = expandRelativePath(fname, "", keyFile.get_string("LensProfile", "LCPFile")); if (pedited) { pedited->lensProf.lcpFile = true; @@ -4127,6 +4340,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_key("LensProfile", "LFCameraMake")) { lensProf.lfCameraMake = keyFile.get_string("LensProfile", "LFCameraMake"); + if (pedited) { pedited->lensProf.lfCameraMake = true; } @@ -4134,6 +4348,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_key("LensProfile", "LFCameraModel")) { lensProf.lfCameraModel = keyFile.get_string("LensProfile", "LFCameraModel"); + if (pedited) { pedited->lensProf.lfCameraModel = true; } @@ -4141,18 +4356,19 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_key("LensProfile", "LFLens")) { lensProf.lfLens = keyFile.get_string("LensProfile", "LFLens"); + if (pedited) { pedited->lensProf.lfLens = true; } } } - if (keyFile.has_group ("Perspective")) { + 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 (keyFile.has_group ("Gradient")) { + 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); @@ -4161,19 +4377,19 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Gradient", "CenterY", pedited, gradient.centerY, pedited->gradient.centerY); } - if (keyFile.has_group ("PCVignette")) { + 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 (keyFile.has_group ("CACorrection")) { + 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_group ("Vignetting Correction")) { + 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); @@ -4181,7 +4397,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Vignetting Correction", "CenterY", pedited, vignetting.centerY, pedited->vignetting.centerY); } - if (keyFile.has_group ("Resize")) { + 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); @@ -4189,6 +4405,14 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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 (ppVersion >= 339) { + assignFromKeyfile(keyFile, "Resize", "AllowUpscaling", pedited, resize.allowUpscaling, pedited->resize.allowUpscaling); + } else { + resize.allowUpscaling = false; + if (pedited) { + pedited->resize.allowUpscaling = true; + } + } } // load spot removal settings @@ -4221,20 +4445,21 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } // load post resize sharpening - if (keyFile.has_group ("PostResizeSharpening")) { + if (keyFile.has_group("PostResizeSharpening")) { assignFromKeyfile(keyFile, "PostResizeSharpening", "Enabled", pedited, prsharpening.enabled, pedited->prsharpening.enabled); + assignFromKeyfile(keyFile, "PostResizeSharpening", "Contrast", pedited, prsharpening.contrast, pedited->prsharpening.contrast); assignFromKeyfile(keyFile, "PostResizeSharpening", "Radius", pedited, prsharpening.radius, pedited->prsharpening.radius); assignFromKeyfile(keyFile, "PostResizeSharpening", "Amount", pedited, prsharpening.amount, pedited->prsharpening.amount); - if (keyFile.has_key ("PostResizeSharpening", "Threshold")) { + 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 + 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"); + 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)); + prsharpening.threshold.setValues(thresh[0], thresh[1], min(thresh[2], 2000), min(thresh[3], 2000)); } } @@ -4255,12 +4480,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "PostResizeSharpening", "DeconvIterations", pedited, prsharpening.deconviter, pedited->prsharpening.deconviter); } - 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 (keyFile.has_group("Color Management")) { + if (keyFile.has_key("Color Management", "InputProfile")) { + icm.inputProfile = expandRelativePath(fname, "file:", keyFile.get_string("Color Management", "InputProfile")); if (pedited) { - pedited->icm.input = true; + pedited->icm.inputProfile = true; } } @@ -4269,11 +4494,35 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + assignFromKeyfile(keyFile, "Color Management", "WorkingProfile", pedited, icm.workingProfile, pedited->icm.workingProfile); + assignFromKeyfile(keyFile, "Color Management", "WorkingTRC", pedited, icm.workingTRC, pedited->icm.workingTRC); + assignFromKeyfile(keyFile, "Color Management", "WorkingTRCGamma", pedited, icm.workingTRCGamma, pedited->icm.workingTRCGamma); + assignFromKeyfile(keyFile, "Color Management", "WorkingTRCSlope", pedited, icm.workingTRCSlope, pedited->icm.workingTRCSlope); - if (keyFile.has_key ("Color Management", "OutputProfileIntent")) { - Glib::ustring intent = keyFile.get_string ("Color Management", "OutputProfileIntent"); + assignFromKeyfile(keyFile, "Color Management", "OutputProfile", pedited, icm.outputProfile, pedited->icm.outputProfile); + if (ppVersion < 341) { + if (icm.outputProfile == "RT_Medium_gsRGB") { + icm.outputProfile = "RTv4_Medium"; + } else if (icm.outputProfile == "RT_Large_gBT709" || icm.outputProfile == "RT_Large_g10" || icm.outputProfile == "RT_Large_gsRGB") { + icm.outputProfile = "RTv4_Large"; + } else if (icm.outputProfile == "WideGamutRGB") { + icm.outputProfile = "RTv4_Wide"; + } else if (icm.outputProfile == "RT_sRGB_gBT709" || icm.outputProfile == "RT_sRGB_g10" || icm.outputProfile == "RT_sRGB") { + icm.outputProfile = "RTv4_sRGB"; + } else if (icm.outputProfile == "BetaRGB") { // Have we ever provided this profile ? Should we convert this filename ? + icm.outputProfile = "RTv4_Beta"; + } else if (icm.outputProfile == "BestRGB") { // Have we ever provided this profile ? Should we convert this filename ? + icm.outputProfile = "RTv4_Best"; + } else if (icm.outputProfile == "Rec2020") { + icm.outputProfile = "RTv4_Rec2020"; + } else if (icm.outputProfile == "Bruce") { // Have we ever provided this profile ? Should we convert this filename ? + icm.outputProfile = "RTv4_Bruce"; + } else if (icm.outputProfile == "ACES") { + icm.outputProfile = "RTv4_ACES-AP0"; + } + } + if (keyFile.has_key("Color Management", "OutputProfileIntent")) { + Glib::ustring intent = keyFile.get_string("Color Management", "OutputProfileIntent"); if (intent == "Perceptual") { icm.outputIntent = RI_PERCEPTUAL; @@ -4289,15 +4538,10 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) pedited->icm.outputIntent = true; } } - 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 (keyFile.has_group ("Wavelet")) { + 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); @@ -4315,7 +4559,18 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); - assignFromKeyfile(keyFile, "Wavelet", "LevMethod", pedited, wavelet.Lmethod, pedited->wavelet.Lmethod); + + 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); @@ -4361,11 +4616,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "CHcurve", pedited, wavelet.Chcurve, pedited->wavelet.Chcurve); assignFromKeyfile(keyFile, "Wavelet", "WavclCurve", pedited, wavelet.wavclCurve, pedited->wavelet.wavclCurve); - if (keyFile.has_key ("Wavelet", "Hueskin")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Hueskin"); + 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)); + wavelet.hueskin.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4373,11 +4628,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "HueRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HueRange"); + 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)); + wavelet.hueskin2.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4385,11 +4640,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "HLRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "HLRange"); + 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)); + wavelet.hllev.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4397,11 +4652,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "SHRange")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "SHRange"); + 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)); + wavelet.bllev.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4409,11 +4664,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "Edgcont")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Edgcont"); + 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)); + wavelet.edgcont.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4421,11 +4676,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "Level0noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level0noise"); + 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]); + wavelet.level0noise.setValues(thresh[0], thresh[1]); } if (pedited) { @@ -4433,11 +4688,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "Level1noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level1noise"); + 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]); + wavelet.level1noise.setValues(thresh[0], thresh[1]); } if (pedited) { @@ -4445,11 +4700,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "Level2noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level2noise"); + 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]); + wavelet.level2noise.setValues(thresh[0], thresh[1]); } if (pedited) { @@ -4457,11 +4712,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "Level3noise")) { - const std::vector thresh = keyFile.get_double_list ("Wavelet", "Level3noise"); + 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]); + wavelet.level3noise.setValues(thresh[0], thresh[1]); } if (pedited) { @@ -4469,11 +4724,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "Pastlev")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Pastlev"); + 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)); + wavelet.pastlev.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4481,11 +4736,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Wavelet", "Satlev")) { - const std::vector thresh = keyFile.get_integer_list ("Wavelet", "Satlev"); + 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)); + wavelet.satlev.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4501,8 +4756,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) std::stringstream ss; ss << "Contrast" << (i + 1); - if (keyFile.has_key ("Wavelet", ss.str())) { - wavelet.c[i] = keyFile.get_integer ("Wavelet", ss.str()); + if (keyFile.has_key("Wavelet", ss.str())) { + wavelet.c[i] = keyFile.get_integer("Wavelet", ss.str()); if (pedited) { pedited->wavelet.c[i] = true; @@ -4514,14 +4769,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) std::stringstream ss; ss << "Chroma" << (i + 1); - if (keyFile.has_key ("Wavelet", ss.str())) { - wavelet.ch[i] = keyFile.get_integer ("Wavelet", ss.str()); + 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); @@ -4529,16 +4785,16 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "Wavelet", "Expnoise", pedited, wavelet.expnoise, pedited->wavelet.expnoise); } - if (keyFile.has_group ("Directional Pyramid Equalizer")) { + 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 (keyFile.has_key ("Directional Pyramid Equalizer", "Hueskin")) { - const std::vector thresh = keyFile.get_integer_list ("Directional Pyramid Equalizer", "Hueskin"); + if (keyFile.has_key("Directional Pyramid Equalizer", "Hueskin")) { + const std::vector thresh = keyFile.get_integer_list("Directional Pyramid Equalizer", "Hueskin"); if (thresh.size() >= 4) { - dirpyrequalizer.hueskin.setValues (thresh[0], thresh[1], min (thresh[2], 300), min (thresh[3], 300)); + dirpyrequalizer.hueskin.setValues(thresh[0], thresh[1], min(thresh[2], 300), min(thresh[3], 300)); } if (pedited) { @@ -4551,15 +4807,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) std::stringstream ss; ss << "Mult" << i; - if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { + if (keyFile.has_key("Directional Pyramid Equalizer", ss.str())) { if (i == 4) { - dirpyrequalizer.threshold = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + dirpyrequalizer.threshold = keyFile.get_double("Directional Pyramid Equalizer", ss.str()); if (pedited) { pedited->dirpyrequalizer.threshold = true; } } else { - dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + dirpyrequalizer.mult[i] = keyFile.get_double("Directional Pyramid Equalizer", ss.str()); if (pedited) { pedited->dirpyrequalizer.mult[i] = true; @@ -4575,8 +4831,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) std::stringstream ss; ss << "Mult" << i; - if (keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) { - dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str()); + 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; @@ -4589,14 +4845,27 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_group ("Film Simulation")) { + if (keyFile.has_group("SoftLight")) { + assignFromKeyfile(keyFile, "SoftLight", "Enabled", pedited, softlight.enabled, pedited->softlight.enabled); + assignFromKeyfile(keyFile, "SoftLight", "Strength", pedited, softlight.strength, pedited->softlight.strength); + } + + if (keyFile.has_group("Dehaze")) { + assignFromKeyfile(keyFile, "Dehaze", "Enabled", pedited, dehaze.enabled, pedited->dehaze.enabled); + assignFromKeyfile(keyFile, "Dehaze", "Strength", pedited, dehaze.strength, pedited->dehaze.strength); + assignFromKeyfile(keyFile, "Dehaze", "ShowDepthMap", pedited, dehaze.showDepthMap, pedited->dehaze.showDepthMap); + assignFromKeyfile(keyFile, "Dehaze", "Depth", pedited, dehaze.depth, pedited->dehaze.depth); + } + + 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 (keyFile.has_key("Film Simulation", "Strength")) { if (ppVersion < 321) { - filmSimulation.strength = keyFile.get_double ("Film Simulation", "Strength") * 100 + 0.1; + filmSimulation.strength = keyFile.get_double("Film Simulation", "Strength") * 100 + 0.1; } else { - filmSimulation.strength = keyFile.get_integer ("Film Simulation", "Strength"); + filmSimulation.strength = keyFile.get_integer("Film Simulation", "Strength"); } if (pedited) { @@ -4605,15 +4874,17 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_group ("HSV Equalizer")) { + 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->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); @@ -4621,22 +4892,24 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_group ("RGB Curves")) { + 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->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_group ("ColorToning")) { + 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); @@ -4648,11 +4921,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) assignFromKeyfile(keyFile, "ColorToning", "SaturatedOpacity", pedited, colorToning.saturatedOpacity, pedited->colorToning.saturatedopacity); assignFromKeyfile(keyFile, "ColorToning", "Strength", pedited, colorToning.strength, pedited->colorToning.strength); - if (keyFile.has_key ("ColorToning", "HighlightsColorSaturation")) { - const std::vector thresh = keyFile.get_integer_list ("ColorToning", "HighlightsColorSaturation"); + if (keyFile.has_key("ColorToning", "HighlightsColorSaturation")) { + const std::vector thresh = keyFile.get_integer_list("ColorToning", "HighlightsColorSaturation"); if (thresh.size() >= 2) { - colorToning.hlColSat.setValues (thresh[0], thresh[1]); + colorToning.hlColSat.setValues(thresh[0], thresh[1]); } if (pedited) { @@ -4660,11 +4933,11 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("ColorToning", "ShadowsColorSaturation")) { - const std::vector thresh = keyFile.get_integer_list ("ColorToning", "ShadowsColorSaturation"); + if (keyFile.has_key("ColorToning", "ShadowsColorSaturation")) { + const std::vector thresh = keyFile.get_integer_list("ColorToning", "ShadowsColorSaturation"); if (thresh.size() >= 2) { - colorToning.shadowsColSat.setValues (thresh[0], thresh[1]); + colorToning.shadowsColSat.setValues(thresh[0], thresh[1]); } if (pedited) { @@ -4690,12 +4963,78 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + assignFromKeyfile(keyFile, "ColorToning", "LabGridBHigh", pedited, colorToning.labgridBHigh, pedited->colorToning.labgridBHigh); + if (ppVersion < 337) { + const double scale = ColorToningParams::LABGRID_CORR_SCALE; + colorToning.labgridALow *= scale; + colorToning.labgridAHigh *= scale; + colorToning.labgridBLow *= scale; + colorToning.labgridBHigh *= scale; + } + std::vector lg; + bool found = false; + bool done = false; + for (int i = 1; !done; ++i) { + ColorToningParams::LabCorrectionRegion cur; + done = true; + std::string n = std::to_string(i); + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionA_") + n, pedited, cur.a, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionB_") + n, pedited, cur.b, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionSaturation_") + n, pedited, cur.saturation, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionSlope_") + n, pedited, cur.slope, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionOffset_") + n, pedited, cur.offset, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionPower_") + n, pedited, cur.power, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionHueMask_") + n, pedited, cur.hueMask, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionChromaticityMask_") + n, pedited, cur.chromaticityMask, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionLightnessMask_") + n, pedited, cur.lightnessMask, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionMaskBlur_") + n, pedited, cur.maskBlur, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (assignFromKeyfile(keyFile, "ColorToning", Glib::ustring("LabRegionChannel_") + n, pedited, cur.channel, pedited->colorToning.labregions)) { + found = true; + done = false; + } + if (!done) { + lg.emplace_back(cur); + } + } + if (found) { + colorToning.labregions = std::move(lg); + } + assignFromKeyfile(keyFile, "ColorToning", "LabRegionsShowMask", pedited, colorToning.labregionsShowMask, pedited->colorToning.labregionsShowMask); } - 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("RAW")) { + if (keyFile.has_key("RAW", "DarkFrame")) { + raw.dark_frame = expandRelativePath(fname, "", keyFile.get_string("RAW", "DarkFrame")); if (pedited) { pedited->raw.darkFrame = true; @@ -4704,8 +5043,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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 (keyFile.has_key("RAW", "FlatFieldFile")) { + raw.ff_file = expandRelativePath(fname, "", keyFile.get_string("RAW", "FlatFieldFile")); if (pedited) { pedited->raw.ff_file = true; @@ -4716,6 +5055,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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. @@ -4723,20 +5063,34 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } 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); + if (ppVersion >= 342) { + assignFromKeyfile(keyFile, "RAW", "CAAutoIterations", pedited, raw.caautoiterations, pedited->raw.caautoiterations); + } else { + raw.caautoiterations = 1; + } + + if (ppVersion >= 343) { + assignFromKeyfile(keyFile, "RAW", "CAAvoidColourshift", pedited, raw.ca_avoidcolourshift, pedited->raw.ca_avoidcolourshift); + } else { + raw.ca_avoidcolourshift = false; + } 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); @@ -4753,11 +5107,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } } - if (keyFile.has_group ("RAW Bayer")) { + if (keyFile.has_group("RAW Bayer")) { assignFromKeyfile(keyFile, "RAW Bayer", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); + assignFromKeyfile(keyFile, "RAW Bayer", "Border", pedited, raw.bayersensor.border, pedited->raw.bayersensor.border); - if (keyFile.has_key ("RAW Bayer", "ImageNum")) { - raw.bayersensor.imageNum = keyFile.get_integer ("RAW Bayer", "ImageNum") - 1; + if (keyFile.has_key("RAW Bayer", "ImageNum")) { + raw.bayersensor.imageNum = keyFile.get_integer("RAW Bayer", "ImageNum") - 1; if (pedited) { pedited->raw.bayersensor.imageNum = true; @@ -4771,60 +5126,82 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); + + if (keyFile.has_key("RAW Bayer", "LineDenoiseDirection")) { + raw.bayersensor.linenoiseDirection = RAWParams::BayerSensor::LineNoiseDirection(keyFile.get_integer("RAW Bayer", "LineDenoiseDirection")); + + if (pedited) { + pedited->raw.bayersensor.linenoiseDirection = true; + } + } + 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"); - + assignFromKeyfile(keyFile, "RAW Bayer", "DualDemosaicAutoContrast", pedited, raw.bayersensor.dualDemosaicAutoContrast, pedited->raw.bayersensor.dualDemosaicAutoContrast); + if (ppVersion < 345) { + raw.bayersensor.dualDemosaicAutoContrast = false; if (pedited) { - pedited->raw.bayersensor.pixelShiftMotionCorrection = true; + pedited->raw.bayersensor.dualDemosaicAutoContrast = true; } } + assignFromKeyfile(keyFile, "RAW Bayer", "DualDemosaicContrast", pedited, raw.bayersensor.dualDemosaicContrast, pedited->raw.bayersensor.dualDemosaicContrast); - if (keyFile.has_key ("RAW Bayer", "PixelShiftMotionCorrectionMethod")) { - raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)keyFile.get_integer ("RAW Bayer", "PixelShiftMotionCorrectionMethod"); + if (keyFile.has_key("RAW Bayer", "PixelShiftMotionCorrectionMethod")) { + raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)keyFile.get_integer("RAW Bayer", "PixelShiftMotionCorrectionMethod"); if (pedited) { pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod = true; } } - 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); + if (ppVersion < 332) { + raw.bayersensor.pixelShiftEperIso += 1.0; + } 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 (ppVersion < 336) { + if (keyFile.has_key("RAW Bayer", "pixelShiftLmmse")) { + bool useLmmse = keyFile.get_boolean ("RAW Bayer", "pixelShiftLmmse"); + if (useLmmse) { + raw.bayersensor.pixelShiftDemosaicMethod = raw.bayersensor.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::LMMSE); + } else { + raw.bayersensor.pixelShiftDemosaicMethod = raw.bayersensor.getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod::AMAZE); + } + if (pedited) { + pedited->raw.bayersensor.pixelShiftDemosaicMethod = true; + } + } + } else { + assignFromKeyfile(keyFile, "RAW Bayer", "pixelShiftDemosaicMethod", pedited, raw.bayersensor.pixelShiftDemosaicMethod, pedited->raw.bayersensor.pixelShiftDemosaicMethod); + } + + assignFromKeyfile(keyFile, "RAW Bayer", "PDAFLinesFilter", pedited, raw.bayersensor.pdafLinesFilter, pedited->raw.bayersensor.pdafLinesFilter); } - if (keyFile.has_group ("RAW X-Trans")) { + 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", "DualDemosaicAutoContrast", pedited, raw.xtranssensor.dualDemosaicAutoContrast, pedited->raw.xtranssensor.dualDemosaicAutoContrast); + if (ppVersion < 345) { + raw.xtranssensor.dualDemosaicAutoContrast = false; + if (pedited) { + pedited->raw.xtranssensor.dualDemosaicAutoContrast = true; + } + } + assignFromKeyfile(keyFile, "RAW X-Trans", "DualDemosaicContrast", pedited, raw.xtranssensor.dualDemosaicContrast, pedited->raw.xtranssensor.dualDemosaicContrast); + assignFromKeyfile(keyFile, "RAW X-Trans", "Border", pedited, raw.xtranssensor.border, pedited->raw.xtranssensor.border); 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); @@ -4834,16 +5211,15 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) 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); } } - if (keyFile.has_group ("Exif")) { - std::vector keys = keyFile.get_keys ("Exif"); - + if (keyFile.has_group("Exif")) { for (const auto& key : keyFile.get_keys("Exif")) { - exif[key] = keyFile.get_string ("Exif", key); + exif[key] = keyFile.get_string("Exif", key); if (pedited) { pedited->exif = true; @@ -4863,7 +5239,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) * tag content is fully replaced by the new one, * i.e. they don't merge */ - if (keyFile.has_group ("IPTC")) { + if (keyFile.has_group("IPTC")) { for (const auto& key : keyFile.get_keys("IPTC")) { // does this key already exist? const IPTCPairs::iterator element = iptc.find(key); @@ -4874,8 +5250,8 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) } // TODO: look out if merging Keywords and SupplementalCategories from the procparams chain would be interesting - for (const auto& currLoadedTagValue : keyFile.get_string_list ("IPTC", key)) { - iptc[key].push_back (currLoadedTagValue); + for (const auto& currLoadedTagValue : keyFile.get_string_list("IPTC", key)) { + iptc[key].push_back(currLoadedTagValue); } if (pedited) { @@ -4886,12 +5262,12 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) return 0; } catch (const Glib::Error& e) { - printf ("-->%s\n", e.what().c_str()); - setDefaults (); + printf("-->%s\n", e.what().c_str()); + setDefaults(); return 1; } catch (...) { - printf ("-->unknown exception!\n"); - setDefaults (); + printf("-->unknown exception!\n"); + setDefaults(); return 1; } @@ -4949,11 +5325,13 @@ bool ProcParams::operator ==(const ProcParams& other) const && dirpyrequalizer == other.dirpyrequalizer && hsvequalizer == other.hsvequalizer && filmSimulation == other.filmSimulation + && softlight == other.softlight && rgbCurves == other.rgbCurves && colorToning == other.colorToning && metadata == other.metadata && exif == other.exif - && iptc == other.iptc; + && iptc == other.iptc + && dehaze == other.dehaze; } bool ProcParams::operator !=(const ProcParams& other) const @@ -4975,13 +5353,13 @@ int ProcParams::write(const Glib::ustring& fname, const Glib::ustring& content) if (fname.length()) { FILE *f; - f = g_fopen (fname.c_str (), "wt"); + f = g_fopen(fname.c_str(), "wt"); if (f == nullptr) { error = 1; } else { - fprintf (f, "%s", content.c_str()); - fclose (f); + fprintf(f, "%s", content.c_str()); + fclose(f); } } @@ -4992,7 +5370,7 @@ PartialProfile::PartialProfile(bool createInstance, bool paramsEditedValue) { if (createInstance) { pparams = new ProcParams(); - pedited = new ParamsEdited (paramsEditedValue); + pedited = new ParamsEdited(paramsEditedValue); } else { pparams = nullptr; pedited = nullptr; @@ -5002,13 +5380,13 @@ PartialProfile::PartialProfile(bool createInstance, bool paramsEditedValue) PartialProfile::PartialProfile(ProcParams* pp, ParamsEdited* pe, bool fullCopy) { if (fullCopy && pp) { - pparams = new ProcParams (*pp); + pparams = new ProcParams(*pp); } else { pparams = pp; } if (fullCopy && pe) { - pedited = new ParamsEdited (*pe); + pedited = new ParamsEdited(*pe); } else { pedited = pe; } @@ -5017,13 +5395,13 @@ PartialProfile::PartialProfile(ProcParams* pp, ParamsEdited* pe, bool fullCopy) PartialProfile::PartialProfile(const ProcParams* pp, const ParamsEdited* pe) { if (pp) { - pparams = new ProcParams (*pp); + pparams = new ProcParams(*pp); } else { pparams = nullptr; } if (pe) { - pedited = new ParamsEdited (*pe); + pedited = new ParamsEdited(*pe); } else { pedited = nullptr; } @@ -5066,7 +5444,7 @@ int PartialProfile::load(const Glib::ustring& fName) } else if (fName == DEFPROFILE_DYNAMIC) { return -1; // should not happen here } else { - return pparams->load (fName, pedited); + return pparams->load(fName, pedited); } } @@ -5077,14 +5455,18 @@ int PartialProfile::load(const Glib::ustring& fName) void PartialProfile::set(bool v) { if (pedited) { - pedited->set (v); + pedited->set(v); } } -void PartialProfile::applyTo(ProcParams* destParams) const +void PartialProfile::applyTo(ProcParams* destParams, bool fromLastSave) const { if (destParams && pparams && pedited) { - pedited->combine (*destParams, *pparams, true); + bool fromHistMatching = fromLastSave && destParams->toneCurve.histmatching && pparams->toneCurve.histmatching; + pedited->combine(*destParams, *pparams, true); + if (!fromLastSave) { + destParams->toneCurve.fromHistMatching = fromHistMatching; + } } } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index d47a8b3c5..fc8794801 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -27,10 +27,9 @@ #include #include "coord.h" -#include "LUT.h" #include "noncopyable.h" -class ParamsEdited; +struct ParamsEdited; namespace rtengine { @@ -46,7 +45,7 @@ class WavOpacityCurveRG; class WavOpacityCurveW; class WavOpacityCurveWL; -enum RenderingIntent { +enum RenderingIntent : int { RI_PERCEPTUAL = INTENT_PERCEPTUAL, RI_RELATIVE = INTENT_RELATIVE_COLORIMETRIC, RI_SATURATION = INTENT_SATURATION, @@ -76,14 +75,14 @@ public: { 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; + 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; + std::fabs(bottom_left - rhs.bottom_left) < 1e-10 + && std::fabs(top_left - rhs.top_left) < 1e-10; } } @@ -113,7 +112,7 @@ public: return top_left; } - T getBottomLeft() const + T getBottomLeft() const { return bottom_left; } @@ -123,7 +122,7 @@ public: return top_left; } - T getBottomRight() const + T getBottomRight() const { return bottom_right; } @@ -173,7 +172,7 @@ public: // 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 y_max) const + RT multiply(RV x, RV2 y_max) const { const double val = x; @@ -251,36 +250,38 @@ private: bool is_double; }; +enum class ToneCurveMode : int { + 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 +}; + /** * Parameters of the tone curve */ 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; - double clip; - bool hrenabled; // Highlight Reconstruction enabled - Glib::ustring method; // Highlight Reconstruction's method - double expcomp; - std::vector curve; - std::vector curve2; - TcMode curveMode; - TcMode curveMode2; - int brightness; - int black; - int contrast; - int saturation; - int shcompr; - int hlcompr; // Highlight Recovery's compression - int hlcomprthresh; // Highlight Recovery's threshold + bool autoexp; + double clip; + bool hrenabled; // Highlight Reconstruction enabled + Glib::ustring method; // Highlight Reconstruction's method + double expcomp; + std::vector curve; + std::vector curve2; + ToneCurveMode curveMode; + ToneCurveMode curveMode2; + int brightness; + int black; + int contrast; + int saturation; + int shcompr; + int hlcompr; // Highlight Recovery's compression + int hlcomprthresh; // Highlight Recovery's threshold bool histmatching; // histogram matching + bool fromHistMatching; + bool clampOOG; // clamp out of gamut colours ToneCurveParams(); @@ -292,8 +293,7 @@ struct ToneCurveParams { /** * Parameters of Retinex */ -struct RetinexParams -{ +struct RetinexParams { bool enabled; std::vector cdcurve; std::vector cdHcurve; @@ -339,8 +339,7 @@ struct RetinexParams /** * Parameters of the luminance curve */ -struct LCurveParams -{ +struct LCurveParams { bool enabled; std::vector lcurve; std::vector acurve; @@ -367,7 +366,7 @@ struct LCurveParams /** * Parameters for local contrast - */ + */ struct LocalContrastParams { bool enabled; int radius; @@ -453,6 +452,28 @@ struct ColorToningParams { double labgridAHigh; double labgridBHigh; static const double LABGRID_CORR_MAX; + static const double LABGRID_CORR_SCALE; + + struct LabCorrectionRegion { + enum { CHAN_ALL = -1, CHAN_R, CHAN_G, CHAN_B }; + double a; + double b; + double saturation; + double slope; + double offset; + double power; + std::vector hueMask; + std::vector chromaticityMask; + std::vector lightnessMask; + double maskBlur; + int channel; + + LabCorrectionRegion(); + bool operator==(const LabCorrectionRegion &other) const; + bool operator!=(const LabCorrectionRegion &other) const; + }; + std::vector labregions; + int labregionsShowMask; ColorToningParams(); @@ -472,6 +493,8 @@ struct ColorToningParams { */ struct SharpeningParams { bool enabled; + double contrast; + double blurradius; double radius; int amount; Threshold threshold; @@ -508,7 +531,8 @@ struct SharpenMicroParams { bool enabled; bool matrix; double amount; - double uniformity; + double contrast; + int uniformity; SharpenMicroParams(); @@ -649,7 +673,7 @@ struct ColorAppearanceParams { struct DefringeParams { bool enabled; double radius; - float threshold; + int threshold; std::vector huecurve; DefringeParams(); @@ -728,6 +752,7 @@ struct FattalToneMappingParams { bool enabled; int threshold; int amount; + int anchor; FattalToneMappingParams(); @@ -740,12 +765,12 @@ struct FattalToneMappingParams { */ struct SHParams { bool enabled; - bool hq; int highlights; int htonalwidth; int shadows; int stonalwidth; int radius; + bool lab; SHParams(); @@ -996,6 +1021,7 @@ struct ResizeParams { int dataspec; int width; int height; + bool allowUpscaling; ResizeParams(); @@ -1006,8 +1032,7 @@ struct ResizeParams { /** * Parameters entry */ -struct SpotEntry -{ +struct SpotEntry { Coord sourcePos; Coord targetPos; int radius; @@ -1023,8 +1048,7 @@ struct SpotEntry /** * Parameters of the dust removal tool */ -struct SpotParams -{ +struct SpotParams { bool enabled; std::vector entries; @@ -1043,22 +1067,22 @@ struct SpotParams * Parameters of the color spaces used during the processing */ struct ColorManagementParams { - Glib::ustring input; - bool toneCurve; - bool applyLookTable; - bool applyBaselineExposureOffset; - bool applyHueSatMap; + Glib::ustring inputProfile; + bool toneCurve; + bool applyLookTable; + bool applyBaselineExposureOffset; + bool applyHueSatMap; int dcpIlluminant; - Glib::ustring working; - Glib::ustring output; + + Glib::ustring workingProfile; + Glib::ustring workingTRC; + double workingTRCGamma; + double workingTRCSlope; + + Glib::ustring outputProfile; RenderingIntent outputIntent; bool outputBPC; - Glib::ustring gamma; - double gampos; - double slpos; - bool freegamma; - static const Glib::ustring NoICMString; ColorManagementParams(); @@ -1087,14 +1111,89 @@ struct MetaDataParams { /** - * Typedef for representing a key/value for the exif metadata information + * Minimal wrapper allowing forward declaration for representing a key/value for the exif metadata information */ -typedef std::map ExifPairs; +class ExifPairs final +{ +public: + using const_iterator = std::map::const_iterator; + + const_iterator begin() const + { + return pairs.begin(); + } + + const_iterator end() const + { + return pairs.end(); + } + + void clear() + { + pairs.clear(); + } + + Glib::ustring& operator[](const Glib::ustring& key) + { + return pairs[key]; + } + + bool operator ==(const ExifPairs& other) const + { + return pairs == other.pairs; + } + +private: + std::map pairs; +}; /** * The IPTC key/value pairs */ -typedef std::map> IPTCPairs; +class IPTCPairs final +{ +public: + using iterator = std::map>::iterator; + using const_iterator = std::map>::const_iterator; + + iterator find(const Glib::ustring& key) + { + return pairs.find(key); + } + + const_iterator begin() const + { + return pairs.begin(); + } + + const_iterator end() const + { + return pairs.end(); + } + + bool empty() const + { + return pairs.empty(); + } + + void clear() + { + pairs.clear(); + } + + std::vector& operator[](const Glib::ustring& key) + { + return pairs[key]; + } + + bool operator ==(const IPTCPairs& other) const + { + return pairs == other.pairs; + } + +private: + std::map> pairs; +}; struct WaveletParams { std::vector ccwcurve; @@ -1133,7 +1232,7 @@ struct WaveletParams { bool exptoning; bool expnoise; - Glib::ustring Lmethod; + int Lmethod; Glib::ustring CLmethod; Glib::ustring Backmethod; Glib::ustring Tilesmethod; @@ -1247,6 +1346,30 @@ struct FilmSimulationParams { }; +struct SoftLightParams { + bool enabled; + int strength; + + SoftLightParams(); + + bool operator==(const SoftLightParams &other) const; + bool operator!=(const SoftLightParams &other) const; +}; + + +struct DehazeParams { + bool enabled; + int strength; + bool showDepthMap; + int depth; + + DehazeParams(); + + bool operator==(const DehazeParams &other) const; + bool operator!=(const DehazeParams &other) const; +}; + + /** * Parameters for RAW demosaicing, common to all sensor type */ @@ -1257,27 +1380,21 @@ struct RAWParams { struct BayerSensor { enum class Method { AMAZE, - IGV, + AMAZEVNG4, + RCD, + RCDVNG4, + DCB, + DCBVNG4, LMMSE, + IGV, + AHD, EAHD, HPHD, VNG4, - DCB, - AHD, - RCD, FAST, MONO, - NONE, - PIXELSHIFT - }; - - enum class PSMotionCorrection { - GRID_1X1, - GRID_1X2, - GRID_3X3, - GRID_5X5, - GRID_7X7, - GRID_3X3_NEW + PIXELSHIFT, + NONE }; enum class PSMotionCorrectionMethod { @@ -1286,7 +1403,14 @@ struct RAWParams { CUSTOM }; + enum class PSDemosaicMethod { + AMAZE, + AMAZEVNG4, + LMMSE + }; + Glib::ustring method; + int border; int imageNum; int ccSteps; double black0; @@ -1295,41 +1419,34 @@ struct RAWParams { double black3; bool twogreen; int linenoise; + enum class LineNoiseDirection { + HORIZONTAL = 1, + VERTICAL, + BOTH, + PDAF_LINES = 5 + }; + LineNoiseDirection linenoiseDirection; int greenthresh; int dcb_iterations; int lmmse_iterations; - int pixelShiftMotion; - PSMotionCorrection pixelShiftMotionCorrection; + bool dualDemosaicAutoContrast; + double dualDemosaicContrast; PSMotionCorrectionMethod pixelShiftMotionCorrectionMethod; - double pixelShiftStddevFactorGreen; - double pixelShiftStddevFactorRed; - double pixelShiftStddevFactorBlue; double pixelShiftEperIso; - double pixelShiftNreadIso; - double pixelShiftPrnu; double pixelShiftSigma; - double pixelShiftSum; - double pixelShiftRedBlueWeight; bool pixelShiftShowMotion; bool pixelShiftShowMotionMaskOnly; - bool pixelShiftAutomatic; - bool pixelShiftNonGreenHorizontal; - bool pixelShiftNonGreenVertical; bool pixelShiftHoleFill; bool pixelShiftMedian; - bool pixelShiftMedian3; bool pixelShiftGreen; bool pixelShiftBlur; double pixelShiftSmoothFactor; - bool pixelShiftExp0; - bool pixelShiftLmmse; - bool pixelShiftOneGreen; bool pixelShiftEqualBright; bool pixelShiftEqualBrightChannel; bool pixelShiftNonGreenCross; - bool pixelShiftNonGreenCross2; - bool pixelShiftNonGreenAmaze; + Glib::ustring pixelShiftDemosaicMethod; bool dcb_enhance; + bool pdafLinesFilter; BayerSensor(); @@ -1340,6 +1457,9 @@ struct RAWParams { static const std::vector& getMethodStrings(); static Glib::ustring getMethodString(Method method); + + static const std::vector& getPSDemosaicMethodStrings(); + static Glib::ustring getPSDemosaicMethodString(PSDemosaicMethod method); }; /** @@ -1347,7 +1467,9 @@ struct RAWParams { */ struct XTransSensor { enum class Method { + FOUR_PASS, THREE_PASS, + TWO_PASS, ONE_PASS, FAST, MONO, @@ -1355,6 +1477,9 @@ struct RAWParams { }; Glib::ustring method; + bool dualDemosaicAutoContrast; + double dualDemosaicContrast; + int border; int ccSteps; double blackred; double blackgreen; @@ -1367,7 +1492,7 @@ struct RAWParams { 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 @@ -1390,12 +1515,13 @@ struct RAWParams { int ff_clipControl; bool ca_autocorrect; + bool ca_avoidcolourshift; + int caautoiterations; double cared; double cablue; // exposure before interpolation double expos; - double preser; bool hotPixelFilter; bool deadPixelFilter; @@ -1457,6 +1583,8 @@ public: DirPyrEqualizerParams dirpyrequalizer; ///< directional pyramid wavelet parameters HSVEqualizerParams hsvequalizer; ///< hsv wavelet parameters FilmSimulationParams filmSimulation; ///< film simulation parameters + SoftLightParams softlight; ///< softlight parameters + DehazeParams dehaze; ///< dehaze parameters int rank; ///< Custom image quality ranking int colorlabel; ///< Custom color label bool inTrash; ///< Marks deleted image @@ -1496,7 +1624,7 @@ public: /** 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. */ @@ -1523,7 +1651,7 @@ private: * 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 : @@ -1537,7 +1665,7 @@ public: void clearGeneral(); int load(const Glib::ustring& fName); void set(bool v); - void applyTo(ProcParams* destParams) const ; + void applyTo(ProcParams* destParams, bool fromLastSaved = false) const ; rtengine::procparams::ProcParams* pparams; ParamsEdited* pedited; diff --git a/rtengine/profilestore.cc b/rtengine/profilestore.cc index e79c8e322..437ef6ec6 100644 --- a/rtengine/profilestore.cc +++ b/rtengine/profilestore.cc @@ -19,6 +19,8 @@ #include "profilestore.h" #include "dynamicprofile.h" +#include "procparams.h" + #include "../rtgui/options.h" #include "../rtgui/multilangmgr.h" @@ -121,11 +123,14 @@ void ProfileStore::_parseProfiles () 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); diff --git a/rtengine/profilestore.h b/rtengine/profilestore.h index 4949517da..5b4c94b20 100644 --- a/rtengine/profilestore.h +++ b/rtengine/profilestore.h @@ -27,8 +27,20 @@ #include "noncopyable.h" #include "dynamicprofile.h" - // forward decl +namespace rtengine +{ + +namespace procparams +{ + +class AutoPartialProfile; +class PartialProfile; + +} + +} + class DynamicProfileRule; class DynamicProfileRules; @@ -39,14 +51,14 @@ class ProfileStoreListener { public: - virtual ~ProfileStoreListener() {} + virtual ~ProfileStoreListener() = default; /** @brief Called whenever the current value has to be stored before update. */ - virtual void storeCurrentValue() {} + virtual void storeCurrentValue() = 0; /** @brief Called whenever the file list has been updated and the content of the listener has to be updated. */ virtual void updateProfileList() = 0; /** @brief Called whenever the profile list has changed and the old value have to be restored (if possible). */ - virtual void restoreValue() {} + virtual void restoreValue() = 0; }; /// @brief ProfileStoreEntry type (folder or file) diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 8d7292113..18848274a 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -30,9 +30,9 @@ RawImage::RawImage( const Glib::ustring &name ) , allocation(nullptr) { memset(maximum_c4, 0, sizeof(maximum_c4)); - RT_matrix_from_constant = 0; - RT_blacklevel_from_constant = 0; - RT_whitelevel_from_constant = 0; + RT_matrix_from_constant = ThreeValBool::X; + RT_blacklevel_from_constant = ThreeValBool::X; + RT_whitelevel_from_constant = ThreeValBool::X; } RawImage::~RawImage() @@ -118,6 +118,8 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac } memset(dsum, 0, sizeof dsum); + constexpr float blackThreshold = 8.f; + constexpr float whiteThreshold = 25.f; if (this->isBayer()) { // calculate number of pixels per color dsum[FC(0, 0) + 4] += (int)(((W + 1) / 2) * ((H + 1) / 2)); @@ -125,7 +127,9 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac dsum[FC(1, 0) + 4] += (int)(((W + 1) / 2) * (H / 2)); dsum[FC(1, 1) + 4] += (int)((W / 2) * (H / 2)); +#ifdef _OPENMP #pragma omp parallel private(val) +#endif { double dsumthr[8]; memset(dsumthr, 0, sizeof dsumthr); @@ -135,12 +139,14 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac float whitefloat[4]; for (int c = 0; c < 4; c++) { - cblackfloat[c] = cblack_[c]; - whitefloat[c] = this->get_white(c) - 25; + cblackfloat[c] = cblack_[c] + blackThreshold; + whitefloat[c] = this->get_white(c) - whiteThreshold; } float *tempdata = data[0]; +#ifdef _OPENMP #pragma omp for nowait +#endif for (size_t row = 0; row < H; row += 8) { size_t ymax = row + 8 < H ? row + 8 : H; @@ -154,7 +160,7 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac int c = FC(y, x); val = tempdata[y * W + x]; - if (val > whitefloat[c]) { // calculate number of pixels to be substracted from sum and skip the block + if (val > whitefloat[c] || val < cblackfloat[c]) { // calculate number of pixels to be subtracted from sum and skip the block dsumthr[FC(row, col) + 4] += (int)(((xmax - col + 1) / 2) * ((ymax - row + 1) / 2)); dsumthr[FC(row, col + 1) + 4] += (int)(((xmax - col) / 2) * ((ymax - row + 1) / 2)); dsumthr[FC(row + 1, col) + 4] += (int)(((xmax - col + 1) / 2) * ((ymax - row) / 2)); @@ -162,10 +168,6 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac goto skip_block2; } - if (val < cblackfloat[c]) { - val = cblackfloat[c]; - } - sum[c] += val; } @@ -178,7 +180,9 @@ skip_block2: } } +#ifdef _OPENMP #pragma omp critical +#endif { for (int c = 0; c < 4; c++) { dsum[c] += dsumthr[c]; @@ -196,20 +200,26 @@ skip_block2: } } else if(isXtrans()) { +#ifdef _OPENMP #pragma omp parallel +#endif { double dsumthr[8]; memset(dsumthr, 0, sizeof dsumthr); float sum[8]; // make local copies of the black and white values to avoid calculations and conversions + float cblackfloat[4]; float whitefloat[4]; for (int c = 0; c < 4; c++) { - whitefloat[c] = this->get_white(c) - 25; + cblackfloat[c] = cblack_[c] + blackThreshold; + whitefloat[c] = this->get_white(c) - whiteThreshold; } +#ifdef _OPENMP #pragma omp for nowait +#endif for (size_t row = 0; row < H; row += 8) for (size_t col = 0; col < W ; col += 8) @@ -221,13 +231,11 @@ skip_block2: int c = XTRANSFC(y, x); float val = data[y][x]; - if (val > whitefloat[c]) { + if (val > whitefloat[c] || val < cblackfloat[c]) { goto skip_block3; } - if ((val -= cblack_[c]) < 0) { - val = 0; - } + val -= cblack_[c]; sum[c] += val; sum[c + 4]++; @@ -241,7 +249,9 @@ skip_block3: ; } +#ifdef _OPENMP #pragma omp critical +#endif { for (int c = 0; c < 8; c++) { @@ -262,27 +272,16 @@ skip_block3: for (size_t y = row; y < row + 8 && y < H; y++) for (size_t x = col; x < col + 8 && x < W; x++) for (int c = 0; c < 3; c++) { - if (this->isBayer()) { - c = FC(y, x); - val = data[y][x]; - } else { - val = data[y][3 * x + c]; - } + val = data[y][3 * x + c]; - if (val > this->get_white(c) - 25) { + if (val > this->get_white(c) - whiteThreshold || val < cblack_[c] + blackThreshold) { goto skip_block; } - if ((val -= cblack_[c]) < 0) { - val = 0; - } + val -= cblack_[c]; sum[c] += val; sum[c + 4]++; - - if ( this->isBayer()) { - break; - } } for (c = 0; c < 8; c++) { @@ -332,10 +331,16 @@ skip_block: pre_mul_[3] = pre_mul_[1] = (pre_mul_[3] + pre_mul_[1]) / 2; } - if (colors == 1) + if (colors == 1) { + // there are monochrome cameras with wrong matrix. We just replace with this one. + rgb_cam[0][0] = 1; rgb_cam[1][0] = 0; rgb_cam[2][0] = 0; + rgb_cam[0][1] = 0; rgb_cam[1][1] = 1; rgb_cam[2][1] = 0; + rgb_cam[0][2] = 0; rgb_cam[1][2] = 0; rgb_cam[2][2] = 1; + for (c = 1; c < 4; c++) { cblack_[c] = cblack_[0]; } + } bool multiple_whites = false; int largest_white = this->get_white(0); @@ -454,8 +459,12 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro } if(!strcmp(make,"Fujifilm") && raw_height * raw_width * 2u != raw_size) { - parse_fuji_compressed_header(); - } + if (raw_width * raw_height * 7u / 4u == raw_size) { + load_raw = &RawImage::fuji_14bit_load_raw; + } else { + parse_fuji_compressed_header(); + } + } if (flip == 5) { this->rotate_deg = 270; @@ -482,13 +491,13 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro iwidth = width; if (filters || colors == 1) { - raw_image = (ushort *) calloc ((raw_height + 7) * raw_width, 2); + raw_image = (ushort *) calloc ((static_cast(raw_height) + 7u) * static_cast(raw_width), 2); merror (raw_image, "main()"); } // dcraw needs this global variable to hold pixel data - image = (dcrawImage_t)calloc (height * width * sizeof * image + meta_length, 1); - meta_data = (char *) (image + height * width); + image = (dcrawImage_t)calloc (static_cast(height) * static_cast(width) * sizeof * image + meta_length, 1); + meta_data = (char *) (image + static_cast(height) * static_cast(width)); if(!image) { return 200; @@ -506,6 +515,10 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro fseek (ifp, data_offset, SEEK_SET); (this->*load_raw)(); + if (!float_raw_image) { // apply baseline exposure only for float DNGs + RT_baseline_exposure = 0; + } + if (plistener) { plistener->setProgress(0.9 * progressRange); } @@ -602,14 +615,14 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro if (cc) { for (int i = 0; i < 4; i++) { - if (RT_blacklevel_from_constant) { + if (RT_blacklevel_from_constant == ThreeValBool::T) { int blackFromCc = cc->get_BlackLevel(i, iso_speed); // if black level from camconst > 0xffff it is an absolute value. black_c4[i] = blackFromCc > 0xffff ? (blackFromCc & 0xffff) : blackFromCc + cblack[i]; } // load 4 channel white level here, will be used if available - if (RT_whitelevel_from_constant) { + if (RT_whitelevel_from_constant == ThreeValBool::T) { maximum_c4[i] = cc->get_WhiteLevel(i, iso_speed, aperture); if(tiff_bps > 0 && maximum_c4[i] > 0 && !isFoveon()) { @@ -676,7 +689,7 @@ int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, Pro return 0; } -float** RawImage::compress_image(int frameNum, bool freeImage) +float** RawImage::compress_image(unsigned int frameNum, bool freeImage) { if( !image ) { return nullptr; @@ -685,7 +698,7 @@ float** RawImage::compress_image(int frameNum, bool freeImage) if (isBayer() || isXtrans()) { if (!allocation) { // shift the beginning of all frames but the first by 32 floats to avoid cache miss conflicts on CPUs which have <= 4-way associative L1-Cache - allocation = new float[height * width + frameNum * 32]; + allocation = new float[static_cast(height) * static_cast(width) + frameNum * 32u]; data = new float*[height]; for (int i = 0; i < height; i++) { @@ -715,7 +728,9 @@ float** RawImage::compress_image(int frameNum, bool freeImage) // copy pixel raw data: the compressed format earns space if( float_raw_image ) { +#ifdef _OPENMP #pragma omp parallel for +#endif for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { @@ -725,21 +740,27 @@ float** RawImage::compress_image(int frameNum, bool freeImage) delete [] float_raw_image; float_raw_image = nullptr; } else if (filters != 0 && !isXtrans()) { +#ifdef _OPENMP #pragma omp parallel for +#endif for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { this->data[row][col] = image[row * width + col][FC(row, col)]; } } else if (isXtrans()) { +#ifdef _OPENMP #pragma omp parallel for +#endif for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { this->data[row][col] = image[row * width + col][XTRANSFC(row, col)]; } } else if (colors == 1) { +#ifdef _OPENMP #pragma omp parallel for +#endif for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { @@ -750,7 +771,9 @@ float** RawImage::compress_image(int frameNum, bool freeImage) height -= top_margin; width -= left_margin; } +#ifdef _OPENMP #pragma omp parallel for +#endif for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { @@ -1052,16 +1075,31 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is *black_level = -1; *white_level = -1; + + const bool is_pentax_dng = dng_version && !strncmp(RT_software.c_str(), "PENTAX", 6); + + if (RT_blacklevel_from_constant == ThreeValBool::F && !is_pentax_dng) { + *black_level = black; + } + if (RT_whitelevel_from_constant == ThreeValBool::F && !is_pentax_dng) { + *white_level = maximum; + } memset(trans, 0, sizeof(*trans) * 12); - // indicate that DCRAW wants these from constants (rather than having loaded these from RAW file - // note: this is simplified so far, in some cases dcraw calls this when it has say the black level - // from file, but then we will not provide any black level in the tables. This case is mainly just - // to avoid loading table values if we have loaded a DNG conversion of a raw file (which already - // have constants stored in the file). - RT_whitelevel_from_constant = 1; - RT_blacklevel_from_constant = 1; - RT_matrix_from_constant = 1; + // // indicate that DCRAW wants these from constants (rather than having loaded these from RAW file + // // note: this is simplified so far, in some cases dcraw calls this when it has say the black level + // // from file, but then we will not provide any black level in the tables. This case is mainly just + // // to avoid loading table values if we have loaded a DNG conversion of a raw file (which already + // // have constants stored in the file). + // if (RT_whitelevel_from_constant == ThreeValBool::X || is_pentax_dng) { + // RT_whitelevel_from_constant = ThreeValBool::T; + // } + // if (RT_blacklevel_from_constant == ThreeValBool::X || is_pentax_dng) { + // RT_blacklevel_from_constant = ThreeValBool::T; + // } + // if (RT_matrix_from_constant == ThreeValBool::X) { + // RT_matrix_from_constant = ThreeValBool::T; + // } { // test if we have any information in the camera constants store, if so we take that. @@ -1069,10 +1107,14 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is rtengine::CameraConst *cc = ccs->get(make, model); if (cc) { - *black_level = cc->get_BlackLevel(0, iso_speed); - *white_level = cc->get_WhiteLevel(0, iso_speed, aperture); + if (RT_blacklevel_from_constant == ThreeValBool::T) { + *black_level = cc->get_BlackLevel(0, iso_speed); + } + if (RT_whitelevel_from_constant == ThreeValBool::T) { + *white_level = cc->get_WhiteLevel(0, iso_speed, aperture); + } - if (cc->has_dcrawMatrix()) { + if (RT_matrix_from_constant == ThreeValBool::T && cc->has_dcrawMatrix()) { const short *mx = cc->get_dcrawMatrix(); for (int j = 0; j < 12; j++) { @@ -1089,8 +1131,12 @@ DCraw::dcraw_coeff_overrides(const char make[], const char model[], const int is for (size_t i = 0; i < sizeof table / sizeof(table[0]); i++) { if (strcasecmp(name, table[i].prefix) == 0) { - *black_level = table[i].black_level; - *white_level = table[i].white_level; + if (RT_blacklevel_from_constant == ThreeValBool::T) { + *black_level = table[i].black_level; + } + if (RT_whitelevel_from_constant == ThreeValBool::T) { + *white_level = table[i].white_level; + } for (int j = 0; j < 12; j++) { trans[j] = table[i].trans[j]; diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 95e7aea8d..0dabfef0d 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -121,10 +121,12 @@ public: { return image; } - float** compress_image(int frameNum, bool freeImage = true); // revert to compressed pixels format and release image data + float** compress_image(unsigned int frameNum, bool freeImage = true); // revert to compressed pixels format and release image data float** data; // holds pixel values, data[i][j] corresponds to the ith row and jth column unsigned prefilters; // original filters saved ( used for 4 color processing ) unsigned int getFrameCount() const { return is_raw; } + + double getBaselineExposure() const { return RT_baseline_exposure; } protected: Glib::ustring filename; // complete filename int rotate_deg; // 0,90,180,270 degree of rotation: info taken by dcraw from exif @@ -167,10 +169,22 @@ public: { return top_margin; } + + int get_rawwidth() const + { + return raw_width; + } + int get_FujiWidth() const { return fuji_width; } + + float const * get_FloatRawImage() const + { + return float_raw_image; + } + eSensorType getSensorType(); void getRgbCam (float rgbcam[3][4]); @@ -312,6 +326,11 @@ public: return filters == 9; } + bool isFloat() const + { + return float_raw_image; + } + public: // dcraw functions void pre_interpolate() diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index ea7b0e559..57a344e7f 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -34,11 +34,13 @@ #include "rt_math.h" #include "improcfun.h" #include "rtlensfun.h" +#include "pdaflinesfilter.h" +#include "camconst.h" +#include "procparams.h" #ifdef _OPENMP #include #endif #include "opthelper.h" -#include "StopWatch.h" #define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val ) #undef CLIPD #define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f) @@ -427,7 +429,6 @@ RawImageSource::RawImageSource () , plistener(nullptr) , scale_mul{} , c_black{} - , c_white{} , cblacksom{} , ref_pre_mul{} , refwb_red(0.0) @@ -447,22 +448,12 @@ RawImageSource::RawImageSource () , camInitialGain(0.0) , defGain(0.0) , ri(nullptr) - , lc00(0.0) - , lc01(0.0) - , lc02(0.0) - , lc10(0.0) - , lc11(0.0) - , lc12(0.0) - , lc20(0.0) - , lc21(0.0) - , lc22(0.0) - , cache(nullptr) - , threshold(0) , rawData(0, 0) , green(0, 0) , red(0, 0) , blue(0, 0) , rawDirty(true) + , histMatchingParams(new procparams::ColorManagementParams) { camProfile = nullptr; embProfile = nullptr; @@ -483,17 +474,13 @@ RawImageSource::~RawImageSource () delete riFrames[i]; } - for(size_t i = 0; i < numFrames - 1; ++i) { + for(size_t i = 0; i + 1 < numFrames; ++i) { delete rawDataBuffer[i]; } flushRGB(); flushRawData(); - if( cache ) { - delete [] cache; - } - if (camProfile) { cmsCloseProfile (camProfile); } @@ -589,8 +576,8 @@ void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, } else { ssx1 = sx1; ssy1 = sy1; - width = (sx2 - sx1) / pp.getSkip() + ((sx2 - sx1) % pp.getSkip() > 0); - height = (sy2 - sy1) / pp.getSkip() + ((sy2 - sy1) % pp.getSkip() > 0); + width = (sx2 + 1 - sx1) / pp.getSkip() + ((sx2 + 1 - sx1) % pp.getSkip() > 0); + height = (sy2 + 1 - sy1) / pp.getSkip() + ((sy2 + 1 - sy1) % pp.getSkip() > 0); } } @@ -651,6 +638,11 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima 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)); + + for (int i = 0; i < 4; ++i) { + c_white[i] = (ri->get_white(i) - cblacksom[i]) / raw.expos + cblacksom[i]; + } + 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; @@ -723,13 +715,18 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima hlmax[1] = clmax[1] * gm; hlmax[2] = clmax[2] * bm; - const bool doClip = (chmax[0] >= clmax[0] || chmax[1] >= clmax[1] || chmax[2] >= clmax[2]) && !hrp.hrenabled; + const bool doClip = (chmax[0] >= clmax[0] || chmax[1] >= clmax[1] || chmax[2] >= clmax[2]) && !hrp.hrenabled && hrp.clampOOG; float area = skip * skip; rm /= area; gm /= area; bm /= area; bool doHr = (hrp.hrenabled && hrp.method != "Color"); + const float expcomp = std::pow(2, ri->getBaselineExposure()); + rm *= expcomp; + gm *= expcomp; + bm *= expcomp; + #ifdef _OPENMP #pragma omp parallel if(!d1x) // omp disabled for D1x to avoid race conditions (see Issue 1088 http://code.google.com/p/rawtherapee/issues/detail?id=1088) { @@ -745,14 +742,11 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima for (int ix = 0; ix < imheight; ix++) { int i = sy1 + skip * ix; - - if (i >= maxy - skip) { - i = maxy - skip - 1; // avoid trouble - } + i = std::min(i, maxy - skip); // avoid trouble if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) { for (int j = 0, jx = sx1; j < imwidth; j++, jx += skip) { - jx = std::min(jx, maxx - skip - 1); // avoid trouble + jx = std::min(jx, maxx - skip); // avoid trouble float rtot = 0.f, gtot = 0.f, btot = 0.f; @@ -911,18 +905,22 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima DCPProfile *RawImageSource::getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as) { + if (cmp.inputProfile == "(camera)" || cmp.inputProfile == "(none)") { + return nullptr; + } + DCPProfile *dcpProf = nullptr; cmsHPROFILE dummy; - findInputProfile(cmp.input, nullptr, (static_cast(getMetaData()))->getCamera(), &dcpProf, dummy); + findInputProfile(cmp.inputProfile, nullptr, (static_cast(getMetaData()))->getCamera(), &dcpProf, dummy); if (dcpProf == nullptr) { if (settings->verbose) { - printf("Can't load DCP profile '%s'!\n", cmp.input.c_str()); + printf("Can't load DCP profile '%s'!\n", cmp.inputProfile.c_str()); } return nullptr; } - dcpProf->setStep2ApplyState(cmp.working, cmp.toneCurve, cmp.applyLookTable, cmp.applyBaselineExposureOffset, as); + dcpProf->setStep2ApplyState(cmp.workingProfile, cmp.toneCurve, cmp.applyLookTable, cmp.applyBaselineExposureOffset, as); return dcpProf; } @@ -1341,12 +1339,12 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads ) * (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 @@ -1517,7 +1515,7 @@ void RawImageSource::vflip (Imagefloat* image) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -int RawImageSource::load (const Glib::ustring &fname) +int RawImageSource::load (const Glib::ustring &fname, bool firstFrameOnly) { MyTime t1, t2; @@ -1534,7 +1532,7 @@ int RawImageSource::load (const Glib::ustring &fname) if (errCode) { return errCode; } - numFrames = ri->getFrameCount(); + numFrames = firstFrameOnly ? 1 : ri->getFrameCount(); errCode = 0; @@ -1593,7 +1591,7 @@ int RawImageSource::load (const Glib::ustring &fname) for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { - imatrices.rgb_cam[i][j] = ri->get_rgb_cam(i, j); + imatrices.rgb_cam[i][j] = ri->get_colors() == 1 ? (i == j) : ri->get_rgb_cam(i, j); } // compute inverse of the color transformation matrix @@ -1624,10 +1622,6 @@ int RawImageSource::load (const Glib::ustring &fname) camProfile = ICCStore::getInstance()->createFromMatrix (imatrices.xyz_cam, false, "Camera"); inverse33 (imatrices.xyz_cam, imatrices.cam_xyz); - for (int c = 0; c < 4; c++) { - c_white[c] = ri->get_white(c); - } - // First we get the "as shot" ("Camera") white balance and store it float pre_mul[4]; // FIXME: get_colorsCoeff not so much used nowadays, when we have calculate_scale_mul() function here @@ -1698,7 +1692,7 @@ int RawImageSource::load (const Glib::ustring &fname) } - // Load complete Exif informations + // 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); @@ -1801,6 +1795,19 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le copyOriginalPixels(raw, riFrames[i], rid, rif, *rawDataFrames[i]); } } + } else if (numFrames == 2 && currFrame == 2) { // average the frames + if(!rawDataBuffer[0]) { + rawDataBuffer[0] = new array2D; + } + rawDataFrames[1] = rawDataBuffer[0]; + copyOriginalPixels(raw, riFrames[1], rid, rif, *rawDataFrames[1]); + copyOriginalPixels(raw, ri, rid, rif, rawData); + + for (int i = 0; i < H; ++i) { + for (int j = 0; j < W; ++j) { + rawData[i][j] = (rawData[i][j] + (*rawDataFrames[1])[i][j]) * 0.5f; + } + } } else { copyOriginalPixels(raw, ri, rid, rif, rawData); } @@ -1852,7 +1859,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } // Correct vignetting of lens profile - if (!hasFlatField && lensProf.useVign) { + if (!hasFlatField && lensProf.useVign && lensProf.lcMode != LensProfParams::LcMode::NONE) { std::unique_ptr pmap; if (lensProf.useLensfun()) { pmap = LFDatabase::findModifier(lensProf, idata, W, H, coarse, -1); @@ -1919,8 +1926,45 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } } - // 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::getMethodString( RAWParams::BayerSensor::Method::VNG4))) ) { + if (ri->getSensorType() == ST_BAYER && raw.bayersensor.pdafLinesFilter) { + PDAFLinesFilter f(ri); + + if (!bitmapBads) { + bitmapBads = new PixelsMap(W, H); + } + + int n = f.mark(rawData, *bitmapBads); + totBP += n; + + if (n > 0) { + if (settings->verbose) { + printf("Marked %d hot pixels from PDAF lines\n", n); + } + + auto &thresh = f.greenEqThreshold(); + if (numFrames == 4) { + for (int i = 0; i < 4; ++i) { + green_equilibrate(thresh, *rawDataFrames[i]); + } + } else { + green_equilibrate(thresh, rawData); + } + } + } + + // check if green equilibration is needed. If yes, compute G channel pre-compensation factors + const auto globalGreenEq = + [&]() -> bool + { + CameraConstantsStore *ccs = CameraConstantsStore::getInstance(); + CameraConst *cc = ccs->get(ri->get_maker().c_str(), ri->get_model().c_str()); + return cc && cc->get_globalGreenEquilibration(); + }; + + if ( ri->getSensorType() == ST_BAYER && (raw.bayersensor.greenthresh || (globalGreenEq() && raw.bayersensor.method != RAWParams::BayerSensor::getMethodString( RAWParams::BayerSensor::Method::VNG4))) ) { + if (settings->verbose) { + printf("Performing global green equilibration...\n"); + } // global correction if(numFrames == 4) { for(int i = 0; i < 4; ++i) { @@ -1937,12 +1981,14 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le plistener->setProgress (0.0); } + GreenEqulibrateThreshold thresh(0.01 * raw.bayersensor.greenthresh); + if(numFrames == 4) { for(int i = 0; i < 4; ++i) { - green_equilibrate(0.01 * raw.bayersensor.greenthresh, *rawDataFrames[i]); + green_equilibrate(thresh, *rawDataFrames[i]); } } else { - green_equilibrate(0.01 * raw.bayersensor.greenthresh, rawData); + green_equilibrate(thresh, rawData); } } @@ -1969,7 +2015,15 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le plistener->setProgress (0.0); } - cfa_linedn(0.00002 * (raw.bayersensor.linenoise)); + std::unique_ptr line_denoise_rowblender; + if (raw.bayersensor.linenoiseDirection == RAWParams::BayerSensor::LineNoiseDirection::PDAF_LINES) { + PDAFLinesFilter f(ri); + line_denoise_rowblender = f.lineDenoiseRowBlender(); + } else { + line_denoise_rowblender.reset(new CFALineDenoiseRowBlender()); + } + + cfa_linedn(0.00002 * (raw.bayersensor.linenoise), int(raw.bayersensor.linenoiseDirection) & int(RAWParams::BayerSensor::LineNoiseDirection::VERTICAL), int(raw.bayersensor.linenoiseDirection) & int(RAWParams::BayerSensor::LineNoiseDirection::HORIZONTAL), *line_denoise_rowblender); } if ( (raw.ca_autocorrect || fabs(raw.cared) > 0.001 || fabs(raw.cablue) > 0.001) && ri->getSensorType() == ST_BAYER ) { // Auto CA correction disabled for X-Trans, for now... @@ -1978,21 +2032,14 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le plistener->setProgress (0.0); } if(numFrames == 4) { - for(int i=0; i<4; ++i) { - CA_correct_RT(raw.ca_autocorrect, raw.cared, raw.cablue, 8.0, *rawDataFrames[i]); + double fitParams[64]; + float *buffer = CA_correct_RT(raw.ca_autocorrect, raw.caautoiterations, raw.cared, raw.cablue, raw.ca_avoidcolourshift, *rawDataFrames[0], fitParams, false, true, nullptr, false, options.chunkSizeCA, options.measure); + for(int i = 1; i < 3; ++i) { + CA_correct_RT(raw.ca_autocorrect, raw.caautoiterations, raw.cared, raw.cablue, raw.ca_avoidcolourshift, *rawDataFrames[i], fitParams, true, false, buffer, false, options.chunkSizeCA, options.measure); } + CA_correct_RT(raw.ca_autocorrect, raw.caautoiterations, raw.cared, raw.cablue, raw.ca_avoidcolourshift, *rawDataFrames[3], fitParams, true, false, buffer, true, options.chunkSizeCA, options.measure); } else { - CA_correct_RT(raw.ca_autocorrect, raw.cared, raw.cablue, 8.0, rawData); - } - } - - if ( raw.expos != 1 ) { - if(numFrames == 4) { - for(int i = 0; i < 4; ++i) { - processRawWhitepoint(raw.expos, raw.preser, *rawDataFrames[i]); - } - } else { - processRawWhitepoint(raw.expos, raw.preser, rawData); + CA_correct_RT(raw.ca_autocorrect, raw.caautoiterations, raw.cared, raw.cablue, raw.ca_avoidcolourshift, rawData, nullptr, false, false, nullptr, true, options.chunkSizeCA, options.measure); } } @@ -2020,7 +2067,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void RawImageSource::demosaic(const RAWParams &raw) +void RawImageSource::demosaic(const RAWParams &raw, bool autoContrast, double &contrastThreshold) { MyTime t1, t2; t1.set(); @@ -2029,13 +2076,22 @@ void RawImageSource::demosaic(const RAWParams &raw) if ( raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::HPHD) ) { hphd_demosaic (); } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4) ) { - vng4_demosaic (); + vng4_demosaic (rawData, red, green, blue); } 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); + amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue, options.chunkSizeAMAZE, options.measure); + } else if (raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::AMAZEVNG4) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::DCBVNG4) + || raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCDVNG4)) { + if (!autoContrast) { + double threshold = raw.bayersensor.dualDemosaicContrast; + dual_demosaic_RT (true, raw, W, H, rawData, red, green, blue, threshold, false); + } else { + dual_demosaic_RT (true, raw, W, H, rawData, red, green, blue, contrastThreshold, true); + } } 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); + pixelshift(0, 0, W, H, raw, 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::getMethodString(RAWParams::BayerSensor::Method::EAHD)) { @@ -2049,20 +2105,24 @@ void RawImageSource::demosaic(const RAWParams &raw) } 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 (); + rcd_demosaic(options.chunkSizeRCD, options.measure); } else { nodemosaic(false); } - - //if (raw.all_enhance) refinement_lassus(); - } else if (ri->getSensorType() == ST_FUJI_XTRANS) { if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST) ) { - fast_xtrans_interpolate(); + fast_xtrans_interpolate(rawData, red, green, blue); } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::ONE_PASS)) { - xtrans_interpolate(1, false); + xtrans_interpolate(1, false, options.chunkSizeXT, options.measure); } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::THREE_PASS) ) { - xtrans_interpolate(3, true); + xtrans_interpolate(3, true, options.chunkSizeXT, options.measure); + } else if (raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FOUR_PASS) || raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::TWO_PASS)) { + if (!autoContrast) { + double threshold = raw.xtranssensor.dualDemosaicContrast; + dual_demosaic_RT (false, raw, W, H, rawData, red, green, blue, threshold, false); + } else { + dual_demosaic_RT (false, raw, W, H, rawData, red, green, blue, contrastThreshold, true); + } } else if(raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::MONO) ) { nodemosaic(true); } else { @@ -2121,7 +2181,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con 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); + // 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; double add; @@ -2283,7 +2343,7 @@ void RawImageSource::retinexPrepareBuffers(const ColorManagementParams& cmp, con } } else { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (cmp.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (cmp.workingProfile); 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])}, @@ -2560,7 +2620,7 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara } } else { - TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.working); + TMatrix wiprof = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.workingProfile); double wip[3][3] = { {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, @@ -2755,11 +2815,6 @@ void RawImageSource::retinex(const ColorManagementParams& cmp, const RetinexPara void RawImageSource::flushRawData() { - if(cache) { - delete [] cache; - cache = nullptr; - } - if (rawData) { rawData(0, 0); } @@ -2780,7 +2835,7 @@ void RawImageSource::flushRGB() } } -void RawImageSource::HLRecovery_Global(ToneCurveParams hrp) +void RawImageSource::HLRecovery_Global(const ToneCurveParams &hrp) { if (hrp.hrenabled && hrp.method == "Color") { if(!rgbSourceModified) { @@ -2815,7 +2870,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile cfaboxblur(riFlatFile, cfablur, BS, BS); } - if(ri->getSensorType() == ST_BAYER) { + if(ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { float refcolor[2][2]; //find centre average values by channel @@ -2823,21 +2878,19 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile for (int n = 0; n < 2; n++) { int row = 2 * (H >> 2) + m; int col = 2 * (W >> 2) + n; - int c = FC(row, col); - int c4 = ( c == 1 && !(row & 1) ) ? 3 : c; + int c = ri->get_colors() != 1 ? FC(row, col) : 0; + int c4 = ri->get_colors() != 1 ? (( c == 1 && !(row & 1) ) ? 3 : c) : 0; refcolor[m][n] = max(0.0f, cfablur[row * W + col] - black[c4]); } float limitFactor = 1.f; if(raw.ff_AutoClipControl) { -// int clipControlGui = 0; - for (int m = 0; m < 2; m++) for (int n = 0; n < 2; n++) { float maxval = 0.f; - int c = FC(m, n); - int c4 = ( c == 1 && !(m & 1) ) ? 3 : c; + int c = ri->get_colors() != 1 ? FC(m, n) : 0; + int c4 = ri->get_colors() != 1 ? (( c == 1 && !(m & 1) ) ? 3 : c) : 0; #ifdef _OPENMP #pragma omp parallel #endif @@ -2876,7 +2929,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile } } -// clipControlGui = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui + flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui } else { limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); } @@ -2886,13 +2939,21 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile refcolor[m][n] *= limitFactor; } + unsigned int c[2][2] {}; + unsigned int c4[2][2] {}; + if(ri->get_colors() != 1) { + for (int i = 0; i < 2; ++i) { + for(int j = 0; j < 2; ++j) { + c[i][j] = FC(i, j); + } + } + c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; + c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; + c4[1][0] = c[1][0]; + c4[1][1] = c[1][1]; + } - unsigned int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; - unsigned int c4[2][2]; - c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; - c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; - c4[1][0] = c[1][0]; - c4[1][1] = c[1][1]; + constexpr float minValue = 1.f; // if the pixel value in the flat field is less or equal this value, no correction will be applied. #ifdef __SSE2__ vfloat refcolorv[2] = {_mm_set_ps(refcolor[0][1], refcolor[0][0], refcolor[0][1], refcolor[0][0]), @@ -2902,7 +2963,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile _mm_set_ps(black[c4[1][1]], black[c4[1][0]], black[c4[1][1]], black[c4[1][0]]) }; - vfloat epsv = F2V(1e-5f); + vfloat onev = F2V(1.f); + vfloat minValuev = F2V(minValue); #endif #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -2915,7 +2977,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile vfloat rowRefcolorv = refcolorv[row & 1]; for (; col < W - 3; col += 4) { - vfloat vignettecorrv = rowRefcolorv / vmaxf(epsv, LVFU(cfablur[(row) * W + col]) - rowBlackv); + vfloat blurv = LVFU(cfablur[(row) * W + col]) - rowBlackv; + vfloat vignettecorrv = rowRefcolorv / blurv; + vignettecorrv = vself(vmaskf_le(blurv, minValuev), onev, vignettecorrv); vfloat valv = LVFU(rawData[row][col]); valv -= rowBlackv; STVFU(rawData[row][col], valv * vignettecorrv + rowBlackv); @@ -2924,7 +2988,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile #endif for (; col < W; col ++) { - float vignettecorr = refcolor[row & 1][col & 1] / max(1e-5f, cfablur[(row) * W + col] - black[c4[row & 1][col & 1]]); + float blur = cfablur[(row) * W + col] - black[c4[row & 1][col & 1]]; + float vignettecorr = blur <= minValue ? 1.f : refcolor[row & 1][col & 1] / blur; rawData[row][col] = (rawData[row][col] - black[c4[row & 1][col & 1]]) * vignettecorr + black[c4[row & 1][col & 1]]; } } @@ -2950,7 +3015,6 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile if(raw.ff_AutoClipControl) { // determine maximum calculated value to avoid clipping -// int clipControlGui = 0; float maxval = 0.f; // xtrans files have only one black level actually, so we can simplify the code a bit #ifdef _OPENMP @@ -2985,7 +3049,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile // there's only one white level for xtrans if(maxval + black[0] > ri->get_white(0)) { limitFactor = ri->get_white(0) / (maxval + black[0]); -// clipControlGui = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui + flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui } } else { limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); @@ -2996,6 +3060,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile refcolor[c] *= limitFactor; } + constexpr float minValue = 1.f; // if the pixel value in the flat field is less or equal this value, no correction will be applied. + #ifdef _OPENMP #pragma omp parallel for #endif @@ -3003,7 +3069,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile for (int row = 0; row < H; row++) { for (int col = 0; col < W; col++) { int c = ri->XTRANSFC(row, col); - float vignettecorr = ( refcolor[c] / max(1e-5f, cfablur[(row) * W + col] - black[c]) ); + float blur = cfablur[(row) * W + col] - black[c]; + float vignettecorr = blur <= minValue ? 1.f : refcolor[c] / blur; rawData[row][col] = (rawData[row][col] - black[c]) * vignettecorr + black[c]; } } @@ -3016,13 +3083,20 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile cfaboxblur(riFlatFile, cfablur1, 0, 2 * BS); //now do horizontal blur cfaboxblur(riFlatFile, cfablur2, 2 * BS, 0); //now do vertical blur - if(ri->getSensorType() == ST_BAYER) { - unsigned int c[2][2] = {{FC(0, 0), FC(0, 1)}, {FC(1, 0), FC(1, 1)}}; - unsigned int c4[2][2]; - c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; - c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; - c4[1][0] = c[1][0]; - c4[1][1] = c[1][1]; + if(ri->getSensorType() == ST_BAYER || ri->get_colors() == 1) { + unsigned int c[2][2] {}; + unsigned int c4[2][2] {}; + if(ri->get_colors() != 1) { + for (int i = 0; i < 2; ++i) { + for(int j = 0; j < 2; ++j) { + c[i][j] = FC(i, j); + } + } + c4[0][0] = ( c[0][0] == 1) ? 3 : c[0][0]; + c4[0][1] = ( c[0][1] == 1) ? 3 : c[0][1]; + c4[1][0] = c[1][0]; + c4[1][1] = c[1][1]; + } #ifdef __SSE2__ vfloat blackv[2] = {_mm_set_ps(black[c4[0][1]], black[c4[0][0]], black[c4[0][1]], black[c4[0][0]]), @@ -3041,8 +3115,8 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile vfloat rowBlackv = blackv[row & 1]; for (; col < W - 3; col += 4) { - vfloat linecorrv = SQRV(vmaxf(epsv, LVFU(cfablur[row * W + col]) - rowBlackv)) / - (vmaxf(epsv, LVFU(cfablur1[row * W + col]) - rowBlackv) * vmaxf(epsv, LVFU(cfablur2[row * W + col]) - rowBlackv)); + vfloat linecorrv = SQRV(vmaxf(LVFU(cfablur[row * W + col]) - rowBlackv, epsv)) / + (vmaxf(LVFU(cfablur1[row * W + col]) - rowBlackv, epsv) * vmaxf(LVFU(cfablur2[row * W + col]) - rowBlackv, epsv)); vfloat valv = LVFU(rawData[row][col]); valv -= rowBlackv; STVFU(rawData[row][col], valv * linecorrv + rowBlackv); @@ -3140,6 +3214,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } } + if (riFlatFile && W == riFlatFile->get_width() && H == riFlatFile->get_height()) { + processFlatField(raw, riFlatFile, black); + } // flatfield } else { // No bayer pattern // TODO: Is there a flat field correction possible? @@ -3169,10 +3246,10 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw } } -SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, const int boxH, const int boxW) +void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur, int boxH, int boxW) { - if(boxW == 0 && boxH == 0) { // nothing to blur + if (boxW < 0 || boxH < 0 || (boxW == 0 && boxH == 0)) { // nothing to blur or negative values memcpy(cfablur, riFlatFile->data[0], W * H * sizeof(float)); return; } @@ -3335,7 +3412,9 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur } +#ifdef _OPENMP #pragma omp single +#endif for (int col = W - (W % 8); col < W; col++) { int len = boxH / 2 + 1; @@ -3445,6 +3524,10 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R cblacksom[i] = max( c_black[i] + black_lev[i], 0.0f ); // adjust black level } + for (int i = 0; i < 4; ++i) { + c_white[i] = (ri->get_white(i) - cblacksom[i]) / raw.expos + cblacksom[i]; + } + initialGain = calculate_scale_mul(scale_mul, ref_pre_mul, c_white, cblacksom, isMono, ri->get_colors()); // recalculate scale colors with adjusted levels //fprintf(stderr, "recalc: %f [%f %f %f %f]\n", initialGain, scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]); @@ -3877,9 +3960,9 @@ lab2ProphotoRgbD50(float L, float A, float B, float& r, float& g, float& b) r = prophoto_xyz[0][0] * X + prophoto_xyz[0][1] * Y + prophoto_xyz[0][2] * Z; g = prophoto_xyz[1][0] * X + prophoto_xyz[1][1] * Y + prophoto_xyz[1][2] * Z; b = prophoto_xyz[2][0] * X + prophoto_xyz[2][1] * Y + prophoto_xyz[2][2] * Z; - r = CLIP01(r); - g = CLIP01(g); - b = CLIP01(b); + // r = CLIP01(r); + // g = CLIP01(g); + // b = CLIP01(b); } // Converts raw image including ICC input profile to working space - floating point version @@ -3891,7 +3974,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen cmsHPROFILE in; DCPProfile *dcpProf; - if (!findInputProfile(cmp.input, embedded, camName, &dcpProf, in)) { + if (!findInputProfile(cmp.inputProfile, embedded, camName, &dcpProf, in)) { return; } @@ -3908,7 +3991,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen {camMatrix[2][0], camMatrix[2][1], camMatrix[2][2]} } }; - dcpProf->apply(im, cmp.dcpIlluminant, cmp.working, wb, pre_mul_row, cam_matrix, cmp.applyHueSatMap); + dcpProf->apply(im, cmp.dcpIlluminant, cmp.workingProfile, wb, pre_mul_row, cam_matrix, cmp.applyHueSatMap); return; } @@ -3917,7 +4000,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen // in this case we avoid using the slllllooooooowwww lcms // Calculate matrix for direct conversion raw>working space - TMatrix work = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.working); + TMatrix work = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.workingProfile); double mat[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; for (int i = 0; i < 3; i++) @@ -3943,7 +4026,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen } } else { - const bool working_space_is_prophoto = (cmp.working == "ProPhoto"); + bool working_space_is_prophoto = (cmp.workingProfile == "ProPhoto"); // use supplied input profile @@ -4012,6 +4095,33 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen cmsHPROFILE prophoto = ICCStore::getInstance()->workingSpace("ProPhoto"); // We always use Prophoto to apply the ICC profile to minimize problems with clipping in LUT conversion. bool transform_via_pcs_lab = false; bool separate_pcs_lab_highlights = false; + + // check if the working space is fully contained in prophoto + if (!working_space_is_prophoto && camera_icc_type == CAMERA_ICC_TYPE_GENERIC) { + TMatrix toxyz = ICCStore::getInstance()->workingSpaceMatrix(cmp.workingProfile); + TMatrix torgb = ICCStore::getInstance()->workingSpaceInverseMatrix("ProPhoto"); + float rgb[3] = {0.f, 0.f, 0.f}; + for (int i = 0; i < 2 && !working_space_is_prophoto; ++i) { + rgb[i] = 1.f; + float x, y, z; + + Color::rgbxyz(rgb[0], rgb[1], rgb[2], x, y, z, toxyz); + Color::xyz2rgb(x, y, z, rgb[0], rgb[1], rgb[2], torgb); + + for (int j = 0; j < 2; ++j) { + if (rgb[j] < 0.f || rgb[j] > 1.f) { + working_space_is_prophoto = true; + prophoto = ICCStore::getInstance()->workingSpace(cmp.workingProfile); + if (settings->verbose) { + std::cout << "colorSpaceConversion_: converting directly to " << cmp.workingProfile << " instead of passing through ProPhoto" << std::endl; + } + break; + } + rgb[j] = 0.f; + } + } + } + lcmsMutex->lock (); switch (camera_icc_type) { @@ -4056,7 +4166,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen if (!working_space_is_prophoto) { toxyz = ICCStore::getInstance()->workingSpaceMatrix ("ProPhoto"); - torgb = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.working); //sRGB .. Adobe...Wide... + torgb = ICCStore::getInstance()->workingSpaceInverseMatrix (cmp.workingProfile); //sRGB .. Adobe...Wide... } #ifdef _OPENMP @@ -4159,7 +4269,7 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, const ColorManagemen for ( int w = 0; w < im->getWidth(); ++w ) { - float r, g, b, hr, hg, hb; + float r, g, b, hr = 0.f, hg = 0.f, hb = 0.f; if (transform_via_pcs_lab) { float L = *(p++); @@ -4297,17 +4407,11 @@ bool RawImageSource::findInputProfile(Glib::ustring inProfile, cmsHPROFILE embed // very effective to reduce (or remove) the magenta, but with levels of grey ! void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int width, float maxval, float* hlmax) { - const int ColorCount = 3; + constexpr int ColorCount = 3; // Transform matrixes rgb>lab and back - static const float trans[2][ColorCount][ColorCount] = { - { { 1, 1, 1 }, { 1.7320508, -1.7320508, 0 }, { -1, -1, 2 } }, - { { 1, 1, 1 }, { 1, -1, 1 }, { 1, 1, -1 } } - }; - static const float itrans[2][ColorCount][ColorCount] = { - { { 1, 0.8660254, -0.5 }, { 1, -0.8660254, -0.5 }, { 1, 0, 1 } }, - { { 1, 1, 1 }, { 1, -1, 1 }, { 1, 1, -1 } } - }; + constexpr float trans[ColorCount][ColorCount] = { { 1, 1, 1 }, { 1.7320508, -1.7320508, 0 }, { -1, -1, 2 } }; + constexpr float itrans[ColorCount][ColorCount] = { { 1, 0.8660254, -0.5 }, { 1, -0.8660254, -0.5 }, { 1, 0, 1 } }; #define FOREACHCOLOR for (int c=0; c < ColorCount; c++) @@ -4364,7 +4468,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi for (int j = 0; j < ColorCount; j++) { - lab[i][c] += trans[ColorCount - 3][c][j] * cam[i][j]; + lab[i][c] += trans[c][j] * cam[i][j]; } } @@ -4388,7 +4492,7 @@ void RawImageSource::HLRecovery_blend(float* rin, float* gin, float* bin, int wi for (int j = 0; j < ColorCount; j++) { - cam[0][c] += itrans[ColorCount - 3][c][j] * lab[0][j]; + cam[0][c] += itrans[c][j] * lab[0][j]; } } FOREACHCOLOR rgb[c] = cam[0][c] / ColorCount; @@ -4490,7 +4594,7 @@ void RawImageSource::HLRecovery_CIELab (float* rin, float* gin, float* bin, floa float bo = min(b, maxval); float yy = xyz_cam[1][0] * r + xyz_cam[1][1] * g + xyz_cam[1][2] * b; float fy = (yy < 65535.0 ? Color::cachef[yy] / 327.68 : std::cbrt(yy / MAXVALD)); - // compute LCH decompostion of the clipped pixel (only color information, thus C and H will be used) + // compute LCH decomposition of the clipped pixel (only color information, thus C and H will be used) float x = xyz_cam[0][0] * ro + xyz_cam[0][1] * go + xyz_cam[0][2] * bo; float y = xyz_cam[1][0] * ro + xyz_cam[1][1] * go + xyz_cam[1][2] * bo; float z = xyz_cam[2][0] * ro + xyz_cam[2][1] * go + xyz_cam[2][2] * bo; @@ -4627,10 +4731,14 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU histRedRaw.clear(); histGreenRaw.clear(); histBlueRaw.clear(); - const float mult[4] = { 65535.0f / ri->get_white(0), - 65535.0f / ri->get_white(1), - 65535.0f / ri->get_white(2), - 65535.0f / ri->get_white(3) + + const float maxWhite = rtengine::max(c_white[0], c_white[1], c_white[2], c_white[3]); + const float scale = maxWhite <= 1.f ? 65535.f : 1.f; // special case for float raw images in [0.0;1.0] range + const float multScale = maxWhite <= 1.f ? 1.f / 255.f : 255.f; + const float mult[4] = { multScale / (c_white[0] - cblacksom[0]), + multScale / (c_white[1] - cblacksom[1]), + multScale / (c_white[2] - cblacksom[2]), + multScale / (c_white[3] - cblacksom[3]) }; const bool fourColours = ri->getSensorType() == ST_BAYER && ((mult[1] != mult[3] || cblacksom[1] != cblacksom[3]) || FC(0, 0) == 3 || FC(0, 1) == 3 || FC(1, 0) == 3 || FC(1, 1) == 3); @@ -4694,26 +4802,26 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU c2 = ( fourColours && c2 == 1 && !(i & 1) ) ? 3 : c2; for (j = start; j < end - 1; j += 2) { - tmphist[c1][(int)ri->data[i][j]]++; - tmphist[c2][(int)ri->data[i][j + 1]]++; + tmphist[c1][(int)(ri->data[i][j] * scale)]++; + tmphist[c2][(int)(ri->data[i][j + 1] * scale)]++; } if(j < end) { // last pixel of row if width is odd - tmphist[c1][(int)ri->data[i][j]]++; + tmphist[c1][(int)(ri->data[i][j] * scale)]++; } } else if (ri->get_colors() == 1) { for (int j = start; j < end; j++) { - tmphist[0][(int)ri->data[i][j]]++; + tmphist[0][(int)(ri->data[i][j] * scale)]++; } } else if(ri->getSensorType() == ST_FUJI_XTRANS) { for (int j = start; j < end - 1; j += 2) { int c = ri->XTRANSFC(i, j); - tmphist[c][(int)ri->data[i][j]]++; + tmphist[c][(int)(ri->data[i][j] * scale)]++; } } else { for (int j = start; j < end; j++) { for (int c = 0; c < 3; c++) { - tmphist[c][(int)ri->data[i][3 * j + c]]++; + tmphist[c][(int)(ri->data[i][3 * j + c] * scale)]++; } } } @@ -4736,23 +4844,28 @@ void RawImageSource::getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LU } // 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(std::min(mult[0] * (i - (cblacksom[0]/*+black_lev[0]*/)), gammaLimit))); - histRedRaw[idx >> 8] += hist[0][i]; + const auto getidx = + [&](int c, int i) -> int + { + float f = mult[c] * std::max(0.f, i - cblacksom[c]); + return f > 0.f ? (f < 1.f ? 1 : std::min(int(f), 255)) : 0; + }; + + for(int i = 0; i < histoSize; i++) { + int idx = getidx(0, i); + histRedRaw[idx] += hist[0][i]; if (ri->get_colors() > 1) { - idx = CLIP((int)Color::gamma(std::min(mult[1] * (i - (cblacksom[1]/*+black_lev[1]*/)), gammaLimit))); - histGreenRaw[idx >> 8] += hist[1][i]; + idx = getidx(1, i); + histGreenRaw[idx] += hist[1][i]; if (fourColours) { - idx = CLIP((int)Color::gamma(std::min(mult[3] * (i - (cblacksom[3]/*+black_lev[3]*/)), gammaLimit))); - histGreenRaw[idx >> 8] += hist[3][i]; + idx = getidx(3, i); + histGreenRaw[idx] += hist[3][i]; } - idx = CLIP((int)Color::gamma(std::min(mult[2] * (i - (cblacksom[2]/*+black_lev[2]*/)), gammaLimit))); - histBlueRaw[idx >> 8] += hist[2][i]; + idx = getidx(2, i); + histBlueRaw[idx] += hist[2][i]; } } @@ -5048,7 +5161,7 @@ ColorTemp RawImageSource::getSpotWB (std::vector &red, std::vector &red, std::vector &red, std::vector &red, std::vectorget_rotateDegree(); @@ -5366,6 +5483,8 @@ void RawImageSource::getRawValues(int x, int y, int rotate, int &R, int &G, int ynew = H - 1 - ynew; } + xnew = LIM(xnew, 0, W - 1); + ynew = LIM(ynew, 0, H - 1); int c = ri->getSensorType() == ST_FUJI_XTRANS ? ri->XTRANSFC(ynew,xnew) : ri->FC(ynew,xnew); int val = round(rawData[ynew][xnew] / scale_mul[c]); if(c == 0) { diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 59316eccf..530211715 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -19,13 +19,16 @@ #ifndef _RAWIMAGESOURCE_ #define _RAWIMAGESOURCE_ -#include "imagesource.h" -#include "dcp.h" -#include "array2D.h" -#include "curves.h" -#include "color.h" -#include "iimage.h" #include +#include + +#include "array2D.h" +#include "color.h" +#include "curves.h" +#include "dcp.h" +#include "iimage.h" +#include "imagesource.h" + #define HR_SCALE 2 namespace rtengine @@ -39,7 +42,7 @@ private: static DiagonalCurve *phaseOneIccCurveInv; static LUTf invGrad; // for fast_demosaic static LUTf initInvGrad (); - 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); + static void colorSpaceConversion_ (Imagefloat* im, const procparams::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: @@ -74,12 +77,7 @@ protected: RawImage* riFrames[4] = {nullptr}; unsigned int currFrame = 0; unsigned int numFrames = 0; - - // to accelerate CIELAB conversion: - double lc00, lc01, lc02, lc10, lc11, lc12, lc20, lc21, lc22; - double* cache; - int threshold; - + int flatFieldAutoClipValue = 0; array2D rawData; // holds preprocessed pixel values, rowData[i][j] corresponds to the ith row and jth column array2D *rawDataFrames[4] = {nullptr}; array2D *rawDataBuffer[3] = {nullptr}; @@ -96,10 +94,8 @@ protected: float psBlueBrightness[4]; std::vector histMatchingCache; + const std::unique_ptr histMatchingParams; - void hphd_vertical (float** hpmap, int col_from, int col_to); - void hphd_horizontal (float** hpmap, int row_from, int row_to); - void hphd_green (float** hpmap); void processFalseColorCorrectionThread (Imagefloat* im, array2D &rbconv_Y, array2D &rbconv_I, array2D &rbconv_Q, array2D &rbout_I, array2D &rbout_Q, const int row_from, const int row_to); void hlRecovery (const std::string &method, float* red, float* green, float* blue, int width, float* hlmax); void transformRect (const PreviewProps &pp, int tran, int &sx1, int &sy1, int &width, int &height, int &fw); @@ -115,21 +111,22 @@ protected: public: RawImageSource (); - ~RawImageSource (); + ~RawImageSource () override; - 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 (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 (const ColorManagementParams& cmp, const RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI); - void flushRawData (); - void flushRGB (); - void HLRecovery_Global (ToneCurveParams hrp); + int load(const Glib::ustring &fname) override { return load(fname, false); } + int load(const Glib::ustring &fname, bool firstFrameOnly); + void preprocess (const procparams::RAWParams &raw, const procparams::LensProfParams &lensProf, const procparams::CoarseTransformParams& coarse, bool prepareDenoise = true) override; + void demosaic (const procparams::RAWParams &raw, bool autoContrast, double &contrastThreshold) override; + void retinex (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &deh, const procparams::ToneCurveParams& Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) override; + void retinexPrepareCurves (const procparams::RetinexParams &retinexParams, LUTf &cdcurve, LUTf &mapcurve, RetinextransmissionCurve &retinextransmissionCurve, RetinexgaintransmissionCurve &retinexgaintransmissionCurve, bool &retinexcontlutili, bool &mapcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) override; + void retinexPrepareBuffers (const procparams::ColorManagementParams& cmp, const procparams::RetinexParams &retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) override; + void flushRawData () override; + void flushRGB () override; + void HLRecovery_Global (const procparams::ToneCurveParams &hrp) override; void refinement_lassus (int PassCount); void refinement(int PassCount); - - bool isRGBSourceModified() const + void setBorder(unsigned int rawBorder) override {border = rawBorder;} + bool isRGBSourceModified() const override { return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified } @@ -139,57 +136,57 @@ public: 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 RAWParams &raw); - eSensorType getSensorType () const + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const procparams::ToneCurveParams &hrp, const procparams::RAWParams &raw) override; + eSensorType getSensorType () const override { return ri != nullptr ? ri->getSensorType() : ST_NONE; } - ColorTemp getWB () const + bool isMono () const override + { + return ri->get_colors() == 1; + } + ColorTemp getWB () const override { return camera_wb; } - void getAutoWBMultipliers (double &rm, double &gm, double &bm); - ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal); - bool isWBProviderReady () + void getAutoWBMultipliers (double &rm, double &gm, double &bm) override; + ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) override; + bool isWBProviderReady () override { return rawData; } - double getDefGain () const + double getDefGain () const override { return defGain; } - void getFullSize (int& w, int& h, int tr = TR_NONE); - void getSize (const PreviewProps &pp, int& w, int& h); - int getRotateDegree() const + void getFullSize (int& w, int& h, int tr = TR_NONE) override; + void getSize (const PreviewProps &pp, int& w, int& h) override; + int getRotateDegree() const override { return ri->get_rotateDegree(); } - FrameData* getImageData (unsigned int frameNum) - { - return idata->getFrameData (frameNum); - } - ImageMatrices* getImageMatrices () + ImageMatrices* getImageMatrices () override { return &imatrices; } - bool isRAW() const + bool isRAW() const override { return true; } - void setProgressListener (ProgressListener* pl) + void setProgressListener (ProgressListener* pl) override { plistener = pl; } - void getAutoExpHistogram (LUTu & histogram, int& histcompr); - void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw); - void getAutoMatchedToneCurve(std::vector &outCurve); - DCPProfile *getDCP(const ColorManagementParams &cmp, DCPProfile::ApplyState &as); + void getAutoExpHistogram (LUTu & histogram, int& histcompr) override; + void getRAWHistogram (LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw) override; + void getAutoMatchedToneCurve(const procparams::ColorManagementParams &cp, std::vector &outCurve) override; + DCPProfile *getDCP(const procparams::ColorManagementParams &cmp, DCPProfile::ApplyState &as) override; - void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb); + void convertColorSpace(Imagefloat* image, const procparams::ColorManagementParams &cmp, const ColorTemp &wb) override; static bool findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in); 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) { @@ -200,18 +197,39 @@ public: void boxblur2(float** src, float** dst, float** temp, int H, int W, int box ); void boxblur_resamp(float **src, float **dst, float** temp, int H, int W, int box, int samp ); void MSR(float** luminance, float **originalLuminance, float **exLuminance, LUTf & mapcurve, bool &mapcontlutili, int width, int height, const RetinexParams &deh, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); - void HLRecovery_inpaint (float** red, float** green, float** blue); + void HLRecovery_inpaint (float** red, float** green, float** blue) override; static void HLRecovery_Luminance (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval); static void HLRecovery_CIELab (float* rin, float* gin, float* bin, float* rout, float* gout, float* bout, int width, float maxval, double cam[3][3], double icam[3][3]); static void HLRecovery_blend (float* rin, float* gin, float* bin, int width, float maxval, float* hlmax); static void init (); static void cleanup (); - void setCurrentFrame(unsigned int frameNum) { - currFrame = std::min(numFrames - 1, frameNum); - ri = riFrames[currFrame]; + void setCurrentFrame(unsigned int frameNum) override { + if (numFrames == 2 && frameNum == 2) { // special case for averaging of two frames + currFrame = frameNum; + ri = riFrames[0]; + } else { + currFrame = std::min(numFrames - 1, frameNum); + ri = riFrames[currFrame]; + } } - int getFrameCount() {return numFrames;} + int getFrameCount() override {return numFrames;} + int getFlatFieldAutoClipValue() override {return flatFieldAutoClipValue;} + class GreenEqulibrateThreshold { + public: + explicit GreenEqulibrateThreshold(float thresh): thresh_(thresh) {} + virtual ~GreenEqulibrateThreshold() {} + virtual float operator()(int row, int column) const { return thresh_; } + protected: + const float thresh_; + }; + + class CFALineDenoiseRowBlender { + public: + virtual ~CFALineDenoiseRowBlender() {} + virtual float operator()(int row) const { return 1.f; } + }; + protected: typedef unsigned short ushort; void processFalseColorCorrection (Imagefloat* i, const int steps); @@ -219,40 +237,53 @@ protected: inline void convert_row_to_RGB (float* r, float* g, float* b, const float* const Y, const float* const I, const float* const Q, const int W); inline void convert_to_RGB (float &r, float &g, float &b, const float Y, const float I, const float Q); - inline void convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob); - inline void interpolate_row_g (float* agh, float* agv, int i); - inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); - inline void interpolate_row_rb_mul_pp (float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip); + inline void interpolate_row_g (float* agh, float* agv, int i); + inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); + inline void interpolate_row_rb_mul_pp (const array2D &rawData, float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip); - void CA_correct_RT (const bool autoCA, const double cared, const double cablue, const double caautostrength, array2D &rawData); + float* CA_correct_RT( + bool autoCA, + size_t autoIterations, + double cared, + double cablue, + bool avoidColourshift, + const array2D &rawData, + double* fitParamsTransfer, + bool fitParamsIn, + bool fitParamsOut, + float* buffer, + bool freeBuffer, + size_t chunkSize = 1, + bool measure = false + ); void ddct8x8s(int isgn, float a[8][8]); - void processRawWhitepoint (float expos, float preser, array2D &rawData); // exposure before interpolation int interpolateBadPixelsBayer( PixelsMap &bitmapBads, array2D &rawData ); int interpolateBadPixelsNColours( PixelsMap &bitmapBads, const int colours ); int interpolateBadPixelsXtrans( PixelsMap &bitmapBads ); int findHotDeadPixels( PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels ); - void cfa_linedn (float linenoiselevel);//Emil's line denoise + void cfa_linedn (float linenoiselevel, bool horizontal, bool vertical, const CFALineDenoiseRowBlender &rowblender);//Emil's line denoise void green_equilibrate_global (array2D &rawData); - void green_equilibrate (float greenthresh, array2D &rawData);//Emil's green equilibration + void green_equilibrate (const GreenEqulibrateThreshold &greenthresh, array2D &rawData);//Emil's green equilibration void nodemosaic(bool bw); void eahd_demosaic(); void hphd_demosaic(); - void vng4_demosaic(); + void vng4_demosaic(const array2D &rawData, array2D &red, array2D &green, array2D &blue); void ppg_demosaic(); void jdl_interpolate_omp(); 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 amaze_demosaic_RT(int winx, int winy, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, size_t chunkSize = 1, bool measure = false);//Emil's code for AMaZE + void dual_demosaic_RT(bool isBayer, const RAWParams &raw, int winw, int winh, const array2D &rawData, array2D &red, array2D &green, array2D &blue, double &contrast, bool autoContrast = false); void fast_demosaic();//Emil's code for fast demosaicing void dcb_demosaic(int iterations, bool dcb_enhance); void ahd_demosaic(); - void rcd_demosaic(); + void rcd_demosaic(size_t chunkSize = 1, bool measure = false); 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 border_interpolate2(int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void dcb_initTileLimits(int &colMin, int &rowMin, int &colMax, int &rowMax, int x0, int y0, int border); void fill_raw( float (*cache )[3], int x0, int y0, float** rawData); void fill_border( float (*cache )[3], int border, int x0, int y0); @@ -268,13 +299,13 @@ protected: void dcb_refinement(float (*image)[3], uint8_t *map, int x0, int y0); void dcb_color_full(float (*image)[3], int x0, int y0, float (*chroma)[2]); void cielab (const float (*rgb)[3], float* l, float* a, float *b, const int width, const int height, const int labWidth, const float xyz_cam[3][3]); - 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 &make, const std::string &model, float rawWpCorrection); + void xtransborder_interpolate (int border, array2D &red, array2D &green, array2D &blue); + void xtrans_interpolate (const int passes, const bool useCieLab, size_t chunkSize = 1, bool measure = false); + void fast_xtrans_interpolate (const array2D &rawData, array2D &red, array2D &green, array2D &blue); + void pixelshift(int winx, int winy, int winw, int winh, const RAWParams &rawParams, 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); + void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override; }; } diff --git a/rtengine/rawimagesource_i.h b/rtengine/rawimagesource_i.h index 689ab03db..b24115e0a 100644 --- a/rtengine/rawimagesource_i.h +++ b/rtengine/rawimagesource_i.h @@ -58,225 +58,7 @@ inline void RawImageSource::convert_to_RGB (float &r, float &g, float &b, const b = Y - 1.105f * I + 1.702f * Q; } -inline void RawImageSource::convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob) -{ - - for (int j = 0; j < W; j++) { - double r = ar[j]; - double g = ag[j]; - double b = ab[j]; - - double x = lc00 * r + lc01 * g + lc02 * b; - double y = lc10 * r + lc11 * g + lc12 * b; - double z = lc20 * r + lc21 * g + lc22 * b; - - if (y > threshold) { - oL[j] = cache[(int)y]; - } else { - oL[j] = float(903.3 * y / MAXVALD); - } - - oa[j] = float(500.0 * ((x > threshold ? cache[(int)x] : 7.787 * x / MAXVALD + 16.0 / 116.0) - (y > threshold ? cache[(int)y] : 7.787 * y / MAXVALD + 16.0 / 116.0))); - ob[j] = float(200.0 * ((y > threshold ? cache[(int)y] : 7.787 * y / MAXVALD + 16.0 / 116.0) - (z > threshold ? cache[(int)z] : 7.787 * z / MAXVALD + 16.0 / 116.0))); - } -} - -inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i) -{ - - for (int j = 0; j < W; j++) { - if (ri->ISGREEN(i, j)) { - agh[j] = rawData[i][j]; - agv[j] = rawData[i][j]; - } else { - int gh = 0; - int gv = 0; - - if (j > 1 && j < W - 2) { - gh = (-rawData[i][j - 2] + 2 * rawData[i][j - 1] + 2 * rawData[i][j] + 2 * rawData[i][j + 1] - rawData[i][j + 2]) / 4; - int maxgh = max(rawData[i][j - 1], rawData[i][j + 1]); - int mingh = min(rawData[i][j - 1], rawData[i][j + 1]); - - if (gh > maxgh) { - gh = maxgh; - } else if (gh < mingh) { - gh = mingh; - } - } else if (j == 0) { - gh = rawData[i][1]; - } else if (j == 1) { - gh = (rawData[i][0] + rawData[i][2]) / 2; - } else if (j == W - 1) { - gh = rawData[i][W - 2]; - } else if (j == W - 2) { - gh = (rawData[i][W - 1] + rawData[i][W - 3]) / 2; - } - - if (i > 1 && i < H - 2) { - gv = (-rawData[i - 2][j] + 2 * rawData[i - 1][j] + 2 * rawData[i][j] + 2 * rawData[i + 1][j] - rawData[i + 2][j]) / 4; - int maxgv = max(rawData[i - 1][j], rawData[i + 1][j]); - int mingv = min(rawData[i - 1][j], rawData[i + 1][j]); - - if (gv > maxgv) { - gv = maxgv; - } else if (gv < mingv) { - gv = mingv; - } - } else if (i == 0) { - gv = rawData[1][j]; - } else if (i == 1) { - gv = (rawData[0][j] + rawData[2][j]) / 2; - } else if (i == H - 1) { - gv = rawData[H - 2][j]; - } else if (i == H - 2) { - gv = (rawData[H - 1][j] + rawData[H - 3][j]) / 2; - } - - agh[j] = gh; - agv[j] = gv; - } - } -} - -inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i) -{ - const auto getPg = [pg](int index) { - return - pg - ? pg[index] - : 0.f; - }; - - const auto getNg = [ng](int index) { - return - ng - ? ng[index] - : 0.f; - }; - - if ((ri->ISRED(i, 0) || ri->ISRED(i, 1))) { - // RGRGR or GRGRGR line - for (int j = 0; j < W; j++) { - if (ri->ISRED(i, j)) { - // red is simple - ar[j] = rawData[i][j]; - // blue: cross interpolation - int b = 0; - int n = 0; - - if (i > 0 && j > 0) { - b += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } - - if (i > 0 && j < W - 1) { - b += rawData[i - 1][j + 1] - getPg(j + 1); - n++; - } - - if (i < H - 1 && j > 0) { - b += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } - - if (i < H - 1 && j < W - 1) { - b += rawData[i + 1][j + 1] - getNg(j + 1); - n++; - } - - b = cg[j] + b / std::max(1, n); - ab[j] = b; - } else { - // linear R-G interp. horizontally - int r; - - if (j == 0) { - r = cg[0] + rawData[i][1] - cg[1]; - } else if (j == W - 1) { - r = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; - } else { - r = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; - } - - ar[j] = CLIP(r); - // linear B-G interp. vertically - int b; - - if (i == 0) { - b = getNg(j) + rawData[1][j] - cg[j]; - } else if (i == H - 1) { - b = getPg(j) + rawData[H - 2][j] - cg[j]; - } else { - b = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2; - } - - ab[j] = b; - } - } - } else { - // BGBGB or GBGBGB line - for (int j = 0; j < W; j++) { - if (ri->ISBLUE(i, j)) { - // red is simple - ab[j] = rawData[i][j]; - // blue: cross interpolation - int r = 0; - int n = 0; - - if (i > 0 && j > 0) { - r += rawData[i - 1][j - 1] - getPg(j - 1); - n++; - } - - if (i > 0 && j < W - 1) { - r += rawData[i - 1][j + 1] - getPg(j + 1); - n++; - } - - if (i < H - 1 && j > 0) { - r += rawData[i + 1][j - 1] - getNg(j - 1); - n++; - } - - if (i < H - 1 && j < W - 1) { - r += rawData[i + 1][j + 1] - getNg(j + 1); - n++; - } - - r = cg[j] + r / std::max(n, 1); - - ar[j] = r; - } else { - // linear B-G interp. horizontally - int b; - - if (j == 0) { - b = cg[0] + rawData[i][1] - cg[1]; - } else if (j == W - 1) { - b = cg[W - 1] + rawData[i][W - 2] - cg[W - 2]; - } else { - b = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; - } - - ab[j] = CLIP(b); - // linear R-G interp. vertically - int r; - - if (i == 0) { - r = getNg(j) + rawData[1][j] - cg[j]; - } else if (i == H - 1) { - r = getPg(j) + rawData[H - 2][j] - cg[j]; - } else { - r = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2; - } - - ar[j] = r; - } - } - } -} - -inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip) +inline void RawImageSource::interpolate_row_rb_mul_pp (const array2D &rawData, float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip) { if ((ri->ISRED(i, 0) || ri->ISRED(i, 1)) && pg && ng) { diff --git a/rtengine/rawmetadatalocation.h b/rtengine/rawmetadatalocation.h index 40ac6cc3e..de6c6a0d7 100644 --- a/rtengine/rawmetadatalocation.h +++ b/rtengine/rawmetadatalocation.h @@ -30,7 +30,7 @@ public: int ciffLength; RawMetaDataLocation () : exifBase(-1), ciffBase(-1), ciffLength(-1) {} - RawMetaDataLocation (int exifBase) : exifBase(exifBase), ciffBase(-1), ciffLength(-1) {} + explicit 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) {} }; diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc new file mode 100644 index 000000000..f0f9c1bfd --- /dev/null +++ b/rtengine/rcd_demosaic.cc @@ -0,0 +1,308 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2017-2018 Luis Sanz Rodriguez (luis.sanz.rodriguez(at)gmail(dot)com) and Ingo Weyrich (heckflosse67@gmx.de) + * + * RawTherapee is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RawTherapee is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RawTherapee. If not, see . + */ +#include + +#include "rawimagesource.h" +#include "rt_math.h" +#include "procparams.h" +#include "../rtgui/multilangmgr.h" +#include "opthelper.h" +#include "StopWatch.h" + +using namespace std; + +namespace rtengine +{ + +/** +* 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 +*/ +// Tiled version by Ingo Weyrich (heckflosse67@gmx.de) +void RawImageSource::rcd_demosaic(size_t chunkSize, bool measure) +{ + std::unique_ptr stop; + + if (measure) { + std::cout << "Demosaicing " << W << "x" << H << " image using rcd with " << chunkSize << " tiles per thread" << std::endl; + stop.reset(new StopWatch("rcd demosaic")); + } + + volatile double progress = 0.0; + + if (plistener) { + plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::RCD))); + plistener->setProgress(0); + } + + constexpr int rcdBorder = 9; + constexpr int tileSize = 214; + constexpr int tileSizeN = tileSize - 2 * rcdBorder; + const int numTh = H / (tileSizeN) + ((H % (tileSizeN)) ? 1 : 0); + const int numTw = W / (tileSizeN) + ((W % (tileSizeN)) ? 1 : 0); + constexpr int w1 = tileSize, w2 = 2 * tileSize, w3 = 3 * tileSize, w4 = 4 * tileSize; + //Tolerance to avoid dividing by zero + static constexpr float eps = 1e-5f; + static constexpr float epssq = 1e-10f; + +#ifdef _OPENMP +#pragma omp parallel +#endif +{ + int progresscounter = 0; + float *cfa = (float*) calloc(tileSize * tileSize, sizeof *cfa); + float (*rgb)[tileSize * tileSize] = (float (*)[tileSize * tileSize])malloc(3 * sizeof *rgb); + float *VH_Dir = (float*) calloc(tileSize * tileSize, sizeof *VH_Dir); + float *PQ_Dir = (float*) calloc(tileSize * tileSize, sizeof *PQ_Dir); + float *lpf = PQ_Dir; // reuse buffer, they don't overlap in usage + +#ifdef _OPENMP + #pragma omp for schedule(dynamic, chunkSize) collapse(2) nowait +#endif + for(int tr = 0; tr < numTh; ++tr) { + for(int tc = 0; tc < numTw; ++tc) { + const int rowStart = tr * tileSizeN; + const int rowEnd = std::min(rowStart + tileSize, H); + if(rowStart + rcdBorder == rowEnd - rcdBorder) { + continue; + } + const int colStart = tc * tileSizeN; + const int colEnd = std::min(colStart + tileSize, W); + if(colStart + rcdBorder == colEnd - rcdBorder) { + continue; + } + + const int tileRows = std::min(rowEnd - rowStart, tileSize); + const int tilecols = std::min(colEnd - colStart, tileSize); + + for (int row = rowStart; row < rowEnd; row++) { + int indx = (row - rowStart) * tileSize; + int c0 = FC(row, colStart); + int c1 = FC(row, colStart + 1); + int col = colStart; + + for (; col < colEnd - 1; col+=2, indx+=2) { + cfa[indx] = rgb[c0][indx] = LIM01(rawData[row][col] / 65535.f); + cfa[indx + 1] = rgb[c1][indx + 1] = LIM01(rawData[row][col + 1] / 65535.f); + } + if(col < colEnd) { + cfa[indx] = rgb[c0][indx] = LIM01(rawData[row][col] / 65535.f); + } + } + + /** + * STEP 1: Find cardinal and diagonal interpolation directions + */ + + for (int row = 4; row < tileRows - 4; row++) { + for (int col = 4, indx = row * tileSize + col; col < tilecols - 4; col++, indx++) { + const float cfai = cfa[indx]; + //Calculate h/v local discrimination + float V_Stat = max(epssq, -18.f * cfai * (cfa[indx - w1] + cfa[indx + w1] + 2.f * (cfa[indx - w2] + cfa[indx + w2]) - cfa[indx - w3] - cfa[indx + w3]) - 2.f * cfai * (cfa[indx - w4] + cfa[indx + w4] - 19.f * cfai) - cfa[indx - w1] * (70.f * cfa[indx + w1] + 12.f * cfa[indx - w2] - 24.f * cfa[indx + w2] + 38.f * cfa[indx - w3] - 16.f * cfa[indx + w3] - 12.f * cfa[indx - w4] + 6.f * cfa[indx + w4] - 46.f * cfa[indx - w1]) + cfa[indx + w1] * (24.f * cfa[indx - w2] - 12.f * cfa[indx + w2] + 16.f * cfa[indx - w3] - 38.f * cfa[indx + w3] - 6.f * cfa[indx - w4] + 12.f * cfa[indx + w4] + 46.f * cfa[indx + w1]) + cfa[indx - w2] * (14.f * cfa[indx + w2] - 12.f * cfa[indx + w3] - 2.f * cfa[indx - w4] + 2.f * cfa[indx + w4] + 11.f * cfa[indx - w2]) + cfa[indx + w2] * (-12.f * cfa[indx - w3] + 2.f * (cfa[indx - w4] - cfa[indx + w4]) + 11.f * cfa[indx + w2]) + cfa[indx - w3] * (2.f * cfa[indx + w3] - 6.f * cfa[indx - w4] + 10.f * cfa[indx - w3]) + cfa[indx + w3] * (-6.f * cfa[indx + w4] + 10.f * cfa[indx + w3]) + cfa[indx - w4] * cfa[indx - w4] + cfa[indx + w4] * cfa[indx + w4]); + float H_Stat = max(epssq, -18.f * cfai * (cfa[indx - 1] + cfa[indx + 1] + 2.f * (cfa[indx - 2] + cfa[indx + 2]) - cfa[indx - 3] - cfa[indx + 3]) - 2.f * cfai * (cfa[indx - 4] + cfa[indx + 4] - 19.f * cfai) - cfa[indx - 1] * (70.f * cfa[indx + 1] + 12.f * cfa[indx - 2] - 24.f * cfa[indx + 2] + 38.f * cfa[indx - 3] - 16.f * cfa[indx + 3] - 12.f * cfa[indx - 4] + 6.f * cfa[indx + 4] - 46.f * cfa[indx - 1]) + cfa[indx + 1] * (24.f * cfa[indx - 2] - 12.f * cfa[indx + 2] + 16.f * cfa[indx - 3] - 38.f * cfa[indx + 3] - 6.f * cfa[indx - 4] + 12.f * cfa[indx + 4] + 46.f * cfa[indx + 1]) + cfa[indx - 2] * (14.f * cfa[indx + 2] - 12.f * cfa[indx + 3] - 2.f * cfa[indx - 4] + 2.f * cfa[indx + 4] + 11.f * cfa[indx - 2]) + cfa[indx + 2] * (-12.f * cfa[indx - 3] + 2.f * (cfa[indx - 4] - cfa[indx + 4]) + 11.f * cfa[indx + 2]) + cfa[indx - 3] * (2.f * cfa[indx + 3] - 6.f * cfa[indx - 4] + 10.f * cfa[indx - 3]) + cfa[indx + 3] * (-6.f * cfa[indx + 4] + 10.f * cfa[indx + 3]) + cfa[indx - 4] * cfa[indx - 4] + cfa[indx + 4] * cfa[indx + 4]); + + VH_Dir[indx] = V_Stat / (V_Stat + H_Stat); + } + } + + /** + * STEP 2: Calculate the low pass filter + */ + // Step 2.1: Low pass filter incorporating green, red and blue local samples from the raw data + + for (int row = 2; row < tileRows - 2; row++) { + for (int col = 2 + (FC(row, 0) & 1), indx = row * tileSize + col; col < tilecols - 2; col += 2, indx += 2) { + lpf[indx>>1] = 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]); + } + } + + /** + * STEP 3: Populate the green channel + */ + // Step 3.1: Populate the green channel at blue and red CFA positions + for (int row = 4; row < tileRows - 4; row++) { + for (int col = 4 + (FC(row, 0) & 1), indx = row * tileSize + col; col < tilecols - 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 = std::fabs(0.5f - VH_Central_Value) < std::fabs(0.5f - VH_Neighbourhood_Value) ? VH_Neighbourhood_Value : VH_Central_Value; + + // Cardinal gradients + float N_Grad = eps + std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfa[indx] - cfa[indx - w2]) + std::fabs(cfa[indx - w1] - cfa[indx - w3]) + std::fabs(cfa[indx - w2] - cfa[indx - w4]); + float S_Grad = eps + std::fabs(cfa[indx - w1] - cfa[indx + w1]) + std::fabs(cfa[indx] - cfa[indx + w2]) + std::fabs(cfa[indx + w1] - cfa[indx + w3]) + std::fabs(cfa[indx + w2] - cfa[indx + w4]); + float W_Grad = eps + std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfa[indx] - cfa[indx - 2]) + std::fabs(cfa[indx - 1] - cfa[indx - 3]) + std::fabs(cfa[indx - 2] - cfa[indx - 4]); + float E_Grad = eps + std::fabs(cfa[indx - 1] - cfa[indx + 1]) + std::fabs(cfa[indx] - cfa[indx + 2]) + std::fabs(cfa[indx + 1] - cfa[indx + 3]) + std::fabs(cfa[indx + 2] - cfa[indx + 4]); + + // Cardinal pixel estimations + float N_Est = cfa[indx - w1] * (1.f + (lpf[indx>>1] - lpf[(indx - w2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx - w2)>>1])); + float S_Est = cfa[indx + w1] * (1.f + (lpf[indx>>1] - lpf[(indx + w2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx + w2)>>1])); + float W_Est = cfa[indx - 1] * (1.f + (lpf[indx>>1] - lpf[(indx - 2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx - 2)>>1])); + float E_Est = cfa[indx + 1] * (1.f + (lpf[indx>>1] - lpf[(indx + 2)>>1]) / (eps + lpf[indx>>1] + lpf[(indx + 2)>>1])); + + // Vertical and horizontal estimations + float V_Est = (S_Grad * N_Est + N_Grad * S_Est) / (N_Grad + S_Grad); + float H_Est = (W_Grad * E_Est + E_Grad * W_Est) / (E_Grad + W_Grad); + + // G@B and G@R interpolation + rgb[1][indx] = VH_Disc * H_Est + (1.f - VH_Disc) * V_Est; + + } + } + /** + * STEP 4: Populate the red and blue channels + */ + + // Step 4.1: Calculate P/Q diagonal local discrimination + for (int row = rcdBorder - 4; row < tileRows - rcdBorder + 4; row++) { + for (int col = rcdBorder - 4 + (FC(row, rcdBorder) & 1), indx = row * tileSize + col; col < tilecols - rcdBorder + 4; col += 2, indx += 2) { + const float cfai = cfa[indx]; + + float P_Stat = max(epssq, - 18.f * cfai * (cfa[indx - w1 - 1] + cfa[indx + w1 + 1] + 2.f * (cfa[indx - w2 - 2] + cfa[indx + w2 + 2]) - cfa[indx - w3 - 3] - cfa[indx + w3 + 3]) - 2.f * cfai * (cfa[indx - w4 - 4] + cfa[indx + w4 + 4] - 19.f * cfai) - cfa[indx - w1 - 1] * (70.f * cfa[indx + w1 + 1] - 12.f * cfa[indx - w2 - 2] + 24.f * cfa[indx + w2 + 2] - 38.f * cfa[indx - w3 - 3] + 16.f * cfa[indx + w3 + 3] + 12.f * cfa[indx - w4 - 4] - 6.f * cfa[indx + w4 + 4] + 46.f * cfa[indx - w1 - 1]) + cfa[indx + w1 + 1] * (24.f * cfa[indx - w2 - 2] - 12.f * cfa[indx + w2 + 2] + 16.f * cfa[indx - w3 - 3] - 38.f * cfa[indx + w3 + 3] - 6.f * cfa[indx - w4 - 4] + 12.f * cfa[indx + w4 + 4] + 46.f * cfa[indx + w1 + 1]) + cfa[indx - w2 - 2] * (14.f * cfa[indx + w2 + 2] - 12.f * cfa[indx + w3 + 3] - 2.f * (cfa[indx - w4 - 4] - cfa[indx + w4 + 4]) + 11.f * cfa[indx - w2 - 2]) - cfa[indx + w2 + 2] * (12.f * cfa[indx - w3 - 3] + 2.f * (cfa[indx - w4 - 4] - cfa[indx + w4 + 4]) + 11.f * cfa[indx + w2 + 2]) + cfa[indx - w3 - 3] * (2.f * cfa[indx + w3 + 3] - 6.f * cfa[indx - w4 - 4] + 10.f * cfa[indx - w3 - 3]) - cfa[indx + w3 + 3] * (6.f * cfa[indx + w4 + 4] + 10.f * cfa[indx + w3 + 3]) + cfa[indx - w4 - 4] * cfa[indx - w4 - 4] + cfa[indx + w4 + 4] * cfa[indx + w4 + 4]); + float Q_Stat = max(epssq, - 18.f * cfai * (cfa[indx + w1 - 1] + cfa[indx - w1 + 1] + 2.f * (cfa[indx + w2 - 2] + cfa[indx - w2 + 2]) - cfa[indx + w3 - 3] - cfa[indx - w3 + 3]) - 2.f * cfai * (cfa[indx + w4 - 4] + cfa[indx - w4 + 4] - 19.f * cfai) - cfa[indx + w1 - 1] * (70.f * cfa[indx - w1 + 1] - 12.f * cfa[indx + w2 - 2] + 24.f * cfa[indx - w2 + 2] - 38.f * cfa[indx + w3 - 3] + 16.f * cfa[indx - w3 + 3] + 12.f * cfa[indx + w4 - 4] - 6.f * cfa[indx - w4 + 4] + 46.f * cfa[indx + w1 - 1]) + cfa[indx - w1 + 1] * (24.f * cfa[indx + w2 - 2] - 12.f * cfa[indx - w2 + 2] + 16.f * cfa[indx + w3 - 3] - 38.f * cfa[indx - w3 + 3] - 6.f * cfa[indx + w4 - 4] + 12.f * cfa[indx - w4 + 4] + 46.f * cfa[indx - w1 + 1]) + cfa[indx + w2 - 2] * (14.f * cfa[indx - w2 + 2] - 12.f * cfa[indx - w3 + 3] - 2.f * (cfa[indx + w4 - 4] - cfa[indx - w4 + 4]) + 11.f * cfa[indx + w2 - 2]) - cfa[indx - w2 + 2] * (12.f * cfa[indx + w3 - 3] + 2.f * (cfa[indx + w4 - 4] - cfa[indx - w4 + 4]) + 11.f * cfa[indx - w2 + 2]) + cfa[indx + w3 - 3] * (2.f * cfa[indx - w3 + 3] - 6.f * cfa[indx + w4 - 4] + 10.f * cfa[indx + w3 - 3]) - cfa[indx - w3 + 3] * (6.f * cfa[indx - w4 + 4] + 10.f * cfa[indx - w3 + 3]) + cfa[indx + w4 - 4] * cfa[indx + w4 - 4] + cfa[indx - w4 + 4] * cfa[indx - w4 + 4]); + + PQ_Dir[indx] = P_Stat / (P_Stat + Q_Stat); + + } + } + + // Step 4.2: Populate the red and blue channels at blue and red CFA positions + for (int row = rcdBorder - 3; row < tileRows - rcdBorder + 3; row++) { + for (int col = rcdBorder - 3 + (FC(row, rcdBorder - 1) & 1), indx = row * tileSize + col, c = 2 - FC(row, col); col < tilecols - rcdBorder + 3; 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 = (std::fabs(0.5f - PQ_Central_Value) < std::fabs(0.5f - PQ_Neighbourhood_Value)) ? PQ_Neighbourhood_Value : PQ_Central_Value; + + // Diagonal gradients + float NW_Grad = eps + std::fabs(rgb[c][indx - w1 - 1] - rgb[c][indx + w1 + 1]) + std::fabs(rgb[c][indx - w1 - 1] - rgb[c][indx - w3 - 3]) + std::fabs(rgb[1][indx] - rgb[1][indx - w2 - 2]); + float NE_Grad = eps + std::fabs(rgb[c][indx - w1 + 1] - rgb[c][indx + w1 - 1]) + std::fabs(rgb[c][indx - w1 + 1] - rgb[c][indx - w3 + 3]) + std::fabs(rgb[1][indx] - rgb[1][indx - w2 + 2]); + float SW_Grad = eps + std::fabs(rgb[c][indx - w1 + 1] - rgb[c][indx + w1 - 1]) + std::fabs(rgb[c][indx + w1 - 1] - rgb[c][indx + w3 - 3]) + std::fabs(rgb[1][indx] - rgb[1][indx + w2 - 2]); + float SE_Grad = eps + std::fabs(rgb[c][indx - w1 - 1] - rgb[c][indx + w1 + 1]) + std::fabs(rgb[c][indx + w1 + 1] - rgb[c][indx + w3 + 3]) + std::fabs(rgb[1][indx] - rgb[1][indx + w2 + 2]); + + // Diagonal colour differences + float NW_Est = rgb[c][indx - w1 - 1] - rgb[1][indx - w1 - 1]; + float NE_Est = rgb[c][indx - w1 + 1] - rgb[1][indx - w1 + 1]; + float SW_Est = rgb[c][indx + w1 - 1] - rgb[1][indx + w1 - 1]; + float SE_Est = rgb[c][indx + w1 + 1] - rgb[1][indx + w1 + 1]; + + // P/Q estimations + float P_Est = (NW_Grad * SE_Est + SE_Grad * NW_Est) / (NW_Grad + SE_Grad); + float Q_Est = (NE_Grad * SW_Est + SW_Grad * NE_Est) / (NE_Grad + SW_Grad); + + // R@B and B@R interpolation + rgb[c][indx] = rgb[1][indx] + (1.f - PQ_Disc) * P_Est + PQ_Disc * Q_Est; + + } + } + + // Step 4.3: Populate the red and blue channels at green CFA positions + for (int row = rcdBorder; row < tileRows - rcdBorder; row++) { + for (int col = rcdBorder + (FC(row, rcdBorder - 1) & 1), indx = row * tileSize + col; col < tilecols - rcdBorder; 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 = (std::fabs(0.5f - VH_Central_Value) < std::fabs(0.5f - VH_Neighbourhood_Value)) ? VH_Neighbourhood_Value : VH_Central_Value; + float rgb1 = rgb[1][indx]; + float N1 = eps + std::fabs(rgb1 - rgb[1][indx - w2]); + float S1 = eps + std::fabs(rgb1 - rgb[1][indx + w2]); + float W1 = eps + std::fabs(rgb1 - rgb[1][indx - 2]); + float E1 = eps + std::fabs(rgb1 - rgb[1][indx + 2]); + + float rgb1mw1 = rgb[1][indx - w1]; + float rgb1pw1 = rgb[1][indx + w1]; + float rgb1m1 = rgb[1][indx - 1]; + float rgb1p1 = rgb[1][indx + 1]; + for (int c = 0; c <= 2; c += 2) { + // Cardinal gradients + float SNabs = std::fabs(rgb[c][indx - w1] - rgb[c][indx + w1]); + float EWabs = std::fabs(rgb[c][indx - 1] - rgb[c][indx + 1]); + float N_Grad = N1 + SNabs + std::fabs(rgb[c][indx - w1] - rgb[c][indx - w3]); + float S_Grad = S1 + SNabs + std::fabs(rgb[c][indx + w1] - rgb[c][indx + w3]); + float W_Grad = W1 + EWabs + std::fabs(rgb[c][indx - 1] - rgb[c][indx - 3]); + float E_Grad = E1 + EWabs + std::fabs(rgb[c][indx + 1] - rgb[c][indx + 3]); + + // Cardinal colour differences + float N_Est = rgb[c][indx - w1] - rgb1mw1; + float S_Est = rgb[c][indx + w1] - rgb1pw1; + float W_Est = rgb[c][indx - 1] - rgb1m1; + float E_Est = rgb[c][indx + 1] - rgb1p1; + + // Vertical and horizontal estimations + float V_Est = (N_Grad * S_Est + S_Grad * N_Est) / (N_Grad + S_Grad); + float H_Est = (E_Grad * W_Est + W_Grad * E_Est) / (E_Grad + W_Grad); + + // R@G and B@G interpolation + rgb[c][indx] = rgb1 + (1.f - VH_Disc) * V_Est + VH_Disc * H_Est; + + } + } + } + + for (int row = rowStart + rcdBorder; row < rowEnd - rcdBorder; ++row) { + for (int col = colStart + rcdBorder; col < colEnd - rcdBorder; ++col) { + int idx = (row - rowStart) * tileSize + col - colStart ; + red[row][col] = CLIP(rgb[0][idx] * 65535.f); + green[row][col] = CLIP(rgb[1][idx] * 65535.f); + blue[row][col] = CLIP(rgb[2][idx] * 65535.f); + } + } + + if(plistener) { + progresscounter++; + if(progresscounter % 32 == 0) { +#ifdef _OPENMP + #pragma omp critical (rcdprogress) +#endif + { + progress += (double)32 * ((tileSizeN) * (tileSizeN)) / (H * W); + progress = progress > 1.0 ? 1.0 : progress; + plistener->setProgress(progress); + } + } + } + + } + } + + free(cfa); + free(rgb); + free(VH_Dir); + free(PQ_Dir); +} + + border_interpolate2(W, H, rcdBorder, rawData, red, green, blue); + + if (plistener) { + plistener->setProgress(1); + } + // ------------------------------------------------------------------------- +} + +} /* namespace */ diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 67ddb2b7d..3fa4af9db 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -74,7 +74,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { 0, // EvLDNEdgeTolerance: obsolete, 0, // EvCDNEnabled:obsolete, 0, // free entry - RGBCURVE, // EvDCPToneCurve, + RGBCURVE|M_AUTOEXP, // EvDCPToneCurve, ALLNORAW, // EvDCPIlluminant, RETINEX, // EvSHEnabled, RGBCURVE, // EvSHHighlights, @@ -151,7 +151,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DARKFRAME, // EvPreProcessAutoDF DARKFRAME, // EvPreProcessDFFile DARKFRAME, // EvPreProcessExpCorrLinear - DARKFRAME, // EvPreProcessExpCorrPH + 0, // --unused-- FLATFIELD, // EvFlatFieldFile, FLATFIELD, // EvFlatFieldAutoSelect, FLATFIELD, // EvFlatFieldBlurRadius, @@ -419,8 +419,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = { DIRPYREQUALIZER, // EvWavgreenlow DIRPYREQUALIZER, // EvWavbluelow DIRPYREQUALIZER, // EvWavNeutral - RGBCURVE, // EvDCPApplyLookTable, - RGBCURVE, // EvDCPApplyBaselineExposureOffset, + RGBCURVE|M_AUTOEXP, // EvDCPApplyLookTable, + RGBCURVE|M_AUTOEXP, // EvDCPApplyBaselineExposureOffset, ALLNORAW, // EvDCPApplyHueSatMap DIRPYREQUALIZER, // EvWavenacont DIRPYREQUALIZER, // EvWavenachrom @@ -472,31 +472,31 @@ int refreshmap[rtengine::NUMOFEVENTS] = { OUTPUTPROFILE, // EvOBPCompens ALLNORAW, // EvWBtempBias DARKFRAME, // EvRawImageNum - DEMOSAIC, // EvPixelShiftMotion - DEMOSAIC, // EvPixelShiftMotionCorrection - DEMOSAIC, // EvPixelShiftStddevFactorGreen + 0, // unused + 0, // unused + 0, // unused DEMOSAIC, // EvPixelShiftEperIso - DEMOSAIC, // EvPixelShiftNreadIso - DEMOSAIC, // EvPixelShiftPrnu + 0, // unused + 0, // unused DEMOSAIC, // EvPixelshiftShowMotion DEMOSAIC, // EvPixelshiftShowMotionMaskOnly - DEMOSAIC, // EvPixelShiftAutomatic - DEMOSAIC, // EvPixelShiftNonGreenHorizontal - DEMOSAIC, // EvPixelShiftNonGreenVertical + 0, // unused + 0, // unused + 0, // unused DEMOSAIC, // EvPixelShiftNonGreenCross - DEMOSAIC, // EvPixelShiftStddevFactorRed - DEMOSAIC, // EvPixelShiftStddevFactorBlue - DEMOSAIC, // EvPixelShiftNonGreenCross2 - DEMOSAIC, // EvPixelShiftNonGreenAmaze + 0, // unused + 0, // unused + 0, // unused + 0, // unused DEMOSAIC, // EvPixelShiftGreen - DEMOSAIC, // EvPixelShiftRedBlueWeight + 0, // unused DEMOSAIC, // EvPixelShiftBlur DEMOSAIC, // EvPixelShiftSigma - DEMOSAIC, // EvPixelShiftSum - DEMOSAIC, // EvPixelShiftExp0 + 0, // unused + 0, // unused DEMOSAIC, // EvPixelShiftHoleFill DEMOSAIC, // EvPixelShiftMedian - DEMOSAIC, // EvPixelShiftMedian3 + 0, // unused DEMOSAIC, // EvPixelShiftMotionMethod DEMOSAIC, // EvPixelShiftSmooth DEMOSAIC, // EvPixelShiftLmmse @@ -519,8 +519,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = { HDR, // EvTMFattalAmount ALLNORAW, // EvWBEnabled RGBCURVE, // EvRGBEnabled - LUMINANCECURVE, // EvLEnabled - DEMOSAIC // EvPixelShiftOneGreen + LUMINANCECURVE // EvLEnabled }; diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h index 921119356..97945e6e1 100644 --- a/rtengine/refreshmap.h +++ b/rtengine/refreshmap.h @@ -51,16 +51,16 @@ // 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_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_SPOT|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_SPOT|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_SPOT|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_SPOT|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_SPOT|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_SPOT|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define HDR (M_LINDENOISE|M_HDR|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_SPOT|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define TRANSFORM (M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_SPOT|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define AUTOEXP (M_HDR|M_AUTOEXP|M_SPOT|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) -#define SPOT (M_SPOT|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define FIRST (M_PREPROC|M_RAW|M_INIT|M_LINDENOISE|M_HDR|M_SPOT|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_SPOT|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_SPOT|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_SPOT|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_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define ALLNORAW (M_INIT|M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define HDR (M_LINDENOISE|M_HDR|M_SPOT|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR) +#define SPOT (M_SPOT|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) @@ -68,7 +68,7 @@ #define DEFRINGE (M_LUMINANCE|M_COLOR) #define DIRPYRDENOISE (M_LUMINANCE|M_COLOR) #define DIRPYREQUALIZER (M_LUMINANCE|M_COLOR) -#define GAMMA M_MONITOR +#define GAMMA M_VOID //M_MONITOR #define CROP M_CROP #define RESIZE M_VOID #define EXIF M_VOID diff --git a/rtengine/rescale.h b/rtengine/rescale.h new file mode 100644 index 000000000..ba9a01c99 --- /dev/null +++ b/rtengine/rescale.h @@ -0,0 +1,99 @@ +/* -*- 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 . + */ + +#pragma once + +#include "array2D.h" + +namespace rtengine { + +inline float getBilinearValue(const array2D &src, float x, float y) +{ + const int W = src.width(); + const int H = src.height(); + + // 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, W - 1); + int yi1 = std::min(yi + 1, H - 1); + + float bl = src[yi][xi]; + float br = src[yi][xi1]; + float tl = src[yi1][xi]; + float tr = src[yi1][xi1]; + + // 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; +} + + +inline void rescaleBilinear(const array2D &src, array2D &dst, bool multithread) +{ + const int Ws = src.width(); + const int Hs = src.height(); + const int Wd = dst.width(); + const int Hd = dst.height(); + + float col_scale = float (Ws) / float (Wd); + float row_scale = float (Hs) / float (Hd); + +#ifdef _OPENMP + #pragma omp parallel for if (multithread) +#endif + + for (int y = 0; y < Hd; ++y) { + float ymrs = y * row_scale; + + for (int x = 0; x < Wd; ++x) { + dst[y][x] = getBilinearValue(src, x * col_scale, ymrs); + } + } +} + + +inline void rescaleNearest(const array2D &src, array2D &dst, bool multithread) +{ + const int width = src.width(); + const int height = src.height(); + const int nw = dst.width(); + const int nh = dst.height(); + +#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[y][x] = src[sy][sx]; + } + } +} + + +} // namespace rtengine diff --git a/rtengine/rt_algo.cc b/rtengine/rt_algo.cc index 79508cfb3..1011ae7b7 100644 --- a/rtengine/rt_algo.cc +++ b/rtengine/rt_algo.cc @@ -1,6 +1,8 @@ /* * This file is part of RawTherapee. * + * Copyright (c) 2017-2018 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 @@ -18,14 +20,145 @@ #include #include #include +#include #include #include - #ifdef _OPENMP #include #endif +#include "gauss.h" +#include "opthelper.h" #include "rt_algo.h" +#include "rt_math.h" +#include "sleef.c" + +namespace { +float calcBlendFactor(float val, float threshold) { + // sigmoid function + // result is in ]0;1] range + // inflexion point is at (x, y) (threshold, 0.5) + return 1.f / (1.f + xexpf(16.f - 16.f * val / threshold)); +} + +#ifdef __SSE2__ +vfloat calcBlendFactor(vfloat valv, vfloat thresholdv) { + // sigmoid function + // result is in ]0;1] range + // inflexion point is at (x, y) (threshold, 0.5) + const vfloat onev = F2V(1.f); + const vfloat c16v = F2V(16.f); + return onev / (onev + xexpf(c16v - c16v * valv / thresholdv)); +} +#endif + +float tileAverage(float **data, size_t tileY, size_t tileX, size_t tilesize) { + + float avg = 0.f; +#ifdef __SSE2__ + vfloat avgv = ZEROV; +#endif + for (std::size_t y = tileY; y < tileY + tilesize; ++y) { + std::size_t x = tileX; +#ifdef __SSE2__ + for (; x < tileX + tilesize - 3; x += 4) { + avgv += LVFU(data[y][x]); + } +#endif + for (; x < tileX + tilesize; ++x) { + avg += data[y][x]; + } + } +#ifdef __SSE2__ + avg += vhadd(avgv); +#endif + return avg / rtengine::SQR(tilesize); +} + +float tileVariance(float **data, size_t tileY, size_t tileX, size_t tilesize, float avg) { + + float var = 0.f; +#ifdef __SSE2__ + vfloat varv = ZEROV; + const vfloat avgv = F2V(avg); +#endif + for (std::size_t y = tileY; y < tileY + tilesize; ++y) { + std::size_t x = tileX; +#ifdef __SSE2__ + for (; x < tileX + tilesize - 3; x += 4) { + varv += SQRV(LVFU(data[y][x]) - avgv); + } +#endif + for (; x < tileX + tilesize; ++x) { + var += rtengine::SQR(data[y][x] - avg); + } + } +#ifdef __SSE2__ + var += vhadd(varv); +#endif + return var / (rtengine::SQR(tilesize) * avg); +} + +float calcContrastThreshold(float** luminance, int tileY, int tileX, int tilesize) { + + constexpr float scale = 0.0625f / 327.68f; + std::vector> blend(tilesize - 4, std::vector(tilesize - 4)); + +#ifdef __SSE2__ + const vfloat scalev = F2V(scale); +#endif + + for(int j = tileY + 2; j < tileY + tilesize - 2; ++j) { + int i = tileX + 2; +#ifdef __SSE2__ + for(; i < tileX + tilesize - 5; i += 4) { + vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + + SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; + STVFU(blend[j - tileY - 2][i - tileX - 2], contrastv); + } +#endif + for(; i < tileX + tilesize - 2; ++i) { + + float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) + + rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale; + + blend[j - tileY - 2][i - tileX - 2] = contrast; + } + } + + const float limit = rtengine::SQR(tilesize - 4) / 100.f; + + int c; + for (c = 1; c < 100; ++c) { + const float contrastThreshold = c / 100.f; + float sum = 0.f; +#ifdef __SSE2__ + const vfloat contrastThresholdv = F2V(contrastThreshold); + vfloat sumv = ZEROV; +#endif + + for(int j = 0; j < tilesize - 4; ++j) { + int i = 0; +#ifdef __SSE2__ + for(; i < tilesize - 7; i += 4) { + sumv += calcBlendFactor(LVFU(blend[j][i]), contrastThresholdv); + } +#endif + for(; i < tilesize - 4; ++i) { + sum += calcBlendFactor(blend[j][i], contrastThreshold); + } + } +#ifdef __SSE2__ + sum += vhadd(sumv); +#endif + if (sum <= limit) { + break; + } + } + + return c / 100.f; +} +} namespace rtengine { @@ -144,6 +277,7 @@ void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& // go back to original range minOut /= scale; minOut += minVal; + minOut = rtengine::LIM(minOut, minVal, maxVal); // find (maxPrct*size) smallest value const float threshmax = maxPrct * size; @@ -162,6 +296,178 @@ void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& // go back to original range maxOut /= scale; maxOut += minVal; + maxOut = rtengine::LIM(maxOut, minVal, maxVal); +} + +void buildBlendMask(float** luminance, float **blend, int W, int H, float &contrastThreshold, float amount, bool autoContrast) { + + if (autoContrast) { + constexpr float minLuminance = 2000.f; + constexpr float maxLuminance = 20000.f; + constexpr float minTileVariance = 0.5f; + for (int pass = 0; pass < 2; ++pass) { + const int tilesize = 80 / (pass + 1); + const int skip = pass == 0 ? tilesize : tilesize / 4; + const int numTilesW = W / skip - 3 * pass; + const int numTilesH = H / skip - 3 * pass; + std::vector> variances(numTilesH, std::vector(numTilesW)); + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic) +#endif + for (int i = 0; i < numTilesH; ++i) { + const int tileY = i * skip; + for (int j = 0; j < numTilesW; ++j) { + const int tileX = j * skip; + const float avg = tileAverage(luminance, tileY, tileX, tilesize); + if (avg < minLuminance || avg > maxLuminance) { + // too dark or too bright => skip the tile + variances[i][j] = RT_INFINITY_F; + continue; + } else { + variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg); + // exclude tiles with a variance less than minTileVariance + variances[i][j] = variances[i][j] < minTileVariance ? RT_INFINITY_F : variances[i][j]; + } + } + } + + float minvar = RT_INFINITY_F; + int minI = 0, minJ = 0; + for (int i = 0; i < numTilesH; ++i) { + for (int j = 0; j < numTilesW; ++j) { + if (variances[i][j] < minvar) { + minvar = variances[i][j]; + minI = i; + minJ = j; + } + } + } + + if (minvar <= 1.f || pass == 1) { + const int minY = skip * minI; + const int minX = skip * minJ; + if (pass == 0) { + // a variance <= 1 means we already found a flat region and can skip second pass + contrastThreshold = calcContrastThreshold(luminance, minY, minX, tilesize); + break; + } else { + // in second pass we allow a variance of 4 + // we additionally scan the tiles +-skip pixels around the best tile from pass 2 + // Means we scan (2 * skip + 1)^2 tiles in this step to get a better hit rate + // fortunately the scan is quite fast, so we use only one core and don't parallelize + const int topLeftYStart = std::max(minY - skip, 0); + const int topLeftXStart = std::max(minX - skip, 0); + const int topLeftYEnd = std::min(minY + skip, H - tilesize); + const int topLeftXEnd = std::min(minX + skip, W - tilesize); + const int numTilesH = topLeftYEnd - topLeftYStart + 1; + const int numTilesW = topLeftXEnd - topLeftXStart + 1; + + std::vector> variances(numTilesH, std::vector(numTilesW)); + for (int i = 0; i < numTilesH; ++i) { + const int tileY = topLeftYStart + i; + for (int j = 0; j < numTilesW; ++j) { + const int tileX = topLeftXStart + j; + const float avg = tileAverage(luminance, tileY, tileX, tilesize); + + if (avg < minLuminance || avg > maxLuminance) { + // too dark or too bright => skip the tile + variances[i][j] = RT_INFINITY_F; + continue; + } else { + variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg); + // exclude tiles with a variance less than minTileVariance + variances[i][j] = variances[i][j] < minTileVariance ? RT_INFINITY_F : variances[i][j]; + } + } + } + + float minvar = RT_INFINITY_F; + int minI = 0, minJ = 0; + for (int i = 0; i < numTilesH; ++i) { + for (int j = 0; j < numTilesW; ++j) { + if (variances[i][j] < minvar) { + minvar = variances[i][j]; + minI = i; + minJ = j; + } + } + } + + contrastThreshold = minvar <= 4.f ? calcContrastThreshold(luminance, topLeftYStart + minI, topLeftXStart + minJ, tilesize) : 0.f; + } + } + } + } + + if(contrastThreshold == 0.f) { + for(int j = 0; j < H; ++j) { + for(int i = 0; i < W; ++i) { + blend[j][i] = amount; + } + } + } else { + constexpr float scale = 0.0625f / 327.68f; +#ifdef _OPENMP + #pragma omp parallel +#endif + { +#ifdef __SSE2__ + const vfloat contrastThresholdv = F2V(contrastThreshold); + const vfloat scalev = F2V(scale); + const vfloat amountv = F2V(amount); +#endif +#ifdef _OPENMP + #pragma omp for schedule(dynamic,16) +#endif + + for(int j = 2; j < H - 2; ++j) { + int i = 2; +#ifdef __SSE2__ + for(; i < W - 5; i += 4) { + vfloat contrastv = vsqrtf(SQRV(LVFU(luminance[j][i+1]) - LVFU(luminance[j][i-1])) + SQRV(LVFU(luminance[j+1][i]) - LVFU(luminance[j-1][i])) + + SQRV(LVFU(luminance[j][i+2]) - LVFU(luminance[j][i-2])) + SQRV(LVFU(luminance[j+2][i]) - LVFU(luminance[j-2][i]))) * scalev; + + STVFU(blend[j][i], amountv * calcBlendFactor(contrastv, contrastThresholdv)); + } +#endif + for(; i < W - 2; ++i) { + + float contrast = sqrtf(rtengine::SQR(luminance[j][i+1] - luminance[j][i-1]) + rtengine::SQR(luminance[j+1][i] - luminance[j-1][i]) + + rtengine::SQR(luminance[j][i+2] - luminance[j][i-2]) + rtengine::SQR(luminance[j+2][i] - luminance[j-2][i])) * scale; + + blend[j][i] = amount * calcBlendFactor(contrast, contrastThreshold); + } + } + +#ifdef _OPENMP + #pragma omp single +#endif + { + // upper border + for(int j = 0; j < 2; ++j) { + for(int i = 2; i < W - 2; ++i) { + blend[j][i] = blend[2][i]; + } + } + // lower border + for(int j = H - 2; j < H; ++j) { + for(int i = 2; i < W - 2; ++i) { + blend[j][i] = blend[H-3][i]; + } + } + for(int j = 0; j < H; ++j) { + // left border + blend[j][0] = blend[j][1] = blend[j][2]; + // right border + blend[j][W - 2] = blend[j][W - 1] = blend[j][W - 3]; + } + } + + // blur blend mask to smooth transitions + gaussianBlur(blend, blend, W, H, 2.0); + } + } } } diff --git a/rtengine/rt_algo.h b/rtengine/rt_algo.h index 2630bbf41..a8e2e3e23 100644 --- a/rtengine/rt_algo.h +++ b/rtengine/rt_algo.h @@ -1,7 +1,7 @@ /* * This file is part of RawTherapee. * - * Copyright (c) 2017 Ingo Weyrich + * Copyright (c) 2017-2018 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 @@ -23,7 +23,6 @@ namespace rtengine { - void findMinMaxPercentile(const float* data, size_t size, float minPrct, float& minOut, float maxPrct, float& maxOut, bool multiThread = true); - +void buildBlendMask(float** luminance, float **blend, int W, int H, float &contrastThreshold, float amount = 1.f, bool autoContrast = false); } diff --git a/rtengine/rt_math.h b/rtengine/rt_math.h index 787e2e63f..9342f5430 100644 --- a/rtengine/rt_math.h +++ b/rtengine/rt_math.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace rtengine { @@ -37,6 +38,12 @@ constexpr T SQR(T x) return x * x; } +template +constexpr T pow4(T x) +{ + return SQR(SQR(x)); +} + template constexpr const T& min(const T& a) { @@ -74,9 +81,9 @@ constexpr const T& max(const T& a, const T& b, const ARGS&... args) } 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 @@ -137,4 +144,97 @@ constexpr std::uint8_t uint16ToUint8Rounded(std::uint16_t i) return ((i + 128) - ((i + 128) >> 8)) >> 8; } +template +constexpr bool OOG(const T &val, const T &high=T(MAXVAL)) +{ + return (val < T(0)) || (val > high); } + +template +void setUnlessOOG(T &out, const T &val) +{ + if (!OOG(out)) { + out = val; + } +} + + +template +bool invertMatrix(const std::array, 3> &in, std::array, 3> &out) +{ + const T res00 = in[1][1] * in[2][2] - in[2][1] * in[1][2]; + const T res10 = in[2][0] * in[1][2] - in[1][0] * in[2][2]; + const T res20 = in[1][0] * in[2][1] - in[2][0] * in[1][1]; + + const T det = in[0][0] * res00 + in[0][1] * res10 + in[0][2] * res20; + + if (std::abs(det) < 1.0e-10) { + return false; + } + + out[0][0] = res00 / det; + out[0][1] = (in[2][1] * in[0][2] - in[0][1] * in[2][2]) / det; + out[0][2] = (in[0][1] * in[1][2] - in[1][1] * in[0][2]) / det; + out[1][0] = res10 / det; + out[1][1] = (in[0][0] * in[2][2] - in[2][0] * in[0][2]) / det; + out[1][2] = (in[1][0] * in[0][2] - in[0][0] * in[1][2]) / det; + out[2][0] = res20 / det; + out[2][1] = (in[2][0] * in[0][1] - in[0][0] * in[2][1]) / det; + out[2][2] = (in[0][0] * in[1][1] - in[1][0] * in[0][1]) / det; + + return true; +} + + +template +std::array, 3> dotProduct(const std::array, 3> &a, const std::array, 3> &b) +{ + std::array, 3> res; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + res[i][j] = 0; + + for (int k = 0; k < 3; ++k) { + res[i][j] += a[i][k] * b[k][j]; + } + } + } + + return res; +} + + +template +std::array dotProduct(const std::array, 3> &a, const std::array &b) +{ + std::array res; + + for (int i = 0; i < 3; ++i) { + res[i] = 0; + for (int k = 0; k < 3; ++k) { + res[i] += a[i][k] * b[k]; + } + } + + return res; +} + + +template +T lin2log(T x, T base) +{ + constexpr T one(1); + return std::log(x * (base - one) + one) / std::log(base); +} + + +template +T log2lin(T x, T base) +{ + constexpr T one(1); + return (std::pow(base, x) - one) / (base - one); +} + +} + diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index eea15c7a3..6264d43ae 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -21,7 +21,6 @@ #include "imageformat.h" #include "rt_math.h" -#include "procparams.h" #include "procevents.h" #include #include @@ -45,6 +44,22 @@ class EditDataProvider; namespace rtengine { +enum RenderingIntent : int; + +namespace procparams +{ + +class ProcParams; +class IPTCPairs; + +struct RAWParams; +struct ColorManagementParams; +struct CropParams; + +enum class ToneCurveMode : int; + +} + class IImage8; class IImage16; class IImagefloat; @@ -120,9 +135,12 @@ public: 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; + virtual bool getPixelShift () 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 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 std::string getImageType (unsigned int frame) const = 0; /** @return the sample format based on MetaData */ virtual IIOSampleFormat getSampleFormat (unsigned int frame = 0) const = 0; @@ -151,21 +169,20 @@ public: /** This listener interface is used to indicate the progress of time consuming operations */ class ProgressListener { - public: - virtual ~ProgressListener() {} + virtual ~ProgressListener() = default; /** This member function is called when the percentage of the progress has been changed. * @param p is a number between 0 and 1 */ - virtual void setProgress (double p) {} + virtual void setProgress(double p) = 0; /** This member function is called when a textual information corresponding to the progress has been changed. * @param str is the textual information corresponding to the progress */ - virtual void setProgressStr (Glib::ustring str) {} + virtual void setProgressStr(const Glib::ustring& str) = 0; /** This member function is called when the state of the processing has been changed. * @param inProcessing =true if the processing has been started, =false if it has been stopped */ - virtual void setProgressState (bool inProcessing) {} + virtual void setProgressState(bool inProcessing) = 0; /** This member function is called when an error occurs during the operation. * @param descr is the error message */ - virtual void error (Glib::ustring descr) {} + virtual void error(const Glib::ustring& descr) = 0; }; class ImageSource; @@ -216,20 +233,20 @@ public: class PreviewImageListener { public: - virtual ~PreviewImageListener() {} + virtual ~PreviewImageListener() = default; /** With this member function the staged processor notifies the listener that it allocated a new * image to store the end result of the processing. It can be used in a shared manner. * @param img is a pointer to the image * @param scale describes the current scaling applied compared to the 100% size (preview scale) * @param cp holds the coordinates of the current crop rectangle */ - virtual void setImage (IImage8* img, double scale, procparams::CropParams cp) {} + virtual void setImage(IImage8* img, double scale, const procparams::CropParams& cp) = 0; /** With this member function the staged processor notifies the listener that the image passed as parameter * will be deleted, and no longer used to store the preview image. * @param img the pointer to the image to be destroyed. The listener has to free the image! */ - virtual void delImage (IImage8* img) {} + virtual void delImage(IImage8* img) = 0; /** With this member function the staged processor notifies the listener that the preview image has been updated. * @param cp holds the coordinates of the current crop rectangle */ - virtual void imageReady (procparams::CropParams cp) {} + virtual void imageReady(const procparams::CropParams& cp) = 0; }; /** When the detailed crop image is ready for display during staged processing (thus the changes have been updated), @@ -239,52 +256,70 @@ public: class DetailedCropListener { public: - virtual ~DetailedCropListener() {} + virtual ~DetailedCropListener() = default; /** With this member function the staged processor notifies the listener that the detailed crop image has been updated. * @param img is a pointer to the detailed crop image */ - virtual void setDetailedCrop (IImage8* img, IImage8* imgtrue, procparams::ColorManagementParams cmp, - procparams::CropParams cp, int cx, int cy, int cw, int ch, int skip) {} - virtual bool getWindow (int& cx, int& cy, int& cw, int& ch, int& skip) - { - return false; - } - // virtual void setPosition (int x, int y, bool update=true) {} - + virtual void setDetailedCrop( + IImage8* img, + IImage8* imgtrue, + const procparams::ColorManagementParams& cmp, + const procparams::CropParams& cp, + int cx, + int cy, + int cw, + int ch, + int skip + ) = 0; + virtual void getWindow(int& cx, int& cy, int& cw, int& ch, int& skip) = 0; }; /** This listener is used when the full size of the final image has been changed (e.g. rotated by 90 deg.) */ class SizeListener { public: - virtual ~SizeListener() {} + virtual ~SizeListener() = default; /** This member function is called when the size of the final image has been changed * @param w is the width of the final image (without cropping) * @param h is the height of the final image (without cropping) * @param ow is the width of the final image (without resizing and cropping) * @param oh is the height of the final image (without resizing and cropping) */ - virtual void sizeChanged (int w, int h, int ow, int oh) {} + virtual void sizeChanged(int w, int h, int ow, int oh) = 0; }; /** This listener is used when the histogram of the final image has changed. */ class HistogramListener { public: - virtual ~HistogramListener() {} + virtual ~HistogramListener() = default; /** This member function is called when the histogram of the final image has changed. * @param histRed is the array of size 256 containing the histogram of the red channel * @param histGreen is the array of size 256 containing the histogram of the green channel * @param histBlue is the array of size 256 containing the histogram of the blue channel * @param histLuma is the array of size 256 containing the histogram of the luminance channel * other for curves backgrounds, histRAW is RAW without colors */ - virtual void histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve,LUTu & histLLCurve, */LUTu & histLCAM, LUTu & histCCAM, - LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI) {} + virtual void histogramChanged( + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRedRaw, + const LUTu& histGreenRaw, + const LUTu& histBlueRaw, + const LUTu& histChroma, + const LUTu& histLRETI + ) = 0; }; /** This listener is used when the auto exposure has been recomputed (e.g. when the clipping ratio changed). */ class AutoExpListener { public: - virtual ~AutoExpListener() {} + virtual ~AutoExpListener() = default; /** This member function is called when the auto exposure has been recomputed. * @param brightness is the new brightness value (in logarithmic scale) * @param bright is the new ... @@ -293,84 +328,93 @@ public: * @param hlcompr is the new highlight recovery amount * @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 autoExpChanged(double brightness, int bright, int contrast, int black, int hlcompr, int hlcomprthresh, bool hlrecons) = 0; - virtual void autoMatchedToneCurveChanged(procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve) {} + virtual void autoMatchedToneCurveChanged(procparams::ToneCurveMode curveMode, const std::vector& curve) = 0; }; class AutoCamListener { public : - virtual ~AutoCamListener() {} - virtual void autoCamChanged (double ccam, double ccamout) {} - virtual void adapCamChanged (double cadap) {} - virtual void ybCamChanged (int yb) {} - + virtual ~AutoCamListener() = default; + virtual void autoCamChanged(double ccam, double ccamout) = 0; + virtual void adapCamChanged(double cadap) = 0; + virtual void ybCamChanged(int yb) = 0; }; class AutoChromaListener { public : - virtual ~AutoChromaListener() {} - virtual void chromaChanged (double autchroma, double autred, double autblue) {} - virtual void noiseChanged (double nresid, double highresid) {} - virtual void noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP) {} - + virtual ~AutoChromaListener() = default; + virtual void chromaChanged(double autchroma, double autred, double autblue) = 0; + virtual void noiseChanged(double nresid, double highresid) = 0; + virtual void noiseTilePrev(int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP) = 0; }; class RetinexListener { -public : - virtual ~RetinexListener() {} - virtual void minmaxChanged (double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax) {} - +public: + virtual ~RetinexListener() = default; + virtual void minmaxChanged(double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax) = 0; }; class AutoColorTonListener { -public : - virtual ~AutoColorTonListener() {} - virtual void autoColorTonChanged (int bwct, int satthres, int satprot) {} +public: + virtual ~AutoColorTonListener() = default; + virtual void autoColorTonChanged(int bwct, int satthres, int satprot) = 0; }; class AutoBWListener { -public : - virtual ~AutoBWListener() {} - virtual void BWChanged (double redbw, double greenbw, double bluebw) {} - +public: + virtual ~AutoBWListener() = default; + virtual void BWChanged(double redbw, double greenbw, double bluebw) = 0; }; class AutoWBListener { -public : +public: virtual ~AutoWBListener() = default; - virtual void WBChanged (double temp, double green) = 0; + virtual void WBChanged(double temp, double green) = 0; }; class FrameCountListener { -public : +public: virtual ~FrameCountListener() = default; - virtual void FrameCountChanged (int n, int frameNum) = 0; + virtual void FrameCountChanged(int n, int frameNum) = 0; +}; + +class FlatFieldAutoClipListener +{ +public: + virtual ~FlatFieldAutoClipListener() = default; + virtual void flatFieldAutoClipValueChanged(int n) = 0; }; class ImageTypeListener { -public : +public: virtual ~ImageTypeListener() = default; - virtual void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans) = 0; + virtual void imageTypeChanged(bool isRaw, bool isBayer, bool isXtrans, bool is_Mono = false) = 0; +}; + +class AutoContrastListener +{ +public : + virtual ~AutoContrastListener() = default; + virtual void autoContrastChanged (double autoContrast) = 0; }; class WaveletListener { -public : - virtual ~WaveletListener() {} - virtual void wavChanged (double nlevel) {} +public: + virtual ~WaveletListener() = default; + virtual void wavChanged(double nlevel) = 0; }; - /** This class represents a detailed part of the image (looking through a kind of window). * It can be created and destroyed with the appropriate members of StagedImageProcessor. * Several crops can be assigned to the same image. */ @@ -399,8 +443,8 @@ class StagedImageProcessor { 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) */ @@ -440,6 +484,9 @@ public: * @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; @@ -463,7 +510,10 @@ public: virtual void setHistogramListener (HistogramListener *l) = 0; virtual void setPreviewImageListener (PreviewImageListener* l) = 0; virtual void setAutoCamListener (AutoCamListener* l) = 0; + virtual void setFlatFieldAutoClipListener (FlatFieldAutoClipListener* l) = 0; virtual void setFrameCountListener (FrameCountListener* l) = 0; + virtual void setBayerAutoContrastListener (AutoContrastListener* l) = 0; + virtual void setXtransAutoContrastListener (AutoContrastListener* l) = 0; virtual void setAutoBWListener (AutoBWListener* l) = 0; virtual void setAutoWBListener (AutoWBListener* l) = 0; virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0; @@ -476,6 +526,7 @@ public: virtual void getMonitorProfile (Glib::ustring& monitorProfile, RenderingIntent& intent) const = 0; virtual void setSoftProofing (bool softProof, bool gamutCheck) = 0; virtual void getSoftProofing (bool &softProof, bool &gamutCheck) = 0; + virtual void setSharpMask (bool sharpMask) = 0; virtual ~StagedImageProcessor () {} @@ -498,7 +549,7 @@ int init (const Settings* s, Glib::ustring baseDir, Glib::ustring userSettingsDi /** 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 { @@ -523,17 +574,17 @@ public: 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); virtual bool fastPipeline() const = 0; }; -/** This function performs all the image processinf steps corresponding to the given ProcessingJob. It returns when it is ready, so it can be slow. +/** This function performs all the image processing 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 * @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. */ IImagefloat* processImage (ProcessingJob* job, int& errorCode, ProgressListener* pl = nullptr, bool flush = false); @@ -547,10 +598,9 @@ public: * there is no jobs left. * @param img is the result of the last ProcessingJob * @return the next ProcessingJob to process */ - virtual ProcessingJob* imageReady (IImagefloat* img) = 0; - virtual void error (Glib::ustring message) = 0; + virtual ProcessingJob* imageReady(IImagefloat* img) = 0; }; -/** This function performs all the image processinf steps corresponding to the given ProcessingJob. It runs in the background, thus it returns immediately, +/** This function performs all the image processing steps corresponding to the given ProcessingJob. It runs in the background, thus it returns immediately, * When it finishes, it calls the BatchProcessingListener with the resulting image and asks for the next job. It the listener gives a new job, it goes on * with processing. If no new job is given, it finishes. * The ProcessingJob passed becomes invalid, you can not use it any more. diff --git a/rtengine/rtetest.cc b/rtengine/rtetest.cc index 5d2dbfddc..bd81dbb0d 100644 --- a/rtengine/rtetest.cc +++ b/rtengine/rtetest.cc @@ -21,23 +21,28 @@ //#include #include -class PListener : public rtengine::ProgressListener +class PListener : + public rtengine::ProgressListener { - public: - void setProgressStr (Glib::ustring str) + void setProgressStr(const Glib::ustring& str) { std::cout << str << std::endl; } - void setProgress (double p) + void setProgress(double p) { std::cout << p << std::endl; } + void setProgressState(bool inProcessing) + { + } + void error(const Glib::ustring& descr) + { + } }; int main (int argc, char* argv[]) { - if (argc < 4) { std::cout << "Usage: rtcmd " << std::endl; exit(1); diff --git a/rtengine/rtlensfun.cc b/rtengine/rtlensfun.cc index 8216f0b83..3cea8c484 100644 --- a/rtengine/rtlensfun.cc +++ b/rtengine/rtlensfun.cc @@ -19,6 +19,7 @@ */ #include "rtlensfun.h" +#include "procparams.h" #include "settings.h" #include @@ -33,6 +34,7 @@ extern const Settings *settings; LFModifier::~LFModifier() { if (data_) { + MyMutex::MyLock lock(lfModifierMutex); data_->Destroy(); } } @@ -56,7 +58,7 @@ void LFModifier::correctDistortion(double &x, double &y, int cx, int cy, double if (swap_xy_) { std::swap(xx, yy); } - if (data_->ApplyGeometryDistortion(xx, yy, 1, 1, pos)) { + if (data_->ApplyGeometryDistortion(xx, yy, 1, 1, pos)) { // This is thread-safe x = pos[0]; y = pos[1]; if (swap_xy_) { @@ -95,7 +97,7 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co if (swap_xy_) { std::swap(x, y); } - data_->ApplySubpixelDistortion(x, y, 1, 1, pos); + data_->ApplySubpixelDistortion(x, y, 1, 1, pos); // This is thread-safe x = pos[2*channel]; y = pos[2*channel+1]; if (swap_xy_) { @@ -112,12 +114,14 @@ void LFModifier::correctCA(double &x, double &y, int cx, int cy, int channel) co void LFModifier::processVignetteLine(int width, int y, float *line) const { + MyMutex::MyLock lock(lfModifierMutex); data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_1(INTENSITY), 0); } void LFModifier::processVignetteLine3Channels(int width, int y, float *line) const { + MyMutex::MyLock lock(lfModifierMutex); data_->ApplyColorModification(line, 0, y, width, 1, LF_CR_3(RED, GREEN, BLUE), 0); } @@ -380,6 +384,7 @@ LFDatabase::LFDatabase(): LFDatabase::~LFDatabase() { if (data_) { + MyMutex::MyLock lock(lfDBMutex); data_->Destroy(); } } @@ -395,6 +400,7 @@ std::vector LFDatabase::getCameras() const { std::vector ret; if (data_) { + MyMutex::MyLock lock(lfDBMutex); auto cams = data_->GetCameras(); while (*cams) { ret.emplace_back(); @@ -410,6 +416,7 @@ std::vector LFDatabase::getLenses() const { std::vector ret; if (data_) { + MyMutex::MyLock lock(lfDBMutex); auto lenses = data_->GetLenses(); while (*lenses) { ret.emplace_back(); @@ -425,6 +432,7 @@ LFCamera LFDatabase::findCamera(const Glib::ustring &make, const Glib::ustring & { LFCamera ret; if (data_) { + MyMutex::MyLock lock(lfDBMutex); auto found = data_->FindCamerasExt(make.c_str(), model.c_str()); if (found) { ret.data_ = found[0]; @@ -439,6 +447,7 @@ LFLens LFDatabase::findLens(const LFCamera &camera, const Glib::ustring &name) c { LFLens ret; if (data_) { + MyMutex::MyLock lock(lfDBMutex); 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 @@ -476,6 +485,7 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons { std::unique_ptr ret; if (data_) { + MyMutex::MyLock lock(lfDBMutex); if (camera && lens) { lfModifier *mod = lfModifier::Create(lens.data_, camera.getCropFactor(), width, height); int flags = LF_MODIFY_DISTORTION | LF_MODIFY_SCALE | LF_MODIFY_TCA; @@ -492,7 +502,6 @@ std::unique_ptr LFDatabase::getModifier(const LFCamera &camera, cons 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; float focallen = idata->getFocalLen(); if (lensProf.lfAutoMatch()) { @@ -507,6 +516,11 @@ std::unique_ptr LFDatabase::findModifier(const LensProfParams &lensP model = lensProf.lfCameraModel; lens = lensProf.lfLens; } + if (make.empty() || model.empty() || lens.empty()) { + return nullptr; + } + + const LFDatabase *db = getInstance(); LFCamera c = db->findCamera(make, model); LFLens l = db->findLens(lensProf.lfAutoMatch() ? c : LFCamera(), lens); if (focallen <= 0 && l.data_ && l.data_->MinFocal == l.data_->MaxFocal) { diff --git a/rtengine/rtlensfun.h b/rtengine/rtlensfun.h index 7690ef544..8b097b30e 100644 --- a/rtengine/rtlensfun.h +++ b/rtengine/rtlensfun.h @@ -29,16 +29,22 @@ #include "lcp.h" #include "noncopyable.h" -#include "procparams.h" namespace rtengine { +namespace procparams +{ + +struct LensProfParams; + +} + class LFModifier final : public LensCorrection, public NonCopyable { public: - ~LFModifier(); + ~LFModifier() override; explicit operator bool() const; @@ -57,6 +63,7 @@ private: lfModifier *data_; bool swap_xy_; int flags_; + mutable MyMutex lfModifierMutex; }; class LFCamera final @@ -112,7 +119,7 @@ public: 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 FramesMetaData *idata, int width, int height, const CoarseTransformParams &coarse, int rawRotationDeg); + static std::unique_ptr findModifier(const procparams::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, @@ -121,6 +128,7 @@ private: LFDatabase(); bool LoadDirectory(const char *dirname); + mutable MyMutex lfDBMutex; static LFDatabase instance_; lfDatabase *data_; }; diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 1a8d18897..1ee09dcf3 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -36,7 +36,11 @@ #include "jpeg.h" #include "../rtgui/ppversion.h" #include "improccoordinator.h" +#include "settings.h" +#include "procparams.h" #include +#include "StopWatch.h" +#include "median.h" namespace { @@ -56,22 +60,36 @@ bool checkRawImageThumb (const rtengine::RawImage& raw_image) } -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(); + const int height = ri->get_iheight(); + const int width = ri->get_iwidth(); + const int top_margin = ri->get_topmargin(); + const int left_margin = ri->get_leftmargin(); + const int raw_width = ri->get_rawwidth(); + const bool isFloat = ri->isFloat(); + const float * const float_raw_image = ri->get_FloatRawImage(); if (ri->isBayer()) { - 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); int col = 0; for (; col < width - 1; col += 2) { - float val0 = image[row * width + col][c0]; - float val1 = image[row * width + col + 1][c1]; + float val0; + float val1; + if (isFloat) { + val0 = float_raw_image[(row + top_margin) * raw_width + col + left_margin]; + val1 = float_raw_image[(row + top_margin) * raw_width + col + left_margin + 1]; + } else { + val0 = image[row * width + col][c0]; + val1 = image[row * width + col + 1][c1]; + } val0 -= cblack[c0]; val1 -= cblack[c1]; val0 *= scale_mul[c0]; @@ -81,18 +99,23 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4]) } if (col < width) { // in case width is odd - float val0 = image[row * width + col][c0]; + float val0; + if (isFloat) { + val0 = float_raw_image[(row + top_margin) * raw_width + col + left_margin]; + } else { + val0 = image[row * width + col][c0]; + } val0 -= cblack[c0]; val0 *= scale_mul[c0]; image[row * width + col][c0] = rtengine::CLIP (val0); } } } 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); } @@ -102,7 +125,12 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4]) for (; col < width - 5; col += 6) { for (int i = 0; i < 6; ++i) { const unsigned ccol = c[i]; - float val = image[row * width + col + i][ccol]; + float val; + if (isFloat) { + val = float_raw_image[(row + top_margin) * raw_width + col + i + left_margin]; + } else { + val = image[row * width + col + i][ccol]; + } val -= cblack[ccol]; val *= scale_mul[ccol]; image[row * width + col + i][ccol] = rtengine::CLIP (val); @@ -111,15 +139,37 @@ void scale_colors (rtengine::RawImage *ri, float scale_mul[4], float cblack[4]) for (; col < width; ++col) { // remaining columns const unsigned ccol = ri->XTRANSFC (row, col); - float val = image[row * width + col][ccol]; + float val; + if (isFloat) { + val = float_raw_image[(row + top_margin) * raw_width + col + left_margin]; + } else { + val = image[row * width + col][ccol]; + } val -= cblack[ccol]; val *= scale_mul[ccol]; image[row * width + col][ccol] = rtengine::CLIP (val); } } + } else if (isFloat) { +#ifdef _OPENMP + #pragma omp parallel for if(multiThread) +#endif + for (int row = 0; row < height; ++row) { + for (int col = 0; col < width; ++col) { + for (int i = 0; i < ri->get_colors(); ++i) { + float val = float_raw_image[(row + top_margin) * raw_width + col + left_margin + i]; + val -= cblack[i]; + val *= scale_mul[i]; + image[row * width + col][i] = val; + } + } + } } 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]; @@ -137,6 +187,9 @@ extern Options options; namespace rtengine { + +extern const Settings *settings; + using namespace procparams; Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode) @@ -233,6 +286,11 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, printf ("loadFromImage: Unsupported image type \"%s\"!\n", img->getType()); } + ProcParams paramsForAutoExp; // Dummy for constructor + ImProcFunctions ipf (¶msForAutoExp, false); + ipf.getAutoExp (tpp->aeHistogram, tpp->aeHistCompression, 0.02, tpp->aeExposureCompensation, tpp->aeLightness, tpp->aeContrast, tpp->aeBlack, tpp->aeHighlightCompression, tpp->aeHighlightCompressionThreshold); + tpp->aeValid = true; + if (n > 0) { ColorTemp cTemp; @@ -251,13 +309,93 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h, return tpp; } -Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode) + +namespace { + +Image8 *load_inspector_mode(const Glib::ustring &fname, RawMetaDataLocation &rml, eSensorType &sensorType, int &w, int &h) { + BENCHFUN + + RawImageSource src; + int err = src.load(fname, true); + if (err) { + return nullptr; + } + + src.getFullSize(w, h); + sensorType = src.getSensorType(); + + ProcParams neutral; + neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); + neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); + neutral.icm.inputProfile = "(camera)"; + neutral.icm.workingProfile = options.rtSettings.srgb; + + src.preprocess(neutral.raw, neutral.lensProf, neutral.coarse, false); + double thresholdDummy = 0.f; + src.demosaic(neutral.raw, false, thresholdDummy); + + PreviewProps pp(0, 0, w, h, 1); + + Imagefloat tmp(w, h); + src.getImage(src.getWB(), TR_NONE, &tmp, pp, neutral.toneCurve, neutral.raw); + src.convertColorSpace(&tmp, neutral.icm, src.getWB()); + + Image8 *img = new Image8(w, h); + const float f = 255.f/65535.f; +#ifdef _OPENMP + #pragma omp parallel for +#endif + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + float r = tmp.r(y, x); + float g = tmp.g(y, x); + float b = tmp.b(y, x); + // avoid magenta highlights + if (r > MAXVALF && b > MAXVALF) { + float v = CLIP((r + g + b) / 3.f) * f; + img->r(y, x) = img->g(y, x) = img->b(y, x) = v; + } else { + img->r(y, x) = Color::gamma_srgbclipped(r) * f; + img->g(y, x) = Color::gamma_srgbclipped(g) * f; + img->b(y, x) = Color::gamma_srgbclipped(b) * f; + } + } + } + + return img; +} + +} // namespace + +Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode, bool forHistogramMatching) +{ + Thumbnail* tpp = new Thumbnail (); + tpp->isRaw = 1; + memset (tpp->colorMatrix, 0, sizeof (tpp->colorMatrix)); + tpp->colorMatrix[0][0] = 1.0; + tpp->colorMatrix[1][1] = 1.0; + tpp->colorMatrix[2][2] = 1.0; + + if (inspectorMode && !forHistogramMatching && settings->thumbnail_inspector_mode == Settings::ThumbnailInspectorMode::RAW) { + Image8 *img = load_inspector_mode(fname, rml, sensorType, w, h); + if (!img) { + delete tpp; + return nullptr; + } + + tpp->scale = 1.; + tpp->thumbImg = img; + + return tpp; + } + RawImage *ri = new RawImage (fname); unsigned int imageNum = 0; int r = ri->loadRaw (false, imageNum, false); if ( r ) { + delete tpp; delete ri; sensorType = ST_NONE; return nullptr; @@ -290,25 +428,36 @@ Thumbnail* Thumbnail::loadQuickFromRaw (const Glib::ustring& fname, RawMetaDataL // did we succeed? if ( err ) { - printf ("Could not extract thumb from %s\n", fname.data()); + if (options.rtSettings.verbose) { + std::cout << "Could not extract thumb from " << fname.c_str() << std::endl; + } + delete tpp; delete img; delete ri; return nullptr; } - Thumbnail* tpp = new Thumbnail (); - - tpp->isRaw = 1; - memset (tpp->colorMatrix, 0, sizeof (tpp->colorMatrix)); - tpp->colorMatrix[0][0] = 1.0; - tpp->colorMatrix[1][1] = 1.0; - tpp->colorMatrix[2][2] = 1.0; - if (inspectorMode) { // Special case, meaning that we want a full sized thumbnail image (e.g. for the Inspector feature) w = img->getWidth(); h = img->getHeight(); tpp->scale = 1.; + + if (!forHistogramMatching && settings->thumbnail_inspector_mode == Settings::ThumbnailInspectorMode::RAW_IF_NOT_JPEG_FULLSIZE && float(std::max(w, h))/float(std::max(ri->get_width(), ri->get_height())) < 0.9f) { + delete img; + delete ri; + + img = load_inspector_mode(fname, rml, sensorType, w, h); + if (!img) { + delete tpp; + return nullptr; + } + + tpp->scale = 1.; + tpp->thumbImg = img; + + return tpp; + } } else { if (fixwh == 1) { w = h * img->getWidth() / img->getHeight(); @@ -385,7 +534,7 @@ RawMetaDataLocation Thumbnail::loadMetaDataFromRaw (const Glib::ustring& fname) return rml; } -Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, double wbEq, bool rotate) +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; @@ -417,10 +566,9 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati 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(); @@ -433,6 +581,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati tpp->camwbBlue = tpp->blueMultiplier / pre_mul[2]; //ri->get_pre_mul(2); //tpp->defGain = 1.0 / min(ri->get_pre_mul(0), ri->get_pre_mul(1), ri->get_pre_mul(2)); tpp->defGain = max (scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]) / min (scale_mul[0], scale_mul[1], scale_mul[2], scale_mul[3]); + tpp->defGain *= std::pow(2, ri->getBaselineExposure()); tpp->gammaCorrected = true; @@ -465,8 +614,8 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati skip--; } - if (skip < 1) { - skip = 1; + if (skip < 2) { + skip = 2; } int hskip = skip, vskip = skip; @@ -662,154 +811,160 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati } else { tpp->scale = (double) height / (rotate_90 ? w : h); } + if(!forHistogramMatching) { // we don't need this for histogram matching - // generate histogram for auto exposure, also calculate autoWB - tpp->aeHistCompression = 3; - tpp->aeHistogram(65536 >> tpp->aeHistCompression); - tpp->aeHistogram.clear(); + // generate histogram for auto exposure, also calculate autoWB + tpp->aeHistCompression = 3; + tpp->aeHistogram(65536 >> tpp->aeHistCompression); + tpp->aeHistogram.clear(); - const unsigned int add = filter ? 1 : 4 / ri->get_colors(); + const unsigned int add = filter ? 1 : 4 / ri->get_colors(); - 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; + 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; + 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]++; + 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; } - } 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++; + + if (ri->get_colors() == 1) { + for (int j = start; j < end; j++) { + tpp->aeHistogram[image[i * width + j][0] >> tpp->aeHistCompression]++; } - double v1 = image[i * width + j + 1][c1]; - tpp->aeHistogram[(int)(camWb[c1] * v1)]++; - if (v1 <= clipval) { - pixSum1 += v1; - n1++; + } 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++; + } + double v1 = image[i * width + j + 1][c1]; + tpp->aeHistogram[(int)(camWb[c1] * v1)]++; + if (v1 <= clipval) { + pixSum1 += v1; + n1++; + } } - } - if (j < end) { - double v0 = image[i * width + j][c0]; - tpp->aeHistogram[(int)(camWb[c0] * v0)]++; - if (v0 <= clipval) { - pixSum0 += v0; - n0++; + if (j < end) { + double v0 = image[i * width + j][c0]; + tpp->aeHistogram[(int)(camWb[c0] * v0)]++; + if (v0 <= clipval) { + pixSum0 += v0; + n0++; + } } - } - 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) { + 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) { - 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]]++; + 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]]++; + } } } - } - 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]++; + 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]++; + } } - } 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; + } + } 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]++; } - } 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; + double g = image[i * width + j][1]; + if (g <= clipval) { + pixSum[1] += g; + n[1]++; + } + 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; } } - } 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]++; - } - double g = image[i * width + j][1]; - if (g <= clipval) { - pixSum[1] += g; - n[1]++; - } - 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; - } } + ProcParams paramsForAutoExp; // Dummy for constructor + ImProcFunctions ipf (¶msForAutoExp, false); + ipf.getAutoExp (tpp->aeHistogram, tpp->aeHistCompression, 0.02, tpp->aeExposureCompensation, tpp->aeLightness, tpp->aeContrast, tpp->aeBlack, tpp->aeHighlightCompression, tpp->aeHighlightCompressionThreshold); + tpp->aeValid = true; + + 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); } - 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); - if (rotate && ri->get_rotateDegree() > 0) { tpp->thumbImg->rotate (ri->get_rotateDegree()); } @@ -858,6 +1013,13 @@ Thumbnail::Thumbnail () : wbEqual (-1.0), wbTempBias (0.0), aeHistCompression (3), + aeValid(false), + aeExposureCompensation(0.0), + aeLightness(0), + aeContrast(0), + aeBlack(0), + aeHighlightCompression(0), + aeHighlightCompressionThreshold(0), embProfileLength (0), embProfileData (nullptr), embProfile (nullptr), @@ -920,7 +1082,7 @@ IImage8* Thumbnail::quickProcessImage (const procparams::ProcParams& params, int } // Full thumbnail processing, second stage if complete profile exists -IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& myscale, bool forMonitor) +IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& myscale, bool forMonitor, bool forHistogramMatching) { unsigned int imgNum = 0; if (isRaw) { @@ -984,7 +1146,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT gmi = gm * defGain / mul_lum; bmi = bm * defGain / mul_lum; - // The RAW exposure is not reflected since it's done in preprocessing. If we only have e.g. the chached thumb, + // The RAW exposure is not reflected since it's done in preprocessing. If we only have e.g. the cached thumb, // that is already preprocessed. So we simulate the effect here roughly my modifying the exposure accordingly if (isRaw) { rmi *= params.raw.expos; @@ -1028,12 +1190,17 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT for (int j = 0; j < rwidth; j++) { float red = baseImg->r (i, j) * rmi; - baseImg->r (i, j) = CLIP (red); float green = baseImg->g (i, j) * gmi; - baseImg->g (i, j) = CLIP (green); float blue = baseImg->b (i, j) * bmi; - baseImg->b (i, j) = CLIP (blue); - + + // avoid magenta highlights if highlight recovery is enabled + if (params.toneCurve.hrenabled && red > MAXVALF && blue > MAXVALF) { + baseImg->r(i, j) = baseImg->g(i, j) = baseImg->b(i, j) = CLIP((red + green + blue) / 3.f); + } else { + baseImg->r(i, j) = CLIP(red); + baseImg->g(i, j) = CLIP(green); + baseImg->b(i, j) = CLIP(blue); + } } } @@ -1052,17 +1219,16 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT 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); + ipf.updateColorProfiles (ICCStore::getInstance()->getDefaultMonitorProfileName(), RenderingIntent(options.rtSettings.monitorIntent), false, false); LUTu hist16 (65536); ipf.firstAnalysis (baseImg, params, hist16); - if (params.fattal.enabled) { - ipf.ToneMapFattal02(baseImg); - } + ipf.dehaze(baseImg); + ipf.ToneMapFattal02(baseImg); // perform transform if (ipf.needsTransform()) { @@ -1076,21 +1242,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT baseImg = trImg; } - // update blurmap - SHMap* shmap = nullptr; - - if (params.sh.enabled) { - shmap = new SHMap (fw, fh, false); - double radius = sqrt (double (fw * fw + fh * fh)) / 2.0; - double shradius = params.sh.radius; - - if (!params.sh.hq) { - shradius *= radius / 1800.0; - } - - shmap->update (baseImg, shradius, ipf.lumimul, params.sh.hq, 16); - } - // RGB processing double expcomp = params.toneCurve.expcomp; int bright = params.toneCurve.brightness; @@ -1099,8 +1250,17 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT int hlcompr = params.toneCurve.hlcompr; int hlcomprthresh = params.toneCurve.hlcomprthresh; - if (params.toneCurve.autoexp && aeHistogram) { - ipf.getAutoExp (aeHistogram, aeHistCompression, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + if (params.toneCurve.autoexp) { + if (aeValid) { + expcomp = aeExposureCompensation; + bright = aeLightness; + contr = aeContrast; + black = aeBlack; + hlcompr = aeHighlightCompression; + hlcomprthresh = aeHighlightCompressionThreshold; + } else if (aeHistogram) { + ipf.getAutoExp (aeHistogram, aeHistCompression, 0.02, expcomp, bright, contr, black, hlcompr, hlcomprthresh); + } } LUTf curve1 (65536); @@ -1140,7 +1300,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT bool opautili = false; if (params.colorToning.enabled) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); double wp[3][3] = { {wprof[0][0], wprof[0][1], wprof[0][2]}, {wprof[1][0], wprof[1][1], wprof[1][2]}, @@ -1192,15 +1352,15 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT if (isRaw) { cmsHPROFILE dummy; - RawImageSource::findInputProfile (params.icm.input, nullptr, camName, &dcpProf, dummy); + RawImageSource::findInputProfile (params.icm.inputProfile, nullptr, camName, &dcpProf, dummy); if (dcpProf) { - dcpProf->setStep2ApplyState (params.icm.working, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset, as); + dcpProf->setStep2ApplyState (params.icm.workingProfile, params.icm.toneCurve, params.icm.applyLookTable, params.icm.applyBaselineExposureOffset, as); } } LUTu histToneCurve; - ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, shmap, params.toneCurve.saturation, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, expcomp, hlcompr, hlcomprthresh, dcpProf, as, histToneCurve); + ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, params.toneCurve.saturation, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, expcomp, hlcompr, hlcomprthresh, dcpProf, as, histToneCurve); // freeing up some memory customToneCurve1.Reset(); @@ -1210,10 +1370,6 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT customToneCurvebw1.Reset(); customToneCurvebw2.Reset(); - if (shmap) { - delete shmap; - } - // luminance histogram update if (params.labCurve.contrast != 0) { hist16.clear(); @@ -1224,6 +1380,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT } } + // luminance processing // ipf.EPDToneMap(labView,0,6); @@ -1241,11 +1398,14 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT ipf.chromiLuminanceCurve (nullptr, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy); ipf.vibrance (labView); + ipf.labColorCorrectionRegions(labView); if ((params.colorappearance.enabled && !params.colorappearance.tonecie) || !params.colorappearance.enabled) { ipf.EPDToneMap (labView, 5, 6); } + ipf.softLight(labView); + if (params.colorappearance.enabled) { CurveFactory::curveLightBrightColor ( params.colorappearance.curve, @@ -1293,7 +1453,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT 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; } - + // color processing //ipf.colorCurve (labView, labView); @@ -1303,7 +1463,7 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, eSensorT readyImg = new Image8 (fw, fh); ipf.lab2monitorRgb (labView, readyImg); } else { - readyImg = ipf.lab2rgb(labView, 0, 0, fw, fh, params.icm); + readyImg = ipf.lab2rgb(labView, 0, 0, fw, fh, params.icm, false); } delete labView; delete baseImg; @@ -1782,46 +1942,53 @@ bool Thumbnail::readImage (const Glib::ustring& fname) Glib::ustring fullFName = fname + ".rtti"; - if (!Glib::file_test (fullFName, Glib::FILE_TEST_EXISTS)) { + if (!Glib::file_test(fullFName, Glib::FILE_TEST_EXISTS)) { return false; } - FILE* f = g_fopen (fullFName.c_str (), "rb"); + FILE* f = g_fopen(fullFName.c_str (), "rb"); if (!f) { return false; } char imgType[31]; // 30 -> arbitrary size, but should be enough for all image type's name - fgets (imgType, 30, f); - imgType[strlen (imgType) - 1] = '\0'; // imgType has a \n trailing character, so we overwrite it by the \0 char + fgets(imgType, 30, f); + imgType[strlen(imgType) - 1] = '\0'; // imgType has a \n trailing character, so we overwrite it by the \0 char guint32 width, height; - fread (&width, 1, sizeof (guint32), f); - fread (&height, 1, sizeof (guint32), f); + + if (fread(&width, 1, sizeof(guint32), f) < sizeof(guint32)) { + width = 0; + } + + if (fread(&height, 1, sizeof(guint32), f) < sizeof(guint32)) { + height = 0; + } bool success = false; - if (!strcmp (imgType, sImage8)) { - Image8 *image = new Image8 (width, height); - image->readData (f); - thumbImg = image; - success = true; - } else if (!strcmp (imgType, sImage16)) { - Image16 *image = new Image16 (width, height); - image->readData (f); - thumbImg = image; - success = true; - } else if (!strcmp (imgType, sImagefloat)) { - Imagefloat *image = new Imagefloat (width, height); - image->readData (f); - thumbImg = image; - success = true; - } else { - printf ("readImage: Unsupported image type \"%s\"!\n", imgType); + if (std::min(width , height) > 0) { + if (!strcmp(imgType, sImage8)) { + Image8 *image = new Image8(width, height); + image->readData(f); + thumbImg = image; + success = true; + } else if (!strcmp(imgType, sImage16)) { + Image16 *image = new Image16(width, height); + image->readData(f); + thumbImg = image; + success = true; + } else if (!strcmp(imgType, sImagefloat)) { + Imagefloat *image = new Imagefloat(width, height); + image->readData(f); + thumbImg = image; + success = true; + } else { + printf ("readImage: Unsupported image type \"%s\"!\n", imgType); + } } - - fclose (f); + fclose(f); return success; } @@ -1868,6 +2035,38 @@ bool Thumbnail::readData (const Glib::ustring& fname) aeHistCompression = keyFile.get_integer ("LiveThumbData", "AEHistCompression"); } + aeValid = true; + if (keyFile.has_key ("LiveThumbData", "AEExposureCompensation")) { + aeExposureCompensation = keyFile.get_double ("LiveThumbData", "AEExposureCompensation"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AELightness")) { + aeLightness = keyFile.get_integer ("LiveThumbData", "AELightness"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEContrast")) { + aeContrast = keyFile.get_integer ("LiveThumbData", "AEContrast"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEBlack")) { + aeBlack = keyFile.get_integer ("LiveThumbData", "AEBlack"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEHighlightCompression")) { + aeHighlightCompression = keyFile.get_integer ("LiveThumbData", "AEHighlightCompression"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "AEHighlightCompressionThreshold")) { + aeHighlightCompressionThreshold = keyFile.get_integer ("LiveThumbData", "AEHighlightCompressionThreshold"); + } else { + aeValid = false; + } + if (keyFile.has_key ("LiveThumbData", "RedMultiplier")) { redMultiplier = keyFile.get_double ("LiveThumbData", "RedMultiplier"); } @@ -1941,7 +2140,12 @@ bool Thumbnail::writeData (const Glib::ustring& fname) keyFile.set_double ("LiveThumbData", "RedAWBMul", redAWBMul); keyFile.set_double ("LiveThumbData", "GreenAWBMul", greenAWBMul); keyFile.set_double ("LiveThumbData", "BlueAWBMul", blueAWBMul); - keyFile.set_integer ("LiveThumbData", "AEHistCompression", aeHistCompression); + keyFile.set_double ("LiveThumbData", "AEExposureCompensation", aeExposureCompensation); + keyFile.set_integer ("LiveThumbData", "AELightness", aeLightness); + keyFile.set_integer ("LiveThumbData", "AEContrast", aeContrast); + keyFile.set_integer ("LiveThumbData", "AEBlack", aeBlack); + keyFile.set_integer ("LiveThumbData", "AEHighlightCompression", aeHighlightCompression); + keyFile.set_integer ("LiveThumbData", "AEHighlightCompressionThreshold", aeHighlightCompressionThreshold); keyFile.set_double ("LiveThumbData", "RedMultiplier", redMultiplier); keyFile.set_double ("LiveThumbData", "GreenMultiplier", greenMultiplier); keyFile.set_double ("LiveThumbData", "BlueMultiplier", blueMultiplier); @@ -2002,7 +2206,7 @@ bool Thumbnail::readEmbProfile (const Glib::ustring& fname) if (!fseek (f, 0, SEEK_SET)) { embProfileData = new unsigned char[embProfileLength]; - fread (embProfileData, 1, embProfileLength, f); + embProfileLength = fread (embProfileData, 1, embProfileLength, f); embProfile = cmsOpenProfileFromMem (embProfileData, embProfileLength); } } @@ -2034,14 +2238,19 @@ bool Thumbnail::writeEmbProfile (const Glib::ustring& fname) bool Thumbnail::readAEHistogram (const Glib::ustring& fname) { - FILE* f = g_fopen (fname.c_str (), "rb"); + FILE* f = g_fopen(fname.c_str(), "rb"); if (!f) { - aeHistogram (0); + aeHistogram.reset(); } else { - aeHistogram (65536 >> aeHistCompression); - fread (&aeHistogram[0], 1, (65536 >> aeHistCompression)*sizeof (aeHistogram[0]), f); + aeHistogram(65536 >> aeHistCompression); + const size_t histoBytes = (65536 >> aeHistCompression) * sizeof(aeHistogram[0]); + const size_t bytesRead = fread(&aeHistogram[0], 1, histoBytes, f); fclose (f); + if (bytesRead != histoBytes) { + aeHistogram.reset(); + return false; + } return true; } diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index 902f264fc..df33b892d 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -20,7 +20,6 @@ #define _THUMBPROCESSINGPARAMETERS_ #include "rawmetadatalocation.h" -#include "procparams.h" #include #include #include "image8.h" @@ -50,6 +49,13 @@ class Thumbnail double autoWBTemp, autoWBGreen, wbEqual, wbTempBias; // autoWBTemp and autoWBGreen are updated each time autoWB is requested and if wbEqual has been modified LUTu aeHistogram; int aeHistCompression; + bool aeValid; + double aeExposureCompensation; + int aeLightness; + int aeContrast; + int aeBlack; + int aeHighlightCompression; + int aeHighlightCompressionThreshold; int embProfileLength; unsigned char* embProfileData; cmsHPROFILE embProfile; @@ -71,13 +77,13 @@ public: void init (); - IImage8* processImage (const procparams::ProcParams& pparams, eSensorType sensorType, int rheight, TypeInterpolation interp, const FramesMetaData *metadata, double& scale, bool forMonitor=true); + 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, 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); + static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, eSensorType &sensorType, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false, bool forHistogramMatching = 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); @@ -100,6 +106,7 @@ public: bool readAEHistogram (const Glib::ustring& fname); bool writeAEHistogram (const Glib::ustring& fname); + bool isAeValid() { return aeValid; }; unsigned char* getImage8Data(); // accessor to the 8bit image if it is one, which should be the case for the "Inspector" mode. // Hombre: ... let's hope that proper template can make this cleaner @@ -148,7 +155,7 @@ public: } return imgPtr; - }; + } }; } diff --git a/rtengine/settings.h b/rtengine/settings.h index 8f24f18f1..1fc3b222c 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -19,8 +19,6 @@ #ifndef _RTSETTINGS_ #define _RTSETTINGS_ -#include "procparams.h" - namespace rtengine { @@ -30,19 +28,19 @@ class Settings public: Glib::ustring iccDirectory; ///< The directory containing the possible output icc profiles int viewingdevice; // white of output device (D50...D65..) - int viewingdevicegrey; // level of grey output device + int viewingdevicegrey; // level of grey output device int viewinggreySc; // level of grey Scene - int leveldnv; // level of crop denoise - int leveldnti; // size of tiles denoise + int leveldnv; // level of crop denoise + int leveldnti; // size of tiles denoise int leveldnaut; // level of auto denoise int leveldnliss; // level of auto multi zone - int leveldnautsimpl; // STD or EXPERT + int leveldnautsimpl; // STD or EXPERT Glib::ustring printerProfile; ///< ICC profile name used for soft-proofing a printer output - RenderingIntent printerIntent; ///< Colorimetric intent used with the above profile + int printerIntent; ///< Colorimetric intent used with the above profile bool printerBPC; ///< Black Point Compensation for the Labimage->Printer->Monitor transform Glib::ustring monitorProfile; ///< ICC profile name used for the monitor - RenderingIntent monitorIntent; ///< Colorimetric intent used with the above profile + int monitorIntent; ///< Colorimetric intent used with the above profile bool monitorBPC; ///< Black Point Compensation for the Labimage->Monitor transform (directly, i.e. not soft-proofing and no WCS in between) bool autoMonitorProfile; ///< Try to auto-determine the correct monitor color profile bool autocielab; @@ -50,22 +48,22 @@ public: bool verbose; Glib::ustring darkFramesPath; ///< The default directory for dark frames Glib::ustring flatFieldsPath; ///< The default directory for flat fields - Glib::ustring adobe; // default name of AdobeRGB1998 - Glib::ustring prophoto; // default name of Prophoto - Glib::ustring prophoto10; // default name of Prophoto - Glib::ustring widegamut; //default name of WidegamutRGB - Glib::ustring beta; // default name of BetaRGB - Glib::ustring best; // default name of BestRGB - Glib::ustring bruce; // default name of Bruce - Glib::ustring srgb; // default name of SRGB space profile - Glib::ustring srgb10; // default name of SRGB space profile - Glib::ustring rec2020; // default name of rec2020 + Glib::ustring adobe; // filename of AdobeRGB1998 profile (default to the bundled one) + Glib::ustring prophoto; // filename of Prophoto profile (default to the bundled one) + Glib::ustring widegamut; // filename of WidegamutRGB profile (default to the bundled one) + Glib::ustring beta; // filename of BetaRGB profile (default to the bundled one) + Glib::ustring best; // filename of BestRGB profile (default to the bundled one) + Glib::ustring bruce; // filename of BruceRGB profile (default to the bundled one) + Glib::ustring srgb; // filename of sRGB profile (default to the bundled one) + Glib::ustring rec2020; // filename of Rec2020 profile (default to the bundled one) + Glib::ustring ACESp0; // filename of ACES P0 profile (default to the bundled one) + Glib::ustring ACESp1; // filename of ACES P1 profile (default to the bundled one) bool gamutICC; // no longer used bool gamutLch; - bool ciecamfloat; - bool HistogramWorking; + bool HistogramWorking; // true: histogram is display the value of the image computed in the Working profile + // false: histogram is display the value of the image computed in the Output profile int amchroma; int protectred; double protectredh; @@ -80,17 +78,23 @@ public: // double colortoningab; // // double decaction; // bool bw_complementary; - double artifact_cbdl; double level0_cbdl; double level123_cbdl; 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) - + + enum class ThumbnailInspectorMode { + JPEG, + RAW, + RAW_IF_NOT_JPEG_FULLSIZE + }; + ThumbnailInspectorMode thumbnail_inspector_mode; + /** Creates a new instance of Settings. * @return a pointer to the new Settings instance. */ - static Settings* create (); + static Settings* create(); /** Destroys an instance of Settings. * @param s a pointer to the Settings instance to destroy. */ - static void destroy (Settings* s); + static void destroy(Settings* s); }; } diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc index 26674c906..1eb911220 100644 --- a/rtengine/shmap.cc +++ b/rtengine/shmap.cc @@ -30,7 +30,7 @@ namespace rtengine extern const Settings* settings; -SHMap::SHMap (int w, int h, bool multiThread) : max_f(0.f), min_f(0.f), avg(0.f), W(w), H(h), multiThread(multiThread) +SHMap::SHMap (int w, int h) : max_f(0.f), min_f(0.f), avg(0.f), W(w), H(h) { map = new float*[H]; @@ -124,7 +124,7 @@ void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int rangefn[lutSize - 1] = 1e-15f; // We need one temporary buffer - const JaggedArray buffer (W, H); + JaggedArray buffer (W, H); // the final result has to be in map // for an even number of levels that means: map => buffer, buffer => map @@ -255,7 +255,7 @@ void SHMap::updateL (float** L, double radius, bool hq, int skip) //printf("lut=%d rf5=%f rfm=%f\n thre=%f",lutSize, rangefn[5],rangefn[lutSize-10],thresh ); // We need one temporary buffer - const JaggedArray buffer (W, H); + JaggedArray buffer (W, H); // the final result has to be in map // for an even number of levels that means: map => buffer, buffer => map @@ -358,7 +358,7 @@ void SHMap::forceStat (float max_, float min_, float avg_) 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 @@ SSEFUNCTION void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, i #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 @@ SSEFUNCTION void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, i 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 @@ SSEFUNCTION void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, i #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 @@ SSEFUNCTION void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, i 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 --git a/rtengine/shmap.h b/rtengine/shmap.h index 9bb496b54..4234e203d 100644 --- a/rtengine/shmap.h +++ b/rtengine/shmap.h @@ -34,7 +34,7 @@ public: float** map; float max_f, min_f, avg; - SHMap (int w, int h, bool multiThread); + SHMap (int w, int h); ~SHMap (); void update (Imagefloat* img, double radius, double lumi[3], bool hq, int skip); @@ -43,7 +43,6 @@ public: private: int W, H; - bool multiThread; void fillLuminance( Imagefloat * img, float **luminance, double lumi[3] ); void fillLuminanceL( float ** L, float **luminance ); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 951212a77..0a7f0bde6 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -24,6 +24,7 @@ #include "iccstore.h" #include "clutstore.h" #include "processingjob.h" +#include "procparams.h" #include #include "../rtgui/options.h" #include "rawimagesource.h" @@ -159,6 +160,15 @@ private: imgsrc = ii->getImageSource (); tr = getCoarseBitMask (params.coarse); + if(imgsrc->getSensorType() == ST_BAYER) { + if(params.raw.bayersensor.method!= RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + imgsrc->setBorder(params.raw.bayersensor.border); + } else { + imgsrc->setBorder(std::max(params.raw.bayersensor.border, 2)); + } + } else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) { + imgsrc->setBorder(params.raw.xtranssensor.border); + } imgsrc->getFullSize (fw, fh, tr); // check the crop params @@ -196,19 +206,22 @@ private: ipf_p.reset (new ImProcFunctions (¶ms, true)); ImProcFunctions &ipf = * (ipf_p.get()); - pp = PreviewProps (0, 0, fw, fh, 1); imgsrc->setCurrentFrame (params.raw.bayersensor.imageNum); imgsrc->preprocess ( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); if (pl) { pl->setProgress (0.20); } + bool autoContrast = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicAutoContrast : params.raw.xtranssensor.dualDemosaicAutoContrast; + double contrastThreshold = imgsrc->getSensorType() == ST_BAYER ? params.raw.bayersensor.dualDemosaicContrast : params.raw.xtranssensor.dualDemosaicContrast; + + imgsrc->demosaic (params.raw, autoContrast, contrastThreshold); - imgsrc->demosaic ( params.raw); if (pl) { pl->setProgress (0.30); } + pp = PreviewProps (0, 0, fw, fh, 1); if (params.retinex.enabled) { //enabled Retinex LUTf cdcurve (65536, 0); @@ -325,13 +338,17 @@ private: LUTf gamcurve (65536, 0); float gam, gamthresh, gamslope; ipf.RGB_denoise_infoGamCurve (params.dirpyrDenoise, imgsrc->isRAW(), gamcurve, gam, gamthresh, gamslope); +#ifdef _OPENMP #pragma omp parallel +#endif { Imagefloat *origCropPart;//init auto noise origCropPart = new Imagefloat (crW, crH);//allocate memory Imagefloat *provicalc = new Imagefloat ((crW + 1) / 2, (crH + 1) / 2); //for denoise curves int skipP = 1; +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) nowait +#endif for (int wcr = 0; wcr < numtiles_W; wcr++) { for (int hcr = 0; hcr < numtiles_H; hcr++) { @@ -367,26 +384,26 @@ private: float multip = 1.f; float adjustr = 1.f; - if (params.icm.working == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; // - } else if (params.icm.working == "Adobe RGB") { + } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "sRGB") { + } else if (params.icm.workingProfile == "sRGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "WideGamut") { + } else if (params.icm.workingProfile == "WideGamut") { adjustr = 1.f / 1.1f; - } else if (params.icm.working == "Rec2020") { + } else if (params.icm.workingProfile == "Rec2020") { adjustr = 1.f / 1.1f; - } else if (params.icm.working == "Beta RGB") { + } else if (params.icm.workingProfile == "Beta RGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BestRGB") { + } else if (params.icm.workingProfile == "BestRGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BruceRGB") { + } else if (params.icm.workingProfile == "BruceRGB") { adjustr = 1.f / 1.2f; } 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); @@ -537,7 +554,7 @@ private: 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; @@ -547,13 +564,17 @@ private: coordH[0] = begH; coordH[1] = fh / 2 - crH / 2; coordH[2] = fh - crH - begH; +#ifdef _OPENMP #pragma omp parallel +#endif { Imagefloat *origCropPart;//init auto noise origCropPart = new Imagefloat (crW, crH);//allocate memory Imagefloat *provicalc = new Imagefloat ((crW + 1) / 2, (crH + 1) / 2); //for denoise curves +#ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) nowait +#endif for (int wcr = 0; wcr <= 2; wcr++) { for (int hcr = 0; hcr <= 2; hcr++) { @@ -610,26 +631,26 @@ private: float MinRMoy = 0.f; float MinBMoy = 0.f; - if (params.icm.working == "ProPhoto") { + if (params.icm.workingProfile == "ProPhoto") { adjustr = 1.f; - } else if (params.icm.working == "Adobe RGB") { + } else if (params.icm.workingProfile == "Adobe RGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "sRGB") { + } else if (params.icm.workingProfile == "sRGB") { adjustr = 1.f / 1.3f; - } else if (params.icm.working == "WideGamut") { + } else if (params.icm.workingProfile == "WideGamut") { adjustr = 1.f / 1.1f; - } else if (params.icm.working == "Rec2020") { + } else if (params.icm.workingProfile == "Rec2020") { adjustr = 1.f / 1.1f; - } else if (params.icm.working == "Beta RGB") { + } else if (params.icm.workingProfile == "Beta RGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BestRGB") { + } else if (params.icm.workingProfile == "BestRGB") { adjustr = 1.f / 1.2f; - } else if (params.icm.working == "BruceRGB") { + } else if (params.icm.workingProfile == "BruceRGB") { adjustr = 1.f / 1.2f; } 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]; @@ -741,19 +762,20 @@ private: ipf.getAutoExp (aehist, aehistcompr, params.toneCurve.clip, expcomp, bright, contr, black, hlcompr, hlcomprthresh); } if (params.toneCurve.histmatching) { - imgsrc->getAutoMatchedToneCurve(params.toneCurve.curve); + if (!params.toneCurve.fromHistMatching) { + 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.curveMode = ToneCurveMode::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 @@ -796,7 +818,9 @@ private: if (denoiseParams.enabled && (noiseLCurve || noiseCCurve )) { // we only need image reduced to 1/4 here calclum = new Imagefloat ((fw + 1) / 2, (fh + 1) / 2); //for luminance denoise curve +#ifdef _OPENMP #pragma omp parallel for +#endif for (int ii = 0; ii < fh; ii += 2) { for (int jj = 0; jj < fw; jj += 2) { @@ -845,9 +869,8 @@ private: ipf.firstAnalysis (baseImg, params, hist16); - if (params.fattal.enabled) { - ipf.ToneMapFattal02(baseImg); - } + ipf.dehaze(baseImg); + ipf.ToneMapFattal02(baseImg); // perform transform (excepted resizing) if (ipf.needsTransform()) { @@ -876,24 +899,24 @@ private: const int W = baseImg->getWidth(); const int H = baseImg->getHeight(); LabImage labcbdl (W, H); - ipf.rgb2lab (*baseImg, labcbdl, params.icm.working); + ipf.rgb2lab (*baseImg, labcbdl, params.icm.workingProfile); ipf.dirpyrequalizer (&labcbdl, 1); - ipf.lab2rgb (labcbdl, *baseImg, params.icm.working); + ipf.lab2rgb (labcbdl, *baseImg, params.icm.workingProfile); } - // update blurmap - SHMap* shmap = nullptr; + //gamma TRC working + if (params.icm.workingTRC == "Custom") { //exec TRC IN free + const Glib::ustring profile = params.icm.workingProfile; - if (params.sh.enabled) { - shmap = new SHMap (fw, fh, true); - double radius = sqrt (double (fw * fw + fh * fh)) / 2.0; - double shradius = params.sh.radius; - - if (!params.sh.hq) { - shradius *= radius / 1800.0; + if (profile == "sRGB" || profile == "Adobe RGB" || profile == "ProPhoto" || profile == "WideGamut" || profile == "BruceRGB" || profile == "Beta RGB" || profile == "BestRGB" || profile == "Rec2020" || profile == "ACESp0" || profile == "ACESp1") { + const int cw = baseImg->getWidth(); + const int ch = baseImg->getHeight(); + cmsHTRANSFORM dummy = nullptr; + // put gamma TRC to 1 + ipf.workingtrc(baseImg, baseImg, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310, dummy, true, false, false); + //adjust TRC + ipf.workingtrc(baseImg, baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope, dummy, false, true, false); } - - shmap->update (baseImg, shradius, ipf.lumimul, params.sh.hq, 1); } // Spot Removal @@ -926,7 +949,7 @@ private: bool opautili = false; if (params.colorToning.enabled) { - TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.working); + TMatrix wprof = ICCStore::getInstance()->workingSpaceMatrix (params.icm.workingProfile); double wp[3][3] = { {wprof[0][0], wprof[0][1], wprof[0][2]}, {wprof[1][0], wprof[1][1], wprof[1][2]}, @@ -975,7 +998,7 @@ private: LUTu histToneCurve; - ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, shmap, params.toneCurve.saturation, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, expcomp, hlcompr, hlcomprthresh, dcpProf, as, histToneCurve); + ipf.rgbProc (baseImg, labView, nullptr, curve1, curve2, curve, params.toneCurve.saturation, rCurve, gCurve, bCurve, satLimit, satLimitOpacity, ctColorCurve, ctOpacityCurve, opautili, clToningcurve, cl2Toningcurve, customToneCurve1, customToneCurve2, customToneCurvebw1, customToneCurvebw2, rrm, ggm, bbm, autor, autog, autob, expcomp, hlcompr, hlcomprthresh, dcpProf, as, histToneCurve, options.chunkSizeRGB, options.measure); if (settings->verbose) { printf ("Output image / Auto B&W coefs: R=%.2f G=%.2f B=%.2f\n", autor, autog, autob); @@ -1000,12 +1023,6 @@ private: delete baseImg; baseImg = nullptr; - if (shmap) { - delete shmap; - } - - shmap = nullptr; - if (pl) { pl->setProgress (0.55); } @@ -1033,7 +1050,9 @@ private: hist16thr[ (int) ((labView->L[i][j]))]++; } +#ifdef _OPENMP #pragma omp critical +#endif { hist16 += hist16thr; } @@ -1058,6 +1077,7 @@ private: ipf.vibrance (labView); + ipf.labColorCorrectionRegions(labView); if ((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) { ipf.impulsedenoise (labView); @@ -1080,20 +1100,8 @@ private: } if (((params.colorappearance.enabled && !settings->autocielab) || (!params.colorappearance.enabled)) && params.sharpening.enabled) { + ipf.sharpening (labView, params.sharpening); - float **buffer = new float*[fh]; - - for (int i = 0; i < fh; i++) { - buffer[i] = new float[fw]; - } - - ipf.sharpening (labView, (float**)buffer, params.sharpening); - - for (int i = 0; i < fh; i++) { - delete [] buffer[i]; - } - - delete [] buffer; } WaveletParams WaveParams = params.wavelet; @@ -1123,6 +1131,8 @@ private: wavCLVCurve.Reset(); + ipf.softLight(labView); + //Colorappearance and tone-mapping associated int f_w = 1, f_h = 1; @@ -1172,23 +1182,8 @@ private: LUTf CAMBrightCurveQ; float CAMMean = NAN; - if (params.sharpening.enabled) { - if (settings->ciecamfloat) { - float d, dj, yb; - 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; - 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), 1, 2, labView, ¶ms, customColCurve1, customColCurve2, customColCurve3, dummy, dummy, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, true, d, dj, yb, 1); - } else { - 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); - } - } + float d, dj, yb; + 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); } delete cieView; @@ -1207,7 +1202,7 @@ private: int imw, imh; double tmpScale = ipf.resizeScale (¶ms, fw, fh, imw, imh); - bool labResize = params.resize.enabled && params.resize.method != "Nearest" && tmpScale != 1.0; + bool labResize = params.resize.enabled && params.resize.method != "Nearest" && (tmpScale != 1.0 || params.prsharpening.enabled); LabImage *tmplab; // crop and convert to rgb16 @@ -1238,65 +1233,42 @@ private: } if (labResize) { // resize lab data - // resize image - tmplab = new LabImage (imw, imh); - ipf.Lanczos (labView, tmplab, tmpScale); - delete labView; - labView = tmplab; + if ((labView->W != imw || labView->H != imh) && + (params.resize.allowUpscaling || (labView->W >= imw && labView->H >= imh))) { + // resize image + tmplab = new LabImage (imw, imh); + ipf.Lanczos (labView, tmplab, tmpScale); + delete labView; + labView = tmplab; + } cw = labView->W; ch = labView->H; if (params.prsharpening.enabled) { - for (int i = 0; i < ch; i++) + for (int i = 0; i < ch; i++) { for (int j = 0; j < cw; j++) { labView->L[i][j] = labView->L[i][j] < 0.f ? 0.f : labView->L[i][j]; } - - float **buffer = new float*[ch]; - - for (int i = 0; i < ch; i++) { - buffer[i] = new float[cw]; } - - ipf.sharpening (labView, (float**)buffer, params.prsharpening); - - for (int i = 0; i < ch; i++) { - delete [] buffer[i]; - } - - delete [] buffer; + ipf.sharpening (labView, params.prsharpening); } } - Imagefloat* readyImg = nullptr; cmsHPROFILE jprof = nullptr; - bool customGamma = false; - bool useLCMS = false; - bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili ; + constexpr bool customGamma = false; + constexpr bool useLCMS = false; + bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili && !params.colorappearance.enabled; - if (params.icm.gamma != "default" || params.icm.freegamma) { // if select gamma output between BT709, sRGB, linear, low, high, 2.2 , 1.8 + ///////////// Custom output gamma has been removed, the user now has to create + ///////////// a new output profile with the ICCProfileCreator - GammaValues ga; - // if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; - readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm, &ga); - customGamma = true; + // 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 - //or selected Free gamma - useLCMS = false; + Imagefloat* readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm); - if ((jprof = ICCStore::getInstance()->createCustomGammaOutputProfile (params.icm, ga)) == nullptr) { - useLCMS = true; - } - - } else { - // 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.lab2rgbOut (labView, cx, cy, cw, ch, params.icm); - - if (settings->verbose) { - printf ("Output profile_: \"%s\"\n", params.icm.output.c_str()); - } + if (settings->verbose) { + printf ("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str()); } delete labView; @@ -1321,7 +1293,8 @@ private: pl->setProgress (0.70); } - if (tmpScale != 1.0 && params.resize.method == "Nearest") { // resize rgb data (gamma applied) + if (tmpScale != 1.0 && params.resize.method == "Nearest" && + (params.resize.allowUpscaling || (readyImg->getWidth() >= imw && readyImg->getHeight() >= imh))) { // resize rgb data (gamma applied) Imagefloat* tempImage = new Imagefloat (imw, imh); ipf.resize (readyImg, tempImage, tmpScale); delete readyImg; @@ -1354,21 +1327,21 @@ private: } else { // use the selected output profile if present, otherwise use LCMS2 profile generate by lab2rgb16 w/ gamma - if (params.icm.output != "" && params.icm.output != ColorManagementParams::NoICMString) { + if (params.icm.outputProfile != "" && params.icm.outputProfile != ColorManagementParams::NoICMString) { // if ICCStore::getInstance()->getProfile send back an object, then ICCStore::getInstance()->getContent will do too - cmsHPROFILE jprof = ICCStore::getInstance()->getProfile (params.icm.output); //get outProfile + cmsHPROFILE jprof = ICCStore::getInstance()->getProfile (params.icm.outputProfile); //get outProfile if (jprof == nullptr) { if (settings->verbose) { - printf ("\"%s\" ICC output profile not found!\n - use LCMS2 substitution\n", params.icm.output.c_str()); + printf ("\"%s\" ICC output profile not found!\n - use LCMS2 substitution\n", params.icm.outputProfile.c_str()); } } else { if (settings->verbose) { - printf ("Using \"%s\" output profile\n", params.icm.output.c_str()); + printf ("Using \"%s\" output profile\n", params.icm.outputProfile.c_str()); } - ProfileContent pc = ICCStore::getInstance()->getContent (params.icm.output); + ProfileContent pc = ICCStore::getInstance()->getContent (params.icm.outputProfile); readyImg->setOutputProfile (pc.getData().c_str(), pc.getData().size()); } } else { @@ -1415,7 +1388,7 @@ private: double scale_factor = ipf.resizeScale (¶ms, fw, fh, imw, imh); std::unique_ptr tmplab (new LabImage (fw, fh)); - ipf.rgb2lab (*baseImg, *tmplab, params.icm.working); + ipf.rgb2lab (*baseImg, *tmplab, params.icm.workingProfile); if (params.crop.enabled) { int cx = params.crop.x; @@ -1439,7 +1412,7 @@ private: assert (params.resize.enabled); // resize image - { + if (params.resize.allowUpscaling || (imw <= fw && imh <= fh)) { std::unique_ptr resized (new LabImage (imw, imh)); ipf.Lanczos (tmplab.get(), resized.get(), scale_factor); tmplab = std::move (resized); @@ -1452,7 +1425,7 @@ private: delete baseImg; baseImg = new Imagefloat (fw, fh); - ipf.lab2rgb (*tmplab, *baseImg, params.icm.working); + ipf.lab2rgb (*tmplab, *baseImg, params.icm.workingProfile); } void adjust_procparams (double scale_factor) @@ -1467,6 +1440,7 @@ private: params.sharpening = params.prsharpening; } else { params.sharpening.radius *= scale_factor; + params.sharpening.deconvradius *= scale_factor; } params.impulseDenoise.thresh *= scale_factor; @@ -1476,12 +1450,13 @@ private: } params.wavelet.strength *= scale_factor; - params.dirpyrDenoise.luma *= scale_factor * scale_factor; + double noise_factor = (1.0 - scale_factor); + params.dirpyrDenoise.luma *= noise_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 * scale_factor, 1.0); + lcurve[i] *= min(noise_factor /* * scale_factor*/, 1.0); } noiseLCurve.Set (lcurve); @@ -1527,7 +1502,12 @@ private: } 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); + params.raw.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCD); + } + + // Use Rcd instead of Amaze for fast export + if (params.raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZE)) { + params.raw.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCD); } } diff --git a/rtengine/sleef.c b/rtengine/sleef.c index 901d04f7d..cc92be108 100644 --- a/rtengine/sleef.c +++ b/rtengine/sleef.c @@ -23,6 +23,7 @@ #define L2U .69314718055966295651160180568695068359375 #define L2L .28235290563031577122588448175013436025525412068e-12 #define R_LN2 1.442695040888963407359924681001892137426645954152985934135449406931 +#define pow_F(a,b) (xexpf(b*xlogf(a))) __inline int64_t doubleToRawLongBits(double d) { union { @@ -1263,6 +1264,16 @@ __inline float xdivf( float d, int n){ return uflint.floatval; } +__inline float xlin2log(float x, float base) +{ + constexpr float one(1); + return xlogf(x * (base - one) + one) / xlogf(base); +} +__inline float xlog2lin(float x, float base) +{ + constexpr float one(1); + return (pow_F(base, x) - one) / (base - one); +} #endif diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c index dcea09e2b..3000c1c10 100644 --- a/rtengine/sleefsseavx.c +++ b/rtengine/sleefsseavx.c @@ -906,7 +906,7 @@ typedef struct { 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); @@ -970,6 +970,8 @@ static INLINE vmask vmaskf_isinf(vfloat d) { return vmaskf_eq(vabsf(d), vcast_vf static INLINE vmask vmaskf_ispinf(vfloat d) { return vmaskf_eq(d, vcast_vf_f(INFINITYf)); } static INLINE vmask vmaskf_isminf(vfloat d) { return vmaskf_eq(d, vcast_vf_f(-INFINITYf)); } static INLINE vmask vmaskf_isnan(vfloat d) { return vmaskf_neq(d, d); } +// the following is equivalent to vorm(vmaskf_isnan(a), vmaskf_isnan(b)), but faster +static INLINE vmask vmaskf_isnan(vfloat a, vfloat b) { return (vmask)_mm_cmpunord_ps(a, b); } static INLINE vfloat visinf2f(vfloat d, vfloat m) { return (vfloat)vandm(vmaskf_isinf(d), vorm(vsignbitf(d), (vmask)m)); } static INLINE vfloat visinff(vfloat d) { return visinf2f(d, vcast_vf_f(1.0f)); } @@ -1201,7 +1203,7 @@ static INLINE vfloat xatan2f(vfloat y, vfloat x) { r = vself(vmaskf_isinf(y), vsubf(vcast_vf_f((float)(rtengine::RT_PI/2)), visinf2f(x, vmulsignf(vcast_vf_f((float)(rtengine::RT_PI/4)), x))), r); r = vself(vmaskf_eq(y, vcast_vf_f(0.0f)), vselfzero(vmaskf_eq(vsignf(x), vcast_vf_f(-1.0f)), vcast_vf_f((float)rtengine::RT_PI)), r); - return vself(vorm(vmaskf_isnan(x), vmaskf_isnan(y)), vcast_vf_f(NANf), vmulsignf(r, y)); + return vself(vmaskf_isnan(x, y), vcast_vf_f(NANf), vmulsignf(r, y)); } static INLINE vfloat xasinf(vfloat d) { @@ -1366,8 +1368,9 @@ static INLINE vfloat xcbrtf(vfloat d) { return y; } -static INLINE vfloat LIMV( vfloat a, vfloat b, vfloat c ) { -return vmaxf( b, vminf(a,c)); +static INLINE vfloat vclampf(vfloat value, vfloat low, vfloat high) { + // clamps value in [low;high], returns low if value is NaN + return vmaxf(vminf(high, value), low); } static INLINE vfloat SQRV(vfloat a){ @@ -1377,8 +1380,7 @@ static INLINE vfloat SQRV(vfloat a){ 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; } @@ -1425,5 +1427,21 @@ static INLINE void vconvertrgbrgbrgbrgb2rrrrggggbbbb (const float * src, vfloat bv = _mm_setr_ps(src[2],src[5],src[8],src[11]); } +#if defined( __SSE4_1__ ) && defined( __x86_64__ ) +static INLINE vfloat vceilf(vfloat x) { + return _mm_round_ps(x, _MM_FROUND_TO_POS_INF |_MM_FROUND_NO_EXC); +} + +#else + +static INLINE vfloat vceilf(vfloat x) { + __m128i zerov = _mm_setzero_si128(); + zerov = _mm_cmpeq_epi32(zerov, zerov); + const vfloat onev = (vfloat)_mm_slli_epi32(_mm_srli_epi32(zerov, 25), 23); //create vector 1.0f + const vfloat xi = _mm_cvtepi32_ps(_mm_cvttps_epi32(x)); + return xi + _mm_and_ps(_mm_cmplt_ps(xi, x), onev); +} +#endif + #endif // __SSE2__ #endif // SLEEFSSEAVX diff --git a/rtengine/spot.cc b/rtengine/spot.cc index 858a1fd44..f23fb036d 100644 --- a/rtengine/spot.cc +++ b/rtengine/spot.cc @@ -19,6 +19,7 @@ #include "improcfun.h" #include "alpha.h" +#include "procparams.h" namespace rtengine { diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 61bf90b31..6ca3091a3 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -17,11 +17,13 @@ * along with RawTherapee. If not, see . */ #include "stdimagesource.h" -#include "mytime.h" + +#include "color.h" +#include "curves.h" #include "iccstore.h" #include "imageio.h" -#include "curves.h" -#include "color.h" +#include "mytime.h" +#include "procparams.h" #undef THREAD_PRIORITY_NORMAL @@ -128,7 +130,9 @@ int StdImageSource::load (const Glib::ustring &fname) case (IIOSF_LOGLUV24): case (IIOSF_LOGLUV32): - case (IIOSF_FLOAT): { + case (IIOSF_FLOAT16): + case (IIOSF_FLOAT24): + case (IIOSF_FLOAT32): { img = new Imagefloat; break; } @@ -192,7 +196,7 @@ void StdImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima // the code will use OpenMP as of now. - img->getStdImage(ctemp, tran, image, pp, true, hrp); + img->getStdImage(ctemp, tran, image, pp); // Hombre: we could have rotated the image here too, with just few line of code, but: // 1. it would require other modifications in the engine, so "do not touch that little plonker!" @@ -218,26 +222,26 @@ void StdImageSource::colorSpaceConversion (Imagefloat* im, const ColorManagement bool skipTransform = false; cmsHPROFILE in = nullptr; - cmsHPROFILE out = ICCStore::getInstance()->workingSpace (cmp.working); + cmsHPROFILE out = ICCStore::getInstance()->workingSpace (cmp.workingProfile); - if (cmp.input == "(embedded)" || cmp.input == "" || cmp.input == "(camera)" || cmp.input == "(cameraICC)") { + if (cmp.inputProfile == "(embedded)" || cmp.inputProfile == "" || cmp.inputProfile == "(camera)" || cmp.inputProfile == "(cameraICC)") { if (embedded) { in = embedded; } else { - if (sampleFormat & (IIOSF_LOGLUV24 | IIOSF_LOGLUV32 | IIOSF_FLOAT)) { + if (sampleFormat & (IIOSF_LOGLUV24 | IIOSF_LOGLUV32 | IIOSF_FLOAT16 | IIOSF_FLOAT24 | IIOSF_FLOAT32)) { skipTransform = true; } else { in = ICCStore::getInstance()->getsRGBProfile (); } } } else { - if (cmp.input != "(none)") { - in = ICCStore::getInstance()->getProfile (cmp.input); + if (cmp.inputProfile != "(none)") { + in = ICCStore::getInstance()->getProfile (cmp.inputProfile); if (in == nullptr && embedded) { in = embedded; } else if (in == nullptr) { - if (sampleFormat & (IIOSF_LOGLUV24 | IIOSF_LOGLUV32 | IIOSF_FLOAT)) { + if (sampleFormat & (IIOSF_LOGLUV24 | IIOSF_LOGLUV32 | IIOSF_FLOAT16 | IIOSF_FLOAT24 | IIOSF_FLOAT32)) { skipTransform = true; } else { in = ICCStore::getInstance()->getsRGBProfile (); @@ -268,7 +272,7 @@ void StdImageSource::colorSpaceConversion (Imagefloat* im, const ColorManagement cmsDeleteTransform(hTransform); } else { - printf("Could not convert from %s to %s\n", in == embedded ? "embedded profile" : cmp.input.data(), cmp.working.data()); + printf("Could not convert from %s to %s\n", in == embedded ? "embedded profile" : cmp.inputProfile.data(), cmp.workingProfile.data()); } } } @@ -336,5 +340,10 @@ ColorTemp StdImageSource::getSpotWB (std::vector &red, std::vectorallocate(0, 0); +}; + + } diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h index 304bc3d8d..8f16880dc 100644 --- a/rtengine/stdimagesource.h +++ b/rtengine/stdimagesource.h @@ -40,69 +40,68 @@ protected: public: StdImageSource (); - ~StdImageSource (); + ~StdImageSource () override; - 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 + int load (const Glib::ustring &fname) override; + void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const RAWParams &raw) override; + ColorTemp getWB () const override { return wb; } - void getAutoWBMultipliers (double &rm, double &gm, double &bm); - ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal); + void getAutoWBMultipliers (double &rm, double &gm, double &bm) override; + ColorTemp getSpotWB (std::vector &red, std::vector &green, std::vector &blue, int tran, double equal) override; - eSensorType getSensorType() const {return ST_NONE;} + eSensorType getSensorType() const override {return ST_NONE;} + bool isMono() const override {return false;} - bool isWBProviderReady () + bool isWBProviderReady () override { return true; }; - void getAutoExpHistogram (LUTu &histogram, int& histcompr); + void getAutoExpHistogram (LUTu &histogram, int& histcompr) override; - double getDefGain () const + double getDefGain () const override { return 0.0; } - void getFullSize (int& w, int& h, int tr = TR_NONE); - void getSize (const PreviewProps &pp, int& w, int& h); + void getFullSize (int& w, int& h, int tr = TR_NONE) override; + void getSize (const PreviewProps &pp, int& w, int& h) override; - FrameData* getImageData (unsigned int frameNum) - { - return idata->getFrameData (frameNum); - } ImageIO* getImageIO () { return img; } - ImageMatrices* getImageMatrices () + ImageMatrices* getImageMatrices () override { return (ImageMatrices*)nullptr; } - bool isRAW() const + bool isRAW() const override { return false; } - void setProgressListener (ProgressListener* pl) + void setProgressListener (ProgressListener* pl) override { plistener = pl; } - void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb);// RAWParams raw will not be used for non-raw files (see imagesource.h) + void convertColorSpace(Imagefloat* image, const ColorManagementParams &cmp, const ColorTemp &wb) override;// 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 override { return rgbSourceModified; } - void setCurrentFrame(unsigned int frameNum) {} - int getFrameCount() {return 1;} + void setCurrentFrame(unsigned int frameNum) override {} + int getFrameCount() override {return 1;} + int getFlatFieldAutoClipValue() override {return 0;} - void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) { R = G = B = 0;} + void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) override { R = G = B = 0;} + void flushRGB () override; }; } diff --git a/rtengine/tmo_fattal02.cc b/rtengine/tmo_fattal02.cc index 4fb11ff19..32755319e 100644 --- a/rtengine/tmo_fattal02.cc +++ b/rtengine/tmo_fattal02.cc @@ -73,6 +73,8 @@ #include "sleef.c" #include "opthelper.h" #include "rt_algo.h" +#include "rescale.h" +#include "procparams.h" namespace rtengine { @@ -153,7 +155,7 @@ void downSample (const Array2Df& A, Array2Df& B) 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 noticable + // 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 @@ -186,7 +188,9 @@ void gaussianBlur (const Array2Df& I, Array2Df& L, bool multithread) Array2Df T (width, height); //--- X blur +#ifdef _OPENMP #pragma omp parallel for shared(I, T) if(multithread) +#endif for ( int y = 0 ; y < height ; y++ ) { for ( int x = 1 ; x < width - 1 ; x++ ) { @@ -201,7 +205,9 @@ void gaussianBlur (const Array2Df& I, Array2Df& L, bool multithread) } //--- Y blur +#ifdef _OPENMP #pragma omp parallel for if(multithread) +#endif for ( int x = 0 ; x < width - 7 ; x += 8 ) { for ( int y = 1 ; y < height - 1 ; y++ ) { @@ -276,9 +282,11 @@ 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 ); - float avgGrad = 0.0f; + double avgGrad = 0.0; // use double precision for large summations +#ifdef _OPENMP #pragma omp parallel for reduction(+:avgGrad) if(multithread) +#endif for ( int y = 0 ; y < height ; y++ ) { int n = (y == 0 ? 0 : y - 1); @@ -293,7 +301,7 @@ float calculateGradients (Array2Df* H, Array2Df* G, int k, bool multithread) gx = ((*H) (w, y) - (*H) (e, y)); gy = ((*H) (x, s) - (*H) (x, n)); - // note this implicitely assumes that H(-1)=H(0) + // 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 @@ -353,7 +361,9 @@ void calculateFiMatrix (Array2Df* FI, Array2Df* gradients[], fi[nlevels - 1] = new Array2Df (width, height); +#ifdef _OPENMP #pragma omp parallel for shared(fi) if(multithread) +#endif for ( int k = 0 ; k < width * height ; k++ ) { (*fi[nlevels - 1]) (k) = 1.0f; } @@ -365,7 +375,9 @@ void calculateFiMatrix (Array2Df* FI, Array2Df* gradients[], // 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; +#ifdef _OPENMP #pragma omp parallel for shared(fi,avgGrad) if(multithread) +#endif 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); @@ -454,7 +466,9 @@ void tmo_fattal02 (size_t width, // float minLum = Y (0, 0); float maxLum = Y (0, 0); +#ifdef _OPENMP #pragma omp parallel for reduction(max:maxLum) if(multithread) +#endif for ( int i = 0 ; i < size ; i++ ) { maxLum = std::max (maxLum, Y (i)); @@ -463,13 +477,17 @@ void tmo_fattal02 (size_t width, Array2Df* H = new Array2Df (width, height); float temp = 100.f / maxLum; float eps = 1e-4f; +#ifdef _OPENMP #pragma omp parallel if(multithread) +#endif { #ifdef __SSE2__ vfloat epsv = F2V (eps); vfloat tempv = F2V (temp); #endif +#ifdef _OPENMP #pragma omp for schedule(dynamic,16) +#endif for (size_t i = 0 ; i < height ; ++i) { size_t j = 0; @@ -572,7 +590,9 @@ void tmo_fattal02 (size_t width, // 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 +#ifdef _OPENMP #pragma omp parallel for if(multithread) +#endif for ( size_t y = 0 ; y < height ; y++ ) { // sets index+1 based on the boundary assumption H(N+1)=H(N-1) @@ -590,7 +610,9 @@ void tmo_fattal02 (size_t width, delete H; // calculate divergence +#ifdef _OPENMP #pragma omp parallel for if(multithread) +#endif for ( size_t y = 0; y < height; ++y ) { for ( size_t x = 0; x < width; ++x ) { @@ -625,12 +647,16 @@ void tmo_fattal02 (size_t width, delete Gx; delete FI; +#ifdef _OPENMP #pragma omp parallel if(multithread) +#endif { #ifdef __SSE2__ vfloat gammav = F2V (gamma); #endif +#ifdef _OPENMP #pragma omp for schedule(dynamic,16) +#endif for (size_t i = 0 ; i < height ; i++) { size_t j = 0; @@ -705,7 +731,9 @@ void transform_ev2normal (Array2Df *A, Array2Df *T, bool multithread) // the discrete cosine transform is not exactly the transform needed // need to scale input values to get the right transformation +#ifdef _OPENMP #pragma omp parallel for if(multithread) +#endif for (int y = 1 ; y < height - 1 ; y++ ) for (int x = 1 ; x < width - 1 ; x++ ) { @@ -756,7 +784,9 @@ void transform_normal2ev (Array2Df *A, Array2Df *T, bool multithread) // need to scale the output matrix to get the right transform float factor = (1.0f / ((height - 1) * (width - 1))); +#ifdef _OPENMP #pragma omp parallel for if(multithread) +#endif for (int y = 0 ; y < height ; y++ ) for (int x = 0 ; x < width ; x++ ) { @@ -875,7 +905,9 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/* std::vector l1 = get_lambda (height); std::vector l2 = get_lambda (width); +#ifdef _OPENMP #pragma omp parallel for if(multithread) +#endif for (int y = 0 ; y < height ; y++ ) { for (int x = 0 ; x < width ; x++ ) { @@ -895,13 +927,17 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/* // (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; +#ifdef _OPENMP #pragma omp parallel for reduction(max:max) if(multithread) +#endif for (int i = 0; i < width * height; i++) { max = std::max (max, (*U) (i)); } +#ifdef _OPENMP #pragma omp parallel for if(multithread) +#endif for (int i = 0; i < width * height; i++) { (*U) (i) -= max; @@ -938,72 +974,20 @@ void solve_pde_fft (Array2Df *F, Array2Df *U, Array2Df *buf, bool multithread)/* * RT code from here on *****************************************************************************/ -inline float get_bilinear_value (const Array2Df &src, float x, float y) +inline void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread) { - // 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; + rescaleBilinear(src, dst, multithread); } - -void rescale_bilinear (const Array2Df &src, Array2Df &dst, bool multithread) +inline void rescale_nearest (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); - } - } + rescaleNearest(src, dst, multithread); } inline float luminance (float r, float g, float b, TMatrix ws) { - return r * ws[1][0] + g * ws[1][1] + b * ws[1][2]; + return Color::rgbLuminance(r, g, b, ws); } @@ -1065,6 +1049,10 @@ inline int find_fast_dim (int dim) void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) { + if (!params->fattal.enabled) { + return; + } + BENCHFUN const int detail_level = 3; @@ -1092,7 +1080,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) constexpr float luminance_noise_floor = 65.535f; constexpr float min_luminance = 1.f; - TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.working); + TMatrix ws = ICCStore::getInstance()->workingSpaceMatrix (params->icm.workingProfile); #ifdef _OPENMP #pragma omp parallel for if(multiThread) @@ -1104,7 +1092,8 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) } float oldMedian; - findMinMaxPercentile (Yr.data(), Yr.getRows() * Yr.getCols(), 0.5f, oldMedian, 0.5f, oldMedian, multiThread); + const float percentile = float(LIM(params->fattal.anchor, 1, 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; @@ -1146,7 +1135,7 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) const float wr = float(w2) / float(w); float newMedian; - findMinMaxPercentile (L.data(), L.getRows() * L.getCols(), 0.5f, newMedian, 0.5f, newMedian, multiThread); + 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 @@ -1158,15 +1147,15 @@ void ImProcFunctions::ToneMapFattal02 (Imagefloat *rgb) 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; + float Y = std::max(Yr(x, y), epsilon); + float l = std::max(L(xx, yy), epsilon) * (scale / Y); + rgb->r(y, x) *= l; + rgb->g(y, x) *= l; + rgb->b(y, x) *= l; - assert (std::isfinite (rgb->r (y, x))); - assert (std::isfinite (rgb->g (y, x))); - assert (std::isfinite (rgb->b (y, x))); + assert(std::isfinite(rgb->r(y, x))); + assert(std::isfinite(rgb->g(y, x))); + assert(std::isfinite(rgb->b(y, x))); } } } diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 4ab5bc1b8..613b67be8 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -265,3 +265,21 @@ void swab(const void* from, void* to, ssize_t n) } } + +#if __SIZEOF_WCHAR_T__ == 4 +Glib::ustring utf32_to_utf8(wchar_t* UTF32Buffer, size_t sizeOfUTF32Buffer) +{ + char *buffer2 = new char[sizeOfUTF32Buffer]; + char *pBuffer2 = buffer2; + gchar a[6]; + for (size_t i=0; i < sizeOfUTF32Buffer/4; ++i) { + gint bytesWritten = g_unichar_to_utf8((gunichar)UTF32Buffer[i], a); + for (gint j=0; j < bytesWritten; ++j) { + *(pBuffer2++) = a[j]; + } + } + Glib::ustring modelDesc(buffer2); + delete [] buffer2; + return modelDesc; +} +#endif diff --git a/rtengine/utils.h b/rtengine/utils.h index 5730c2544..14593edae 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -55,3 +55,8 @@ bool hasPngExtension(const Glib::ustring& filename); void swab(const void* from, void* to, ssize_t n); } + +#if __SIZEOF_WCHAR_T__ == 4 +Glib::ustring utf32_to_utf8(wchar_t* UTF32Buffer, size_t sizeOfUTF32Buffer); +#endif + diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc new file mode 100644 index 000000000..0f35389fb --- /dev/null +++ b/rtengine/vng4_demosaic_RT.cc @@ -0,0 +1,398 @@ +//////////////////////////////////////////////////////////////// +// +// VNG4 demosaic algorithm +// +// optimized for speed by Ingo Weyrich +// +// +// vng4_interpolate_RT.cc 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. +// +// 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, see . +// +//////////////////////////////////////////////////////////////// + +#include "rtengine.h" +#include "rawimagesource.h" +#include "procparams.h" +#include "../rtgui/multilangmgr.h" +//#define BENCHMARK +#include "StopWatch.h" + +namespace { + +using namespace rtengine; + +inline void vng4interpolate_row_redblue (const RawImage *ri, const array2D &rawData, float* ar, float* ab, const float * const pg, const float * const cg, const float * const ng, int i, int width) +{ + if (ri->ISBLUE(i, 0) || ri->ISBLUE(i, 1)) { + std::swap(ar, ab); + } + + // RGRGR or GRGRGR line + for (int j = 3; j < width - 3; ++j) { + if (!ri->ISGREEN(i, j)) { + // keep original value + ar[j] = rawData[i][j]; + // cross interpolation of red/blue + float rb = (rawData[i - 1][j - 1] - pg[j - 1] + rawData[i + 1][j - 1] - ng[j - 1]); + rb += (rawData[i - 1][j + 1] - pg[j + 1] + rawData[i + 1][j + 1] - ng[j + 1]); + ab[j] = cg[j] + rb * 0.25f; + } else { + // linear R/B-G interpolation horizontally + ar[j] = cg[j] + (rawData[i][j - 1] - cg[j - 1] + rawData[i][j + 1] - cg[j + 1]) / 2; + // linear B/R-G interpolation vertically + ab[j] = cg[j] + (rawData[i - 1][j] - pg[j] + rawData[i + 1][j] - ng[j]) / 2; + } + } +} +} + +namespace rtengine + +{ +#define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) + +void RawImageSource::vng4_demosaic (const array2D &rawData, array2D &red, array2D &green, array2D &blue) +{ + BENCHFUN + const signed short int *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 }; + + double progress = 0.0; + const bool plistenerActive = plistener; + + if (plistenerActive) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::VNG4))); + plistener->setProgress (progress); + } + + const unsigned prefilters = ri->prefilters; + const int width = W, height = H; + constexpr unsigned int colors = 4; + + float (*image)[4] = (float (*)[4]) calloc (height * width, sizeof * image); + + int lcode[16][16][32]; + float mul[16][16][8]; + float csum[16][16][3]; + + // first linear interpolation + for (int row = 0; row < 16; row++) + for (int col = 0; col < 16; col++) { + int * ip = lcode[row][col]; + int mulcount = 0; + float sum[4] = {}; + + for (int y = -1; y <= 1; y++) + for (int x = -1; x <= 1; x++) { + int shift = (y == 0) + (x == 0); + + if (shift == 2) { + continue; + } + + int color = fc(row + y, col + x); + *ip++ = (width * y + x) * 4 + color; + + mul[row][col][mulcount] = (1 << shift); + *ip++ = color; + sum[color] += (1 << shift); + mulcount++; + } + + int colcount = 0; + + for (unsigned int c = 0; c < colors; c++) + if (c != fc(row, col)) { + *ip++ = c; + csum[row][col][colcount] = 1.f / sum[c]; + colcount ++; + } + } + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + int firstRow = -1; + int lastRow = -1; +#ifdef _OPENMP + // note, static scheduling is important in this implementation + #pragma omp for schedule(static) +#endif + + for (int ii = 0; ii < H; ii++) { + if (firstRow == -1) { + firstRow = ii; + } + lastRow = ii; + for (int jj = 0; jj < W; jj++) { + image[ii * W + jj][fc(ii, jj)] = rawData[ii][jj]; + } + if (ii - 1 > firstRow) { + int row = ii - 1; + for (int col = 1; col < width - 1; col++) { + float * pix = image[row * width + col]; + int * ip = lcode[row & 15][col & 15]; + float sum[4] = {}; + + for (int i = 0; i < 8; i++, ip += 2) { + sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; + } + + for (unsigned int i = 0; i < colors - 1; i++, ip++) { + pix[ip[0]] = sum[ip[0]] * csum[row & 15][col & 15][i]; + } + } + } + } + + // now all rows are processed except the first and last row of each chunk + // let's process them now but skip row 0 and row H - 1 + if (firstRow > 0 && firstRow < H - 1) { + const int row = firstRow; + for (int col = 1; col < width - 1; col++) { + float * pix = image[row * width + col]; + int * ip = lcode[row & 15][col & 15]; + float sum[4] = {}; + + for (int i = 0; i < 8; i++, ip += 2) { + sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; + } + + for (unsigned int i = 0; i < colors - 1; i++, ip++) { + pix[ip[0]] = sum[ip[0]] * csum[row & 15][col & 15][i]; + } + } + } + + if (lastRow > 0 && lastRow < H - 1) { + const int row = lastRow; + for (int col = 1; col < width - 1; col++) { + float * pix = image[row * width + col]; + int * ip = lcode[row & 15][col & 15]; + float sum[4] = {}; + + for (int i = 0; i < 8; i++, ip += 2) { + sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; + } + + for (unsigned int i = 0; i < colors - 1; i++, ip++) { + pix[ip[0]] = sum[ip[0]] * csum[row & 15][col & 15][i]; + } + } + } + } + + constexpr int prow = 7, pcol = 1; + int32_t *code[8][2]; + int32_t * ip = (int32_t *) calloc ((prow + 1) * (pcol + 1), 1280); + + for (int row = 0; row <= prow; row++) /* Precalculate for VNG */ + for (int col = 0; col <= pcol; col++) { + code[row][col] = ip; + cp = terms; + for (int t = 0; t < 64; t++) { + int y1 = *cp++; + int x1 = *cp++; + int y2 = *cp++; + int x2 = *cp++; + int weight = *cp++; + int grads = *cp++; + unsigned int color = fc(row + y1, col + x1); + + if (fc(row + y2, col + x2) != color) { + continue; + } + + int diag = (fc(row, col + 1) == color && fc(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; +#ifdef __SSE2__ + // at least on machines with SSE2 feature this cast is save + *reinterpret_cast(ip++) = 1 << weight; +#else + *ip++ = 1 << weight; +#endif + for (int g = 0; g < 8; g++) + if (grads & (1 << g)) { + *ip++ = g; + } + + *ip++ = -1; + } + + *ip++ = INT_MAX; + + cp = chood; + for (int g = 0; g < 8; g++) { + int y = *cp++; + int x = *cp++; + *ip++ = (y * width + x) * 4; + unsigned int color = fc(row, col); + + if (fc(row + y, col + x) != color && fc(row + y * 2, col + x * 2) == color) { + *ip++ = (y * width + x) * 8 + color; + } else { + *ip++ = 0; + } + } + } + + if(plistenerActive) { + progress = 0.2; + plistener->setProgress (progress); + } + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + constexpr int progressStep = 64; + const double progressInc = (1.0 - progress) / ((height - 2) / progressStep); + int firstRow = -1; + int lastRow = -1; +#ifdef _OPENMP + // note, static scheduling is important in this implementation + #pragma omp for schedule(static) +#endif + + for (int row = 2; row < height - 2; row++) { /* Do VNG interpolation */ + if (firstRow == -1) { + firstRow = row; + } + lastRow = row; + for (int col = 2; col < width - 2; col++) { + float * pix = image[row * width + col]; + int color = fc(row, col); + int32_t * ip = code[row & prow][col & pcol]; + float gval[8] = {}; + + while (ip[0] != INT_MAX) { /* Calculate gradients */ +#ifdef __SSE2__ + // at least on machines with SSE2 feature this cast is save and saves a lot of int => float conversions + const float diff = std::fabs(pix[ip[0]] - pix[ip[1]]) * reinterpret_cast(ip)[2]; +#else + const float diff = std::fabs(pix[ip[0]] - pix[ip[1]]) * ip[2]; +#endif + gval[ip[3]] += diff; + ip += 5; + if (UNLIKELY(ip[-1] != -1)) { + gval[ip[-1]] += diff; + ip++; + } + } + ip++; + + const float thold = rtengine::min(gval[0], gval[1], gval[2], gval[3], gval[4], gval[5], gval[6], gval[7]) + + rtengine::max(gval[0], gval[1], gval[2], gval[3], gval[4], gval[5], gval[6], gval[7]) * 0.5f; + + float sum0 = 0.f; + float sum1 = 0.f; + const float greenval = pix[color]; + int num = 0; + + if(color & 1) { + color ^= 2; + for (int g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */ + if (gval[g] <= thold) { + if(ip[1]) { + sum0 += greenval + pix[ip[1]]; + } + + sum1 += pix[ip[0] + color]; + num++; + } + } + sum0 *= 0.5f; + } else { + for (int g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */ + if (gval[g] <= thold) { + if(ip[1]) { + sum0 += greenval + pix[ip[1]]; + } + + sum1 += pix[ip[0] + 1] + pix[ip[0] + 3]; + num++; + } + } + } + green[row][col] = greenval + (sum1 - sum0) / (2 * num); + } + if (row - 1 > firstRow) { + vng4interpolate_row_redblue(ri, rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, W); + } + + if(plistenerActive) { + if((row % progressStep) == 0) +#ifdef _OPENMP + #pragma omp critical (updateprogress) +#endif + { + progress += progressInc; + plistener->setProgress (progress); + } + } + } + + if (firstRow > 2 && firstRow < H - 3) { + vng4interpolate_row_redblue(ri, rawData, red[firstRow], blue[firstRow], green[firstRow - 1], green[firstRow], green[firstRow + 1], firstRow, W); + } + + if (lastRow > 2 && lastRow < H - 3) { + vng4interpolate_row_redblue(ri, rawData, red[lastRow], blue[lastRow], green[lastRow - 1], green[lastRow], green[lastRow + 1], lastRow, W); + } +#ifdef _OPENMP + #pragma omp single +#endif + { + // let the first thread, which is out of work, do the border interpolation + border_interpolate2(W, H, 3, rawData, red, green, blue); + } + } + + free (code[0][0]); + free (image); + + if(plistenerActive) { + plistener->setProgress (1.0); + } +} +} diff --git a/rtengine/xtrans_demosaic.cc b/rtengine/xtrans_demosaic.cc new file mode 100644 index 000000000..cb65db092 --- /dev/null +++ b/rtengine/xtrans_demosaic.cc @@ -0,0 +1,1034 @@ +//////////////////////////////////////////////////////////////// +// +// Xtrans demosaic algorithm +// +// code dated: April 18, 2018 +// +// xtrans_demosaic.cc 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. +// +// 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, see . +// +//////////////////////////////////////////////////////////////// + +#include "rtengine.h" +#include "rawimagesource.h" +#include "rt_algo.h" +#include "rt_math.h" +#include "../rtgui/multilangmgr.h" +#include "opthelper.h" +#include "StopWatch.h" + +namespace rtengine +{ +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 }; + +void RawImageSource::cielab (const float (*rgb)[3], float* l, float* a, float *b, const int width, const int height, const int labWidth, const float xyz_cam[3][3]) +{ + static LUTf cbrt(0x14000); + static bool cbrtinit = false; + + if (!rgb) { + if(!cbrtinit) { + #pragma omp parallel for + for (int i = 0; i < 0x14000; i++) { + double r = i / 65535.0; + cbrt[i] = r > Color::eps ? std::cbrt(r) : (Color::kappa * r + 16.0) / 116.0; + } + + cbrtinit = true; + } + + return; + } + +#ifdef __SSE2__ + vfloat c116v = F2V(116.f); + vfloat c16v = F2V(16.f); + vfloat c500v = F2V(500.f); + vfloat c200v = F2V(200.f); + vfloat xyz_camv[3][3]; + + for(int i = 0; i < 3; i++) + for(int j = 0; j < 3; j++) { + xyz_camv[i][j] = F2V(xyz_cam[i][j]); + } + +#endif // __SSE2__ + + for(int i = 0; i < height; i++) { + int j = 0; +#ifdef __SSE2__ + + for(; j < labWidth - 3; j += 4) { + vfloat redv, greenv, bluev; + vconvertrgbrgbrgbrgb2rrrrggggbbbb(rgb[i * width + j], redv, greenv, bluev); + 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)); + STVFU(b[i * labWidth + j], c200v * (xyz1v - xyz2v)); + } + +#endif + + for(; j < labWidth; j++) { + float xyz[3] = {0.5f, 0.5f, 0.5f}; + + for(int c = 0; c < 3; c++) { + float val = rgb[i * width + j][c]; + xyz[0] += xyz_cam[0][c] * val; + xyz[1] += xyz_cam[1][c] * val; + xyz[2] += xyz_cam[2][c] * val; + } + + xyz[0] = cbrt[(int) xyz[0]]; + xyz[1] = cbrt[(int) xyz[1]]; + xyz[2] = cbrt[(int) xyz[2]]; + + l[i * labWidth + j] = 116 * xyz[1] - 16; + a[i * labWidth + j] = 500 * (xyz[0] - xyz[1]); + b[i * labWidth + j] = 200 * (xyz[1] - xyz[2]); + } + } +} + + +#define fcol(row,col) xtrans[(row)%6][(col)%6] +#define isgreen(row,col) (xtrans[(row)%3][(col)%3]&1) + +void RawImageSource::xtransborder_interpolate (int border, array2D &red, array2D &green, array2D &blue) +{ + const int height = H, width = W; + + int xtrans[6][6]; + ri->getXtransMatrix(xtrans); + const float weight[3][3] = { + {0.25f, 0.5f, 0.25f}, + {0.5f, 0.f, 0.5f}, + {0.25f, 0.5f, 0.25f} + }; + + for (int row = 0; row < height; row++) + for (int col = 0; col < width; col++) { + if (col == border && row >= border && row < height - border) { + col = width - border; + } + + float sum[6] = {0.f}; + + for (int y = MAX(0, row - 1), v = row == 0 ? 0 : -1; y <= MIN(row + 1, height - 1); y++, v++) + for (int x = MAX(0, col - 1), h = col == 0 ? 0 : -1; x <= MIN(col + 1, width - 1); x++, h++) { + int f = fcol(y, x); + sum[f] += rawData[y][x] * weight[v + 1][h + 1]; + sum[f + 3] += weight[v + 1][h + 1]; + } + + switch(fcol(row, col)) { + case 0: + red[row][col] = rawData[row][col]; + green[row][col] = (sum[1] / sum[4]); + blue[row][col] = (sum[2] / sum[5]); + break; + + case 1: + if(sum[3] == 0.f) { // at the 4 corner pixels it can happen, that we have only green pixels in 2x2 area + red[row][col] = green[row][col] = blue[row][col] = rawData[row][col]; + } else { + red[row][col] = (sum[0] / sum[3]); + green[row][col] = rawData[row][col]; + blue[row][col] = (sum[2] / sum[5]); + } + + break; + + case 2: + red[row][col] = (sum[0] / sum[3]); + green[row][col] = (sum[1] / sum[4]); + blue[row][col] = rawData[row][col]; + } + } +} + +/* + Frank Markesteijn's algorithm for Fuji X-Trans sensors + adapted to RT by Ingo Weyrich 2014 +*/ +// override CLIP function to test unclipped output +#define CLIP(x) (x) +void RawImageSource::xtrans_interpolate (const int passes, const bool useCieLab, size_t chunkSize, bool measure) +{ + + std::unique_ptr stop; + + if (measure) { + std::cout << passes << "-pass Xtrans Demosaicing " << W << "x" << H << " image with " << chunkSize << " tiles per thread" << std::endl; + stop.reset(new StopWatch("xtrans demosaic")); + } + + constexpr int ts = 114; /* Tile Size */ + constexpr int tsh = ts / 2; /* half of Tile Size */ + + double progress = 0.0; + const bool plistenerActive = plistener; + + if (plistenerActive) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), "Xtrans")); + plistener->setProgress (progress); + } + + int xtrans[6][6]; + ri->getXtransMatrix(xtrans); + + constexpr 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 }; + + // sgrow/sgcol is the offset in the sensor matrix of the solitary + // green pixels + ushort sgrow = 0, sgcol = 0; + + const int height = H, width = W; + + float xyz_cam[3][3]; + { + float rgb_cam[3][4]; + ri->getRgbCam(rgb_cam); + int k; + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; 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]; + } + } + + /* Map a green hexagon around each non-green pixel and vice versa: */ + short allhex[2][3][3][8]; + { + int gint, d, h, v, ng, row, col; + + for (row = 0; row < 3; row++) + for (col = 0; col < 3; col++) { + gint = isgreen(row, col); + + for (ng = d = 0; d < 10; d += 2) { + if (isgreen(row + orth[d] + 6, col + orth[d + 2] + 6)) { + ng = 0; + } else { + ng++; + } + + if (ng == 4) { + // if there are four non-green pixels adjacent in cardinal + // directions, this is the solitary green pixel + sgrow = row; + sgcol = col; + } + + if (ng == gint + 1) { + for (int c = 0; c < 8; c++) { + v = orth[d] * patt[gint][c * 2] + orth[d + 1] * patt[gint][c * 2 + 1]; + h = orth[d + 2] * patt[gint][c * 2] + orth[d + 3] * patt[gint][c * 2 + 1]; + allhex[0][row][col][c ^ (gint * 2 & d)] = h + v * width; + allhex[1][row][col][c ^ (gint * 2 & d)] = h + v * ts; + } + } + } + } + + } + + if(plistenerActive) { + progress += 0.05; + plistener->setProgress(progress); + } + + + double progressInc = 36.0 * (1.0 - progress) / ((H * W) / ((ts - 16) * (ts - 16))); + const int ndir = 4 << (passes > 1); + cielab (nullptr, nullptr, nullptr, nullptr, 0, 0, 0, nullptr); + struct s_minmaxgreen { + float min; + float max; + }; + + int RightShift[3]; + + for(int row = 0; row < 3; row++) { + // count number of green pixels in three cols + int greencount = 0; + + for(int col = 0; col < 3; col++) { + greencount += isgreen(row, col); + } + + RightShift[row] = (greencount == 2); + } + +#ifdef _OPENMP + #pragma omp parallel +#endif + { + int progressCounter = 0; + int c; + float color[3][6]; + + float *buffer = (float *) malloc ((ts * ts * (ndir * 4 + 3) + 128) * sizeof(float)); + float (*rgb)[ts][ts][3] = (float(*)[ts][ts][3]) buffer; + float (*lab)[ts - 8][ts - 8] = (float (*)[ts - 8][ts - 8])(buffer + ts * ts * (ndir * 3)); + float (*drv)[ts - 10][ts - 10] = (float (*)[ts - 10][ts - 10]) (buffer + ts * ts * (ndir * 3 + 3)); + uint8_t (*homo)[ts][ts] = (uint8_t (*)[ts][ts]) (lab); // we can reuse the lab-buffer because they are not used together + s_minmaxgreen (*greenminmaxtile)[tsh] = (s_minmaxgreen(*)[tsh]) (lab); // we can reuse the lab-buffer because they are not used together + uint8_t (*homosum)[ts][ts] = (uint8_t (*)[ts][ts]) (drv); // we can reuse the drv-buffer because they are not used together + uint8_t (*homosummax)[ts] = (uint8_t (*)[ts]) homo[ndir - 1]; // we can reuse the homo-buffer because they are not used together + +#ifdef _OPENMP + #pragma omp for collapse(2) schedule(dynamic, chunkSize) nowait +#endif + + for (int top = 3; top < height - 19; top += ts - 16) + for (int left = 3; left < width - 19; left += ts - 16) { + int mrow = MIN (top + ts, height - 3); + int mcol = MIN (left + ts, width - 3); + + /* Set greenmin and greenmax to the minimum and maximum allowed values: */ + for (int row = top; row < mrow; row++) { + // find first non-green pixel + int leftstart = left; + + for(; leftstart < mcol; leftstart++) + if(!isgreen(row, leftstart)) { + break; + } + + int coloffset = (RightShift[row % 3] == 1 ? 3 : 1 + (fcol(row, leftstart + 1) & 1)); + + if(coloffset == 3) { + short *hex = allhex[0][row % 3][leftstart % 3]; + + for (int col = leftstart; col < mcol; col += coloffset) { + float minval = FLT_MAX; + float maxval = 0.f; + float *pix = &rawData[row][col]; + + for(int c = 0; c < 6; c++) { + float val = pix[hex[c]]; + + minval = minval < val ? minval : val; + maxval = maxval > val ? maxval : val; + } + + greenminmaxtile[row - top][(col - left) >> 1].min = minval; + greenminmaxtile[row - top][(col - left) >> 1].max = maxval; + } + } else { + float minval = FLT_MAX; + float maxval = 0.f; + int col = leftstart; + + if(coloffset == 2) { + minval = FLT_MAX; + maxval = 0.f; + float *pix = &rawData[row][col]; + short *hex = allhex[0][row % 3][col % 3]; + + for(int c = 0; c < 6; c++) { + float val = pix[hex[c]]; + + minval = minval < val ? minval : val; + maxval = maxval > val ? maxval : val; + } + + greenminmaxtile[row - top][(col - left) >> 1].min = minval; + greenminmaxtile[row - top][(col - left) >> 1].max = maxval; + col += 2; + } + + short *hex = allhex[0][row % 3][col % 3]; + + for (; col < mcol - 1; col += 3) { + minval = FLT_MAX; + maxval = 0.f; + float *pix = &rawData[row][col]; + + for(int c = 0; c < 6; c++) { + float val = pix[hex[c]]; + + minval = minval < val ? minval : val; + maxval = maxval > val ? maxval : val; + } + + greenminmaxtile[row - top][(col - left) >> 1].min = minval; + greenminmaxtile[row - top][(col - left) >> 1].max = maxval; + greenminmaxtile[row - top][(col + 1 - left) >> 1].min = minval; + greenminmaxtile[row - top][(col + 1 - left) >> 1].max = maxval; + } + + if(col < mcol) { + minval = FLT_MAX; + maxval = 0.f; + float *pix = &rawData[row][col]; + + for(int c = 0; c < 6; c++) { + float val = pix[hex[c]]; + + minval = minval < val ? minval : val; + maxval = maxval > val ? maxval : val; + } + + greenminmaxtile[row - top][(col - left) >> 1].min = minval; + greenminmaxtile[row - top][(col - left) >> 1].max = maxval; + } + } + } + + memset(rgb, 0, ts * ts * 3 * sizeof(float)); + + for (int row = top; row < mrow; row++) + for (int col = left; col < mcol; col++) { + rgb[0][row - top][col - left][fcol(row, col)] = rawData[row][col]; + } + + for(int c = 0; c < 3; c++) { + memcpy (rgb[c + 1], rgb[0], sizeof * rgb); + } + + /* Interpolate green horizontally, vertically, and along both diagonals: */ + for (int row = top; row < mrow; row++) { + // find first non-green pixel + int leftstart = left; + + for(; leftstart < mcol; leftstart++) + if(!isgreen(row, leftstart)) { + break; + } + + int coloffset = (RightShift[row % 3] == 1 ? 3 : 1 + (fcol(row, leftstart + 1) & 1)); + + if(coloffset == 3) { + short *hex = allhex[0][row % 3][leftstart % 3]; + + for (int col = leftstart; col < mcol; col += coloffset) { + float *pix = &rawData[row][col]; + float color[4]; + color[0] = 0.6796875f * (pix[hex[1]] + pix[hex[0]]) - + 0.1796875f * (pix[2 * hex[1]] + pix[2 * hex[0]]); + color[1] = 0.87109375f * pix[hex[3]] + pix[hex[2]] * 0.12890625f + + 0.359375f * (pix[0] - pix[-hex[2]]); + + for(int c = 0; c < 2; c++) + color[2 + c] = 0.640625f * pix[hex[4 + c]] + 0.359375f * pix[-2 * hex[4 + c]] + 0.12890625f * + (2.f * pix[0] - pix[3 * hex[4 + c]] - pix[-3 * hex[4 + c]]); + + for(int c = 0; c < 4; c++) { + rgb[c][row - top][col - left][1] = LIM(color[c], greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); + } + } + } else { + short *hexmod[2]; + hexmod[0] = allhex[0][row % 3][leftstart % 3]; + hexmod[1] = allhex[0][row % 3][(leftstart + coloffset) % 3]; + + for (int col = leftstart, hexindex = 0; col < mcol; col += coloffset, coloffset ^= 3, hexindex ^= 1) { + float *pix = &rawData[row][col]; + short *hex = hexmod[hexindex]; + float color[4]; + color[0] = 0.6796875f * (pix[hex[1]] + pix[hex[0]]) - + 0.1796875f * (pix[2 * hex[1]] + pix[2 * hex[0]]); + color[1] = 0.87109375f * pix[hex[3]] + pix[hex[2]] * 0.12890625f + + 0.359375f * (pix[0] - pix[-hex[2]]); + + for(int c = 0; c < 2; c++) + color[2 + c] = 0.640625f * pix[hex[4 + c]] + 0.359375f * pix[-2 * hex[4 + c]] + 0.12890625f * + (2.f * pix[0] - pix[3 * hex[4 + c]] - pix[-3 * hex[4 + c]]); + + for(int c = 0; c < 4; c++) { + rgb[c ^ 1][row - top][col - left][1] = LIM(color[c], greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); + } + } + } + } + + for (int 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 (int row = top + 2; row < mrow - 2; row++) { + int leftstart = left + 2; + + for(; leftstart < mcol - 2; leftstart++) + if(!isgreen(row, leftstart)) { + break; + } + + int coloffset = (RightShift[row % 3] == 1 ? 3 : 1 + (fcol(row, leftstart + 1) & 1)); + + if(coloffset == 3) { + int f = fcol(row, leftstart); + short *hex = allhex[1][row % 3][leftstart % 3]; + + for (int col = leftstart; col < mcol - 2; col += coloffset, f ^= 2) { + for (int d = 3; d < 6; d++) { + float (*rix)[3] = &rgb[(d - 2)][row - top][col - left]; + float val = 0.33333333f * (rix[-2 * hex[d]][1] + 2 * (rix[hex[d]][1] - rix[hex[d]][f]) + - rix[-2 * hex[d]][f]) + rix[0][f]; + rix[0][1] = LIM(val, greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); + } + } + } else { + int f = fcol(row, leftstart); + short *hexmod[2]; + hexmod[0] = allhex[1][row % 3][leftstart % 3]; + hexmod[1] = allhex[1][row % 3][(leftstart + coloffset) % 3]; + + for (int col = leftstart, hexindex = 0; col < mcol - 2; col += coloffset, coloffset ^= 3, f = f ^ (coloffset & 2), hexindex ^= 1 ) { + short *hex = hexmod[hexindex]; + + for (int d = 3; d < 6; d++) { + float (*rix)[3] = &rgb[(d - 2) ^ 1][row - top][col - left]; + float val = 0.33333333f * (rix[-2 * hex[d]][1] + 2 * (rix[hex[d]][1] - rix[hex[d]][f]) + - rix[-2 * hex[d]][f]) + rix[0][f]; + rix[0][1] = LIM(val, greenminmaxtile[row - top][(col - left) >> 1].min, greenminmaxtile[row - top][(col - left) >> 1].max); + } + } + } + } + } + + /* Interpolate red and blue values for solitary green pixels: */ + int sgstartcol = (left - sgcol + 4) / 3 * 3 + sgcol; + + for (int row = (top - sgrow + 4) / 3 * 3 + sgrow; row < mrow - 2; row += 3) { + for (int col = sgstartcol, h = fcol(row, col + 1); col < mcol - 2; col += 3, h ^= 2) { + float (*rix)[3] = &rgb[0][row - top][col - left]; + float diff[6] = {0.f}; + + for (int i = 1, d = 0; d < 6; d++, i ^= ts ^ 1, h ^= 2) { + for (int c = 0; c < 2; c++, h ^= 2) { + float g = rix[0][1] + rix[0][1] - rix[i << c][1] - rix[-i << c][1]; + color[h][d] = g + rix[i << c][h] + rix[-i << c][h]; + + if (d > 1) + diff[d] += SQR (rix[i << c][1] - rix[-i << c][1] + - rix[i << c][h] + rix[-i << c][h]) + SQR(g); + } + + if (d > 2 && (d & 1)) // 3, 5 + if (diff[d - 1] < diff[d]) + for(int c = 0; c < 2; c++) { + color[c * 2][d] = color[c * 2][d - 1]; + } + + if ((d & 1) || d < 2) { // d: 0, 1, 3, 5 + for(int c = 0; c < 2; c++) { + rix[0][c * 2] = CLIP(0.5f * color[c * 2][d]); + } + + rix += ts * ts; + } + } + } + } + + /* Interpolate red for blue pixels and vice versa: */ + for (int row = top + 3; row < mrow - 3; row++) { + int leftstart = left + 3; + + for(; leftstart < mcol - 1; leftstart++) + if(!isgreen(row, leftstart)) { + break; + } + + int coloffset = (RightShift[row % 3] == 1 ? 3 : 1); + c = (row - sgrow) % 3 ? ts : 1; + int h = 3 * (c ^ ts ^ 1); + + if(coloffset == 3) { + int f = 2 - fcol(row, leftstart); + + for (int col = leftstart; col < mcol - 3; col += coloffset, f ^= 2) { + float (*rix)[3] = &rgb[0][row - top][col - left]; + + for (int d = 0; d < 4; d++, rix += ts * ts) { + int i = d > 1 || ((d ^ c) & 1) || + ((fabsf(rix[0][1] - rix[c][1]) + fabsf(rix[0][1] - rix[-c][1])) < 2.f * (fabsf(rix[0][1] - rix[h][1]) + fabsf(rix[0][1] - rix[-h][1]))) ? c : h; + + rix[0][f] = CLIP(rix[0][1] + 0.5f * (rix[i][f] + rix[-i][f] - rix[i][1] - rix[-i][1])); + } + } + } else { + coloffset = fcol(row, leftstart + 1) == 1 ? 2 : 1; + int f = 2 - fcol(row, leftstart); + + for (int col = leftstart; col < mcol - 3; col += coloffset, coloffset ^= 3, f = f ^ (coloffset & 2) ) { + float (*rix)[3] = &rgb[0][row - top][col - left]; + + for (int d = 0; d < 4; d++, rix += ts * ts) { + int i = d > 1 || ((d ^ c) & 1) || + ((fabsf(rix[0][1] - rix[c][1]) + fabsf(rix[0][1] - rix[-c][1])) < 2.f * (fabsf(rix[0][1] - rix[h][1]) + fabsf(rix[0][1] - rix[-h][1]))) ? c : h; + + rix[0][f] = CLIP(rix[0][1] + 0.5f * (rix[i][f] + rix[-i][f] - rix[i][1] - rix[-i][1])); + } + } + } + } + + /* Fill in red and blue for 2x2 blocks of green: */ + // Find first row of 2x2 green + int topstart = top + 2; + + for(; topstart < mrow - 2; topstart++) + if((topstart - sgrow) % 3) { + break; + } + + int leftstart = left + 2; + + for(; leftstart < mcol - 2; leftstart++) + if((leftstart - sgcol) % 3) { + break; + } + + int coloffsetstart = 2 - (fcol(topstart, leftstart + 1) & 1); + + for (int row = topstart; row < mrow - 2; row++) { + if ((row - sgrow) % 3) { + short *hexmod[2]; + hexmod[0] = allhex[1][row % 3][leftstart % 3]; + hexmod[1] = allhex[1][row % 3][(leftstart + coloffsetstart) % 3]; + + for (int col = leftstart, coloffset = coloffsetstart, hexindex = 0; col < mcol - 2; col += coloffset, coloffset ^= 3, hexindex ^= 1) { + float (*rix)[3] = &rgb[0][row - top][col - left]; + short *hex = hexmod[hexindex]; + + for (int d = 0; d < ndir; d += 2, rix += ts * ts) { + if (hex[d] + hex[d + 1]) { + float 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]) * 0.33333333f); + } + } else { + float 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]) * 0.5f); + } + } + } + } + } + } + } + +// end of multipass part + rgb = (float(*)[ts][ts][3]) buffer; + mrow -= top; + mcol -= left; + + if(useCieLab) { + /* Convert to CIELab and differentiate in all directions: */ + // Original dcraw algorithm uses CIELab as perceptual space + // (presumably coming from original AHD) and converts taking + // camera matrix into account. We use this in RT. + for (int d = 0; d < ndir; d++) { + float *l = &lab[0][0][0]; + float *a = &lab[1][0][0]; + float *b = &lab[2][0][0]; + cielab(&rgb[d][4][4], l, a, b, ts, mrow - 8, ts - 8, xyz_cam); + int f = dir[d & 3]; + f = f == 1 ? 1 : f - 8; + + for (int row = 5; row < mrow - 5; row++) +#ifdef _OPENMP + #pragma omp simd +#endif + for (int col = 5; col < mcol - 5; col++) { + float *l = &lab[0][row - 4][col - 4]; + float *a = &lab[1][row - 4][col - 4]; + float *b = &lab[2][row - 4][col - 4]; + + float g = 2 * l[0] - l[f] - l[-f]; + drv[d][row - 5][col - 5] = SQR(g) + + SQR((2 * a[0] - a[f] - a[-f] + g * 2.1551724f)) + + SQR((2 * b[0] - b[f] - b[-f] - g * 0.86206896f)); + } + + } + } else { + // For 1-pass demosaic we use YPbPr which requires much + // less code and is nearly indistinguishable. It assumes the + // camera RGB is roughly linear. + for (int d = 0; d < ndir; d++) { + float (*yuv)[ts - 8][ts - 8] = lab; // we use the lab buffer, which has the same dimensions +#ifdef __SSE2__ + vfloat zd2627v = F2V(0.2627f); + vfloat zd6780v = F2V(0.6780f); + vfloat zd0593v = F2V(0.0593f); + vfloat zd56433v = F2V(0.56433f); + vfloat zd67815v = F2V(0.67815f); +#endif + + for (int row = 4; row < mrow - 4; row++) { + int col = 4; +#ifdef __SSE2__ + + for (; col < mcol - 7; col += 4) { + // use ITU-R BT.2020 YPbPr, which is great, but could use + // a better/simpler choice? note that imageop.h provides + // dt_iop_RGB_to_YCbCr which uses Rec. 601 conversion, + // which appears less good with specular highlights + vfloat redv, greenv, bluev; + vconvertrgbrgbrgbrgb2rrrrggggbbbb(rgb[d][row][col], redv, greenv, bluev); + vfloat yv = zd2627v * redv + zd6780v * bluev + zd0593v * greenv; + STVFU(yuv[0][row - 4][col - 4], yv); + STVFU(yuv[1][row - 4][col - 4], (bluev - yv) * zd56433v); + STVFU(yuv[2][row - 4][col - 4], (redv - yv) * zd67815v); + } + +#endif + + for (; col < mcol - 4; col++) { + // use ITU-R BT.2020 YPbPr, which is great, but could use + // a better/simpler choice? note that imageop.h provides + // dt_iop_RGB_to_YCbCr which uses Rec. 601 conversion, + // which appears less good with specular highlights + float y = 0.2627f * rgb[d][row][col][0] + 0.6780f * rgb[d][row][col][1] + 0.0593f * rgb[d][row][col][2]; + yuv[0][row - 4][col - 4] = y; + yuv[1][row - 4][col - 4] = (rgb[d][row][col][2] - y) * 0.56433f; + yuv[2][row - 4][col - 4] = (rgb[d][row][col][0] - y) * 0.67815f; + } + } + + int f = dir[d & 3]; + f = f == 1 ? 1 : f - 8; + + for (int row = 5; row < mrow - 5; row++) + for (int col = 5; col < mcol - 5; col++) { + float *y = &yuv[0][row - 4][col - 4]; + float *u = &yuv[1][row - 4][col - 4]; + float *v = &yuv[2][row - 4][col - 4]; + drv[d][row - 5][col - 5] = SQR(2 * y[0] - y[f] - y[-f]) + + SQR(2 * u[0] - u[f] - u[-f]) + + SQR(2 * v[0] - v[f] - v[-f]); + } + } + } + + /* Build homogeneity maps from the derivatives: */ +#ifdef __SSE2__ + vfloat eightv = F2V(8.f); + vfloat zerov = F2V(0.f); + vfloat onev = F2V(1.f); +#endif + + for (int row = 6; row < mrow - 6; row++) { + int col = 6; +#ifdef __SSE2__ + + for (; col < mcol - 9; col += 4) { + vfloat tr1v = vminf(LVFU(drv[0][row - 5][col - 5]), LVFU(drv[1][row - 5][col - 5])); + vfloat tr2v = vminf(LVFU(drv[2][row - 5][col - 5]), LVFU(drv[3][row - 5][col - 5])); + + if(ndir > 4) { + vfloat tr3v = vminf(LVFU(drv[4][row - 5][col - 5]), LVFU(drv[5][row - 5][col - 5])); + vfloat tr4v = vminf(LVFU(drv[6][row - 5][col - 5]), LVFU(drv[7][row - 5][col - 5])); + tr1v = vminf(tr1v, tr3v); + tr1v = vminf(tr1v, tr4v); + } + + tr1v = vminf(tr1v, tr2v); + tr1v = tr1v * eightv; + + for (int d = 0; d < ndir; d++) { + uint8_t tempstore[16]; + vfloat tempv = zerov; + + for (int v = -1; v <= 1; v++) { + for (int h = -1; h <= 1; h++) { + tempv += vselfzero(vmaskf_le(LVFU(drv[d][row + v - 5][col + h - 5]), tr1v), onev); + } + } + + _mm_storeu_si128((__m128i*)&tempstore, _mm_cvtps_epi32(tempv)); + homo[d][row][col] = tempstore[0]; + homo[d][row][col + 1] = tempstore[4]; + homo[d][row][col + 2] = tempstore[8]; + homo[d][row][col + 3] = tempstore[12]; + + } + } + +#endif + + for (; col < mcol - 6; col++) { + float tr = drv[0][row - 5][col - 5] < drv[1][row - 5][col - 5] ? drv[0][row - 5][col - 5] : drv[1][row - 5][col - 5]; + + for (int d = 2; d < ndir; d++) { + tr = (drv[d][row - 5][col - 5] < tr ? drv[d][row - 5][col - 5] : tr); + } + + tr *= 8; + + for (int d = 0; d < ndir; d++) { + uint8_t temp = 0; + + for (int v = -1; v <= 1; v++) { + for (int h = -1; h <= 1; h++) { + temp += (drv[d][row + v - 5][col + h - 5] <= tr ? 1 : 0); + } + } + + homo[d][row][col] = temp; + } + } + } + + if (height - top < ts + 4) { + mrow = height - top + 2; + } + + if (width - left < ts + 4) { + mcol = width - left + 2; + } + + + /* Build 5x5 sum of homogeneity maps */ + const int startcol = MIN(left, 8); + + for(int d = 0; d < ndir; d++) { + for (int row = MIN(top, 8); row < mrow - 8; row++) { + int col = startcol; +#ifdef __SSE2__ + int endcol = row < mrow - 9 ? mcol - 8 : mcol - 23; + + // crunching 16 values at once is faster than summing up column sums + for (; col < endcol; col += 16) { + vint v5sumv = (vint)ZEROV; + + for(int v = -2; v <= 2; v++) + for(int h = -2; h <= 2; h++) { + v5sumv = _mm_adds_epu8( _mm_loadu_si128((vint*)&homo[d][row + v][col + h]), v5sumv); + } + + _mm_storeu_si128((vint*)&homosum[d][row][col], v5sumv); + } + +#endif + + if(col < mcol - 8) { + int v5sum[5] = {0}; + + for(int v = -2; v <= 2; v++) + for(int h = -2; h <= 2; h++) { + v5sum[2 + h] += homo[d][row + v][col + h]; + } + + int blocksum = v5sum[0] + v5sum[1] + v5sum[2] + v5sum[3] + v5sum[4]; + homosum[d][row][col] = blocksum; + col++; + + // now we can subtract a column of five from blocksum and get new colsum of 5 + for (int voffset = 0; col < mcol - 8; col++, voffset++) { + int colsum = homo[d][row - 2][col + 2] + homo[d][row - 1][col + 2] + homo[d][row][col + 2] + homo[d][row + 1][col + 2] + homo[d][row + 2][col + 2]; + voffset = voffset == 5 ? 0 : voffset; // faster than voffset %= 5; + blocksum -= v5sum[voffset]; + blocksum += colsum; + v5sum[voffset] = colsum; + homosum[d][row][col] = blocksum; + } + } + } + } + + // calculate maximum of homogeneity maps per pixel. Vectorized calculation is a tiny bit faster than on the fly calculation in next step +#ifdef __SSE2__ + vint maskv = _mm_set1_epi8(31); +#endif + + for (int row = MIN(top, 8); row < mrow - 8; row++) { + int col = startcol; +#ifdef __SSE2__ + int endcol = row < mrow - 9 ? mcol - 8 : mcol - 23; + + for (; col < endcol; col += 16) { + vint maxval1 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[0][row][col]), _mm_loadu_si128((vint*)&homosum[1][row][col])); + vint maxval2 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[2][row][col]), _mm_loadu_si128((vint*)&homosum[3][row][col])); + + if(ndir > 4) { + vint maxval3 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[4][row][col]), _mm_loadu_si128((vint*)&homosum[5][row][col])); + vint maxval4 = _mm_max_epu8(_mm_loadu_si128((vint*)&homosum[6][row][col]), _mm_loadu_si128((vint*)&homosum[7][row][col])); + maxval1 = _mm_max_epu8(maxval1, maxval3); + maxval1 = _mm_max_epu8(maxval1, maxval4); + } + + maxval1 = _mm_max_epu8(maxval1, maxval2); + // there is no shift intrinsic for epu8. Shift using epi32 and mask the wrong bits out + vint subv = _mm_srli_epi32( maxval1, 3 ); + subv = _mm_and_si128(subv, maskv); + maxval1 = _mm_subs_epu8(maxval1, subv); + _mm_storeu_si128((vint*)&homosummax[row][col], maxval1); + } + +#endif + + for (; col < mcol - 8; col ++) { + uint8_t maxval = homosum[0][row][col]; + + for(int d = 1; d < ndir; d++) { + maxval = maxval < homosum[d][row][col] ? homosum[d][row][col] : maxval; + } + + maxval -= maxval >> 3; + homosummax[row][col] = maxval; + } + } + + + /* Average the most homogeneous pixels for the final result: */ + uint8_t hm[8] = {}; + + for (int row = MIN(top, 8); row < mrow - 8; row++) + for (int col = MIN(left, 8); col < mcol - 8; col++) { + + for (int d = 0; d < 4; d++) { + hm[d] = homosum[d][row][col]; + } + + for (int d = 4; d < ndir; d++) { + hm[d] = homosum[d][row][col]; + + if (hm[d - 4] < hm[d]) { + hm[d - 4] = 0; + } else if (hm[d - 4] > hm[d]) { + hm[d] = 0; + } + } + + float avg[4] = {0.f}; + + uint8_t maxval = homosummax[row][col]; + + for (int d = 0; d < ndir; d++) + if (hm[d] >= maxval) { + for (int c = 0; c < 3; c++) { + avg[c] += rgb[d][row][col][c]; + } + avg[3]++; + } + + red[row + top][col + left] = avg[0] / avg[3]; + green[row + top][col + left] = avg[1] / avg[3]; + blue[row + top][col + left] = avg[2] / avg[3]; + } + + if(plistenerActive && ((++progressCounter) % 32 == 0)) { +#ifdef _OPENMP + #pragma omp critical (xtransdemosaic) +#endif + { + progress += progressInc; + progress = min(1.0, progress); + plistener->setProgress (progress); + } + } + + + } + + free(buffer); + } + + xtransborder_interpolate(8, red, green, blue); +} +#undef CLIP +void RawImageSource::fast_xtrans_interpolate (const array2D &rawData, array2D &red, array2D &green, array2D &blue) +{ + + if (plistener) { + plistener->setProgressStr(Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), "fast Xtrans")); + plistener->setProgress(0.0); + } + + xtransborder_interpolate(1, red, green, blue); + int xtrans[6][6]; + ri->getXtransMatrix(xtrans); + + const float weight[3][3] = { + {0.25f, 0.5f, 0.25f}, + {0.5f, 0.f, 0.5f}, + {0.25f, 0.5f, 0.25f} + }; +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic, 16) +#endif + for (int row = 1; row < H - 1; ++row) { + for (int col = 1; col < W - 1; ++col) { + float sum[3] = {}; + + for (int v = -1; v <= 1; v++) { + for (int h = -1; h <= 1; h++) { + sum[fcol(row + v, col + h)] += rawData[row + v][(col + h)] * weight[v + 1][h + 1]; + } + } + + switch(fcol(row, col)) { + case 0: // red pixel + red[row][col] = rawData[row][col]; + green[row][col] = sum[1] * 0.5f; + blue[row][col] = sum[2]; + break; + + case 1: // green pixel + green[row][col] = rawData[row][col]; + if (fcol(row, col - 1) == fcol(row, col + 1)) { // Solitary green pixel always has exactly two direct red and blue neighbors in 3x3 grid + red[row][col] = sum[0]; + blue[row][col] = sum[2]; + } else { // Non solitary green pixel always has one direct and one diagonal red and blue neighbor in 3x3 grid + red[row][col] = sum[0] * 1.3333333f; + blue[row][col] = sum[2] * 1.3333333f; + } + break; + + case 2: // blue pixel + red[row][col] = sum[0]; + green[row][col] = sum[1] * 0.5f; + blue[row][col] = rawData[row][col]; + break; + } + } + } + + if (plistener) { + plistener->setProgress (1.0); + } +} +#undef fcol +#undef isgreen + +} + diff --git a/rtexif/canonattribs.cc b/rtexif/canonattribs.cc index 3b0d9c9ef..2dcbdd96f 100644 --- a/rtexif/canonattribs.cc +++ b/rtexif/canonattribs.cc @@ -32,7 +32,7 @@ namespace rtexif class CAOnOffInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int n = t->toInt(); @@ -51,7 +51,7 @@ class CAIntSerNumInterpreter : public Interpreter { public: CAIntSerNumInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { return ""; } @@ -63,7 +63,7 @@ class CAApertureInterpreter : public Interpreter { public: CAApertureInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double v = pow (2.0, t->toDouble() / 64.0); @@ -78,7 +78,7 @@ public: }; CAApertureInterpreter caApertureInterpreter; -class CAMacroModeInterpreter : public ChoiceInterpreter +class CAMacroModeInterpreter : public ChoiceInterpreter<> { public: CAMacroModeInterpreter() @@ -92,7 +92,7 @@ CAMacroModeInterpreter caMacroModeInterpreter; class CASelfTimerInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int sec = t->toInt (0, SHORT); @@ -107,7 +107,7 @@ public: }; CASelfTimerInterpreter caSelfTimerInterpreter; -class CAQualityInterpreter : public ChoiceInterpreter +class CAQualityInterpreter : public ChoiceInterpreter<> { public: CAQualityInterpreter() @@ -121,7 +121,7 @@ public: }; CAQualityInterpreter caQualityInterpreter; -class CAFlashModeInterpreter : public ChoiceInterpreter +class CAFlashModeInterpreter : public ChoiceInterpreter<> { public: CAFlashModeInterpreter() @@ -138,7 +138,7 @@ public: }; CAFlashModeInterpreter caFlashModeInterpreter; -class CAContinuousDriveInterpreter : public ChoiceInterpreter +class CAContinuousDriveInterpreter : public ChoiceInterpreter<> { public: CAContinuousDriveInterpreter() @@ -156,7 +156,7 @@ public: }; CAContinuousDriveInterpreter caContinuousDriveInterpreter; -class CAFocusModeInterpreter : public ChoiceInterpreter +class CAFocusModeInterpreter : public ChoiceInterpreter<> { public: CAFocusModeInterpreter() @@ -176,7 +176,7 @@ public: }; CAFocusModeInterpreter caFocusModeInterpreter; -class CARecordModeInterpreter : public ChoiceInterpreter +class CARecordModeInterpreter : public ChoiceInterpreter<> { public: CARecordModeInterpreter() @@ -194,7 +194,7 @@ public: }; CARecordModeInterpreter caRecordModeInterpreter; -class CAImageSizeInterpreter : public ChoiceInterpreter +class CAImageSizeInterpreter : public ChoiceInterpreter<> { public: CAImageSizeInterpreter () @@ -220,7 +220,7 @@ public: }; CAImageSizeInterpreter caImageSizeInterpreter; -class CAEasyModeInterpreter : public ChoiceInterpreter +class CAEasyModeInterpreter : public ChoiceInterpreter<> { public: CAEasyModeInterpreter () @@ -300,7 +300,7 @@ public: }; CAEasyModeInterpreter caEasyModeInterpreter; -class CADigitalZoomInterpreter : public ChoiceInterpreter +class CADigitalZoomInterpreter : public ChoiceInterpreter<> { public: CADigitalZoomInterpreter() @@ -313,7 +313,7 @@ public: }; CADigitalZoomInterpreter caDigitalZoomInterpreter; -class CAMeteringModeInterpreter : public ChoiceInterpreter +class CAMeteringModeInterpreter : public ChoiceInterpreter<> { public: CAMeteringModeInterpreter() @@ -328,7 +328,7 @@ public: }; CAMeteringModeInterpreter caMeteringModeInterpreter; -class CAFocusRangeInterpreter : public ChoiceInterpreter +class CAFocusRangeInterpreter : public ChoiceInterpreter<> { public: CAFocusRangeInterpreter() @@ -348,7 +348,7 @@ public: }; CAFocusRangeInterpreter caFocusRangeInterpreter; -class CAAFPointInterpreter : public ChoiceInterpreter +class CAAFPointInterpreter : public ChoiceInterpreter<> { public: CAAFPointInterpreter() @@ -365,7 +365,7 @@ public: }; CAAFPointInterpreter caAFPointInterpreter; -class CAExposureModeInterpreter : public ChoiceInterpreter +class CAExposureModeInterpreter : public ChoiceInterpreter<> { public: CAExposureModeInterpreter() @@ -385,7 +385,7 @@ CAExposureModeInterpreter caExposureModeInterpreter; class CAFlashBitsInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream s; unsigned bits = t->toInt (0, SHORT); @@ -431,7 +431,7 @@ public: }; CAFlashBitsInterpreter caFlashBitsInterpreter; -class CAFocusContinuousInterpreter : public ChoiceInterpreter +class CAFocusContinuousInterpreter : public ChoiceInterpreter<> { public: CAFocusContinuousInterpreter() @@ -443,7 +443,7 @@ public: }; CAFocusContinuousInterpreter caFocusContinuousInterpreter; -class CAAESettingsInterpreter : public ChoiceInterpreter +class CAAESettingsInterpreter : public ChoiceInterpreter<> { public: CAAESettingsInterpreter() @@ -457,7 +457,7 @@ public: }; CAAESettingsInterpreter caAESettingsInterpreter; -class CAStabilizationInterpreter : public ChoiceInterpreter +class CAStabilizationInterpreter : public ChoiceInterpreter<> { public: CAStabilizationInterpreter() @@ -476,7 +476,7 @@ public: }; CAStabilizationInterpreter caStabilizationInterpreter; -class CASpotMeteringInterpreter : public ChoiceInterpreter +class CASpotMeteringInterpreter : public ChoiceInterpreter<> { public: CASpotMeteringInterpreter() @@ -487,7 +487,7 @@ public: }; CASpotMeteringInterpreter caSpotMeteringInterpreter; -class CAPhotoEffectInterpreter : public ChoiceInterpreter +class CAPhotoEffectInterpreter : public ChoiceInterpreter<> { public: CAPhotoEffectInterpreter() @@ -504,7 +504,7 @@ public: }; CAPhotoEffectInterpreter caPhotoEffectInterpreter; -class CAManualFlashInterpreter : public ChoiceInterpreter +class CAManualFlashInterpreter : public ChoiceInterpreter<> { public: CAManualFlashInterpreter() @@ -518,7 +518,7 @@ public: }; CAManualFlashInterpreter caManualFlashInterpreter; -class CARAWQualityInterpreter : public ChoiceInterpreter +class CARAWQualityInterpreter : public ChoiceInterpreter<> { public: CARAWQualityInterpreter() @@ -533,7 +533,7 @@ CARAWQualityInterpreter caRAWQualityInterpreter; class CAFocalInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { Tag *unitTag = t->getParent()->getRoot()->findTag ("FocalUnits"); double v = unitTag ? unitTag->toDouble() : 1.; @@ -567,6 +567,7 @@ public: {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"}, + {6, "Sigma 28-300mm f/3.5-6.3 DG 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"}, @@ -656,13 +657,16 @@ public: {82, "Canon TS-E 135mm f/4L Macro"}, {94, "Canon TS-E 17mm f/4L"}, {95, "Canon TS-E 24mm f/3.5L II"}, + {103, "Samyang AF 14mm f/2.8 EF or Rokinon Lens"}, + {103, "Rokinon SP 14mm f/2.4"}, + {103, "Rokinon AF 14mm f/2.8 EF"}, {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"}, - {130, "Canon EF 50mm f/1.0L"}, - {131, "Canon EF 28-80mm f/2.8-4L or Sigma Lens"}, + {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"}, @@ -670,11 +674,11 @@ public: {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"}, - {134, "Canon EF 600mm f/4L IS"}, - {135, "Canon EF 200mm f/1.8L"}, - {136, "Canon EF 300mm f/2.8L"}, - {137, "Canon EF 85mm f/1.2L or Sigma or Tamron Lens"}, + {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"}, @@ -692,11 +696,11 @@ public: {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"}, - {140, "Canon EF 500mm f/4.5L"}, - {141, "Canon EF 500mm f/4.5L"}, - {142, "Canon EF 300mm f/2.8L IS"}, - {143, "Canon EF 500mm f/4L IS or Sigma Lens"}, + {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"}, @@ -704,18 +708,18 @@ public: {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 or Sigma Lens"}, + {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"}, - {152, "Canon EF 300mm f/4L IS or Sigma Lens"}, + {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 or Sigma or Tamron Lens"}, + {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"}, @@ -724,7 +728,7 @@ public: {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.0-5.6 Di VC USD"}, + {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"}, @@ -732,7 +736,7 @@ public: {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 or Sigma or Tamron Lens"}, + {161, "Canon EF 28-70mm f/2.8L USM or Other 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"}, @@ -740,15 +744,16 @@ public: {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"}, + {161, "Tokina AT-X 24-70mm f/2.8 PRO FX (IF)"}, + {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.8 L"}, - {166, "Canon EF 70-200mm f/2.8 L + 1.4x"}, - {167, "Canon EF 70-200mm f/2.8 L + 2x"}, + {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 or Sigma Lens"}, + {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"}, @@ -756,48 +761,54 @@ public: {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"}, - {171, "Canon EF 300mm f/4L"}, - {172, "Canon EF 400mm f/5.6L or Sigma Lens"}, + {169, "Sigma 35mm f/1.5 FF High-Speed Prime | 017"}, + {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 or Sigma Lens"}, + {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 or Other Lens"}, + {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"}, + {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"}, + {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"}, - {180, "Canon EF 35mm f/1.4L or Other Lens"}, + {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 + 1.4x or Sigma Lens"}, + {180, "Sigma 24mm f/1.5 FF High-Speed Prime | 017"}, + {180, "Sigma 50mm f/1.5 FF High-Speed Prime | 017"}, + {180, "Sigma 85mm f/1.5 FF High-Speed Prime | 017"}, + {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 + 2x or Sigma Lens"}, + {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 or Sigma Lens"}, + {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 + 2x"}, - {185, "Canon EF 600mm f/4L IS"}, - {186, "Canon EF 70-200mm f/4L"}, - {187, "Canon EF 70-200mm f/4L + 1.4x"}, - {188, "Canon EF 70-200mm f/4L + 2x"}, - {189, "Canon EF 70-200mm f/4L + 2.8x"}, + {183, "Sigma 180mm f/3.5 APO Macro EX DG IF 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"}, + {191, "Canon EF 400mm f/4 DO IS or Sigma Lens"}, + {191, "Sigma 500mm f/4 DG OS HSM"}, {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"}, @@ -807,6 +818,7 @@ public: {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"}, + {198, "Zeiss Milvus 25mm f/1.4"}, {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"}, @@ -824,57 +836,72 @@ public: {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"}, - {225, "Canon EF 70-200mm f/2.8L IS + 1.4x"}, - {226, "Canon EF 70-200mm f/2.8L IS + 2x"}, - {227, "Canon EF 70-200mm f/2.8L IS + 2.8x"}, + {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"}, - {230, "Canon EF 24-70mm f/2.8L"}, - {231, "Canon EF 17-40mm f/4L"}, + {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"}, + {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"}, + {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"}, - {240, "Canon EF-S 17-55mm f/2.8 IS USM"}, - {241, "Canon EF 50mm f/1.2L"}, - {242, "Canon EF 70-200mm f/4L IS"}, - {243, "Canon EF 70-200mm f/4L IS + 1.4x"}, - {244, "Canon EF 70-200mm f/4L IS + 2x"}, - {245, "Canon EF 70-200mm f/4L IS + 2.8x"}, - {246, "Canon EF 16-35mm f/2.8L II"}, + {239, "Canon EF 85mm f/1.2L II USM or Rokinon Lens"}, + {239, "Rokinon SP 85mm f/1.2"}, + {240, "Canon EF-S 17-55mm f/2.8 IS USM or Sigma Lens"}, + {240, "Sigma 17-50mm f/2.8 EX DC OS HSM"}, + {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 or Sigma Lens"}, + {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"}, - {250, "Canon EF 24mm f/1.4L II or Sigma Lens"}, + {248, "Sigma 135mm f/2 FF High-Speed Prime | 017"}, + {248, "Sigma 24-35mm f/2.2 FF Zoom | 017"}, + {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"}, + {250, "Sigma 20mm f/1.5 FF High-Speed Prime | 017"}, {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"}, + {368, "Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens"}, + {368, "Sigma 20mm f/1.4 DG HSM | A"}, + {368, "Sigma 50mm f/1.4 DG HSM | A"}, + {368, "Sigma 40mm f/1.4 DG HSM | A"}, + {368, "Sigma 60-600mm f/4.5-6.3 DG OS HSM | S"}, {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)"}, + {491, "Tamron 100-400mm f/4.5-6.3 Di VC USD (A035)"}, + {491, "Tamron 70-210mm f/4 Di VC USD (A034)"}, + {491, "Tamron 70-210mm f/4 Di VC USD (A034) + 1.4x"}, + {491, "Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)"}, {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/4.0L IS II 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"}, + {502, "Canon EF 28mm f/2.8 IS USM or Tamron Lens"}, + {502, "Tamron 35mm f/1.8 Di VC USD (F012)"}, {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"}, @@ -883,11 +910,19 @@ public: {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"}, + {747, "Tamron SP 150-600mm f/5-6.3 Di VC USD G2"}, + {748, "Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens"}, + {748, "Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 1.4x"}, + {748, "Tamron 70-210mm f/4 Di VC USD (A034) + 2x"}, + {749, "Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 2x"}, {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"}, + {754, "Canon EF 70-200mm f/4L IS II USM"}, + {757, "Canon EF 400mm f/2.8L IS III USM"}, + {758, "Canon EF 600mm f/4L IS III USM"}, + {1136, "Sigma 24-70mm f/2.8 DG OS HSM | Art 017"}, {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"}, @@ -905,9 +940,14 @@ public: {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"}, + {4159, "Canon EF-M 32mm f/1.4 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"}, + {61182, "Canon RF 35mm F1.8 Macro IS STM or other Canon RF Lens"}, + {61182, "Canon RF 50mm F1.2 L USM"}, + {61182, "Canon RF 24-105mm F4 L IS USM"}, + {61182, "Canon RF 28-70mm F2 L 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"}, @@ -917,7 +957,7 @@ public: }; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int lensID = t->toInt(); @@ -1054,7 +1094,7 @@ public: }; CALensInterpreter caLensInterpreter; -class CAFocalTypeInterpreter : public ChoiceInterpreter +class CAFocalTypeInterpreter : public ChoiceInterpreter<> { public: CAFocalTypeInterpreter() @@ -1069,7 +1109,7 @@ CAFocalTypeInterpreter caFocalTypeInterpreter; class CAFocalPlaneInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int val = t->toInt(); @@ -1087,7 +1127,7 @@ CAFocalPlaneInterpreter caFocalPlaneInterpreter; class CAExposureTimeInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double d = pow (2, - t->toInt() / 32.0); @@ -1099,7 +1139,7 @@ CAExposureTimeInterpreter caExposureTimeInterpreter; class CAEVInterpreter : public Interpreter { - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; sprintf (buffer, "%.1f", t->toDouble() / 32.0 ); @@ -1111,14 +1151,14 @@ CAEVInterpreter caEVInterpreter; class CABaseISOInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; int a = t->toInt(); sprintf (buffer, "%d", a); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = Interpreter::toInt (t, ofs); @@ -1129,7 +1169,7 @@ public: return 0.; } } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { int a = Interpreter::toInt (t, ofs, astype); @@ -1143,7 +1183,7 @@ public: }; CABaseISOInterpreter caBaseISOInterpreter; -class CAToneCurveInterpreter : public ChoiceInterpreter +class CAToneCurveInterpreter : public ChoiceInterpreter<> { public: CAToneCurveInterpreter() @@ -1155,7 +1195,7 @@ public: }; CAToneCurveInterpreter caToneCurveInterpreter; -class CASharpnessFrequencyInterpreter : public ChoiceInterpreter +class CASharpnessFrequencyInterpreter : public ChoiceInterpreter<> { public: CASharpnessFrequencyInterpreter() @@ -1170,7 +1210,7 @@ public: }; CASharpnessFrequencyInterpreter caSharpnessFrequencyInterpreter; -class CAWhiteBalanceInterpreter : public ChoiceInterpreter +class CAWhiteBalanceInterpreter : public ChoiceInterpreter<> { public: CAWhiteBalanceInterpreter() @@ -1201,7 +1241,7 @@ public: }; CAWhiteBalanceInterpreter caWhiteBalanceInterpreter; -class CAPictureStyleInterpreter : public ChoiceInterpreter +class CAPictureStyleInterpreter : public ChoiceInterpreter<> { public: CAPictureStyleInterpreter() @@ -1232,7 +1272,7 @@ public: }; CAPictureStyleInterpreter caPictureStyleInterpreter; -class CASlowShutterInterpreter : public ChoiceInterpreter +class CASlowShutterInterpreter : public ChoiceInterpreter<> { public: CASlowShutterInterpreter() @@ -1248,7 +1288,7 @@ CASlowShutterInterpreter caSlowShutterInterpreter; class CAFlashGuideNumberInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int n = t->toInt(); @@ -1263,7 +1303,7 @@ public: }; CAFlashGuideNumberInterpreter caFlashGuideNumberInterpreter; -class CAAFPointsInFocusInterpreter : public ChoiceInterpreter +class CAAFPointsInFocusInterpreter : public ChoiceInterpreter<> { public: CAAFPointsInFocusInterpreter() @@ -1280,7 +1320,7 @@ public: }; CAAFPointsInFocusInterpreter caAFPointsInFocusInterpreter; -class CAAutoExposureBracketingInterpreter : public ChoiceInterpreter +class CAAutoExposureBracketingInterpreter : public ChoiceInterpreter { public: CAAutoExposureBracketingInterpreter() @@ -1294,7 +1334,7 @@ public: }; CAAutoExposureBracketingInterpreter caAutoExposureBracketingInterpreter; -class CAControModeInterpreter : public ChoiceInterpreter +class CAControModeInterpreter : public ChoiceInterpreter<> { public: CAControModeInterpreter() @@ -1309,7 +1349,7 @@ CAControModeInterpreter caControModeInterpreter; class CAFocusDistanceInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; sprintf (buffer, "%.2f", t->toDouble() / 100 ); @@ -1321,7 +1361,7 @@ CAFocusDistanceInterpreter caFocusDistanceInterpreter; class CAMeasuredEVInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; sprintf (buffer, "%.1f", t->toDouble() / 8 - 6 ); @@ -1330,7 +1370,7 @@ public: }; CAMeasuredEVInterpreter caMeasuredEVInterpreter; -class CACameraTypeInterpreter : public ChoiceInterpreter +class CACameraTypeInterpreter : public ChoiceInterpreter<> { public: CACameraTypeInterpreter() @@ -1343,7 +1383,7 @@ public: }; CACameraTypeInterpreter caCameraTypeInterpreter; -class CAAutoRotateInterpreter : public ChoiceInterpreter +class CAAutoRotateInterpreter : public ChoiceInterpreter { public: CAAutoRotateInterpreter() @@ -1357,7 +1397,7 @@ public: }; CAAutoRotateInterpreter caAutoRotateInterpreter; -class CABracketModeInterpreter : public ChoiceInterpreter +class CABracketModeInterpreter : public ChoiceInterpreter<> { public: CABracketModeInterpreter() @@ -1371,7 +1411,7 @@ public: }; CABracketModeInterpreter caBracketModeInterpreter; -class CARAWJpegQualityInterpreter : public ChoiceInterpreter +class CARAWJpegQualityInterpreter : public ChoiceInterpreter<> { public: CARAWJpegQualityInterpreter() @@ -1387,7 +1427,7 @@ public: }; CARAWJpegQualityInterpreter caRAWJpegQualityInterpreter; -class CAJpegSizeInterpreter : public ChoiceInterpreter +class CAJpegSizeInterpreter : public ChoiceInterpreter<> { public: CAJpegSizeInterpreter() @@ -1413,7 +1453,7 @@ public: }; CAJpegSizeInterpreter caJpegSizeInterpreter; -class CAWBBracketModeInterpreter : public ChoiceInterpreter +class CAWBBracketModeInterpreter : public ChoiceInterpreter<> { public: CAWBBracketModeInterpreter() @@ -1425,7 +1465,7 @@ public: }; CAWBBracketModeInterpreter caWBBracketModeInterpreter; -class CAFilterEffectInterpreter : public ChoiceInterpreter +class CAFilterEffectInterpreter : public ChoiceInterpreter<> { public: CAFilterEffectInterpreter() @@ -1439,7 +1479,7 @@ public: }; CAFilterEffectInterpreter caFilterEffectInterpreter; -class CAToningEffectInterpreter : public ChoiceInterpreter +class CAToningEffectInterpreter : public ChoiceInterpreter<> { public: CAToningEffectInterpreter() @@ -1456,7 +1496,7 @@ CAToningEffectInterpreter caToningEffectInterpreter; class CAFileNumberInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { unsigned long val = t->toInt (0, LONG); char buffer[32]; @@ -1467,11 +1507,14 @@ public: CAFileNumberInterpreter caFileNumberInterpreter; // CanonModelID -class CAModelIDInterpreter : public ChoiceInterpreter +class CAModelIDInterpreter : public ChoiceInterpreter<> { public: CAModelIDInterpreter () { + choices[1042] = "EOS M50 / Kiss M"; + choices[2049] = "PowerShot SX740 HS"; + choices[2053] = "PowerShot SX70 HS"; choices[16842752] = "PowerShot A30"; choices[17039360] = "PowerShot S300 / Digital IXUS 300 / IXY Digital 300"; choices[17170432] = "PowerShot A20"; @@ -1702,6 +1745,7 @@ public: 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"; @@ -1734,6 +1778,7 @@ public: choices[1074257056] = "EOS C300"; choices[1074257321] = "HF G25"; choices[1074257844] = "XC10"; + choices[1074258371] = "EOS C200"; choices[2147483649] = "EOS-1D"; choices[2147484007] = "EOS-1DS"; choices[2147484008] = "EOS 10D"; @@ -1775,7 +1820,7 @@ public: choices[2147484452] = "EOS-1D C"; choices[2147484453] = "EOS 70D"; choices[2147484454] = "EOS Rebel T5i / 700D / Kiss X7i"; - choices[2147484455] = "EOS Rebel T5 / 1200D / Kiss X70"; + choices[2147484455] = "EOS Rebel T5 / 1200D / Kiss X70 / Hi"; choices[2147484456] = "EOS-1D X MARK II"; choices[2147484465] = "EOS M"; choices[2147484486] = "EOS Rebel SL1 / 100D / Kiss X7"; @@ -1791,11 +1836,14 @@ public: choices[2147484678] = "EOS 6D Mark II"; choices[2147484680] = "EOS 77D / 9000D"; choices[2147484695] = "EOS Rebel SL2 / 200D / Kiss X9"; + choices[2147484706] = "EOS Rebel T100 / 4000D / 3000D"; + choices[2147484708] = "EOR R"; + choices[2147484722] = "EOS Rebel T7 / 2000D / 1500D / Kiss X90"; } }; CAModelIDInterpreter caModelIDInterpreter; -class CAPanoramaDirectionInterpreter : public ChoiceInterpreter +class CAPanoramaDirectionInterpreter : public ChoiceInterpreter<> { public: CAPanoramaDirectionInterpreter() @@ -1809,7 +1857,7 @@ public: }; CAPanoramaDirectionInterpreter caPanoramaDirectionInterpreter; -class CAAspectRatioInterpreter : public ChoiceInterpreter +class CAAspectRatioInterpreter : public ChoiceInterpreter<> { public: CAAspectRatioInterpreter() diff --git a/rtexif/fujiattribs.cc b/rtexif/fujiattribs.cc index 6f76a64b5..2e17a68f9 100644 --- a/rtexif/fujiattribs.cc +++ b/rtexif/fujiattribs.cc @@ -24,7 +24,7 @@ namespace rtexif { -class FAOnOffInterpreter : public ChoiceInterpreter +class FAOnOffInterpreter : public ChoiceInterpreter<> { public: FAOnOffInterpreter () @@ -35,7 +35,7 @@ public: }; FAOnOffInterpreter faOnOffInterpreter; -class FASharpnessInterpreter : public ChoiceInterpreter +class FASharpnessInterpreter : public ChoiceInterpreter<> { public: FASharpnessInterpreter () @@ -53,7 +53,7 @@ public: }; FASharpnessInterpreter faSharpnessInterpreter; -class FAWhiteBalanceInterpreter : public ChoiceInterpreter +class FAWhiteBalanceInterpreter : public ChoiceInterpreter<> { public: FAWhiteBalanceInterpreter () @@ -79,7 +79,7 @@ public: }; FAWhiteBalanceInterpreter faWhiteBalanceInterpreter; -class FASaturationInterpreter : public ChoiceInterpreter +class FASaturationInterpreter : public ChoiceInterpreter<> { public: FASaturationInterpreter () @@ -104,7 +104,7 @@ public: }; FASaturationInterpreter faSaturationInterpreter; -class FAContrastInterpreter : public ChoiceInterpreter +class FAContrastInterpreter : public ChoiceInterpreter<> { public: FAContrastInterpreter () @@ -119,7 +119,7 @@ public: }; FAContrastInterpreter faContrastInterpreter; -class FAContrast2Interpreter : public ChoiceInterpreter +class FAContrast2Interpreter : public ChoiceInterpreter<> { public: FAContrast2Interpreter () @@ -131,7 +131,7 @@ public: }; FAContrast2Interpreter faContrast2Interpreter; -class FANoiseReductionInterpreter : public ChoiceInterpreter +class FANoiseReductionInterpreter : public ChoiceInterpreter<> { public: FANoiseReductionInterpreter () @@ -143,7 +143,7 @@ public: }; FANoiseReductionInterpreter faNoiseReductionInterpreter; -class FAFlashInterpreter : public ChoiceInterpreter +class FAFlashInterpreter : public ChoiceInterpreter<> { public: // FujiFlashMode @@ -158,7 +158,7 @@ public: }; FAFlashInterpreter faFlashInterpreter; -class FAFocusModeInterpreter : public ChoiceInterpreter +class FAFocusModeInterpreter : public ChoiceInterpreter<> { public: FAFocusModeInterpreter () @@ -169,7 +169,7 @@ public: }; FAFocusModeInterpreter faFocusModeInterpreter; -class FAColorModeInterpreter : public ChoiceInterpreter +class FAColorModeInterpreter : public ChoiceInterpreter<> { public: FAColorModeInterpreter () @@ -181,7 +181,7 @@ public: }; FAColorModeInterpreter faColorModeInterpreter; -class FADynamicRangeInterpreter : public ChoiceInterpreter +class FADynamicRangeInterpreter : public ChoiceInterpreter<> { public: FADynamicRangeInterpreter () @@ -192,7 +192,7 @@ public: }; FADynamicRangeInterpreter faDynamicRangeInterpreter; -class FAFilmModeInterpreter : public ChoiceInterpreter +class FAFilmModeInterpreter : public ChoiceInterpreter<> { public: FAFilmModeInterpreter () @@ -212,7 +212,7 @@ public: }; FAFilmModeInterpreter faFilmModeInterpreter; -class FADRSettingInterpreter : public ChoiceInterpreter +class FADRSettingInterpreter : public ChoiceInterpreter<> { public: // DynamicRangeSetting @@ -228,7 +228,7 @@ public: }; FADRSettingInterpreter faDRSettingInterpreter; -class FAPictureModeInterpreter : public ChoiceInterpreter +class FAPictureModeInterpreter : public ChoiceInterpreter<> { public: FAPictureModeInterpreter () diff --git a/rtexif/kodakattribs.cc b/rtexif/kodakattribs.cc index 1b6e522c5..a9c168a70 100644 --- a/rtexif/kodakattribs.cc +++ b/rtexif/kodakattribs.cc @@ -104,12 +104,11 @@ void parseKodakIfdTextualInfo (Tag *textualInfo, Tag* exif_) a = atoi (val.c_str()); b = atoi (&p1[1]); } - t = new Tag (exif, lookupAttrib (exifAttribs, "ExposureTime")); t->initRational (a, b); exif->replaceTag (t); - float ssv = -log2 ((float)a / (float)b); // convert to APEX value + const float ssv = -log2 ((float)a / std::max((float)b, 0.0001f)); // convert to APEX value, avoid division by zero t = new Tag (exif, lookupAttrib (exifAttribs, "ShutterSpeedValue")); t->initRational (1000000 * ssv, 1000000); exif->replaceTag (t); diff --git a/rtexif/nikonattribs.cc b/rtexif/nikonattribs.cc index cfdf61edb..a1fa28c34 100644 --- a/rtexif/nikonattribs.cc +++ b/rtexif/nikonattribs.cc @@ -23,7 +23,6 @@ #include #include #include - #include "rtexif.h" using namespace std; @@ -35,7 +34,7 @@ class NAISOInterpreter : public Interpreter { public: NAISOInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; sprintf (buffer, "%d", t->toInt (2)); @@ -48,14 +47,14 @@ class NAISOInfoISOInterpreter : public Interpreter { public: NAISOInfoISOInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; int a = t->toInt(); sprintf (buffer, "%d", a); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->getValue()[ofs]; @@ -66,7 +65,7 @@ public: return 0.; } } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { int a = t->getValue()[ofs]; @@ -84,7 +83,7 @@ class NAISOExpansionInterpreter : public Interpreter { public: NAISOExpansionInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt(); @@ -143,7 +142,7 @@ class NALensTypeInterpreter : public Interpreter { public: NALensTypeInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt(); std::ostringstream str; @@ -156,7 +155,7 @@ public: }; NALensTypeInterpreter naLensTypeInterpreter; -class NAFlashModeInterpreter : public ChoiceInterpreter +class NAFlashModeInterpreter : public ChoiceInterpreter<> { public: NAFlashModeInterpreter () @@ -171,7 +170,7 @@ public: }; NAFlashModeInterpreter naFlashModeInterpreter; -class NAHiISONRInterpreter : public ChoiceInterpreter +class NAHiISONRInterpreter : public ChoiceInterpreter<> { public: // HighISONoiseReduction @@ -192,7 +191,7 @@ class NAShootingModeInterpreter : public Interpreter { public: NAShootingModeInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt(); std::ostringstream str; @@ -235,14 +234,26 @@ public: afpchoices[0x9] = "Far Left"; afpchoices[0xa] = "Far Right"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { + const auto get_from_choices = + [](const std::map& choices, int index) -> std::string + { + const std::map::const_iterator choice = choices.find(index); + + if (choice != choices.end()) { + return choice->second; + } + + return {}; + }; + int am = t->toInt (0, BYTE); int afp = t->toInt (1, BYTE); int aff = t->toInt (2, SHORT); std::ostringstream str; - str << "AFAreaMode = " << amchoices[am] << std::endl; - str << "AFAreaMode = " << afpchoices[afp] << std::endl; + str << "AFAreaMode = " << get_from_choices(amchoices, am) << std::endl; + str << "AFAreaMode = " << get_from_choices(afpchoices, afp) << std::endl; std::ostringstream af; @@ -315,7 +326,7 @@ class NALensDataInterpreter : public Interpreter static const std::map lenses; public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { static const unsigned char xlat[2][256] = { @@ -543,7 +554,16 @@ public: if (r != lenses.end()) { if (r == lenses.begin() && EffectiveMaxApertureString != "") { // first entry is for unchipped lenses - ld << "Lens = Unknown $FL$mm f/" << EffectiveMaxApertureString; + Tag *FLTag = t->getParent()->getRoot()->findTag ("FocalLength"); + ld << "Lens = MF "; + + if(FLTag) { + ld << FLTag->valueToString () << "mm"; + } else { + ld << "0mm"; + } + + ld << " f/" << EffectiveMaxApertureString; } else { ld << "Lens = " << r->second; } @@ -842,7 +862,9 @@ const std::map NALensDataInterpreter::lenses = { {"49 3C A6 A6 30 30 F2 02", "AF-S Nikkor 600mm f/4D IF-ED + TC-20E"}, {"4A 40 11 11 2C 0C 4D 02", "Samyang 8mm f/3.5 Fish-Eye CS"}, {"4A 48 1E 1E 24 0C 4D 02", "Samyang 12mm f/2.8 ED AS NCS Fish-Eye"}, + {"4A 48 24 24 24 0C 4D 02", "Samyang 10mm f/2.8 ED AS NCS CS"}, {"4A 48 24 24 24 0C 4D 02", "Samyang AE 14mm f/2.8 ED AS IF UMC"}, + {"4A 4C 24 24 1E 6C 4D 06", "Samyang 14mm f/2.4 Premium"}, {"4A 54 29 29 18 0C 4D 02", "Samyang 16mm f/2.0 ED AS UMC CS"}, {"4A 54 62 62 0C 0C 4D 02", "AF Nikkor 85mm f/1.4D IF"}, {"4A 60 36 36 0C 0C 4D 02", "Samyang 24mm f/1.4 ED AS UMC"}, @@ -902,7 +924,7 @@ const std::map NALensDataInterpreter::lenses = { {"74 40 37 62 2C 34 78 06", "AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"}, {"75 40 3C 68 2C 3C 79 06", "AF Zoom-Nikkor 28-100mm f/3.5-5.6G"}, {"76 58 50 50 14 14 7A 02", "AF Nikkor 50mm f/1.8D"}, - {"77 44 60 98 34 3C 7B 0E", "Sigma 80-400mm f4.5-5.6 APO DG D OS"}, + {"77 44 60 98 34 3C 7B 0E", "Sigma 80-400mm f/4.5-5.6 APO DG D OS"}, {"77 44 61 98 34 3C 7B 0E", "Sigma 80-400mm f/4.5-5.6 EX OS"}, {"77 48 5C 80 24 24 7B 0E", "AF-S VR Zoom-Nikkor 70-200mm f/2.8G IF-ED"}, {"78 40 37 6E 2C 3C 7C 0E", "AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED"}, @@ -945,6 +967,7 @@ const std::map NALensDataInterpreter::lenses = { {"8B 4C 2D 44 14 14 4B 06", "Sigma 18-35mm f/1.8 DC HSM"}, {"8C 40 2D 53 2C 3C 8E 06", "AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED"}, {"8D 44 5C 8E 34 3C 8F 0E", "AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED"}, + {"8D 48 6E 8E 24 24 4B 0E", "Sigma 120-300mm f/2.8 DG OS HSM Sports"}, {"8E 3C 2B 5C 24 30 4B 0E", "Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C"}, {"8F 40 2D 72 2C 3C 91 06", "AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED"}, {"8F 48 2B 50 24 24 4B 0E", "Sigma 17-50mm f/2.8 EX DC OS HSM"}, @@ -955,7 +978,7 @@ const std::map NALensDataInterpreter::lenses = { {"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"}, + {"94 48 7C 7C 24 24 4B 0E", "Sigma APO Macro 180mm f/2.8 EX DG OS HSM"}, {"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"}, @@ -967,6 +990,7 @@ const std::map NALensDataInterpreter::lenses = { {"99 40 29 62 2C 3C 9B 0E", "AF-S DX VR Zoom-Nikkor 16-85mm f/3.5-5.6G ED"}, {"99 48 76 76 24 24 4B 0E", "Sigma APO Macro 150mm f/2.8 EX DG OS HSM"}, {"9A 40 2D 53 2C 3C 9C 0E", "AF-S DX VR Zoom-Nikkor 18-55mm f/3.5-5.6G"}, + {"9A 4C 50 50 14 14 9C 06", "Yongnuo YN50mm f/1.8N"}, {"9B 00 4C 4C 24 24 9D 06", "PC-E Micro Nikkor 45mm f/2.8D ED"}, {"9B 54 4C 4C 24 24 9D 02", "PC-E Micro Nikkor 45mm f/2.8D ED"}, {"9B 54 62 62 0C 0C 4B 06", "Sigma 85mm f/1.4 EX DG HSM"}, @@ -987,37 +1011,57 @@ const std::map NALensDataInterpreter::lenses = { {"A1 40 18 37 2C 34 A3 06", "AF-S DX Nikkor 10-24mm f/3.5-4.5G ED"}, {"A1 41 19 31 2C 2C 4B 06", "Sigma 10-20mm f/3.5 EX DC HSM"}, {"A1 54 55 55 0C 0C BC 06", "AF-S Nikkor 58mm f/1.4G"}, + {"A2 38 5C 8E 34 40 CD 86", "AF-P DX Nikkor 70-300mm f/4.5-6.3G VR"}, {"A2 40 2D 53 2C 3C BD 0E", "AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II"}, {"A2 48 5C 80 24 24 A4 0E", "AF-S Nikkor 70-200mm f/2.8G ED VR II"}, + {"A3 38 5C 8E 34 40 CE 0E", "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED"}, + {"A3 38 5C 8E 34 40 CE 8E", "AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR"}, {"A3 3C 29 44 30 30 A5 0E", "AF-S Nikkor 16-35mm f/4G ED VR"}, {"A3 3C 5C 8E 30 3C 4B 0E", "Sigma 70-300mm f/4-5.6 DG OS"}, {"A4 40 2D 8E 2C 40 BF 0E", "AF-S DX Nikkor 18-300mm f/3.5-6.3G ED VR"}, {"A4 47 2D 50 24 34 4B 0E", "Sigma 18-50mm f/2.8-4.5 DC OS HSM"}, {"A4 48 5C 80 24 24 CF 0E", "AF-S Nikkor 70-200mm f/2.8E FL ED VR"}, + {"A4 48 5C 80 24 24 CF 4E", "AF-S Nikkor 70-200mm f/2.8E FL ED VR"}, {"A4 54 37 37 0C 0C A6 06", "AF-S Nikkor 24mm f/1.4G ED"}, {"A5 40 2D 88 2C 40 4B 0E", "Sigma 18-250mm f/3.5-6.3 DC OS HSM"}, {"A5 40 3C 8E 2C 3C A7 0E", "AF-S Nikkor 28-300mm f/3.5-5.6G ED VR"}, {"A5 4C 44 44 14 14 C0 06", "AF-S Nikkor 35mm f/1.8G ED"}, {"A5 54 6A 6A 0C 0C D0 06", "AF-S Nikkor 105mm f/1.4E ED"}, {"A5 54 6A 6A 0C 0C D0 46", "AF-S Nikkor 105mm f/1.4E ED"}, + {"A6 48 2F 2F 30 30 D1 06", "PC Nikkor 19mm f/4E ED"}, + {"A6 48 2F 2F 30 30 D1 46", "PC Nikkor 19mm f/4E ED"}, {"A6 48 37 5C 24 24 4B 06", "Sigma 24-70mm f/2.8 IF EX DG HSM"}, - {"A6 48 8E 8E 24 24 A8 0E", "AF-S VR Nikkor 300mm f/2.8G IF-ED II"}, + {"A6 48 8E 8E 24 24 A8 0E", "AF-S Nikkor 300mm f/2.8G IF-ED VR II"}, {"A6 48 98 98 24 24 C1 0E", "AF-S Nikkor 400mm f/2.8E FL ED VR"}, {"A7 3C 53 80 30 3C C2 0E", "AF-S DX Nikkor 55-200mm f/4-5.6G ED VR II"}, + {"A7 40 11 26 2C 34 D2 06", "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"}, + {"A7 40 11 26 2C 34 D2 46", "AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED"}, {"A7 49 80 A0 24 24 4B 06", "Sigma APO 200-500mm f/2.8 EX DG"}, {"A7 4B 62 62 2C 2C A9 0E", "AF-S DX Micro Nikkor 85mm f/3.5G ED VR"}, + {"A8 38 18 30 34 3C D3 0E", "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"}, {"A8 38 18 30 34 3C D3 8E", "AF-P DX Nikkor 10-20mm f/4.5-5.6G VR"}, - {"A8 48 80 98 30 30 AA 0E", "AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED II"}, + {"A8 48 80 98 30 30 AA 0E", "AF-S Zoom-Nikkor 200-400mm f/4G IF-ED VR II"}, {"A8 48 8E 8E 30 30 C3 0E", "AF-S Nikkor 300mm f/4E PF ED VR"}, {"A8 48 8E 8E 30 30 C3 4E", "AF-S Nikkor 300mm f/4E PF ED VR"}, + {"A9 48 7C 98 30 30 D4 0E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR"}, + {"A9 48 7C 98 30 30 D4 4E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR"}, {"A9 4C 31 31 14 14 C4 06", "AF-S Nikkor 20mm f/1.8G ED"}, {"A9 54 80 80 18 18 AB 0E", "AF-S Nikkor 200mm f/2G ED VR II"}, {"AA 3C 37 6E 30 30 AC 0E", "AF-S Nikkor 24-120mm f/4G ED VR"}, + {"AA 48 37 5C 24 24 C5 0E", "AF-S Nikkor 24-70mm f/2.8E ED VR"}, {"AA 48 37 5C 24 24 C5 4E", "AF-S Nikkor 24-70mm f/2.8E ED VR"}, + {"AA 48 88 A4 3C 3C D5 0E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC"}, + {"AA 48 88 A4 3C 3C D5 4E", "AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC"}, {"AB 3C A0 A0 30 30 C6 4E", "AF-S Nikkor 500mm f/4E FL ED VR"}, - {"AC 38 53 8E 34 3C AE 0E", "AF-S DX VR Nikkor 55-300mm f/4.5-5.6G ED"}, + {"AB 44 5C 8E 34 3C D6 0E", "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"}, + {"AB 44 5C 8E 34 3C D6 CE", "AF-P Nikkor 70-300mm f/4.5-5.6E ED VR"}, + {"AC 38 53 8E 34 3C AE 0E", "AF-S DX Nikkor 55-300mm f/4.5-5.6G ED VR"}, {"AC 3C A6 A6 30 30 C7 4E", "AF-S Nikkor 600mm f/4E FL ED VR"}, + {"AC 54 3C 3C 0C 0C D7 06", "AF-S Nikkor 28mm f/1.4E ED"}, + {"AC 54 3C 3C 0C 0C D7 46", "AF-S Nikkor 28mm f/1.4E ED"}, {"AD 3C 2D 8E 2C 3C AF 0E", "AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR"}, + {"AD 3C A0 A0 3C 3C D8 0E", "AF-S Nikkor 500mm f/5.6E PF ED VR"}, + {"AD 3C A0 A0 3C 3C D8 4E", "AF-S Nikkor 500mm f/5.6E PF ED VR"}, {"AD 48 28 60 24 30 C8 0E", "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"}, {"AD 48 28 60 24 30 C8 4E", "AF-S DX Nikkor 16-80mm f/2.8-4E ED VR"}, {"AE 3C 80 A0 3C 3C C9 0E", "AF-S Nikkor 200-500mm f/5.6E ED VR"}, @@ -1029,22 +1073,36 @@ const std::map NALensDataInterpreter::lenses = { {"B1 48 48 48 24 24 B3 06", "AF-S DX Micro Nikkor 40mm f/2.8G"}, {"B2 48 5C 80 30 30 B4 0E", "AF-S Nikkor 70-200mm f/4G ED VR"}, {"B3 4C 62 62 14 14 B5 06", "AF-S Nikkor 85mm f/1.8G"}, - {"B4 40 37 62 2C 34 B6 0E", "AF-S VR Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED"}, + {"B4 40 37 62 2C 34 B6 0E", "AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED VR"}, {"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"}, + {"C1 48 24 37 24 24 4B 46", "Sigma 14-24mm f/2.8 DG HSM | A"}, + {"C2 4C 24 24 14 14 4B 06", "Sigma 14mm f/1.8 DG HSM | A"}, {"C3 34 68 98 38 40 4B 4E", "Sigma 100-400mm f/5-6.3 DG OS HSM | C"}, + {"C8 54 62 62 0C 0C 4B 46", "Sigma 85mm f/1.4 DG HSM | A"}, + {"C9 48 37 5C 24 24 4B 4E", "Sigma 24-70mm f/2.8 DG OS HSM | A"}, + {"CA 48 27 3E 24 24 DF 4E", "Tamron SP 15-30mm f/2.8 Di VC USD G2 (A041)"}, + {"CB 3C 2B 44 24 31 DF 46", "Tamron 17-35mm f/2.8-4 Di OSD (A037)"}, {"CC 4C 50 68 14 14 4B 06", "Sigma 50-100mm f/1.8 DC HSM | A"}, {"CD 3D 2D 70 2E 3C 4B 0E", "Sigma 18-125mm f/3.8-5.6 DC OS HSM"}, {"CE 34 76 A0 38 40 4B 0E", "Sigma 150-500mm f/5-6.3 DG OS APO HSM"}, + {"CE 47 37 5C 25 25 DF 4E", "Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)"}, {"CF 38 6E 98 34 3C 4B 0E", "Sigma APO 120-400mm f/4.5-5.6 DG OS HSM"}, + {"CF 47 5C 8E 31 3D DF 0E", "Tamron SP 70-300mm f/4-5.6 Di VC USD (A030)"}, {"DC 48 19 19 24 24 4B 06", "Sigma 10mm f/2.8 EX DC HSM Fisheye"}, {"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"}, + {"E0 40 2D 98 2C 41 DF 4E", "Tamron AF 18-400mm f/3.5-6.3 Di II VC HLD (B028)"}, + {"E1 40 19 36 2C 35 DF 4E", "Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)"}, {"E1 58 37 37 14 14 1C 02", "Sigma 24mm f/1.8 EX DG Aspherical Macro"}, + {"E2 47 5C 80 24 24 DF 4E", "Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)"}, + {"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"}, @@ -1090,7 +1148,7 @@ const std::map NALensDataInterpreter::lenses = { {"FE 53 5C 80 24 24 84 06", "Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)"}, {"FE 54 5C 80 24 24 DF 0E", "Tamron SP 70-200mm f/2.8 Di VC USD (A009)"}, {"FE 54 64 64 24 24 DF 0E", "Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F004)"}, - {"FF 40 2D 80 2C 40 4B 06", "Sigma 18-200mm f/3.5-6.3 DC"}, + {"FF 40 2D 80 2C 40 4B 06", "Sigma 18-200mm f/3.5-6.3 DC"} }; const TagAttrib nikonISOInfoAttribs[] = { diff --git a/rtexif/olympusattribs.cc b/rtexif/olympusattribs.cc index 21cfb5738..e42763e35 100644 --- a/rtexif/olympusattribs.cc +++ b/rtexif/olympusattribs.cc @@ -33,7 +33,7 @@ class OLOnOffInterpreter : public Interpreter { public: OLOnOffInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { if (t->toInt() == 0) { return "Off"; @@ -48,7 +48,7 @@ class OLYesNoInterpreter : public Interpreter { public: OLYesNoInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { if (t->toInt() == 0) { return "No"; @@ -63,7 +63,7 @@ class OLApertureInterpreter : public Interpreter { public: OLApertureInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; str.precision (2); @@ -125,7 +125,9 @@ public: 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"; @@ -144,6 +146,7 @@ public: lenses["01 06 00"] = "Sigma APO 50-500mm f/4.0-6.3 EX DG HSM"; lenses["01 06 10"] = "Sigma 30mm f/1.4 DC DN | C"; lenses["01 07 00"] = "Sigma Macro 105mm f/2.8 EX DG"; + lenses["01 07 10"] = "Sigma 16mm f/1.4 DC DN | C (017)"; lenses["01 08 00"] = "Sigma APO Macro 150mm f/2.8 EX DG HSM"; lenses["01 09 00"] = "Sigma 18-50mm f/2.8 EX DC Macro"; lenses["01 10 00"] = "Sigma 24mm f/1.8 EX DG Aspherical Macro"; @@ -191,7 +194,7 @@ public: lenses["03 02 00"] = "Leica D Summilux 25mm f/1.4 Asph."; lenses["05 01 10"] = "Tamron 14-150mm f/3.5-5.8 Di III"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream lid; lid.setf (std::ios_base::hex, std::ios_base::basefield); @@ -200,7 +203,7 @@ public: lid << std::setw (2) << std::setfill ('0') << t->toInt (2) << ' '; //model lid << std::setw (2) << std::setfill ('0') << t->toInt (3); // submodel - std::map::iterator r = lenses.find (lid.str()); + std::map::const_iterator r = lenses.find (lid.str()); if (r != lenses.end()) { return r->second; @@ -211,7 +214,7 @@ public: }; OLLensTypeInterpreter olLensTypeInterpreter; -class OLFlashTypeInterpreter : public ChoiceInterpreter +class OLFlashTypeInterpreter : public ChoiceInterpreter<> { public: OLFlashTypeInterpreter () @@ -223,7 +226,7 @@ public: }; OLFlashTypeInterpreter olFlashTypeInterpreter; -class OLExposureModeInterpreter : public ChoiceInterpreter +class OLExposureModeInterpreter : public ChoiceInterpreter<> { public: OLExposureModeInterpreter () @@ -237,7 +240,7 @@ public: }; OLExposureModeInterpreter olExposureModeInterpreter; -class OLMeteringModeInterpreter : public ChoiceInterpreter +class OLMeteringModeInterpreter : public ChoiceInterpreter<> { public: OLMeteringModeInterpreter () @@ -252,7 +255,7 @@ public: }; OLMeteringModeInterpreter olMeteringModeInterpreter; -class OLFocusModeInterpreter : public ChoiceInterpreter +class OLFocusModeInterpreter : public ChoiceInterpreter<> { public: OLFocusModeInterpreter () @@ -267,7 +270,7 @@ public: }; OLFocusModeInterpreter olFocusModeInterpreter; -class OLWhitebalance2Interpreter : public ChoiceInterpreter +class OLWhitebalance2Interpreter : public ChoiceInterpreter<> { public: OLWhitebalance2Interpreter () @@ -299,7 +302,7 @@ public: }; OLWhitebalance2Interpreter olWhitebalance2Interpreter; -class OLSceneModeInterpreter : public ChoiceInterpreter +class OLSceneModeInterpreter : public ChoiceInterpreter<> { public: OLSceneModeInterpreter () @@ -365,7 +368,7 @@ public: }; OLSceneModeInterpreter olSceneModeInterpreter; -class OLPictureModeBWFilterInterpreter : public ChoiceInterpreter +class OLPictureModeBWFilterInterpreter : public ChoiceInterpreter<> { public: OLPictureModeBWFilterInterpreter () @@ -380,7 +383,7 @@ public: }; OLPictureModeBWFilterInterpreter olPictureModeBWFilterInterpreter; -class OLPictureModeToneInterpreter : public ChoiceInterpreter +class OLPictureModeToneInterpreter : public ChoiceInterpreter<> { public: OLPictureModeToneInterpreter () @@ -395,7 +398,7 @@ public: }; OLPictureModeToneInterpreter olPictureModeToneInterpreter; -class OLImageQuality2Interpreter : public ChoiceInterpreter +class OLImageQuality2Interpreter : public ChoiceInterpreter<> { public: OLImageQuality2Interpreter () @@ -409,7 +412,7 @@ public: }; OLImageQuality2Interpreter olImageQuality2Interpreter; -class OLDevEngineInterpreter : public ChoiceInterpreter +class OLDevEngineInterpreter : public ChoiceInterpreter<> { public: // RawDevEngine @@ -423,7 +426,7 @@ public: }; OLDevEngineInterpreter olDevEngineInterpreter; -class OLPictureModeInterpreter : public ChoiceInterpreter +class OLPictureModeInterpreter : public ChoiceInterpreter<> { public: OLPictureModeInterpreter () @@ -446,7 +449,7 @@ public: }; OLPictureModeInterpreter olPictureModeInterpreter; -class OLColorSpaceInterpreter : public ChoiceInterpreter +class OLColorSpaceInterpreter : public ChoiceInterpreter<> { public: OLColorSpaceInterpreter () @@ -462,7 +465,7 @@ class OLNoiseFilterInterpreter : public Interpreter { public: OLNoiseFilterInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0); int b = t->toInt (2); @@ -487,7 +490,7 @@ class OLFlashModeInterpreter : public Interpreter { public: OLFlashModeInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; int a = t->toInt (); @@ -506,7 +509,7 @@ class OLNoiseReductionInterpreter : public Interpreter { public: OLNoiseReductionInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; int a = t->toInt (); @@ -519,7 +522,7 @@ public: }; OLNoiseReductionInterpreter olNoiseReductionInterpreter; -class OLFlashModelInterpreter : public ChoiceInterpreter +class OLFlashModelInterpreter : public ChoiceInterpreter<> { public: OLFlashModelInterpreter () diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 7444e7212..7e861d64f 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -31,7 +31,7 @@ namespace rtexif { -class PAQualityInterpreter : public ChoiceInterpreter +class PAQualityInterpreter : public ChoiceInterpreter<> { public: PAQualityInterpreter () @@ -44,12 +44,13 @@ public: choices[5] = "Premium"; choices[6] = "RAW (HDR enabled)"; choices[7] = "RAW (pixel shift enabled)"; + choices[8] = "RAW (pixel shift handheld mode enabled)"; choices[65535] = "n/a"; } }; PAQualityInterpreter paQualityInterpreter; -class PAOnOffInterpreter : public ChoiceInterpreter +class PAOnOffInterpreter : public ChoiceInterpreter<> { public: PAOnOffInterpreter () @@ -60,7 +61,7 @@ public: }; PAOnOffInterpreter paOnOffInterpreter; -class PAShakeReductionInterpreter : public ChoiceInterpreter +class PAShakeReductionInterpreter : public ChoiceInterpreter<> { public: PAShakeReductionInterpreter () @@ -79,7 +80,7 @@ public: }; PAShakeReductionInterpreter paShakeReductionInterpreter; -class PAShakeReduction2Interpreter : public ChoiceInterpreter +class PAShakeReduction2Interpreter : public ChoiceInterpreter<> { public: // ShakeReduction @@ -99,7 +100,7 @@ public: }; PAShakeReduction2Interpreter paShakeReduction2Interpreter; -class PAPictureModeInterpreter : public ChoiceInterpreter +class PAPictureModeInterpreter : public ChoiceInterpreter<> { public: PAPictureModeInterpreter () @@ -163,7 +164,7 @@ public: }; PAPictureModeInterpreter paPictureModeInterpreter; -class PASceneModeInterpreter : public ChoiceInterpreter +class PASceneModeInterpreter : public ChoiceInterpreter<> { public: PASceneModeInterpreter () @@ -195,7 +196,7 @@ public: }; PASceneModeInterpreter paSceneModeInterpreter; -class PAAEProgramModeInterpreter : public ChoiceInterpreter +class PAAEProgramModeInterpreter : public ChoiceInterpreter<> { public: PAAEProgramModeInterpreter () @@ -234,7 +235,7 @@ public: }; PAAEProgramModeInterpreter paAEProgramModeInterpreter; -class PAFlashModeInterpreter : public ChoiceInterpreter +class PAFlashModeInterpreter : public ChoiceInterpreter<> { public: PAFlashModeInterpreter () @@ -258,7 +259,7 @@ public: }; PAFlashModeInterpreter paFlashModeInterpreter; -class PAFocusModeInterpreter : public ChoiceInterpreter +class PAFocusModeInterpreter : public ChoiceInterpreter<> { public: PAFocusModeInterpreter () @@ -282,7 +283,7 @@ public: }; PAFocusModeInterpreter paFocusModeInterpreter; -class PAAFPointInterpreter : public ChoiceInterpreter +class PAAFPointInterpreter : public ChoiceInterpreter<> { public: // AFPointSelected @@ -309,7 +310,7 @@ public: }; PAAFPointInterpreter paAFPointInterpreter; -class PAAFFocusInterpreter : public ChoiceInterpreter +class PAAFFocusInterpreter : public ChoiceInterpreter<> { public: // AFPointsInFocus @@ -330,7 +331,7 @@ public: }; PAAFFocusInterpreter paAFFocusInterpreter; -class PAISOInterpreter : public ChoiceInterpreter +class PAISOInterpreter : public ChoiceInterpreter<> { public: PAISOInterpreter () @@ -414,7 +415,7 @@ class PAFNumberInterpreter: public Interpreter { public: PAFNumberInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double v = t->toDouble() / 10; @@ -429,7 +430,7 @@ public: }; PAFNumberInterpreter paFNumberInterpreter; -class PAMeteringModeInterpreter : public ChoiceInterpreter +class PAMeteringModeInterpreter : public ChoiceInterpreter<> { public: PAMeteringModeInterpreter () @@ -441,7 +442,7 @@ public: }; PAMeteringModeInterpreter paMeteringModeInterpreter; -class PAWhiteBalanceInterpreter : public ChoiceInterpreter +class PAWhiteBalanceInterpreter : public ChoiceInterpreter<> { public: PAWhiteBalanceInterpreter () @@ -467,7 +468,7 @@ public: }; PAWhiteBalanceInterpreter paWhiteBalanceInterpreter; -class PAWhiteBalanceModeInterpreter : public ChoiceInterpreter +class PAWhiteBalanceModeInterpreter : public ChoiceInterpreter<> { public: PAWhiteBalanceModeInterpreter () @@ -486,7 +487,7 @@ public: }; PAWhiteBalanceModeInterpreter paWhiteBalanceModeInterpreter; -class PASaturationInterpreter : public ChoiceInterpreter +class PASaturationInterpreter : public ChoiceInterpreter<> { public: PASaturationInterpreter () @@ -505,7 +506,7 @@ public: }; PASaturationInterpreter paSaturationInterpreter; -class PAContrastInterpreter : public ChoiceInterpreter +class PAContrastInterpreter : public ChoiceInterpreter<> { public: PAContrastInterpreter () @@ -524,7 +525,7 @@ public: }; PAContrastInterpreter paContrastInterpreter; -class PASharpnessInterpreter : public ChoiceInterpreter +class PASharpnessInterpreter : public ChoiceInterpreter<> { public: PASharpnessInterpreter () @@ -542,7 +543,7 @@ public: }; PASharpnessInterpreter paSharpnessInterpreter; -class PAPictureModeInterpreter2: public ChoiceInterpreter +class PAPictureModeInterpreter2: public ChoiceInterpreter<> { public: PAPictureModeInterpreter2() @@ -609,10 +610,10 @@ public: choices[256 * 255 + 0] = "Video (Auto Aperture)"; choices[256 * 255 + 4] = "Video (4)"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int c = 256 * t->toInt (0, BYTE) + t->toInt (1, BYTE); - std::map::iterator r = choices.find (c); + const ChoicesIterator r = choices.find (c); if (r != choices.end()) { std::ostringstream s; @@ -634,7 +635,7 @@ public: }; PAPictureModeInterpreter2 paPictureModeInterpreter2; -class PADriveModeInterpreter : public ChoiceInterpreter +class PADriveModeInterpreter : public ChoiceInterpreter<> { std::map choices1; std::map choices2; @@ -668,12 +669,12 @@ public: choices3[224] = "HDR Auto"; choices3[255] = "Video"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { - std::map::iterator r = choices.find (t->toInt (0, BYTE)); - std::map::iterator r1 = choices1.find (t->toInt (1, BYTE)); - std::map::iterator r2 = choices2.find (t->toInt (2, BYTE)); - std::map::iterator r3 = choices3.find (t->toInt (3, BYTE)); + const ChoicesIterator r = choices.find (t->toInt (0, BYTE)); + std::map::const_iterator r1 = choices1.find (t->toInt (1, BYTE)); + std::map::const_iterator r2 = choices2.find (t->toInt (2, BYTE)); + std::map::const_iterator r3 = choices3.find (t->toInt (3, BYTE)); std::ostringstream s; s << ((r != choices.end()) ? r->second : ""); s << ((r1 != choices1.end()) ? r1->second : "") << " "; @@ -684,7 +685,7 @@ public: }; PADriveModeInterpreter paDriveModeInterpreter; -class PAColorSpaceInterpreter: public ChoiceInterpreter +class PAColorSpaceInterpreter: public ChoiceInterpreter<> { public: PAColorSpaceInterpreter() @@ -783,6 +784,7 @@ public: 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,13 +930,14 @@ public: 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")); choices.insert (p_t (256 * 8 + 61, "HD PENTAX-D FA 28-105mm f/3.5-5.6 ED DC WR")); choices.insert (p_t (256 * 8 + 62, "HD PENTAX-D FA 24-70mm f/2.8 ED SDM WR")); choices.insert (p_t (256 * 8 + 63, "HD PENTAX-D FA 15-30mm f/2.8 ED SDM WR")); + choices.insert (p_t (256 * 8 + 64, "HD PENTAX-D FA* 50mm f/1.4 SDM AW")); choices.insert (p_t (256 * 8 + 197, "HD PENTAX-DA 55-300mm f/4.5-6.3 ED PLM WR RE")); choices.insert (p_t (256 * 8 + 198, "smc PENTAX-DA L 18-50mm f/4-5.6 DC WR RE")); choices.insert (p_t (256 * 8 + 199, "HD PENTAX-DA 18-50mm f/4-5.6 DC WR RE")); @@ -990,7 +993,7 @@ public: choices.insert (p_t (256 * 22 + 4, "04 Toy Lens Wide 6.3mm f/7.1")); choices.insert (p_t (256 * 22 + 5, "05 Toy Lens Telephoto 18mm f/8")); } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { double *liArray = nullptr; double maxApertureAtFocal = 0.; @@ -1058,7 +1061,7 @@ class PASRResultInterpreter: public Interpreter { public: PASRResultInterpreter() { } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; int b = t->toInt (0, BYTE); @@ -1076,7 +1079,7 @@ public: }; PASRResultInterpreter paSRResultInterpreter; -class PAHighISONoiseInterpreter: public ChoiceInterpreter +class PAHighISONoiseInterpreter: public ChoiceInterpreter<> { public: // HighISONoiseReduction @@ -1092,7 +1095,7 @@ public: }; PAHighISONoiseInterpreter paHighISONoiseInterpreter; -class PAMonochromeFilterEffectInterpreter: public ChoiceInterpreter +class PAMonochromeFilterEffectInterpreter: public ChoiceInterpreter<> { public: PAMonochromeFilterEffectInterpreter() @@ -1110,7 +1113,7 @@ public: }; PAMonochromeFilterEffectInterpreter paMonochromeFilterEffectInterpreter; -class PAMonochromeToningInterpreter: public ChoiceInterpreter +class PAMonochromeToningInterpreter: public ChoiceInterpreter<> { public: PAMonochromeToningInterpreter() @@ -1129,7 +1132,7 @@ public: }; PAMonochromeToningInterpreter paMonochromeToningInterpreter; -class PAShadowCorrectionInterpreter: public ChoiceInterpreter +class PAShadowCorrectionInterpreter: public ChoiceInterpreter<> { public: PAShadowCorrectionInterpreter() @@ -1143,7 +1146,7 @@ public: choices[ 2 << 8 | 4 ] = "Auto"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int idx = 0; @@ -1153,7 +1156,7 @@ public: idx = t->toInt (0, BYTE) << 8 | t->toInt (1, BYTE); } - std::map::iterator r = choices.find (idx); + const ChoicesIterator r = choices.find (idx); std::ostringstream s; s << ((r != choices.end()) ? r->second : "n/a"); return s.str(); @@ -1161,7 +1164,7 @@ public: }; PAShadowCorrectionInterpreter paShadowCorrectionInterpreter; -class PAISOAutoParametersInterpreter: public ChoiceInterpreter +class PAISOAutoParametersInterpreter: public ChoiceInterpreter<> { public: PAISOAutoParametersInterpreter() @@ -1170,9 +1173,9 @@ public: choices[2] = "Standard"; choices[3] = "Fast"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { - std::map::iterator r = choices.find (t->toInt (0, BYTE)); + const ChoicesIterator r = choices.find (t->toInt (0, BYTE)); std::ostringstream s; s << ((r != choices.end()) ? r->second : "n/a"); return s.str(); @@ -1180,7 +1183,7 @@ public: }; PAISOAutoParametersInterpreter paISOAutoParametersInterpreter; -class PABleachBypassToningInterpreter: public ChoiceInterpreter +class PABleachBypassToningInterpreter: public ChoiceInterpreter<> { public: PABleachBypassToningInterpreter() @@ -1198,7 +1201,7 @@ public: }; PABleachBypassToningInterpreter paBleachBypassToningInterpreter; -class PABlurControlInterpreter: public ChoiceInterpreter +class PABlurControlInterpreter: public ChoiceInterpreter<> { public: PABlurControlInterpreter() @@ -1208,9 +1211,9 @@ public: choices[2] = "Medium"; choices[3] = "High"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { - std::map::iterator r = choices.find (t->toInt (0, BYTE)); + const ChoicesIterator r = choices.find (t->toInt (0, BYTE)); std::ostringstream s; s << ((r != choices.end()) ? r->second : "n/a"); return s.str(); @@ -1218,7 +1221,7 @@ public: }; PABlurControlInterpreter paBlurControlInterpreter; -class PAHDRInterpreter: public ChoiceInterpreter +class PAHDRInterpreter: public ChoiceInterpreter<> { std::map choices1; std::map choices2; @@ -1240,11 +1243,11 @@ public: choices2[8] = "2 EV"; choices2[12] = "3 EV"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { - std::map::iterator r = choices.find (t->toInt (0, BYTE)); - std::map::iterator r1 = choices1.find (t->toInt (1, BYTE)); - std::map::iterator r2 = choices2.find (t->toInt (2, BYTE)); + const ChoicesIterator r = choices.find (t->toInt (0, BYTE)); + std::map::const_iterator r1 = choices1.find (t->toInt (1, BYTE)); + std::map::const_iterator r2 = choices2.find (t->toInt (2, BYTE)); std::ostringstream s; s << ((r != choices.end() ) ? r->second : "") << std::endl; s << ((r1 != choices1.end()) ? r1->second : "") << std::endl; @@ -1254,7 +1257,7 @@ public: }; PAHDRInterpreter paHDRInterpreter; -class PACrossProcessInterpreter: public ChoiceInterpreter +class PACrossProcessInterpreter: public ChoiceInterpreter<> { public: PACrossProcessInterpreter() @@ -1271,7 +1274,7 @@ public: }; PACrossProcessInterpreter paCrossProcessInterpreter; -class PAPowerSourceInterpreter: public ChoiceInterpreter +class PAPowerSourceInterpreter: public ChoiceInterpreter<> { public: PAPowerSourceInterpreter() @@ -1287,7 +1290,7 @@ class PALensModelQInterpreter: public Interpreter { public: PALensModelQInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[31]; buffer[0] = 0; // @@ -1305,7 +1308,7 @@ class PALensInfoQInterpreter: public Interpreter { public: PALensInfoQInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[21]; buffer[0] = 0; @@ -1323,7 +1326,7 @@ class PAFlashExposureCompInterpreter: public Interpreter { public: PAFlashExposureCompInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a; @@ -1337,7 +1340,7 @@ public: sprintf (buffer, "%d", a ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a; @@ -1356,7 +1359,7 @@ class PAFocalLengthInterpreter: public Interpreter { public: PAFocalLengthInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { double a = double (t->toInt (0, LONG)); @@ -1368,7 +1371,7 @@ public: return "n/a"; } } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { double a = double (t->toInt (0, LONG)); @@ -1385,7 +1388,7 @@ class PALensDataFocalLengthInterpreter: public Interpreter { public: PALensDataFocalLengthInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0, BYTE); float b = float (10 * int (a >> 2)) * pow (4.f, float (int (a & 0x03) - 2)); @@ -1398,7 +1401,7 @@ public: return "n/a"; } } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (ofs, BYTE); float b = float (10 * int (a >> 2)) * pow (4.f, float (int (a & 0x03) - 2)); @@ -1416,7 +1419,7 @@ class PAISOfInterpreter: public Interpreter { public: PAISOfInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0, BYTE); char buffer[32]; @@ -1424,7 +1427,7 @@ public: sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (0, BYTE); return 100.*exp (double (a - 32) * log (2.) / 8.); @@ -1436,7 +1439,7 @@ class PAMaxApertureInterpreter: public Interpreter { public: PAMaxApertureInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0, BYTE); a &= 0x7F; @@ -1455,7 +1458,7 @@ public: return "n/a"; } } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (0, BYTE); a &= 0x7F; @@ -1473,7 +1476,7 @@ class PAAEXvInterpreter: public Interpreter { public: PAAEXvInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0, BYTE); char buffer[32]; @@ -1481,7 +1484,7 @@ public: sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (0, BYTE); return double (a - 64) / 8.; @@ -1493,7 +1496,7 @@ class PAAEBXvInterpreter: public Interpreter { public: PAAEBXvInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0, SBYTE); char buffer[32]; @@ -1501,7 +1504,7 @@ public: sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (0, SBYTE); return double (a) / 8.; @@ -1513,7 +1516,7 @@ class PAApertureInterpreter: public Interpreter { public: PAApertureInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0, BYTE); char buffer[32]; @@ -1521,7 +1524,7 @@ public: sprintf (buffer, "%.1f", v ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (0, BYTE); return exp ((double (a) - 68.) * log (2.) / 16.); @@ -1533,7 +1536,7 @@ class PAExposureTimeInterpreter: public Interpreter { public: PAExposureTimeInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt (0, BYTE); char buffer[32]; @@ -1541,7 +1544,7 @@ public: sprintf (buffer, "%.6f", v ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (0, BYTE); return 24.*exp (- (double (a) - 32.) * log (2.) / 8.); @@ -1553,7 +1556,7 @@ class PANominalMinApertureInterpreter: public Interpreter { public: PANominalMinApertureInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; int a = t->toInt (0, BYTE); @@ -1561,7 +1564,7 @@ public: sprintf (buffer, "%.1f", double (int (pow (2.0, double (mina + 10) / 4.0) + 0.2))); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = t->toInt (0, BYTE) & 0x0F; return double (int (pow (2.0, double (a + 10) / 4.0) + 0.2)); @@ -1573,7 +1576,7 @@ class PANominalMaxApertureInterpreter: public Interpreter { public: PANominalMaxApertureInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; int a = t->toInt (0, BYTE); @@ -1581,7 +1584,7 @@ public: sprintf (buffer, "%.1f", double (int (pow (2.0, double (maxa) / 4.0) + 0.2)) ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { int a = ( t->toInt (0, BYTE) & 0xF0) >> 4; return double (int (pow (2.0, double (a) / 4.0) + 0.2)); @@ -1589,7 +1592,7 @@ public: }; PANominalMaxApertureInterpreter paNominalMaxApertureInterpreter; -class PAFlashStatusInterpreter: public ChoiceInterpreter +class PAFlashStatusInterpreter: public ChoiceInterpreter<> { public: PAFlashStatusInterpreter() @@ -1605,7 +1608,7 @@ public: }; PAFlashStatusInterpreter paFlashStatusInterpreter; -class PAInternalFlashModeInterpreter: public ChoiceInterpreter +class PAInternalFlashModeInterpreter: public ChoiceInterpreter<> { public: PAInternalFlashModeInterpreter() @@ -1635,7 +1638,7 @@ public: }; PAInternalFlashModeInterpreter paInternalFlashModeInterpreter; -class PAExternalFlashModeInterpreter: public ChoiceInterpreter +class PAExternalFlashModeInterpreter: public ChoiceInterpreter<> { public: PAExternalFlashModeInterpreter() @@ -1655,7 +1658,7 @@ public: }; PAExternalFlashModeInterpreter paExternalFlashModeInterpreter; -class PAExternalFlashExposureCompInterpreter: public ChoiceInterpreter +class PAExternalFlashExposureCompInterpreter: public ChoiceInterpreter<> { public: PAExternalFlashExposureCompInterpreter() @@ -1675,7 +1678,7 @@ public: }; PAExternalFlashExposureCompInterpreter paExternalFlashExposureCompInterpreter; -class PAExternalFlashBounceInterpreter: public ChoiceInterpreter +class PAExternalFlashBounceInterpreter: public ChoiceInterpreter<> { public: PAExternalFlashBounceInterpreter() @@ -1691,7 +1694,7 @@ class PAExternalFlashGNInterpreter: public Interpreter { public: PAExternalFlashGNInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; int b = t->toInt (0, BYTE) & 0x1F; @@ -1705,7 +1708,7 @@ class PAEVStepsInterpreter: public Interpreter { public: PAEVStepsInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; @@ -1724,7 +1727,7 @@ class PAEDialinInterpreter: public Interpreter { public: PAEDialinInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; @@ -1743,7 +1746,7 @@ class PAApertureRingUseInterpreter: public Interpreter { public: PAApertureRingUseInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; @@ -1758,7 +1761,7 @@ public: }; PAApertureRingUseInterpreter paApertureRingUseInterpreter; -class PAFlashOptionInterpreter: public ChoiceInterpreter +class PAFlashOptionInterpreter: public ChoiceInterpreter<> { public: PAFlashOptionInterpreter() @@ -1773,9 +1776,9 @@ public: choices[9] = "Slow-sync, Red-eye reduction"; choices[10] = "Trailing-curtain Sync"; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { - std::map::iterator r = choices.find (t->toInt (0, BYTE) >> 4); + const ChoicesIterator r = choices.find (t->toInt (0, BYTE) >> 4); if (r != choices.end()) { return r->second; @@ -1792,7 +1795,7 @@ class PAMeteringMode2Interpreter: public Interpreter { public: PAMeteringMode2Interpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; int v = (t->toInt (0, BYTE) & 0xF); @@ -1810,7 +1813,7 @@ public: }; PAMeteringMode2Interpreter paMeteringMode2Interpreter; -class PAExposureBracketStepSizeInterpreter: public ChoiceInterpreter +class PAExposureBracketStepSizeInterpreter: public ChoiceInterpreter<> { public: PAExposureBracketStepSizeInterpreter() @@ -1827,7 +1830,7 @@ public: }; PAExposureBracketStepSizeInterpreter paExposureBracketStepSizeInterpreter; -class PAPictureMode2Interpreter: public ChoiceInterpreter +class PAPictureMode2Interpreter: public ChoiceInterpreter<> { public: PAPictureMode2Interpreter() @@ -1856,7 +1859,7 @@ class PAProgramLineInterpreter: public Interpreter { public: PAProgramLineInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::ostringstream str; int c = t->toInt (0, BYTE); @@ -1896,7 +1899,7 @@ class PAAFModeInterpreter: public Interpreter { public: PAAFModeInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { switch (t->toInt (0, BYTE) & 0x3) { case 0: @@ -1922,7 +1925,7 @@ class PAAFPointSelectedInterpreter: public Interpreter { public: PAAFPointSelectedInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int c = t->toInt (0, SHORT); @@ -1946,7 +1949,7 @@ class PADriveMode2Interpreter: public Interpreter { public: PADriveMode2Interpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int c = t->toInt (0, BYTE); diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 6cb1e7ff8..571fd4e6b 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -32,6 +32,8 @@ #include "rtexif.h" +#include "../rtengine/procparams.h" + #include "../rtgui/cacheimagedata.h" #include "../rtgui/version.h" #include "../rtgui/ppversion.h" @@ -362,23 +364,25 @@ Glib::ustring TagDirectory::getDumpKey (int tagID, const Glib::ustring &tagName) return key; } -void TagDirectory::addTag (Tag* tag) +void TagDirectory::addTag (Tag* &tag) { // look up if it already exists: if (getTag (tag->getID())) { delete tag; + tag = nullptr; } else { tags.push_back (tag); } } -void TagDirectory::addTagFront (Tag* tag) +void TagDirectory::addTagFront (Tag* &tag) { // look up if it already exists: if (getTag (tag->getID())) { delete tag; + tag = nullptr; } else { tags.insert (tags.begin(), tag); } @@ -463,22 +467,34 @@ Tag* TagDirectory::findTag (const char* name, bool lookUpward) const return t; } + Tag* foundTag = nullptr; + int tagDistance = 10000; + for (auto tag : tags) { if (tag->isDirectory()) { TagDirectory *dir; int i = 0; + // Find the shortest path to that tag while ((dir = tag->getDirectory(i)) != nullptr) { TagDirectory *dir = tag->getDirectory(); Tag* t = dir->findTag (name); if (t) { - return t; + int currTagDistance = t->getDistanceFrom(this); + if (currTagDistance < tagDistance) { + tagDistance = currTagDistance; + foundTag = t; + } } ++i; } } } + if (foundTag) { + return foundTag; + } + if (lookUpward && parent) { Tag* t = parent->findTagUpward(name); @@ -708,7 +724,7 @@ int TagDirectory::write (int start, unsigned char* buffer) return maxPos; } -void TagDirectory::applyChange (std::string name, Glib::ustring value) +void TagDirectory::applyChange (const std::string &name, const Glib::ustring &value) { std::string::size_type dp = name.find_first_of ('.'); @@ -830,14 +846,15 @@ TagDirectoryTable::TagDirectoryTable (TagDirectory* p, FILE* f, int memsize, int : TagDirectory (p, ta, border), zeroOffset (offs), valuesSize (memsize), defaultType ( type ) { values = new unsigned char[valuesSize]; - fread (values, 1, valuesSize, f); + if (fread (values, 1, valuesSize, f) == static_cast(valuesSize)) { - // Security ; will avoid to read above the buffer limit if the RT's tagDirectoryTable is longer that what's in the file - int count = valuesSize / getTypeSize (type); + // Security ; will avoid to read above the buffer limit if the RT's tagDirectoryTable is longer that what's in the file + int count = valuesSize / getTypeSize (type); - for (const TagAttrib* tattr = ta; tattr->ignore != -1 && tattr->ID < count; ++tattr) { - Tag* newTag = new Tag (this, tattr, (values + zeroOffset + tattr->ID * getTypeSize (type)), tattr->type == AUTO ? type : tattr->type); - tags.push_back (newTag); // Here we can insert more tag in the same offset because of bitfield meaning + for (const TagAttrib* tattr = ta; tattr->ignore != -1 && tattr->ID < count; ++tattr) { + Tag* newTag = new Tag (this, tattr, (values + zeroOffset + tattr->ID * getTypeSize (type)), tattr->type == AUTO ? type : tattr->type); + tags.push_back (newTag); // Here we can insert more tag in the same offset because of bitfield meaning + } } } TagDirectory* TagDirectoryTable::clone (TagDirectory* parent) @@ -964,16 +981,19 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) if (tag == 0x002e) { // location of the embedded preview image in raw files of Panasonic cameras ExifManager eManager(f, nullptr, true); - eManager.parseJPEG(ftell(f)); // try to parse the exif data from the preview image + const auto fpos = ftell(f); + if (fpos >= 0) { + eManager.parseJPEG(fpos); // try to parse the exif data from the preview image - 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 - Tag* t = new Tag (parent->getRoot(), lookupAttrib (ifdAttribs, "Exif")); // replace raw exif with preview exif assuming there are the same - t->initSubDir (previewdir->getTag ("Exif")->getDirectory()); - parent->getRoot()->addTag (t); + 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 + Tag* t = new Tag (parent->getRoot(), lookupAttrib (ifdAttribs, "Exif")); // replace raw exif with preview exif assuming there are the same + t->initSubDir (previewdir->getTag ("Exif")->getDirectory()); + parent->getRoot()->addTag (t); + } } } } @@ -1189,8 +1209,8 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) } else { // read value value = new unsigned char [valuesize + 1]; - fread (value, 1, valuesize, f); - value[valuesize] = '\0'; + auto readSize = fread (value, 1, valuesize, f); + value[readSize] = '\0'; } // seek back to the saved position @@ -1200,32 +1220,33 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) defsubdirs: // read value value = new unsigned char [valuesize]; - fread (value, 1, valuesize, f); - - // count the number of valid subdirs - int sdcount = count; - - if (sdcount > 0) { - if (parent->getAttribTable() == olympusAttribs) { - sdcount = 1; - } - - // allocate space - directory = new TagDirectory*[sdcount + 1]; - - // load directories - for (size_t j = 0, i = 0; j < count; j++, i++) { - int newpos = base + toInt (j * 4, LONG); - fseek (f, newpos, SEEK_SET); - directory[i] = new TagDirectory (parent, f, base, attrib->subdirAttribs, order); - } - - // set the terminating NULL - directory[sdcount] = nullptr; - } else { + if (fread (value, 1, valuesize, f) != static_cast(valuesize)) { type = INVALID; - } + } else { + // count the number of valid subdirs + int sdcount = count; + if (sdcount > 0) { + if (parent->getAttribTable() == olympusAttribs) { + sdcount = 1; + } + + // allocate space + directory = new TagDirectory*[sdcount + 1]; + + // load directories + for (size_t j = 0, i = 0; j < count; j++, i++) { + int newpos = base + toInt (j * 4, LONG); + fseek (f, newpos, SEEK_SET); + directory[i] = new TagDirectory (parent, f, base, attrib->subdirAttribs, order); + } + + // set the terminating NULL + directory[sdcount] = nullptr; + } else { + type = INVALID; + } + } // seek back to the saved position fseek (f, save, SEEK_SET); return; @@ -1420,6 +1441,20 @@ Tag::~Tag () } } +int Tag::getDistanceFrom(const TagDirectory *root) +{ + int i = 0; + TagDirectory *currTagDir = parent; + while (currTagDir != nullptr && currTagDir != root) { + ++i; + if (parent->getParent() == currTagDir) { + break; + } + currTagDir = parent->getParent(); + } + return i; +} + void Tag::setInt (int v, int ofs, TagType astype) { @@ -1734,7 +1769,7 @@ std::string Tag::nameToString (int i) return buffer; } -std::string Tag::valueToString () +std::string Tag::valueToString () const { if (attrib && attrib->interpreter) { @@ -1928,9 +1963,9 @@ void Tag::initInt (int data, TagType t, int cnt) setInt (data, 0, t); } -void Tag::swapByteOrder2(char *buffer, int count) +void Tag::swapByteOrder2(unsigned char *buffer, int count) { - char* ptr = buffer; + unsigned char* ptr = buffer; for (int i = 0; i < count; i+=2) { unsigned char c = ptr[0]; ptr[0] = ptr[1]; @@ -1948,8 +1983,8 @@ void Tag::initUserComment (const Glib::ustring &text) memcpy(value, "ASCII\0\0\0", 8); memcpy(value + 8, text.c_str(), valuesize - 8); } else { - wchar_t *commentStr = (wchar_t*)g_utf8_to_utf16 (text.c_str(), -1, nullptr, nullptr, nullptr); - size_t wcStrSize = wcslen(commentStr); + 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); @@ -1966,7 +2001,7 @@ void Tag::initUserComment (const Glib::ustring &text) // Swapping byte order to match the Exif's byte order if (getOrder() != HOSTORDER) { - swapByteOrder2((char*)commentStr, wcStrSize * 2); + swapByteOrder2((unsigned char*)commentStr, wcStrSize * 2); } memcpy(value + 8 + (useBOM ? 2 : 0), (char*)commentStr, wcStrSize * 2); @@ -2075,12 +2110,15 @@ void ExifManager::parseCIFF () TagDirectory* root = new TagDirectory (nullptr, ifdAttribs, INTEL); Tag* exif = new Tag (root, lookupAttrib (ifdAttribs, "Exif")); exif->initSubDir (); - Tag* mn = new Tag (exif->getDirectory(), lookupAttrib (exifAttribs, "MakerNote")); - mn->initMakerNote (IFD, canonAttribs); root->addTag (exif); - exif->getDirectory()->addTag (mn); + if (exif) { + Tag* mn = new Tag (exif->getDirectory(), lookupAttrib (exifAttribs, "MakerNote")); + mn->initMakerNote (IFD, canonAttribs); + exif->getDirectory()->addTag (mn); + } parseCIFF (rml->ciffLength, root); root->sort (); + parse(true); } Tag* ExifManager::saveCIFFMNTag (TagDirectory* root, int len, const char* name) @@ -2114,10 +2152,14 @@ void ExifManager::parseCIFF (int length, TagDirectory* root) char buffer[1024]; Tag* t; - fseek (f, rml->ciffBase + length - 4, SEEK_SET); + if (fseek(f, rml->ciffBase + length - 4, SEEK_SET)) { + return; + } int dirStart = get4 (f, INTEL) + rml->ciffBase; - fseek (f, dirStart, SEEK_SET); + if (fseek(f, dirStart, SEEK_SET)) { + return; + } int numOfTags = get2 (f, INTEL); @@ -2168,11 +2210,13 @@ void ExifManager::parseCIFF (int length, TagDirectory* root) t = new Tag (root, lookupAttrib (ifdAttribs, "Make")); t->initString (buffer); root->addTag (t); - fseek (f, strlen (buffer) - 63, SEEK_CUR); - fread (buffer, 64, 1, f); - t = new Tag (root, lookupAttrib (ifdAttribs, "Model")); - t->initString (buffer); - root->addTag (t); + if (!fseek (f, strlen (buffer) - 63, SEEK_CUR)) { + if (fread (buffer, 64, 1, f) == 1) { + t = new Tag (root, lookupAttrib (ifdAttribs, "Model")); + t->initString (buffer); + root->addTag (t); + } + } } if (type == 0x1818) { @@ -2448,7 +2492,7 @@ parse_leafdata (TagDirectory* root, ByteOrder order) char *val = (char *)&value[pos]; if (strncmp (&hdr[8], "CameraObj_ISO_speed", 19) == 0) { - iso_speed = 25 * (1 << (atoi (val) - 1)); + iso_speed = 25 * (1 << std::max((atoi (val) - 1), 0)); found_count++; } else if (strncmp (&hdr[8], "ImgProf_rotation_angle", 22) == 0) { rotation_angle = atoi (val); @@ -2477,7 +2521,7 @@ parse_leafdata (TagDirectory* root, ByteOrder order) root->addTagFront (exif); } - if (!exif->getDirectory()->getTag ("ISOSpeedRatings")) { + if (exif && !exif->getDirectory()->getTag ("ISOSpeedRatings")) { Tag *t = new Tag (exif->getDirectory(), exif->getDirectory()->getAttrib ("ISOSpeedRatings")); t->initInt (iso_speed, LONG); exif->getDirectory()->addTagFront (t); @@ -2803,7 +2847,7 @@ void ExifManager::parse (bool isRaw, bool skipIgnored) exif->initSubDir (exifdir); root->addTagFront (exif); - if (!exif->getDirectory()->getTag ("ISOSpeedRatings") && exif->getDirectory()->getTag ("ExposureIndex")) { + if (exif && !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); @@ -3017,7 +3061,7 @@ void ExifManager::parse (bool isRaw, bool skipIgnored) if (!sftTagList.empty()) { for (auto sft : sftTagList) { int sftVal = sft->toInt(); - if (sftVal == (isRaw ? 0 : 2)) { + if (sftVal == 0 || (!isRaw && sftVal == 2)) { frames.push_back(sft->getParent()); frameRootDetected = true; @@ -3077,7 +3121,7 @@ void ExifManager::parse (bool isRaw, bool skipIgnored) root->printAll (); #endif - } while (ifdOffset && !onlyFirst); + } 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. @@ -3398,7 +3442,7 @@ short int int2_to_signed (short unsigned int i) * -mm f/- * NB: no space between separator '-'; no space between focal length and 'mm' */ -bool extractLensInfo (std::string &fullname, double &minFocal, double &maxFocal, double &maxApertureAtMinFocal, double &maxApertureAtMaxFocal) +bool extractLensInfo (const std::string &fullname, double &minFocal, double &maxFocal, double &maxApertureAtMinFocal, double &maxApertureAtMaxFocal) { minFocal = 0.0; maxFocal = 0.0; diff --git a/rtexif/rtexif.h b/rtexif/rtexif.h index 33419fe71..43b296746 100644 --- a/rtexif/rtexif.h +++ b/rtexif/rtexif.h @@ -19,22 +19,32 @@ #ifndef _MEXIF3_ #define _MEXIF3_ -#include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include #include +#include +#include +#include #include -#include "../rtengine/procparams.h" #include "../rtengine/noncopyable.h" #include "../rtengine/rawmetadatalocation.h" +namespace rtengine +{ + +namespace procparams +{ + class ExifPairs; +} + +} + class CacheImageData; namespace rtexif @@ -57,15 +67,15 @@ const enum ByteOrder HOSTORDER = MOTOROLA; #endif enum MNKind {NOMK, IFD, HEADERIFD, NIKON3, OLYMPUS2, FUJI, TABLESUBDIR}; -bool extractLensInfo (std::string &fullname, double &minFocal, double &maxFocal, double &maxApertureAtMinFocal, double &maxApertureAtMaxFocal); +bool extractLensInfo (const std::string &fullname, double &minFocal, double &maxFocal, double &maxApertureAtMinFocal, double &maxApertureAtMaxFocal); 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 { @@ -78,7 +88,7 @@ struct TIFFHeader { 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; @@ -155,11 +165,11 @@ public: virtual Tag* findTagUpward (const char* name) const; bool getXMPTagValue (const char* name, char* value) const; - void keepTag (int ID); - virtual void addTag (Tag* a); - virtual void addTagFront (Tag* a); - virtual void replaceTag (Tag* a); - inline Tag* getTagByIndex (int ix) + void keepTag (int ID); + void addTag (Tag* &a); + void addTagFront (Tag* &a); + void replaceTag (Tag* a); + inline Tag* getTagByIndex (int ix) { return tags[ix]; } @@ -171,7 +181,7 @@ public: virtual int calculateSize (); virtual int write (int start, unsigned char* buffer); virtual TagDirectory* clone (TagDirectory* parent); - virtual void applyChange (std::string field, Glib::ustring value); + void applyChange (const std::string &field, const 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, @@ -191,10 +201,10 @@ public: TagDirectoryTable(); TagDirectoryTable (TagDirectory* p, unsigned char *v, int memsize, int offs, TagType type, const TagAttrib* ta, ByteOrder border); TagDirectoryTable (TagDirectory* p, FILE* f, int memsize, int offset, TagType type, const TagAttrib* ta, ByteOrder border); - virtual ~TagDirectoryTable(); - virtual int calculateSize (); - virtual int write (int start, unsigned char* buffer); - virtual TagDirectory* clone (TagDirectory* parent); + ~TagDirectoryTable() override; + int calculateSize () override; + int write (int start, unsigned char* buffer) override; + TagDirectory* clone (TagDirectory* parent) override; }; // a class representing a single tag @@ -236,7 +246,7 @@ public: void initLongArray (const char* data, int len); void initRational (int num, int den); - static void swapByteOrder2 (char *buffer, int count); + static void swapByteOrder2 (unsigned char *buffer, int count); // get basic tag properties int getID () const @@ -281,18 +291,18 @@ public: } // read/write value - int toInt (int ofs = 0, TagType astype = INVALID) const; - void fromInt (int v); - 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); - + int toInt (int ofs = 0, TagType astype = INVALID) const; + void fromInt (int v); + 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); + int getDistanceFrom (const TagDirectory *root); // additional getter/setter for more comfortable use - std::string valueToString (); + std::string valueToString () const; std::string nameToString (int i = 0); void valueFromString (const std::string& value); void userCommentFromString (const Glib::ustring& text); @@ -371,7 +381,7 @@ class Interpreter public: Interpreter () {} virtual ~Interpreter() {}; - virtual std::string toString (Tag* t) + virtual std::string toString (const Tag* t) const { char buffer[1024]; t->toString (buffer); @@ -482,22 +492,26 @@ public: }; extern Interpreter stdInterpreter; + +template class ChoiceInterpreter : public Interpreter { protected: - std::map choices; + using Choices = std::map; + using ChoicesIterator = typename Choices::const_iterator; + Choices choices; public: ChoiceInterpreter () {}; - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { - std::map::iterator r = choices.find (t->toInt()); + const typename std::map::const_iterator r = choices.find(t->toInt()); if (r != choices.end()) { return r->second; } else { char buffer[1024]; - t->toString (buffer); - return std::string (buffer); + t->toString(buffer); + return buffer; } } }; @@ -507,11 +521,11 @@ class IntLensInterpreter : public Interpreter { protected: typedef std::multimap< T, std::string> container_t; - typedef typename std::multimap< T, std::string>::iterator it_t; + typedef typename std::multimap< T, std::string>::const_iterator it_t; typedef std::pair< T, std::string> p_t; container_t choices; - virtual std::string guess (const T lensID, double focalLength, double maxApertureAtFocal, double *lensInfoArray) + virtual std::string guess (const T lensID, double focalLength, double maxApertureAtFocal, double *lensInfoArray) const { it_t r; size_t nFound = choices.count ( lensID ); diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 083affa72..0c6e433ff 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -25,7 +25,7 @@ namespace rtexif { -class SANoYesInterpreter : public ChoiceInterpreter +class SANoYesInterpreter : public ChoiceInterpreter<> { public: SANoYesInterpreter () @@ -36,7 +36,7 @@ public: }; SANoYesInterpreter saNoYesInterpreter; -class SAOnOffInterpreter : public ChoiceInterpreter +class SAOnOffInterpreter : public ChoiceInterpreter<> { public: SAOnOffInterpreter () @@ -48,7 +48,7 @@ public: }; SAOnOffInterpreter saOnOffInterpreter; -class SAOnOffInterpreter2 : public ChoiceInterpreter +class SAOnOffInterpreter2 : public ChoiceInterpreter<> { public: SAOnOffInterpreter2 () @@ -59,7 +59,7 @@ public: }; SAOnOffInterpreter2 saOnOffInterpreter2; -class SAOnOffInterpreter3 : public ChoiceInterpreter +class SAOnOffInterpreter3 : public ChoiceInterpreter<> { public: SAOnOffInterpreter3 () @@ -71,7 +71,7 @@ public: }; SAOnOffInterpreter3 saOnOffInterpreter3; -class SAOnOffInterpreter4 : public ChoiceInterpreter +class SAOnOffInterpreter4 : public ChoiceInterpreter<> { public: SAOnOffInterpreter4 () @@ -84,7 +84,7 @@ public: }; SAOnOffInterpreter4 saOnOffInterpreter4; -class SAOnOffInterpreter5 : public ChoiceInterpreter +class SAOnOffInterpreter5 : public ChoiceInterpreter<> { public: SAOnOffInterpreter5 () @@ -95,7 +95,7 @@ public: }; SAOnOffInterpreter5 saOnOffInterpreter5; -class SAHighISONoiseReduction : public ChoiceInterpreter +class SAHighISONoiseReduction : public ChoiceInterpreter<> { public: SAHighISONoiseReduction () @@ -110,7 +110,7 @@ public: }; SAHighISONoiseReduction saHighISONoiseReduction; -class SAHighISONoiseReduction2 : public ChoiceInterpreter +class SAHighISONoiseReduction2 : public ChoiceInterpreter<> { public: SAHighISONoiseReduction2 () @@ -124,7 +124,7 @@ public: }; SAHighISONoiseReduction2 saHighISONoiseReduction2; -class SAHighISONoiseReduction3 : public ChoiceInterpreter +class SAHighISONoiseReduction3 : public ChoiceInterpreter<> { public: SAHighISONoiseReduction3 () @@ -137,7 +137,7 @@ public: }; SAHighISONoiseReduction3 saHighISONoiseReduction3; -class SAHighISONoiseReduction4 : public ChoiceInterpreter +class SAHighISONoiseReduction4 : public ChoiceInterpreter<> { public: SAHighISONoiseReduction4 () @@ -150,7 +150,7 @@ public: }; SAHighISONoiseReduction4 saHighISONoiseReduction4; -class SAHighISONoiseReduction5 : public ChoiceInterpreter +class SAHighISONoiseReduction5 : public ChoiceInterpreter<> { public: SAHighISONoiseReduction5 () @@ -161,7 +161,7 @@ public: }; SAHighISONoiseReduction5 saHighISONoiseReduction5; -class SASmileShutterMode : public ChoiceInterpreter +class SASmileShutterMode : public ChoiceInterpreter<> { public: SASmileShutterMode () @@ -173,7 +173,7 @@ public: }; SASmileShutterMode saSmileShutterMode; -class SAHDRLevel : public ChoiceInterpreter +class SAHDRLevel : public ChoiceInterpreter<> { public: SAHDRLevel () @@ -191,7 +191,7 @@ public: }; SAHDRLevel saHDRLevel; -class SAViewingMode : public ChoiceInterpreter +class SAViewingMode : public ChoiceInterpreter<> { public: SAViewingMode () @@ -204,7 +204,7 @@ public: }; SAViewingMode saViewingMode; -class SAFlashAction : public ChoiceInterpreter +class SAFlashAction : public ChoiceInterpreter<> { public: SAFlashAction () @@ -215,7 +215,7 @@ public: }; SAFlashAction saFlashAction; -class SALiveViewFocusMode : public ChoiceInterpreter +class SALiveViewFocusMode : public ChoiceInterpreter<> { public: SALiveViewFocusMode () @@ -227,7 +227,7 @@ public: }; SALiveViewFocusMode saLiveViewFocusMode; -class SALensMount : public ChoiceInterpreter +class SALensMount : public ChoiceInterpreter<> { public: SALensMount () @@ -239,7 +239,7 @@ public: }; SALensMount saLensMount; -class SASweepPanoramaSize : public ChoiceInterpreter +class SASweepPanoramaSize : public ChoiceInterpreter<> { public: SASweepPanoramaSize () @@ -250,7 +250,7 @@ public: }; SASweepPanoramaSize saSweepPanoramaSize; -class SASweepPanoramaDirection : public ChoiceInterpreter +class SASweepPanoramaDirection : public ChoiceInterpreter<> { public: SASweepPanoramaDirection () @@ -263,7 +263,7 @@ public: }; SASweepPanoramaDirection saSweepPanoramaDirection; -class SALiveViewAFSetting : public ChoiceInterpreter +class SALiveViewAFSetting : public ChoiceInterpreter<> { public: SALiveViewAFSetting () @@ -275,7 +275,7 @@ public: }; SALiveViewAFSetting saLiveViewAFSetting; -class SAPanoramaSize3D : public ChoiceInterpreter +class SAPanoramaSize3D : public ChoiceInterpreter<> { public: SAPanoramaSize3D () @@ -288,7 +288,7 @@ public: }; SAPanoramaSize3D saPanoramaSize3D; -class SALiveViewMetering : public ChoiceInterpreter +class SALiveViewMetering : public ChoiceInterpreter<> { public: SALiveViewMetering () @@ -300,7 +300,7 @@ public: }; SALiveViewMetering saLiveViewMetering; -class SAWhiteBalanceInterpreter: public ChoiceInterpreter +class SAWhiteBalanceInterpreter: public ChoiceInterpreter<> { public: SAWhiteBalanceInterpreter() @@ -319,7 +319,7 @@ public: }; SAWhiteBalanceInterpreter saWhiteBalanceInterpreter; -class SAWhiteBalanceSettingInterpreter: public ChoiceInterpreter +class SAWhiteBalanceSettingInterpreter: public ChoiceInterpreter<> { public: SAWhiteBalanceSettingInterpreter() @@ -379,7 +379,7 @@ public: }; SAWhiteBalanceSettingInterpreter saWhiteBalanceSettingInterpreter; -class SASceneModeInterpreter : public ChoiceInterpreter +class SASceneModeInterpreter : public ChoiceInterpreter<> { public: SASceneModeInterpreter () @@ -413,7 +413,7 @@ public: }; SASceneModeInterpreter saSceneModeInterpreter; -class SAZoneMatchingInterpreter : public ChoiceInterpreter +class SAZoneMatchingInterpreter : public ChoiceInterpreter<> { public: SAZoneMatchingInterpreter () @@ -425,7 +425,7 @@ public: }; SAZoneMatchingInterpreter saZoneMatchingInterpreter; -class SADynamicRangeOptimizerInterpreter : public ChoiceInterpreter +class SADynamicRangeOptimizerInterpreter : public ChoiceInterpreter<> { public: SADynamicRangeOptimizerInterpreter () @@ -448,7 +448,7 @@ public: }; SADynamicRangeOptimizerInterpreter saDynamicRangeOptimizerInterpreter; -class SAColorModeInterpreter : public ChoiceInterpreter +class SAColorModeInterpreter : public ChoiceInterpreter<> { public: SAColorModeInterpreter () @@ -477,7 +477,7 @@ public: }; SAColorModeInterpreter saColorModeInterpreter; -class SAExposureModeInterpreter : public ChoiceInterpreter +class SAExposureModeInterpreter : public ChoiceInterpreter<> { public: SAExposureModeInterpreter () @@ -517,7 +517,7 @@ public: }; SAExposureModeInterpreter saExposureModeInterpreter; -class SAQualityInterpreter : public ChoiceInterpreter +class SAQualityInterpreter : public ChoiceInterpreter<> { public: SAQualityInterpreter () @@ -528,7 +528,7 @@ public: }; SAQualityInterpreter saQualityInterpreter; -class SAAntiBlurInterpreter : public ChoiceInterpreter +class SAAntiBlurInterpreter : public ChoiceInterpreter<> { public: SAAntiBlurInterpreter () @@ -693,6 +693,7 @@ public: {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"}, @@ -745,6 +746,7 @@ public: {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"}, @@ -816,6 +818,7 @@ public: {2672, "Minolta AF 24-105mm f/3.5-4.5 (D)"}, {3046, "Metabones Canon EF Speed Booster"}, {4567, "Tokina 70-210mm f/4-5.6"}, + {4570, "Tamron AF 35-135mm f/3.5-4.5"}, {4571, "Vivitar 70-210mm f/4.5-5.6"}, {4574, "2x Teleconverter or Tamron or Tokina Lens"}, {4574, "Tamron SP AF 90mm f/2.5"}, @@ -849,6 +852,8 @@ public: {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 24mm f/1.4 GM"}, + {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"}, @@ -871,24 +876,40 @@ public: {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 FE 400mm f/2.8 GM OSS"}, + {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"}, {6553, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter"}, + {6553, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter"}, + {6553, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter"}, {6553, "Samyang AF 50mm f/1.4 FE"}, {6553, "Samyang AF 14mm f/2.8 FE"}, + {6553, "Samyang AF 24mm f/2.8"}, {6553, "Samyang AF 35mm f/2.8 FE"}, + {6553, "Samyang AF 35mm f/1.4"}, {6553, "Sigma 19mm f/2.8 [EX] DN"}, {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 85mm f/1.4 DG HSM | A"}, + {6553, "Sigma 16mm f/1.4 DC DN | C"}, + {6553, "Sigma 105mm f/1.4 DG HSM | A"}, + {6553, "Sigma 56mm f/1.4 DC DN | C"}, + {6553, "Sigma 70-200mm f/2.8 DG OS HSM | S"}, + {6553, "Sigma 70mm f/2.8 DG MACRO | A"}, {6553, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, + {6553, "Tamron 28-75mm f/2.8 Di III RXD"}, {6553, "Tokina Firin 20mm f/2 FE MF"}, {6553, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III"}, {6553, "Voigtlander HELIAR-HYPER WIDE 10mm f/5.6"}, {6553, "Voigtlander ULTRA WIDE-HELIAR 12mm f/5.6 III"}, {6553, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical"}, {6553, "Voigtlander NOKTON 40mm f/1.2 Aspherical"}, + {6553, "Voigtlander NOKTON classic 35mm f/1.4"}, + {6553, "Voigtlander MACRO APO-LANTHAR 110mm f/2.5"}, + {6553, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical"}, {6553, "Zeiss Touit 12mm f/2.8"}, {6553, "Zeiss Touit 32mm f/1.8"}, {6553, "Zeiss Touit 50mm f/2.8 Macro"}, @@ -896,10 +917,12 @@ public: {6553, "Zeiss Batis 85mm f/1.8"}, {6553, "Zeiss Batis 18mm f/2.8"}, {6553, "Zeiss Batis 135mm f/2.8"}, + {6553, "Zeiss Batis 40mm f/2 CF"}, {6553, "Zeiss Loxia 50mm f/2"}, {6553, "Zeiss Loxia 35mm f/2"}, {6553, "Zeiss Loxia 21mm f/2.8"}, {6553, "Zeiss Loxia 85mm f/2.4"}, + {6553, "Zeiss Loxia 25mm f/2.4"}, {6553, "Arax MC 35mm f/2.8 Tilt+Shift"}, {6553, "Arax MC 80mm f/2.8 Tilt+Shift"}, {6553, "Zenitar MF 16mm f/2.8 Fisheye M42"}, @@ -948,6 +971,7 @@ public: {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"}, @@ -1019,6 +1043,7 @@ public: {26721, "Minolta AF 24-105mm f/3.5-4.5 (D)"}, {30464, "Metabones Canon EF Speed Booster"}, {45671, "Tokina 70-210mm f/4-5.6"}, + {45701, "Tamron AF 35-135mm f/3.5-4.5"}, {45711, "Vivitar 70-210mm f/4.5-5.6"}, {45741, "2x Teleconverter or Tamron or Tokina Lens"}, {45741, "Tamron SP AF 90mm f/2.5"}, @@ -1052,6 +1077,8 @@ public: {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 24mm f/1.4 GM"}, + {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"}, @@ -1074,24 +1101,40 @@ public: {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 FE 400mm f/2.8 GM OSS"}, + {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"}, {65535, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter"}, + {65535, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter"}, + {65535, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter"}, {65535, "Samyang AF 50mm f/1.4 FE"}, {65535, "Samyang AF 14mm f/2.8 FE"}, + {65535, "Samyang AF 24mm f/2.8"}, {65535, "Samyang AF 35mm f/2.8 FE"}, + {65535, "Samyang AF 35mm f/1.4"}, {65535, "Sigma 19mm f/2.8 [EX] DN"}, {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 85mm f/1.4 DG HSM | A"}, + {65535, "Sigma 16mm f/1.4 DC DN | C"}, + {65535, "Sigma 105mm f/1.4 DG HSM | A"}, + {65535, "Sigma 56mm f/1.4 DC DN | C"}, + {65535, "Sigma 70-200mm f/2.8 DG OS HSM | S"}, + {65535, "Sigma 70mm f/2.8 DG MACRO | A"}, {65535, "Tamron 18-200mm f/3.5-6.3 Di III VC"}, + {65535, "Tamron 28-75mm f/2.8 Di III RXD"}, {65535, "Tokina Firin 20mm f/2 FE MF"}, {65535, "Voigtlander SUPER WIDE-HELIAR 15mm f/4.5 III"}, {65535, "Voigtlander HELIAR-HYPER WIDE 10mm f/5.6"}, {65535, "Voigtlander ULTRA WIDE-HELIAR 12mm f/5.6 III"}, {65535, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical"}, {65535, "Voigtlander NOKTON 40mm f/1.2 Aspherical"}, + {65535, "Voigtlander NOKTON classic 35mm f/1.4"}, + {65535, "Voigtlander MACRO APO-LANTHAR 110mm f/2.5"}, + {65535, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical"}, {65535, "Zeiss Touit 12mm f/2.8"}, {65535, "Zeiss Touit 32mm f/1.8"}, {65535, "Zeiss Touit 50mm f/2.8 Macro"}, @@ -1099,10 +1142,12 @@ public: {65535, "Zeiss Batis 85mm f/1.8"}, {65535, "Zeiss Batis 18mm f/2.8"}, {65535, "Zeiss Batis 135mm f/2.8"}, + {65535, "Zeiss Batis 40mm f/2 CF"}, {65535, "Zeiss Loxia 50mm f/2"}, {65535, "Zeiss Loxia 35mm f/2"}, {65535, "Zeiss Loxia 21mm f/2.8"}, {65535, "Zeiss Loxia 85mm f/2.4"}, + {65535, "Zeiss Loxia 25mm f/2.4"}, {65535, "Arax MC 35mm f/2.8 Tilt+Shift"}, {65535, "Arax MC 80mm f/2.8 Tilt+Shift"}, {65535, "Zenitar MF 16mm f/2.8 Fisheye M42"}, @@ -1113,7 +1158,7 @@ public: }; } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int lensID = t->toInt(); Tag *lensInfoTag = t->getParent()->getRoot()->findTag ("LensInfo"); @@ -1173,7 +1218,8 @@ public: choices.insert (p_t (32791, "Sony E 16-70mm f/4 ZA OSS")); choices.insert (p_t (32792, "Sony E 10-18mm f/4 OSS")); choices.insert (p_t (32793, "Sony E PZ 16-50mm f/3.5-5.6 OSS")); - choices.insert (p_t (32794, "Sony FE 35mm f/2.8 ZA")); + choices.insert (p_t (32794, "Sony FE 35mm f/2.8 ZA or Samyang AF 24mm f/2.8 FE")); + choices.insert (p_t (32794, "Samyang AF 24mm f/2.8 FE")); choices.insert (p_t (32795, "Sony FE 24-70mm f/4 ZA OSS")); choices.insert (p_t (32796, "Sony FE 85mm f/1.8")); choices.insert (p_t (32797, "Sony E 18-200mm f/3.5-6.3 OSS LE")); @@ -1183,6 +1229,8 @@ public: 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 (32804, "Sony FE 24mm f/1.4 GM")); + 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")); @@ -1205,12 +1253,15 @@ public: 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 (32848, "Sony FE 400mm f/2.8 GM OSS")); + 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)")); choices.insert (p_t (33077, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 1.4X Teleconverter")); choices.insert (p_t (33078, "Sony FE 100-400mm f/4.5-5.6 GM OSS + 2X Teleconverter")); + choices.insert (p_t (33079, "Sony FE 400mm f/2.8 GM OSS + 1.4X Teleconverter")); + choices.insert (p_t (33080, "Sony FE 400mm f/2.8 GM OSS + 2X Teleconverter")); choices.insert (p_t (49201, "Zeiss Touit 12mm f/2.8")); choices.insert (p_t (49202, "Zeiss Touit 32mm f/1.8")); choices.insert (p_t (49203, "Zeiss Touit 50mm f/2.8 Macro")); @@ -1218,33 +1269,47 @@ public: choices.insert (p_t (49217, "Zeiss Batis 85mm f/1.8")); choices.insert (p_t (49218, "Zeiss Batis 18mm f/2.8")); choices.insert (p_t (49219, "Zeiss Batis 135mm f/2.8")); + choices.insert (p_t (49220, "Zeiss Batis 40mm f/2 CF")); choices.insert (p_t (49232, "Zeiss Loxia 50mm f/2")); choices.insert (p_t (49233, "Zeiss Loxia 35mm f/2")); choices.insert (p_t (49234, "Zeiss Loxia 21mm f/2.8")); choices.insert (p_t (49235, "Zeiss Loxia 85mm f/2.4")); + choices.insert (p_t (49236, "Zeiss Loxia 25mm f/2.4")); + choices.insert (p_t (49457, "Tamron 28-75mm f/2.8 Di III RXD")); choices.insert (p_t (50480, "Sigma 30mm f/1.4 DC DN | C")); - choices.insert (p_t (50481, "Sigma 50mm f/1.4 DG HSM | A + MC-11")); + choices.insert (p_t (50481, "Sigma 50mm f/1.4 DG HSM | A")); choices.insert (p_t (50482, "Sigma 18-300mm f/3.5-6.3 DC MACRO OS HSM | C + MC-11")); choices.insert (p_t (50483, "Sigma 18-35mm f/1.8 DC HSM | A + MC-11")); choices.insert (p_t (50484, "Sigma 24-35mm f/2 DG HSM | A + MC-11")); choices.insert (p_t (50486, "Sigma 150-600mm f/5-6.3 DG OS HSM | C + MC-11")); choices.insert (p_t (50487, "Sigma 20mm f/1.4 DG HSM | A + MC-11")); - choices.insert (p_t (50488, "Sigma 35mm f/1.4 DG HSM | A + MC-11")); + choices.insert (p_t (50488, "Sigma 35mm f/1.4 DG HSM | A")); choices.insert (p_t (50489, "Sigma 150-600mm f/5-6.3 DG OS HSM | S + MC-11")); choices.insert (p_t (50490, "Sigma 120-300mm f/2.8 DG OS HSM | S + MC-11")); 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 (50499, "Sigma 85mm f/1.4 DG HSM | A")); + choices.insert (p_t (50501, "Sigma 100-400mm f/5-6.3 DG OS HSM | C + MC-11")); + choices.insert (p_t (50503, "Sigma 16mm f/1.4 DC DN | C")); + choices.insert (p_t (50507, "Sigma 105mm f/1.4 DG HSM | A")); + choices.insert (p_t (50508, "Sigma 56mm f/1.4 DC DN | C")); + choices.insert (p_t (50512, "Sigma 70-200mm f/2.8 DG OS HSM | S")); + choices.insert (p_t (50513, "Sigma 70mm f/2.8 DG MACRO | A")); 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")); choices.insert (p_t (50995, "Voigtlander MACRO APO-LANTHAR 65mm f/2 Aspherical")); choices.insert (p_t (50996, "Voigtlander NOKTON 40mm f/1.2 Aspherical")); + choices.insert (p_t (50997, "Voigtlander NOKTON classic 35mm f/1.4")); + choices.insert (p_t (50998, "Voigtlander MACRO APO-LANTHAR 110mm f/2.5")); + choices.insert (p_t (50999, "Voigtlander COLOR-SKOPAR 21mm f/3.5 Aspherical")); choices.insert (p_t (51505, "Samyang AF 14mm f/2.8 FE or Samyang AF 35mm f/2.8 FE")); choices.insert (p_t (51505, "Samyang AF 35mm f/2.8 FE")); + choices.insert (p_t (51507, "Samyang AF 35mm f/1.4")); } - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int lensID = t->toInt(); Tag *lensInfoTag = t->getParent()->getRoot()->findTag ("LensInfo"); @@ -1278,7 +1343,7 @@ public: }; SALensID2Interpreter saLensID2Interpreter; -class MATeleconverterInterpreter : public ChoiceInterpreter +class MATeleconverterInterpreter : public ChoiceInterpreter<> { public: MATeleconverterInterpreter () @@ -1296,7 +1361,7 @@ public: }; MATeleconverterInterpreter maTeleconverterInterpreter; -class MAQualityInterpreter : public ChoiceInterpreter +class MAQualityInterpreter : public ChoiceInterpreter<> { public: MAQualityInterpreter () @@ -1314,7 +1379,7 @@ public: }; MAQualityInterpreter maQualityInterpreter; -class MAImageSizeInterpreter : public ChoiceInterpreter +class MAImageSizeInterpreter : public ChoiceInterpreter<> { public: MAImageSizeInterpreter () @@ -1329,7 +1394,7 @@ public: }; MAImageSizeInterpreter maImageSizeInterpreter; -class SAQualityInterpreter2 : public ChoiceInterpreter +class SAQualityInterpreter2 : public ChoiceInterpreter<> { public: SAQualityInterpreter2 () @@ -1345,7 +1410,7 @@ public: }; SAQualityInterpreter2 saQualityInterpreter2; -class SAQualityInterpreter3 : public ChoiceInterpreter +class SAQualityInterpreter3 : public ChoiceInterpreter<> { public: SAQualityInterpreter3 () @@ -1358,7 +1423,7 @@ public: }; SAQualityInterpreter3 saQualityInterpreter3; -class SADriveMode : public ChoiceInterpreter +class SADriveMode : public ChoiceInterpreter<> { public: SADriveMode () @@ -1380,7 +1445,7 @@ public: }; SADriveMode saDriveMode; -class SADriveMode2 : public ChoiceInterpreter +class SADriveMode2 : public ChoiceInterpreter<> { public: SADriveMode2 () @@ -1396,7 +1461,7 @@ public: }; SADriveMode2 saDriveMode2; -class SADriveMode3 : public ChoiceInterpreter +class SADriveMode3 : public ChoiceInterpreter<> { public: SADriveMode3 () @@ -1422,7 +1487,7 @@ public: }; SADriveMode3 saDriveMode3; -class SAFocusMode: public ChoiceInterpreter +class SAFocusMode: public ChoiceInterpreter<> { public: SAFocusMode () @@ -1437,7 +1502,7 @@ public: }; SAFocusMode saFocusMode; -class SAFocusMode2: public ChoiceInterpreter +class SAFocusMode2: public ChoiceInterpreter<> { public: SAFocusMode2 () @@ -1451,7 +1516,7 @@ public: }; SAFocusMode2 saFocusMode2; -class SAFocusModeSetting3: public ChoiceInterpreter +class SAFocusModeSetting3: public ChoiceInterpreter<> { public: SAFocusModeSetting3 () @@ -1466,7 +1531,7 @@ public: }; SAFocusModeSetting3 saFocusModeSetting3; -class SAAFMode: public ChoiceInterpreter +class SAAFMode: public ChoiceInterpreter<> { public: SAAFMode() @@ -1484,7 +1549,7 @@ public: }; SAAFMode saAFMode; -class SAAFAreaMode: public ChoiceInterpreter +class SAAFAreaMode: public ChoiceInterpreter<> { public: SAAFAreaMode () @@ -1496,7 +1561,7 @@ public: }; SAAFAreaMode saAFAreaMode; -class SAAFAreaMode2: public ChoiceInterpreter +class SAAFAreaMode2: public ChoiceInterpreter<> { public: SAAFAreaMode2 () @@ -1509,7 +1574,7 @@ public: }; SAAFAreaMode2 saAFAreaMode2; -class SAAFPointSelected: public ChoiceInterpreter +class SAAFPointSelected: public ChoiceInterpreter<> { public: SAAFPointSelected () @@ -1529,7 +1594,7 @@ public: }; SAAFPointSelected saAFPointSelected; -class SACameraInfoAFPointSelected: public ChoiceInterpreter +class SACameraInfoAFPointSelected: public ChoiceInterpreter<> { public: SACameraInfoAFPointSelected () @@ -1554,7 +1619,7 @@ public: }; SACameraInfoAFPointSelected saCameraInfoAFPointSelected; -class SACameraInfoAFPoint: public ChoiceInterpreter +class SACameraInfoAFPoint: public ChoiceInterpreter<> { public: SACameraInfoAFPoint () @@ -1582,7 +1647,7 @@ public: }; SACameraInfoAFPoint saCameraInfoAFPoint; -class SAAFPointSelected2: public ChoiceInterpreter +class SAAFPointSelected2: public ChoiceInterpreter<> { public: SAAFPointSelected2 () @@ -1600,7 +1665,7 @@ public: }; SAAFPointSelected2 saAFPointSelected2; -class SAMeteringMode0_3: public ChoiceInterpreter +class SAMeteringMode0_3: public ChoiceInterpreter<> { public: SAMeteringMode0_3 () @@ -1612,7 +1677,7 @@ public: }; SAMeteringMode0_3 saMeteringMode0_3; -class SAMeteringMode1_3: public ChoiceInterpreter +class SAMeteringMode1_3: public ChoiceInterpreter<> { public: SAMeteringMode1_3 () @@ -1624,7 +1689,7 @@ public: }; SAMeteringMode1_3 saMeteringMode1_3; -class SAMeteringMode1_4: public ChoiceInterpreter +class SAMeteringMode1_4: public ChoiceInterpreter<> { public: SAMeteringMode1_4 () @@ -1636,7 +1701,7 @@ public: }; SAMeteringMode1_4 saMeteringMode1_4; -class SADynamicRangeOptimizerMode: public ChoiceInterpreter +class SADynamicRangeOptimizerMode: public ChoiceInterpreter<> { public: SADynamicRangeOptimizerMode () @@ -1650,7 +1715,7 @@ public: }; SADynamicRangeOptimizerMode saDynamicRangeOptimizerMode; -class SADynamicRangeOptimizerSetting: public ChoiceInterpreter +class SADynamicRangeOptimizerSetting: public ChoiceInterpreter<> { public: SADynamicRangeOptimizerSetting () @@ -1662,7 +1727,7 @@ public: }; SADynamicRangeOptimizerSetting saDynamicRangeOptimizerSetting; -class SACreativeStyle: public ChoiceInterpreter +class SACreativeStyle: public ChoiceInterpreter<> { public: SACreativeStyle () @@ -1685,7 +1750,7 @@ public: }; SACreativeStyle saCreativeStyle; -class SACreativeStyle2: public ChoiceInterpreter +class SACreativeStyle2: public ChoiceInterpreter<> { public: SACreativeStyle2 () @@ -1701,7 +1766,7 @@ public: }; SACreativeStyle2 saCreativeStyle2; -class SACreativeStyleSetting: public ChoiceInterpreter +class SACreativeStyleSetting: public ChoiceInterpreter<> { public: SACreativeStyleSetting () @@ -1716,7 +1781,7 @@ public: }; SACreativeStyleSetting saCreativeStyleSetting; -class SAFlashControl: public ChoiceInterpreter +class SAFlashControl: public ChoiceInterpreter<> { public: SAFlashControl () @@ -1727,7 +1792,7 @@ public: }; SAFlashControl saFlashControl; -class SAFlashMode: public ChoiceInterpreter +class SAFlashMode: public ChoiceInterpreter<> { public: SAFlashMode () @@ -1738,7 +1803,7 @@ public: }; SAFlashMode saFlashMode; -class SAFlashMode2: public ChoiceInterpreter +class SAFlashMode2: public ChoiceInterpreter<> { public: SAFlashMode2 () @@ -1753,7 +1818,7 @@ public: }; SAFlashMode2 saFlashMode2; -class SAExposureProgram: public ChoiceInterpreter +class SAExposureProgram: public ChoiceInterpreter<> { public: SAExposureProgram () @@ -1776,7 +1841,7 @@ public: }; SAExposureProgram saExposureProgram; -class SAExposureProgram2: public ChoiceInterpreter +class SAExposureProgram2: public ChoiceInterpreter<> { public: SAExposureProgram2 () @@ -1817,7 +1882,7 @@ public: }; SAExposureProgram2 saExposureProgram2; -class SARotation: public ChoiceInterpreter +class SARotation: public ChoiceInterpreter<> { public: SARotation () @@ -1830,7 +1895,7 @@ public: }; SARotation saRotation; -class SASonyImageSize: public ChoiceInterpreter +class SASonyImageSize: public ChoiceInterpreter<> { public: SASonyImageSize () @@ -1842,7 +1907,7 @@ public: }; SASonyImageSize saSonyImageSize; -class SASonyImageSize3: public ChoiceInterpreter +class SASonyImageSize3: public ChoiceInterpreter<> { public: SASonyImageSize3 () @@ -1857,7 +1922,7 @@ public: }; SASonyImageSize3 saSonyImageSize3; -class SAAspectRatio: public ChoiceInterpreter +class SAAspectRatio: public ChoiceInterpreter<> { public: SAAspectRatio () @@ -1868,7 +1933,7 @@ public: }; SAAspectRatio saAspectRatio; -class SAAspectRatio2: public ChoiceInterpreter +class SAAspectRatio2: public ChoiceInterpreter<> { public: SAAspectRatio2 () @@ -1879,7 +1944,7 @@ public: }; SAAspectRatio2 saAspectRatio2; -class SAExposureLevelIncrements: public ChoiceInterpreter +class SAExposureLevelIncrements: public ChoiceInterpreter<> { public: SAExposureLevelIncrements () @@ -1890,7 +1955,7 @@ public: }; SAExposureLevelIncrements saExposureLevelIncrements; -class SAAFIlluminator: public ChoiceInterpreter +class SAAFIlluminator: public ChoiceInterpreter<> { public: SAAFIlluminator () @@ -1902,7 +1967,7 @@ public: }; SAAFIlluminator saAFIlluminator; -class SAColorSpace1_2: public ChoiceInterpreter +class SAColorSpace1_2: public ChoiceInterpreter<> { public: SAColorSpace1_2 () @@ -1913,7 +1978,7 @@ public: }; SAColorSpace1_2 saColorSpace1_2; -class SAColorSpace0_5: public ChoiceInterpreter +class SAColorSpace0_5: public ChoiceInterpreter<> { public: SAColorSpace0_5 () @@ -1925,7 +1990,7 @@ public: }; SAColorSpace0_5 saColorSpace0_5; -class SAColorSpace5_6: public ChoiceInterpreter +class SAColorSpace5_6: public ChoiceInterpreter<> { public: SAColorSpace5_6 () @@ -1936,7 +2001,7 @@ public: }; SAColorSpace5_6 saColorSpace5_6; -class SAReleaseModeInterpreter: public ChoiceInterpreter +class SAReleaseModeInterpreter: public ChoiceInterpreter<> { public: SAReleaseModeInterpreter () @@ -1951,7 +2016,7 @@ public: }; SAReleaseModeInterpreter saReleaseModeInterpreter; -class SAImageStyleInterpreter: public ChoiceInterpreter +class SAImageStyleInterpreter: public ChoiceInterpreter<> { public: SAImageStyleInterpreter () @@ -1975,7 +2040,7 @@ public: }; SAImageStyleInterpreter saImageStyleInterpreter; -class SAPictureEffectInterpreter: public ChoiceInterpreter +class SAPictureEffectInterpreter: public ChoiceInterpreter<> { public: SAPictureEffectInterpreter() @@ -2020,7 +2085,7 @@ public: }; SAPictureEffectInterpreter saPictureEffectInterpreter; -class SACameraInfoFocusStatusInterpreter : public ChoiceInterpreter +class SACameraInfoFocusStatusInterpreter : public ChoiceInterpreter<> { public: SACameraInfoFocusStatusInterpreter() @@ -2038,7 +2103,7 @@ class SAExposureTimeInterpreter : public Interpreter { public: SAExposureTimeInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { double a = t->toDouble(); @@ -2050,7 +2115,7 @@ public: return "n/a"; } } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT TagType astype = t->getType(); @@ -2069,7 +2134,7 @@ public: return 0.; } } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT int a = 0; @@ -2098,7 +2163,7 @@ class SAFNumberInterpreter : public Interpreter { public: SAFNumberInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { double a = double (t->toDouble()); @@ -2110,7 +2175,7 @@ public: return "n/a"; } } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT TagType astype = t->getType(); @@ -2129,7 +2194,7 @@ public: return 0.; } } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT int a = 0; @@ -2158,7 +2223,7 @@ class SAISOSettingInterpreter : public Interpreter { public: SAISOSettingInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->toInt(); @@ -2170,7 +2235,7 @@ public: return "Auto"; } } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { // Get the value; Depending on the camera model, this parameter can be a BYTE or a SHORT int a = 0; @@ -2199,14 +2264,14 @@ class SAExposureCompSetInterpreter : public Interpreter { public: SAExposureCompSetInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { double a = t->toDouble(); char buffer[32]; sprintf (buffer, "%.2f", a ); return buffer; } - virtual double toDouble (const Tag* t, int ofs) + double toDouble (const Tag* t, int ofs) override { // Get the value int a = t->getValue()[ofs]; @@ -2220,13 +2285,13 @@ class SAAFMicroAdjValueInterpreter : public Interpreter { public: SAAFMicroAdjValueInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; sprintf (buffer, "%d", t->getValue()[0] - 20); return buffer; } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { return t->getValue()[0] - 20; } @@ -2237,7 +2302,7 @@ class SAAFMicroAdjModeInterpreter : public Interpreter { public: SAAFMicroAdjModeInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int a = t->getValue()[0] & 0x80; @@ -2247,7 +2312,7 @@ public: return "Off"; } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { return (t->getValue()[0] & 0x80) == 0x80 ? 1 : 0; } @@ -2259,13 +2324,13 @@ class SAAFMicroAdjRegisteredLensesInterpreter : public Interpreter { public: SAAFMicroAdjRegisteredLensesInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; sprintf (buffer, "%d", t->getValue()[0] & 0x7f); return buffer; } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { return t->getValue()[0] & 0x7f; } @@ -2276,7 +2341,7 @@ class SAFocusStatusInterpreter : public Interpreter { public: SAFocusStatusInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { std::string retval; int a = t->toInt(); @@ -2315,13 +2380,13 @@ class SAColorTemperatureSettingInterpreter : public Interpreter { public: SAColorTemperatureSettingInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; sprintf (buffer, "%d", t->toInt()); return buffer; } - virtual int toInt (const Tag* t, int ofs, TagType astype) + int toInt (const Tag* t, int ofs, TagType astype) override { int a = 0; diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index ca19b7f1c..ec5534381 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -28,7 +28,7 @@ namespace rtexif { -class ColorSpaceInterpreter : public ChoiceInterpreter +class ColorSpaceInterpreter : public ChoiceInterpreter<> { public: @@ -41,7 +41,7 @@ public: }; ColorSpaceInterpreter colorSpaceInterpreter; -class PreviewColorSpaceInterpreter : public ChoiceInterpreter +class PreviewColorSpaceInterpreter : public ChoiceInterpreter<> { public: @@ -56,7 +56,7 @@ public: }; PreviewColorSpaceInterpreter previewColorSpaceInterpreter; -class LinearSRGBInterpreter : public ChoiceInterpreter +class LinearSRGBInterpreter : public ChoiceInterpreter<> { public: @@ -68,7 +68,7 @@ public: }; LinearSRGBInterpreter linearSRGBInterpreter; -class DefaultBlackRenderInterpreter : public ChoiceInterpreter +class DefaultBlackRenderInterpreter : public ChoiceInterpreter<> { public: @@ -80,7 +80,7 @@ public: }; DefaultBlackRenderInterpreter defaultBlackRenderInterpreter; -class ExposureProgramInterpreter : public ChoiceInterpreter +class ExposureProgramInterpreter : public ChoiceInterpreter<> { public: @@ -99,7 +99,7 @@ public: }; ExposureProgramInterpreter exposureProgramInterpreter; -class MeteringModeInterpreter : public ChoiceInterpreter +class MeteringModeInterpreter : public ChoiceInterpreter<> { public: @@ -117,7 +117,7 @@ public: }; MeteringModeInterpreter meteringModeInterpreter; -class ExposureModeInterpreter : public ChoiceInterpreter +class ExposureModeInterpreter : public ChoiceInterpreter<> { public: @@ -130,7 +130,7 @@ public: }; ExposureModeInterpreter exposureModeInterpreter; -class WhiteBalanceInterpreter : public ChoiceInterpreter +class WhiteBalanceInterpreter : public ChoiceInterpreter<> { public: @@ -142,7 +142,7 @@ public: }; WhiteBalanceInterpreter whiteBalanceInterpreter; -class SceneCaptureInterpreter : public ChoiceInterpreter +class SceneCaptureInterpreter : public ChoiceInterpreter<> { public: @@ -156,7 +156,7 @@ public: }; SceneCaptureInterpreter sceneCaptureInterpreter; -class GainControlInterpreter : public ChoiceInterpreter +class GainControlInterpreter : public ChoiceInterpreter<> { public: @@ -171,7 +171,7 @@ public: }; GainControlInterpreter gainControlInterpreter; -class ContrastInterpreter : public ChoiceInterpreter +class ContrastInterpreter : public ChoiceInterpreter<> { public: @@ -184,7 +184,7 @@ public: }; ContrastInterpreter contrastInterpreter; -class SharpnessInterpreter : public ChoiceInterpreter +class SharpnessInterpreter : public ChoiceInterpreter<> { public: @@ -197,7 +197,7 @@ public: }; SharpnessInterpreter sharpnessInterpreter; -class SaturationInterpreter : public ChoiceInterpreter +class SaturationInterpreter : public ChoiceInterpreter<> { public: @@ -210,7 +210,7 @@ public: }; SaturationInterpreter saturationInterpreter; -class FlashInterpreter : public ChoiceInterpreter +class FlashInterpreter : public ChoiceInterpreter<> { public: @@ -242,7 +242,7 @@ public: }; FlashInterpreter flashInterpreter; -class LightSourceInterpreter : public ChoiceInterpreter +class LightSourceInterpreter : public ChoiceInterpreter<> { public: @@ -273,7 +273,7 @@ public: }; LightSourceInterpreter lightSourceInterpreter; -class CompressionInterpreter : public ChoiceInterpreter +class CompressionInterpreter : public ChoiceInterpreter<> { public: @@ -285,7 +285,7 @@ public: }; CompressionInterpreter compressionInterpreter; -class PhotometricInterpreter : public ChoiceInterpreter +class PhotometricInterpreter : public ChoiceInterpreter<> { public: @@ -297,7 +297,7 @@ public: }; PhotometricInterpreter photometricInterpreter; -class ProfileEmbedPolicyInterpreter : public ChoiceInterpreter +class ProfileEmbedPolicyInterpreter : public ChoiceInterpreter<> { public: @@ -311,7 +311,7 @@ public: }; ProfileEmbedPolicyInterpreter profileEmbedPolicyInterpreter; -class PlanarConfigInterpreter : public ChoiceInterpreter +class PlanarConfigInterpreter : public ChoiceInterpreter<> { public: @@ -327,7 +327,7 @@ class FNumberInterpreter : public Interpreter { public: FNumberInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double v = t->toDouble(); @@ -346,7 +346,7 @@ class ApertureInterpreter : public Interpreter { public: ApertureInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double v = pow (2.0, t->toDouble() / 2.0); @@ -365,7 +365,7 @@ class ExposureBiasInterpreter : public Interpreter { public: ExposureBiasInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double v = t->toDouble(); @@ -384,7 +384,7 @@ class ShutterSpeedInterpreter : public Interpreter { public: ShutterSpeedInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double d = pow (2.0, -t->toDouble()); @@ -404,7 +404,7 @@ class ExposureTimeInterpreter : public Interpreter { public: ExposureTimeInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double d = t->toDouble(); @@ -424,7 +424,7 @@ class FocalLengthInterpreter : public Interpreter { public: FocalLengthInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char buffer[32]; double v = t->toDouble(); @@ -443,7 +443,7 @@ class UserCommentInterpreter : public Interpreter { public: UserCommentInterpreter () {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int count = t->getCount(); @@ -452,8 +452,8 @@ public: } count = std::min (count, 65535); // limit to 65535 chars to avoid crashes in case of corrupted metadata - char *buffer = new char[count - 6]; // include 2 ending null chars for UCS-2 string (possibly) - char *value = (char*)t->getValue(); + 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(value, "ASCII\0\0\0", 8)) { memcpy(buffer, value + 8, count - 8); @@ -461,14 +461,14 @@ public: } else if (!memcmp(value, "UNICODE\0", 8)) { memcpy(buffer, value + 8, count - 8); buffer[count - 7] = buffer[count - 8] = '\0'; - Glib::ustring tmp1(buffer); + 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 (buffer + 3); + std::string retVal ((char*)buffer + 3); delete [] buffer; return retVal; } else if (count >= 10) { @@ -484,7 +484,7 @@ public: // 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++) { - char cc = value[j]; + unsigned char cc = value[j]; if (!(j%2)) { // counting zeros for first byte if (!cc) { @@ -505,7 +505,7 @@ public: } if (c == (count - 8) && d) { // this is an UTF-8 string - std::string retVal (buffer); + std::string retVal ((char*)buffer); delete [] buffer; return retVal; } @@ -532,21 +532,22 @@ public: glong written; char* utf8Str = g_utf16_to_utf8((unsigned short int*)buffer, -1, nullptr, &written, nullptr); delete [] buffer; - buffer = new char[written + 1]; + buffer = new unsigned char[written + 1]; memcpy(buffer, utf8Str, written); buffer[written] = 0; + g_free(utf8Str); } 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(buffer, count - 8, nullptr, &written, nullptr); + 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 char[length + 1]; - strcpy(buffer, utf8Str); + buffer = new unsigned char[length + 1]; + strcpy((char*)buffer, utf8Str); } else { buffer[0] = 0; } @@ -558,11 +559,11 @@ public: 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) + void fromString (Tag* t, const std::string& value) override { Glib::ustring tmpStr(value); t->userCommentFromString (tmpStr); @@ -574,7 +575,7 @@ class CFAInterpreter : public Interpreter { public: CFAInterpreter() {} - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { char colors[] = "RGB"; char buffer[1024]; @@ -590,7 +591,7 @@ public: }; CFAInterpreter cfaInterpreter; -class OrientationInterpreter : public ChoiceInterpreter +class OrientationInterpreter : public ChoiceInterpreter<> { public: OrientationInterpreter () @@ -609,7 +610,7 @@ public: }; OrientationInterpreter orientationInterpreter; -class UnitsInterpreter : public ChoiceInterpreter +class UnitsInterpreter : public ChoiceInterpreter<> { public: UnitsInterpreter() @@ -631,7 +632,7 @@ UTF8BinInterpreter utf8BinInterpreter; class RawImageSegmentationInterpreter : public Interpreter { public: - virtual std::string toString (Tag* t) + std::string toString (const Tag* t) const override { int segmentNumber = t->toInt(0, SHORT); int segmentWidth = t->toInt(2, SHORT); diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index c1cbe3c1e..28ec3aa52 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -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(CLISOURCEFILES set(NONCLISOURCEFILES adjuster.cc + alignedmalloc.cc batchqueue.cc batchqueuebuttonset.cc batchqueueentry.cc @@ -69,6 +71,7 @@ set(NONCLISOURCEFILES histogrampanel.cc history.cc hsvequalizer.cc + iccprofilecreator.cc icmpanel.cc ilabel.cc imagearea.cc @@ -153,6 +156,8 @@ set(NONCLISOURCEFILES eventmapper.cc metadatapanel.cc labgrid.cc + softlight.cc + dehaze.cc ) include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}") @@ -166,7 +171,7 @@ endif() if(WIN32) set(EXTRA_SRC_CLI myicon.rc) - set(EXTRA_SRC_NONCLI myicon.rc windirmonitor.cc) + set(EXTRA_SRC_NONCLI myicon.rc) set(EXTRA_LIB_RTGUI winmm) include_directories(${EXTRA_INCDIR} ${GIOMM_INCLUDE_DIRS} @@ -222,6 +227,10 @@ else() ) endif() +if(OPENMP_FOUND AND NOT APPLE) + set(EXTRA_LIB_RTGUI ${EXTRA_LIB_RTGUI} "atomic") +endif() + # Create config.h which defines where data are stored configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h") diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index f94075ce4..163bc27ef 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -42,7 +42,6 @@ enum { ADDSET_PREPROCESS_LINEDENOISE, ADDSET_RAWCACORR, ADDSET_RAWEXPOS_LINEAR, - ADDSET_RAWEXPOS_PRESER, ADDSET_RAWEXPOS_BLACKS, ADDSET_SHARPENEDGE_AMOUNT, ADDSET_SHARPENMICRO_AMOUNT, @@ -50,8 +49,6 @@ enum { ADDSET_SHARPENMICRO_UNIFORMITY, ADDSET_VIBRANCE_PASTELS, ADDSET_VIBRANCE_SATURATED, - ADDSET_FREE_OUPUT_GAMMA, - ADDSET_FREE_OUTPUT_SLOPE, ADDSET_CAT_DEGREE, ADDSET_CAT_ADAPTSCENE, ADDSET_CAT_ADAPTVIEWING, @@ -127,12 +124,24 @@ enum { ADDSET_EPD_EDGESTOPPING, ADDSET_EPD_SCALE, ADDSET_EPD_REWEIGHTINGITERATES, - ADDSET_FATTAL_ALPHA, - ADDSET_FATTAL_BETA, + ADDSET_FATTAL_THRESHOLD, + ADDSET_FATTAL_AMOUNT, ADDSET_LOCALCONTRAST_RADIUS, ADDSET_LOCALCONTRAST_AMOUNT, ADDSET_LOCALCONTRAST_DARKNESS, ADDSET_LOCALCONTRAST_LIGHTNESS, + ADDSET_FATTAL_ANCHOR, + ADDSET_SHARPENMICRO_CONTRAST, + ADDSET_SHARP_CONTRAST, + ADDSET_BAYER_FALSE_COLOR_SUPPRESSION, + ADDSET_BAYER_ITER, + ADDSET_BAYER_PS_SMOOTH, + ADDSET_BAYER_PS_EPERISO, + ADDSET_BAYER_PS_SIGMA, + ADDSET_BAYER_DUALDEMOZCONTRAST, + ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, + ADDSET_SOFTLIGHT_STRENGTH, + ADDSET_DEHAZE_STRENGTH, ADDSET_PARAM_NUM // THIS IS USED AS A DELIMITER!! }; diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index a4f57499d..46aa3952b 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -46,6 +46,10 @@ Adjuster::Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep grid = NULL; imageIcon1 = imgIcon1; + logBase = 0; + logPivot = 0; + logAnchorMiddle = false; + if (imageIcon1) { setExpandAlignProperties(imageIcon1, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); } @@ -79,10 +83,10 @@ Adjuster::Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep } reset = Gtk::manage (new Gtk::Button ()); - reset->add (*Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png"))); + reset->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); setExpandAlignProperties(reset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); reset->set_relief (Gtk::RELIEF_NONE); - reset->set_tooltip_text (M("ADJUSTER_RESET_TO_DEFAULT")); + reset->set_tooltip_markup (M("ADJUSTER_RESET_TO_DEFAULT")); reset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); reset->set_can_focus(false); @@ -166,7 +170,7 @@ void Adjuster::addAutoButton (Glib::ustring tooltip) { if (!automatic) { automatic = new Gtk::CheckButton (); - //automatic->add (*Gtk::manage (new RTImage ("processing.png"))); + //automatic->add (*Gtk::manage (new RTImage ("gears.png"))); automatic->set_tooltip_markup(tooltip.length() ? Glib::ustring::compose("%1\n\n%2", M("GENERAL_AUTO"), tooltip) : M("GENERAL_AUTO")); setExpandAlignProperties(automatic, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); autoChange = automatic->signal_toggled().connect( sigc::mem_fun(*this, &Adjuster::autoToggled) ); @@ -235,10 +239,12 @@ void Adjuster::autoToggled () // Disable the slider and spin button spin->set_sensitive(false); slider->set_sensitive(false); + reset->set_sensitive(false); } else { // Enable the slider and spin button spin->set_sensitive(true); slider->set_sensitive(true); + reset->set_sensitive(true); } } @@ -289,13 +295,13 @@ void Adjuster::resetValue (bool toInitial) if (toInitial) { // resetting to the initial editing value, when the image has been loaded - slider->set_value (addMode ? defaultVal : value2slider(defaultVal)); + setSliderValue(addMode ? defaultVal : value2slider(defaultVal)); } else { // resetting to the slider default value if (addMode) { - slider->set_value (0.); + setSliderValue(0.); } else { - slider->set_value (value2slider(ctorDefaultVal)); + setSliderValue(value2slider(ctorDefaultVal)); } } } @@ -313,8 +319,8 @@ void Adjuster::resetPressed (GdkEventButton* event) double Adjuster::shapeValue (double a) { - - return round(a * pow(double(10), digits)) / pow(double(10), digits); + double val = round(a * pow(double(10), digits)) / pow(double(10), digits); + return val == -0.0 ? 0.0 : val; } void Adjuster::setLimits (double vmin, double vmax, double vstep, double vdefault) @@ -333,7 +339,7 @@ void Adjuster::setLimits (double vmin, double vmax, double vstep, double vdefaul slider->set_digits (digits); slider->set_increments (vstep, 2.0 * vstep); slider->set_range (addMode ? vmin : value2slider(vmin), addMode ? vmax : value2slider(vmax)); - slider->set_value (addMode ? shapeValue(vdefault) : value2slider(shapeValue(vdefault))); + setSliderValue(addMode ? shapeValue(vdefault) : value2slider(shapeValue(vdefault))); //defaultVal = shapeValue (vdefault); sliderChange.block (false); spinChange.block (false); @@ -369,7 +375,7 @@ void Adjuster::spinChanged () } sliderChange.block (true); - slider->set_value (addMode ? spin->get_value () : value2slider(spin->get_value ())); + setSliderValue(addMode ? spin->get_value () : value2slider(spin->get_value ())); sliderChange.block (false); if (delay == 0) { @@ -409,7 +415,8 @@ void Adjuster::sliderChanged () } spinChange.block (true); - spin->set_value (addMode ? slider->get_value () : slider2value(slider->get_value ())); + double v = shapeValue(getSliderValue()); + spin->set_value (addMode ? v : slider2value(v)); spinChange.block (false); if (delay == 0 || afterReset) { @@ -447,7 +454,7 @@ void Adjuster::setValue (double a) spinChange.block (true); sliderChange.block (true); spin->set_value (shapeValue (a)); - slider->set_value (addMode ? shapeValue(a) : value2slider(shapeValue (a))); + setSliderValue(addMode ? shapeValue(a) : value2slider(shapeValue (a))); sliderChange.block (false); spinChange.block (false); afterReset = false; @@ -466,10 +473,12 @@ void Adjuster::setAutoValue (bool a) // Disable the slider and spin button spin->set_sensitive(false); slider->set_sensitive(false); + reset->set_sensitive(false); } else { // Enable the slider and spin button spin->set_sensitive(true); slider->set_sensitive(true); + reset->set_sensitive(true); } } } @@ -608,3 +617,81 @@ void Adjuster::trimValue (float &val) val = rtengine::LIM(val, static_cast(vMin), static_cast(vMax)); } + + +inline double Adjuster::getSliderValue() +{ + double val = slider->get_value(); + if (logBase) { + if (logAnchorMiddle) { + double mid = (vMax - vMin) / 2; + double mmid = vMin + mid; + if (val >= mmid) { + double range = vMax - mmid; + double x = (val - mmid) / range; + val = logPivot + (pow(logBase, x) - 1.0) / (logBase - 1.0) * (vMax - logPivot); + } else { + double range = mmid - vMin; + double x = (mmid - val) / range; + val = logPivot - (pow(logBase, x) - 1.0) / (logBase - 1.0) * (logPivot - vMin); + } + } else { + if (val >= logPivot) { + double range = vMax - logPivot; + double x = (val - logPivot) / range; + val = logPivot + (pow(logBase, x) - 1.0) / (logBase - 1.0) * range; + } else { + double range = logPivot - vMin; + double x = (logPivot - val) / range; + val = logPivot - (pow(logBase, x) - 1.0) / (logBase - 1.0) * range; + } + } + } + return val; +} + + +inline void Adjuster::setSliderValue(double val) +{ + if (logBase) { + if (logAnchorMiddle) { + double mid = (vMax - vMin) / 2; + if (val >= logPivot) { + double range = vMax - logPivot; + double x = (val - logPivot) / range; + val = (vMin + mid) + log(x * (logBase - 1.0) + 1.0) / log(logBase) * mid; + } else { + double range = logPivot - vMin; + double x = (logPivot - val) / range; + val = (vMin + mid) - log(x * (logBase - 1.0) + 1.0) / log(logBase) * mid; + } + } else { + if (val >= logPivot) { + double range = vMax - logPivot; + double x = (val - logPivot) / range; + val = logPivot + log(x * (logBase - 1.0) + 1.0) / log(logBase) * range; + } else { + double range = logPivot - vMin; + double x = (logPivot - val) / range; + val = logPivot - log(x * (logBase - 1.0) + 1.0) / log(logBase) * range; + } + } + } + slider->set_value(val); +} + + +void Adjuster::setLogScale(double base, double pivot, bool anchorMiddle) +{ + spinChange.block (true); + sliderChange.block (true); + + double cur = getSliderValue(); + logBase = base; + logPivot = pivot; + logAnchorMiddle = anchorMiddle; + setSliderValue(cur); + + sliderChange.block (false); + spinChange.block (false); +} diff --git a/rtgui/adjuster.h b/rtgui/adjuster.h index 768406a33..169bd7d12 100644 --- a/rtgui/adjuster.h +++ b/rtgui/adjuster.h @@ -24,13 +24,13 @@ #include "guiutils.h" class Adjuster; + class AdjusterListener { - public: - virtual ~AdjusterListener() {}; - virtual void adjusterChanged (Adjuster* a, double newval) {} - virtual void adjusterAutoToggled (Adjuster* a, bool newval) {} + virtual ~AdjusterListener() = default; + virtual void adjusterChanged (Adjuster* a, double newval) = 0; + virtual void adjusterAutoToggled (Adjuster* a, bool newval) = 0; }; typedef double(*double2double_fun)(double val); @@ -71,16 +71,23 @@ protected: double vMax; double vStep; + double logBase; + double logPivot; + bool logAnchorMiddle; + double shapeValue (double a); void refreshLabelStyle (); double2double_fun value2slider, slider2value; + double getSliderValue(); + void setSliderValue(double val); + public: int delay; Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep, double vdefault, Gtk::Image *imgIcon1 = nullptr, Gtk::Image *imgIcon2 = nullptr, double2double_fun slider2value = nullptr, double2double_fun value2slider = nullptr); - virtual ~Adjuster (); + ~Adjuster () override; // Add an "Automatic" checkbox next to the reset button. void addAutoButton(Glib::ustring tooltip = ""); @@ -173,6 +180,8 @@ public: void trimValue (double &val); void trimValue (float &val); void trimValue (int &val); + + void setLogScale(double base, double pivot, bool anchorMiddle=false); }; #endif diff --git a/rtgui/alignedmalloc.cc b/rtgui/alignedmalloc.cc new file mode 100644 index 000000000..91fe15a85 --- /dev/null +++ b/rtgui/alignedmalloc.cc @@ -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 --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc index 2f3505a08..9792522c7 100644 --- a/rtgui/batchqueue.cc +++ b/rtgui/batchqueue.cc @@ -21,6 +21,7 @@ #include #include #include "../rtengine/rt_math.h" +#include "../rtengine/procparams.h" #include #include @@ -53,16 +54,16 @@ BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCa pmenu.attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p + 1); p++; - pmenu.attach (*Gtk::manage(head = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEHEAD"), "toleftend.png")), 0, 1, p, p + 1); + pmenu.attach (*Gtk::manage(head = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEHEAD"), "goto-start-small.png")), 0, 1, p, p + 1); p++; - pmenu.attach (*Gtk::manage(tail = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEEND"), "torightend.png")), 0, 1, p, p + 1); + pmenu.attach (*Gtk::manage(tail = new MyImageMenuItem (M("FILEBROWSER_POPUPMOVEEND"), "goto-end-small.png")), 0, 1, p, p + 1); p++; pmenu.attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p + 1); p++; - pmenu.attach (*Gtk::manage(cancel = new MyImageMenuItem (M("FILEBROWSER_POPUPCANCELJOB"), "gtk-close.png")), 0, 1, p, p + 1); + pmenu.attach (*Gtk::manage(cancel = new MyImageMenuItem (M("FILEBROWSER_POPUPCANCELJOB"), "cancel-small.png")), 0, 1, p, p + 1); pmenu.show_all (); @@ -86,6 +87,17 @@ BatchQueue::BatchQueue (FileCatalog* aFileCatalog) : processing(nullptr), fileCa BatchQueue::~BatchQueue () { + std::set removable_bqes; + + mutex_removable_batch_queue_entries.lock(); + removable_batch_queue_entries.swap(removable_bqes); + mutex_removable_batch_queue_entries.unlock(); + + for (const auto entry : removable_bqes) { + ::g_remove(entry->savedParamsFile.c_str()); + delete entry; + } + idle_register.destroy(); MYWRITERLOCK(l, entryRW); @@ -186,7 +198,7 @@ void BatchQueue::addEntries (const std::vector& entries, bool // recovery save const auto tempFile = getTempFilenameForParams (entry->filename); - if (!entry->params.save (tempFile)) + if (!entry->params->save (tempFile)) entry->savedParamsFile = tempFile; entry->selected = false; @@ -208,7 +220,7 @@ void BatchQueue::addEntries (const std::vector& entries, bool saveBatchQueue (); redraw (); - notifyListener (false); + notifyListener (); } bool BatchQueue::saveBatchQueue () @@ -228,7 +240,7 @@ bool BatchQueue::saveBatchQueue () // The column's header is mandatory (the first line will be skipped when loaded) file << "input image full path|param file full path|output image full path|file format|jpeg quality|jpeg subsampling|" - << "png bit depth|png compression|tiff bit depth|uncompressed tiff|save output params|force format options|fast export|" + << "png bit depth|png compression|tiff bit depth|tiff is float|uncompressed tiff|save output params|force format options|fast export|" << std::endl; // method is already running with entryLock, so no need to lock again @@ -246,7 +258,7 @@ bool BatchQueue::saveBatchQueue () #endif << saveFormat.jpegQuality << '|' << saveFormat.jpegSubSamp << '|' << saveFormat.pngBits << '|' - << saveFormat.tiffBits << '|' << saveFormat.tiffUncompressed << '|' + << saveFormat.tiffBits << '|' << (saveFormat.tiffFloat ? 1 : 0) << '|' << saveFormat.tiffUncompressed << '|' << saveFormat.saveParams << '|' << entry->forceFormatOpts << '|' << entry->fast_pipeline << '|' << std::endl; @@ -311,6 +323,7 @@ bool BatchQueue::loadBatchQueue () const auto jpegSubSamp = nextIntOr (options.saveFormat.jpegSubSamp); const auto pngBits = nextIntOr (options.saveFormat.pngBits); const auto tiffBits = nextIntOr (options.saveFormat.tiffBits); + const auto tiffFloat = nextIntOr (options.saveFormat.tiffFloat); const auto tiffUncompressed = nextIntOr (options.saveFormat.tiffUncompressed); const auto saveParams = nextIntOr (options.saveFormat.saveParams); const auto forceFormatOpts = nextIntOr (options.forceFormatOpts); @@ -352,6 +365,7 @@ bool BatchQueue::loadBatchQueue () saveFormat.jpegSubSamp = jpegSubSamp; saveFormat.pngBits = pngBits; saveFormat.tiffBits = tiffBits; + saveFormat.tiffFloat = tiffFloat == 1; saveFormat.tiffUncompressed = tiffUncompressed != 0; saveFormat.saveParams = saveParams != 0; entry->forceFormatOpts = forceFormatOpts != 0; @@ -364,7 +378,7 @@ bool BatchQueue::loadBatchQueue () } redraw (); - notifyListener (false); + notifyListener (); return !fd.empty (); } @@ -393,6 +407,8 @@ Glib::ustring BatchQueue::getTempFilenameForParams( const Glib::ustring &filenam void BatchQueue::cancelItems (const std::vector& items) { + std::set removable_bqes; + { MYWRITERLOCK(l, entryRW); @@ -415,16 +431,7 @@ void BatchQueue::cancelItems (const std::vector& items) if (entry->thumbnail) entry->thumbnail->imageRemovedFromQueue (); - const auto func = [](gpointer data) -> gboolean { - const BatchQueueEntry* const bqe = static_cast(data); - - ::g_remove(bqe->savedParamsFile.c_str()); - delete bqe; - - return FALSE; - }; - - idle_register.add(func, entry); + removable_bqes.insert(entry); } for (const auto entry : fd) @@ -434,10 +441,34 @@ void BatchQueue::cancelItems (const std::vector& items) selected.clear (); } + if (!removable_bqes.empty()) { + mutex_removable_batch_queue_entries.lock(); + removable_batch_queue_entries.insert(removable_bqes.begin(), removable_bqes.end()); + mutex_removable_batch_queue_entries.unlock(); + + idle_register.add( + [this]() -> bool + { + std::set removable_bqes; + + mutex_removable_batch_queue_entries.lock(); + removable_batch_queue_entries.swap(removable_bqes); + mutex_removable_batch_queue_entries.unlock(); + + for (const auto entry : removable_bqes) { + ::g_remove(entry->savedParamsFile.c_str()); + delete entry; + } + + return false; + } + ); + } + saveBatchQueue (); redraw (); - notifyListener (false); + notifyListener (); } void BatchQueue::headItems (const std::vector& items) @@ -574,13 +605,64 @@ void BatchQueue::startProcessing () // start batch processing rtengine::startBatchProcessing (next->job, this); queue_draw (); + + notifyListener(); } } } -rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) +void BatchQueue::setProgress(double p) { + if (processing) { + processing->progress = p; + } + // No need to acquire the GUI, setProgressUI will do it + idle_register.add( + [this]() -> bool + { + redraw(); + return false; + } + ); +} + +void BatchQueue::setProgressStr(const Glib::ustring& str) +{ +} + +void BatchQueue::setProgressState(bool inProcessing) +{ +} + +void BatchQueue::error(const Glib::ustring& descr) +{ + if (processing && processing->processing) { + // restore failed thumb + BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (processing); + bqbs->setButtonListener (this); + processing->addButtonSet (bqbs); + processing->processing = false; + processing->job = rtengine::ProcessingJob::create(processing->filename, processing->thumbnail->getType() == FT_Raw, *processing->params); + processing = nullptr; + redraw (); + } + + if (listener) { + BatchQueueListener* const bql = listener; + + idle_register.add( + [bql, descr]() -> bool + { + bql->queueSizeChanged(0, false, true, descr); + return false; + } + ); + } +} + +rtengine::ProcessingJob* BatchQueue::imageReady(rtengine::IImagefloat* img) +{ // save image img Glib::ustring fname; SaveFormat saveFormat; @@ -608,7 +690,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) int err = 0; if (saveFormat.format == "tif") { - err = img->saveAsTIFF (fname, saveFormat.tiffBits, saveFormat.tiffUncompressed); + err = img->saveAsTIFF (fname, saveFormat.tiffBits, saveFormat.tiffFloat, saveFormat.tiffUncompressed); } else if (saveFormat.format == "png") { err = img->saveAsPNG (fname, saveFormat.pngBits); } else if (saveFormat.format == "jpg") { @@ -625,7 +707,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) // We keep the extension to avoid overwriting the profile when we have // the same output filename with different extension //processing->params.save (removeExtension(fname) + paramFileExtension); - processing->params.save (fname + ".out" + paramFileExtension); + processing->params->save (fname + ".out" + paramFileExtension); } if (processing->thumbnail) { @@ -638,7 +720,6 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) Glib::ustring processedParams = processing->savedParamsFile; // delete from the queue - bool queueEmptied = false; bool remove_button_set = false; { @@ -650,9 +731,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) fd.erase (fd.begin()); // return next job - if (fd.empty()) { - queueEmptied = true; - } else if (listener && listener->canStartNext ()) { + if (!fd.empty() && listener && listener->canStartNext ()) { BatchQueueEntry* next = static_cast(fd[0]); // tag it as selected and set sequence next->processing = true; @@ -710,7 +789,7 @@ rtengine::ProcessingJob* BatchQueue::imageReady (rtengine::IImagefloat* img) } redraw (); - notifyListener (queueEmptied); + notifyListener (); return processing ? processing->job : nullptr; } @@ -890,27 +969,9 @@ Glib::ustring BatchQueue::autoCompleteFileName (const Glib::ustring& fileName, c return ""; } -void BatchQueue::setProgress (double p) -{ - - if (processing) { - processing->progress = p; - } - - // No need to acquire the GUI, setProgressUI will do it - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->redraw(); - return FALSE; - }; - - idle_register.add(func, this); -} - void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionData) { - - std::vector bqe; - bqe.push_back (static_cast(actionData)); + const std::vector bqe = {static_cast(actionData)}; if (actionCode == 10) { // cancel cancelItems (bqe); @@ -921,35 +982,25 @@ void BatchQueue::buttonPressed (LWButton* button, int actionCode, void* actionDa } } -struct NLParams { - BatchQueueListener* listener; - int qsize; - bool queueEmptied; - bool queueError; - Glib::ustring queueErrorMessage; -}; - -int bqnotifylistenerUI (void* data) +void BatchQueue::notifyListener () { - NLParams* params = static_cast(data); - params->listener->queueSizeChanged (params->qsize, params->queueEmptied, params->queueError, params->queueErrorMessage); - delete params; - return 0; -} - -void BatchQueue::notifyListener (bool queueEmptied) -{ - + const bool queueRunning = processing; if (listener) { - NLParams* params = new NLParams; - params->listener = listener; + BatchQueueListener* const bql = listener; + + int qsize = 0; { MYREADERLOCK(l, entryRW); - params->qsize = fd.size(); + qsize = fd.size(); } - params->queueEmptied = queueEmptied; - params->queueError = false; - idle_register.add(bqnotifylistenerUI, params); + + idle_register.add( + [bql, qsize, queueRunning]() -> bool + { + bql->queueSizeChanged(qsize, queueRunning, false, {}); + return false; + } + ); } } @@ -958,27 +1009,3 @@ void BatchQueue::redrawNeeded (LWButton* button) GThreadLock lock; queue_draw (); } - -void BatchQueue::error (Glib::ustring msg) -{ - - if (processing && processing->processing) { - // restore failed thumb - BatchQueueButtonSet* bqbs = new BatchQueueButtonSet (processing); - bqbs->setButtonListener (this); - processing->addButtonSet (bqbs); - processing->processing = false; - processing->job = rtengine::ProcessingJob::create(processing->filename, processing->thumbnail->getType() == FT_Raw, processing->params); - processing = nullptr; - redraw (); - } - - if (listener) { - NLParams* params = new NLParams; - params->listener = listener; - params->queueEmptied = false; - params->queueError = true; - params->queueErrorMessage = msg; - idle_register.add(bqnotifylistenerUI, params); - } -} diff --git a/rtgui/batchqueue.h b/rtgui/batchqueue.h index 0d91542b6..95d92aef2 100644 --- a/rtgui/batchqueue.h +++ b/rtgui/batchqueue.h @@ -18,21 +18,25 @@ #ifndef _BATCHQUEUE_ #define _BATCHQUEUE_ +#include + #include -#include "threadutils.h" -#include "batchqueueentry.h" + #include "../rtengine/rtengine.h" -#include "options.h" + +#include "batchqueueentry.h" #include "lwbuttonset.h" +#include "options.h" +#include "threadutils.h" #include "thumbbrowserbase.h" class BatchQueueListener { public: - virtual ~BatchQueueListener () {} - virtual void queueSizeChanged (int qsize, bool queueEmptied, bool queueError, Glib::ustring queueErrorMessage) = 0; - virtual bool canStartNext () = 0; + virtual ~BatchQueueListener() = default; + virtual void queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) = 0; + virtual bool canStartNext() = 0; }; class FileCatalog; @@ -44,7 +48,7 @@ class BatchQueue final : { public: explicit BatchQueue (FileCatalog* aFileCatalog); - ~BatchQueue (); + ~BatchQueue () override; void addEntries (const std::vector& entries, bool head = false, bool save = true); void cancelItems (const std::vector& items); @@ -62,14 +66,17 @@ public: return (!fd.empty()); } - rtengine::ProcessingJob* imageReady (rtengine::IImagefloat* img); - void error (Glib::ustring msg); - void setProgress (double p); - void rightClicked (ThumbBrowserEntryBase* entry); - void doubleClicked (ThumbBrowserEntryBase* entry); - bool keyPressed (GdkEventKey* event); - void buttonPressed (LWButton* button, int actionCode, void* actionData); - void redrawNeeded (LWButton* button); + void setProgress(double p) override; + void setProgressStr(const Glib::ustring& str) override; + void setProgressState(bool inProcessing) override; + void error(const Glib::ustring& descr) override; + rtengine::ProcessingJob* imageReady(rtengine::IImagefloat* img) override; + + void rightClicked (ThumbBrowserEntryBase* entry) override; + void doubleClicked (ThumbBrowserEntryBase* entry) override; + bool keyPressed (GdkEventKey* event) override; + void buttonPressed (LWButton* button, int actionCode, void* actionData) override; + void redrawNeeded (LWButton* button) override; void setBatchQueueListener (BatchQueueListener* l) { @@ -82,15 +89,17 @@ public: static Glib::ustring calcAutoFileNameBase (const Glib::ustring& origFileName, int sequence = 0); static int calcMaxThumbnailHeight(); -protected: - int getMaxThumbnailHeight() const; - void saveThumbnailHeight (int height); - int getThumbnailHeight (); +private: + int getMaxThumbnailHeight() const override; + void saveThumbnailHeight (int height) override; + int getThumbnailHeight () override; Glib::ustring autoCompleteFileName (const Glib::ustring& fileName, const Glib::ustring& format); Glib::ustring getTempFilenameForParams( const Glib::ustring &filename ); bool saveBatchQueue (); - void notifyListener (bool queueEmptied); + void notifyListener (); + + using ThumbBrowserBase::redrawNeeded; BatchQueueEntry* processing; // holds the currently processed image FileCatalog* fileCatalog; @@ -108,6 +117,9 @@ protected: BatchQueueListener* listener; + std::set removable_batch_queue_entries; + MyMutex mutex_removable_batch_queue_entries; + IdleRegister idle_register; }; diff --git a/rtgui/batchqueuebuttonset.cc b/rtgui/batchqueuebuttonset.cc index fefcdf3c9..19c309791 100644 --- a/rtgui/batchqueuebuttonset.cc +++ b/rtgui/batchqueuebuttonset.cc @@ -31,9 +31,9 @@ BatchQueueButtonSet::BatchQueueButtonSet (BatchQueueEntry* myEntry) { if (!iconsLoaded) { - cancelIcon = RTImage::createFromPng ("gtk-close.png"); - headIcon = RTImage::createFromPng ("toleftend.png"); - tailIcon = RTImage::createFromPng ("torightend.png"); + cancelIcon = RTImage::createFromPng ("cancel-small.png"); + headIcon = RTImage::createFromPng ("goto-start-small.png"); + tailIcon = RTImage::createFromPng ("goto-end-small.png"); iconsLoaded = true; } diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index 3092d6db4..0ce71b043 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -26,6 +26,8 @@ #include "multilangmgr.h" #include "thumbbrowserbase.h" +#include "../rtengine/procparams.h" + bool BatchQueueEntry::iconsLoaded(false); Glib::RefPtr BatchQueueEntry::savedAsIcon; @@ -36,7 +38,7 @@ BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine: origph(prevh), opreviewDone(false), job(pjob), - params(pparams), + params(new rtengine::procparams::ProcParams(pparams)), progress(0), outFileName(""), sequence(0), @@ -55,7 +57,7 @@ BatchQueueEntry::BatchQueueEntry (rtengine::ProcessingJob* pjob, const rtengine: #endif if (!iconsLoaded) { - savedAsIcon = RTImage::createFromFile ("gtk-save.png"); + savedAsIcon = RTImage::createFromFile ("save-small.png"); iconsLoaded = true; } @@ -93,7 +95,7 @@ void BatchQueueEntry::refreshThumbnailImage () // creating the image buffer first //if (!opreview) opreview = new guint8[(origpw+1) * origph * 3]; // this will asynchronously compute the original preview and land at this.updateImage - batchQueueEntryUpdater.process (nullptr, origpw, origph, preh, this, ¶ms, thumbnail); + batchQueueEntryUpdater.process (nullptr, origpw, origph, preh, this, params.get(), thumbnail); } else { // this will asynchronously land at this.updateImage batchQueueEntryUpdater.process (opreview, origpw, origph, preh, this); @@ -175,9 +177,10 @@ Glib::ustring BatchQueueEntry::getToolTip (int x, int y) tooltip += Glib::ustring::compose("\n\n%1: %2", M("BATCHQUEUE_DESTFILENAME"), outFileName); if (forceFormatOpts) { - tooltip += Glib::ustring::compose("\n\n%1: %2 (%3 bits)", M("SAVEDLG_FILEFORMAT"), saveFormat.format, + tooltip += Glib::ustring::compose("\n\n%1: %2 (%3-bits%4)", M("SAVEDLG_FILEFORMAT"), saveFormat.format, saveFormat.format == "png" ? saveFormat.pngBits : - saveFormat.format == "tif" ? saveFormat.tiffBits : 8); + saveFormat.format == "tif" ? saveFormat.tiffBits : 8, + saveFormat.format == "tif" && saveFormat.tiffFloat ? M("SAVEDLG_FILEFORMAT_FLOAT") : ""); if (saveFormat.format == "jpg") { tooltip += Glib::ustring::compose("\n%1: %2\n%3: %4", diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index caf1b8eff..6aecff945 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -19,6 +19,8 @@ #ifndef _BATCHQUEUEENTRY_ #define _BATCHQUEUEENTRY_ +#include + #include #include "../rtengine/rtengine.h" #include "thumbbrowserentrybase.h" @@ -46,7 +48,7 @@ public: static Glib::RefPtr savedAsIcon; rtengine::ProcessingJob* job; - rtengine::procparams::ProcParams params; + const std::unique_ptr params; Glib::ustring savedParamsFile; double progress; Glib::ustring outFileName; @@ -56,21 +58,21 @@ public: bool fast_pipeline; BatchQueueEntry (rtengine::ProcessingJob* job, const rtengine::procparams::ProcParams& pparams, Glib::ustring fname, int prevw, int prevh, Thumbnail* thm = nullptr); - ~BatchQueueEntry (); + ~BatchQueueEntry () override; - void refreshThumbnailImage (); - void calcThumbnailSize (); + void refreshThumbnailImage () override; + void calcThumbnailSize () override; - void drawProgressBar (Glib::RefPtr win, const Gdk::RGBA& foregr, const Gdk::RGBA& backgr, int x, int w, int y, int h); + void drawProgressBar (Glib::RefPtr win, const Gdk::RGBA& foregr, const Gdk::RGBA& backgr, int x, int w, int y, int h) override; void removeButtonSet (); - virtual std::vector > getIconsOnImageArea (); - virtual void getIconSize (int& w, int& h); - virtual Glib::ustring getToolTip (int x, int y); + std::vector > getIconsOnImageArea () override; + void getIconSize (int& w, int& h) override; + Glib::ustring getToolTip (int x, int y) override; // bqentryupdatelistener interface - void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview); + void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) override; void _updateImage (guint8* img, int w, int h); // inside gtk thread }; diff --git a/rtgui/batchqueuepanel.cc b/rtgui/batchqueuepanel.cc index ba07f6f4d..55aea5f4f 100644 --- a/rtgui/batchqueuepanel.cc +++ b/rtgui/batchqueuepanel.cc @@ -57,6 +57,8 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) qAutoStart->set_tooltip_text (M("BATCHQUEUE_AUTOSTARTHINT")); qAutoStart->set_active (options.procQueueEnabled); + queueShouldRun = false; + 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"))); @@ -87,7 +89,7 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) outdirFolderButton->signal_pressed().connect( sigc::mem_fun(*this, &BatchQueuePanel::pathFolderButtonPressed) ); outdirFolderButton->set_tooltip_markup (M("PREFERENCES_OUTDIRFOLDERHINT")); outdirFolderButton->set_label(makeFolderLabel(options.savePathFolder)); - Gtk::Image* folderImg = Gtk::manage (new RTImage ("gtk-directory.png")); + Gtk::Image* folderImg = Gtk::manage (new RTImage ("folder-closed.png")); folderImg->show (); outdirFolderButton->set_image (*folderImg); outdirFolder = nullptr; @@ -151,13 +153,13 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) zoomLabel->set_use_markup (true); zoomBox->pack_start (*zoomLabel, Gtk::PACK_SHRINK, 4); zoomInButton = Gtk::manage (new Gtk::Button ()); - zoomInButton->set_image (*Gtk::manage (new RTImage ("gtk-zoom-in.png"))); + zoomInButton->set_image (*Gtk::manage (new RTImage ("magnifier-plus.png"))); zoomInButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomIn)); zoomInButton->set_relief (Gtk::RELIEF_NONE); zoomInButton->set_tooltip_markup (M("FILEBROWSER_ZOOMINHINT")); zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); zoomOutButton = Gtk::manage (new Gtk::Button ()); - zoomOutButton->set_image (*Gtk::manage (new RTImage ("gtk-zoom-out.png"))); + zoomOutButton->set_image (*Gtk::manage (new RTImage ("magnifier-minus.png"))); zoomOutButton->signal_pressed().connect (sigc::mem_fun(*batchQueue, &BatchQueue::zoomOut)); zoomOutButton->set_relief (Gtk::RELIEF_NONE); zoomOutButton->set_tooltip_markup (M("FILEBROWSER_ZOOMOUTHINT")); @@ -170,13 +172,14 @@ BatchQueuePanel::BatchQueuePanel (FileCatalog* aFileCatalog) : parent(nullptr) show_all (); if (batchQueue->loadBatchQueue()) { - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->resizeLoadedQueue(); - - return FALSE; - }; - - idle_register.add(func, batchQueue, G_PRIORITY_LOW); + idle_register.add( + [this]() -> bool + { + batchQueue->resizeLoadedQueue(); + return false; + }, + G_PRIORITY_LOW + ); } } @@ -192,7 +195,7 @@ void BatchQueuePanel::init (RTWindow *parent) 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()); @@ -206,13 +209,13 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) Gtk::Label* l; if(!qsize ) { - grid->attach_next_to(*Gtk::manage (new RTImage ("processing.png")), Gtk::POS_TOP, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears.png")), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_BATCHQUEUE")) ); } else if (qStartStop->get_active()) { - grid->attach_next_to(*Gtk::manage (new RTImage ("processing-play.png")), Gtk::POS_TOP, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears-play.png")), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_BATCHQUEUE") + " [" + Glib::ustring::format( qsize ) + "]")); } else { - grid->attach_next_to(*Gtk::manage (new RTImage ("processing-pause.png")), Gtk::POS_TOP, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears-pause.png")), Gtk::POS_TOP, 1, 1); l = Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("MAIN_FRAME_BATCHQUEUE") + " [" + Glib::ustring::format( qsize ) + "]" )); } @@ -226,13 +229,13 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) } } else { if (!qsize ) { - grid->attach_next_to(*Gtk::manage (new RTImage ("processing.png")), Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears.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 (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 RTImage ("gears-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 { - grid->attach_next_to(*Gtk::manage (new RTImage ("processing-pause.png")), Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("gears-pause.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); } @@ -245,20 +248,13 @@ void BatchQueuePanel::updateTab (int qsize, int forceOrientation) } } -void BatchQueuePanel::queueSizeChanged (int qsize, bool queueEmptied, bool queueError, Glib::ustring queueErrorMessage) +void BatchQueuePanel::queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) { - updateTab ( qsize); + setGuiFromBatchState(queueRunning, 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); - fformat->set_sensitive (true); + if (!queueRunning && qsize == 0 && queueShouldRun) { + // There was work, but it is all done now. + queueShouldRun = false; SoundManager::playSoundAsync(options.sndBatchQueueDone); } @@ -271,8 +267,7 @@ void BatchQueuePanel::queueSizeChanged (int qsize, bool queueEmptied, bool queue void BatchQueuePanel::startOrStopBatchProc() { - bool state = qStartStop->get_state(); - if (state) { + if (qStartStop->get_state()) { startBatchProc(); } else { stopBatchProc(); @@ -281,58 +276,54 @@ void BatchQueuePanel::startOrStopBatchProc() 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); - } + // Update the *desired* state of the queue, then launch it. The switch + // state is not updated here; it is changed by the queueSizeChanged() + // callback in response to the *reported* state. + queueShouldRun = true; + saveOptions(); batchQueue->startProcessing (); - } else { - stopBatchProc (); } - - updateTab (batchQueue->getEntries().size()); } void BatchQueuePanel::stopBatchProc () { - // Update switch when queue started programmatically - qStartStopConn.block (true); - qStartStop->set_active(false); - qStartStopConn.block (false); - - updateTab (batchQueue->getEntries().size()); + // There is nothing much to do here except set the desired state, which the + // background queue thread must check. It will notify queueSizeChanged() + // when it stops. + queueShouldRun = false; } -void BatchQueuePanel::addBatchQueueJobs ( std::vector &entries, bool head) +void BatchQueuePanel::setGuiFromBatchState(bool queueRunning, int qsize) { + // Change the GUI state in response to the reported queue state + if (qsize == 0 || (qsize == 1 && queueRunning)) { + qStartStop->set_sensitive(false); + } else { + qStartStop->set_sensitive(true); + } - batchQueue->addEntries (entries, head); + qStartStopConn.block(true); + qStartStop->set_active(queueRunning); + qStartStopConn.block(false); + + fdir->set_sensitive (!queueRunning); + fformat->set_sensitive (!queueRunning); + + updateTab(qsize); +} + +void BatchQueuePanel::addBatchQueueJobs(const std::vector& entries, bool head) +{ + batchQueue->addEntries(entries, head); if (!qStartStop->get_active() && qAutoStart->get_active()) { + // Auto-start as if the user had pressed the qStartStop switch startBatchProc (); } } -bool BatchQueuePanel::canStartNext () -{ - - if (qStartStop->get_active()) { - return true; - } else { - fdir->set_sensitive (true); - fformat->set_sensitive (true); - return false; - } -} - void BatchQueuePanel::saveOptions () { @@ -341,6 +332,33 @@ void BatchQueuePanel::saveOptions () options.procQueueEnabled = qAutoStart->get_active(); } +bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event) +{ + bool ctrl = event->state & GDK_CONTROL_MASK; + + if (ctrl) { + switch(event->keyval) { + case GDK_KEY_s: + if (qStartStop->get_active()) { + stopBatchProc(); + } else { + startBatchProc(); + } + + return true; + } + } + + return batchQueue->keyPressed (event); +} + +bool BatchQueuePanel::canStartNext () +{ + // This function is called from the background BatchQueue thread. It + // cannot call UI functions; we keep the desired state in an atomic. + return queueShouldRun; +} + void BatchQueuePanel::pathFolderButtonPressed () { @@ -363,33 +381,10 @@ void BatchQueuePanel::pathFolderButtonPressed () // since these settings are shared with editorpanel : void BatchQueuePanel::pathFolderChanged () { - options.savePathFolder = outdirFolder->get_filename(); } -void BatchQueuePanel::formatChanged (Glib::ustring f) +void BatchQueuePanel::formatChanged(const Glib::ustring& format) { - - options.saveFormatBatch = saveFormatPanel->getFormat (); - -} - -bool BatchQueuePanel::handleShortcutKey (GdkEventKey* event) -{ - bool ctrl = event->state & GDK_CONTROL_MASK; - - if (ctrl) { - switch(event->keyval) { - case GDK_KEY_s: - if (qStartStop->get_active()) { - stopBatchProc(); - } else { - startBatchProc(); - } - - return true; - } - } - - return batchQueue->keyPressed (event); + options.saveFormatBatch = saveFormatPanel->getFormat(); } diff --git a/rtgui/batchqueuepanel.h b/rtgui/batchqueuepanel.h index 497bc166e..a1ee7326f 100644 --- a/rtgui/batchqueuepanel.h +++ b/rtgui/batchqueuepanel.h @@ -19,6 +19,8 @@ #ifndef _BATCHQUEUEPANEL_ #define _BATCHQUEUEPANEL_ +#include + #include #include "batchqueue.h" #include "saveformatpanel.h" @@ -51,31 +53,35 @@ class BatchQueuePanel : public Gtk::VBox, Gtk::HBox* bottomBox; Gtk::HBox* topBox; + std::atomic queueShouldRun; + IdleRegister idle_register; public: explicit BatchQueuePanel (FileCatalog* aFileCatalog); - ~BatchQueuePanel(); + ~BatchQueuePanel() override; void init (RTWindow* parent); - void addBatchQueueJobs (std::vector &entries , bool head = false); + void addBatchQueueJobs(const std::vector& entries , bool head = false); + void saveOptions (); + + bool handleShortcutKey (GdkEventKey* event); // batchqueuelistener interface - void queueSizeChanged (int qsize, bool queueEmptied, bool queueError, Glib::ustring queueErrorMessage); - bool canStartNext (); + void queueSizeChanged(int qsize, bool queueRunning, bool queueError, const Glib::ustring& queueErrorMessage) override; + bool canStartNext() override; +private: void startBatchProc (); void stopBatchProc (); void startOrStopBatchProc(); + void setGuiFromBatchState(bool queueRunning, int qsize); - void saveOptions (); void pathFolderChanged (); void pathFolderButtonPressed (); - void formatChanged (Glib::ustring f); + void formatChanged(const Glib::ustring& format) override; void updateTab (int qsize, int forceOrientation = 0); // forceOrientation=0: base on options / 1: horizontal / 2: vertical - - bool handleShortcutKey (GdkEventKey* event); }; #endif diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 413a9ce86..1a0eaeb28 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -107,7 +107,7 @@ void BatchToolPanelCoordinator::initSession () // compare all the ProcParams and describe which parameters has different (i.e. inconsistent) values in pparamsEdited pparamsEdited.initFrom (initialPP); - crop->setDimensions (100000, 100000); + //crop->setDimensions (100000, 100000); /* if (!selected.empty()) { pparams = selected[0]->getProcParams (); @@ -127,6 +127,10 @@ void BatchToolPanelCoordinator::initSession () coarse->initBatchBehavior (); + int w,h; + selected[0]->getOriginalSize(w,h); + crop->setDimensions (w, h); + if (selected.size() == 1) { for (size_t i = 0; i < toolPanels.size(); i++) { @@ -146,13 +150,12 @@ void BatchToolPanelCoordinator::initSession () gradient->setAdjusterBehavior (false, false, false, false); pcvignette->setAdjusterBehavior (false, false, false); cacorrection->setAdjusterBehavior (false); - sharpening->setAdjusterBehavior (false, false, false, false, false, false); - prsharpening->setAdjusterBehavior (false, false, false, false, false, false); + sharpening->setAdjusterBehavior (false, false, false, false, false, false, false); + prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false); sharpenEdge->setAdjusterBehavior (false, false); - sharpenMicro->setAdjusterBehavior (false, false); - icm->setAdjusterBehavior (false, false); + sharpenMicro->setAdjusterBehavior (false, false, false); epd->setAdjusterBehavior (false, false, false, false, false); - fattal->setAdjusterBehavior (false, false); + fattal->setAdjusterBehavior (false, false, false); chmixer->setAdjusterBehavior (false); blackwhite->setAdjusterBehavior (false, false); @@ -164,10 +167,12 @@ void BatchToolPanelCoordinator::initSession () 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); + bayerprocess->setAdjusterBehavior(false, false, false, false, false, false); + xtransprocess->setAdjusterBehavior(false, false); bayerpreprocess->setAdjusterBehavior (false, false); rawcacorrection->setAdjusterBehavior (false); flatfield->setAdjusterBehavior(false); - rawexposure->setAdjusterBehavior (false, false); + rawexposure->setAdjusterBehavior (false); bayerrawexposure->setAdjusterBehavior (false); xtransrawexposure->setAdjusterBehavior (false); } else { @@ -189,18 +194,19 @@ void BatchToolPanelCoordinator::initSession () gradient->setAdjusterBehavior (options.baBehav[ADDSET_GRADIENT_DEGREE], options.baBehav[ADDSET_GRADIENT_FEATHER], options.baBehav[ADDSET_GRADIENT_STRENGTH], options.baBehav[ADDSET_GRADIENT_CENTER]); pcvignette->setAdjusterBehavior (options.baBehav[ADDSET_PCVIGNETTE_STRENGTH], options.baBehav[ADDSET_PCVIGNETTE_FEATHER], options.baBehav[ADDSET_PCVIGNETTE_ROUNDNESS]); 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]); + sharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_CONTRAST], 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_CONTRAST], 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_ALPHA], options.baBehav[ADDSET_FATTAL_BETA]); + 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]); - icm->setAdjusterBehavior (options.baBehav[ADDSET_FREE_OUPUT_GAMMA], options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]); + sharpenMicro->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT], options.baBehav[ADDSET_SHARPENMICRO_CONTRAST], options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]); // colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRPROTECT], options.baBehav[ADDSET_COLORTONING_BALANCE]); colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRENGTH], options.baBehav[ADDSET_COLORTONING_BALANCE]); filmSimulation->setAdjusterBehavior(options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]); + softlight->setAdjusterBehavior(options.baBehav[ADDSET_SOFTLIGHT_STRENGTH]); + dehaze->setAdjusterBehavior(options.baBehav[ADDSET_DEHAZE_STRENGTH]); retinex->setAdjusterBehavior (options.baBehav[ADDSET_RETI_STR], options.baBehav[ADDSET_RETI_NEIGH], options.baBehav[ADDSET_RETI_LIMD], options.baBehav[ADDSET_RETI_OFFS], options.baBehav[ADDSET_RETI_VART], options.baBehav[ADDSET_RETI_GAM], options.baBehav[ADDSET_RETI_SLO]); chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] ); @@ -209,10 +215,12 @@ void BatchToolPanelCoordinator::initSession () 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]); + bayerprocess->setAdjusterBehavior(options.baBehav[ADDSET_BAYER_FALSE_COLOR_SUPPRESSION], options.baBehav[ADDSET_BAYER_ITER], options.baBehav[ADDSET_BAYER_DUALDEMOZCONTRAST], options.baBehav[ADDSET_BAYER_PS_SIGMA], options.baBehav[ADDSET_BAYER_PS_SMOOTH], options.baBehav[ADDSET_BAYER_PS_EPERISO]); + xtransprocess->setAdjusterBehavior(options.baBehav[ADDSET_BAYER_FALSE_COLOR_SUPPRESSION], options.baBehav[ADDSET_BAYER_DUALDEMOZCONTRAST]); bayerpreprocess->setAdjusterBehavior (options.baBehav[ADDSET_PREPROCESS_LINEDENOISE], options.baBehav[ADDSET_PREPROCESS_GREENEQUIL]); rawcacorrection->setAdjusterBehavior (options.baBehav[ADDSET_RAWCACORR]); flatfield->setAdjusterBehavior(options.baBehav[ADDSET_RAWFFCLIPCONTROL]); - rawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_LINEAR], options.baBehav[ADDSET_RAWEXPOS_PRESER]); + rawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_LINEAR]); bayerrawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_BLACKS]); xtransrawexposure->setAdjusterBehavior (options.baBehav[ADDSET_RAWEXPOS_BLACKS]); @@ -244,6 +252,7 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_SHARP_HALOCTRL]) { pparams.sharpening.halocontrol_amount = pparams.prsharpening.halocontrol_amount = 0; } if (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT]) { pparams.sharpenEdge.amount = 0; } if (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT]) { pparams.sharpenMicro.amount = 0; } + if (options.baBehav[ADDSET_SHARPENMICRO_CONTRAST]) { pparams.sharpenMicro.contrast = 0; } if (options.baBehav[ADDSET_SHARPENEDGE_PASS]) { pparams.sharpenEdge.passes = 0; } if (options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]) { pparams.sharpenMicro.uniformity = 0; } if (options.baBehav[ADDSET_CHMIXER]) for (int i = 0; i < 3; i++) { pparams.chmixer.red[i] = pparams.chmixer.green[i] = pparams.chmixer.blue[i] = 0; } @@ -273,8 +282,6 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_CAT_CONTRAST]) { pparams.colorappearance.contrast = 0; } if (options.baBehav[ADDSET_CAT_CONTRAST_Q]) { pparams.colorappearance.qcontrast = 0; } if (options.baBehav[ADDSET_CAT_HUE]) { pparams.colorappearance.colorh = 0; } - if (options.baBehav[ADDSET_FREE_OUPUT_GAMMA]) { pparams.icm.gampos = 0; } - if (options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]) { pparams.icm.slpos = 0; } //if (options.baBehav[ADDSET_CBOOST_AMOUNT]) pparams.colorBoost.amount = 0; //if (options.baBehav[ADDSET_CS_BLUEYELLOW]) pparams.colorShift.a = 0; //if (options.baBehav[ADDSET_CS_GREENMAGENTA]) pparams.colorShift.b = 0; @@ -289,6 +296,8 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_COLORTONING_BALANCE]) { pparams.colorToning.balance = 0; } if (options.baBehav[ADDSET_COLORTONING_STRENGTH]) { pparams.colorToning.strength = 0; } if (options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]) { pparams.filmSimulation.strength = 0; } + if (options.baBehav[ADDSET_SOFTLIGHT_STRENGTH]) { pparams.softlight.strength = 0; } + if (options.baBehav[ADDSET_DEHAZE_STRENGTH]) { pparams.dehaze.strength = 0; } if (options.baBehav[ADDSET_ROTATE_DEGREE]) { pparams.rotate.degree = 0; } if (options.baBehav[ADDSET_RESIZE_SCALE]) { pparams.resize.scale = 0; } if (options.baBehav[ADDSET_DIST_AMOUNT]) { pparams.distortion.amount = 0; } @@ -343,11 +352,17 @@ void BatchToolPanelCoordinator::initSession () if (options.baBehav[ADDSET_DIRPYRDN_GAMMA]) { pparams.dirpyrDenoise.gamma = 0; } if (options.baBehav[ADDSET_RAWCACORR]) { pparams.raw.cablue = pparams.raw.cared = 0; } if (options.baBehav[ADDSET_RAWEXPOS_LINEAR]) { pparams.raw.expos = 0; } - if (options.baBehav[ADDSET_RAWEXPOS_PRESER]) { pparams.raw.preser = 0; } if (options.baBehav[ADDSET_RAWEXPOS_BLACKS]) { pparams.raw.bayersensor.black0 = pparams.raw.bayersensor.black1 = pparams.raw.bayersensor.black2 = pparams.raw.bayersensor.black3 = pparams.raw.xtranssensor.blackred = pparams.raw.xtranssensor.blackgreen = pparams.raw.xtranssensor.blackblue = 0; } + if (options.baBehav[ADDSET_BAYER_FALSE_COLOR_SUPPRESSION]) { pparams.raw.bayersensor.ccSteps = 0; } + if (options.baBehav[ADDSET_BAYER_ITER]) { pparams.raw.bayersensor.dcb_iterations = 0; pparams.raw.bayersensor.lmmse_iterations = 0; } + if (options.baBehav[ADDSET_BAYER_PS_SMOOTH]) { pparams.raw.bayersensor.pixelShiftSmoothFactor = 0; } + if (options.baBehav[ADDSET_BAYER_PS_EPERISO]) { pparams.raw.bayersensor.pixelShiftEperIso = 0; } + if (options.baBehav[ADDSET_BAYER_PS_SIGMA]) { pparams.raw.bayersensor.pixelShiftSigma = 0; } + if (options.baBehav[ADDSET_BAYER_DUALDEMOZCONTRAST]) { pparams.raw.bayersensor.dualDemosaicContrast = 0; } + if (options.baBehav[ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION]) { pparams.raw.xtranssensor.ccSteps = 0; } 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; } @@ -373,9 +388,8 @@ void BatchToolPanelCoordinator::initSession () } } -void BatchToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr) +void BatchToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) { - if (selected.empty()) { return; } @@ -390,7 +404,7 @@ void BatchToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const G } // 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) { @@ -601,9 +615,14 @@ void BatchToolPanelCoordinator::endBatchPParamsChange() * Using a Profile panel in the batch tool panel editor is actually * not supported by BatchToolPanelCoordinator::profileChange! */ -void BatchToolPanelCoordinator::profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited) +void BatchToolPanelCoordinator::profileChange( + const PartialProfile* nparams, + const rtengine::ProcEvent& event, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited, + bool fromLastSave +) { - if (event == rtengine::EvProfileChanged) { // a profile has been selected in a hypothetical Profile panel // -> ACTUALLY NOT SUPPORTED @@ -687,11 +706,11 @@ void BatchToolPanelCoordinator::spotWBselected (int x, int y, Thumbnail* thm) double otemp = initialPP[i].wb.temperature; double ogreen = initialPP[i].wb.green; - if (options.baBehav[12]) { + if (options.baBehav[ADDSET_ROTATE_DEGREE]) { temp = temp - otemp; } - if (options.baBehav[13]) { + if (options.baBehav[ADDSET_DIST_AMOUNT]) { green = green - ogreen; } diff --git a/rtgui/batchtoolpanelcoord.h b/rtgui/batchtoolpanelcoord.h index 4efcea6fa..f5889f967 100644 --- a/rtgui/batchtoolpanelcoord.h +++ b/rtgui/batchtoolpanelcoord.h @@ -51,30 +51,36 @@ public: explicit BatchToolPanelCoordinator (FilePanel* parent); // FileSelectionChangeListener interface - void selectionChanged (const std::vector& selected); + void selectionChanged (const std::vector& selected) override; // toolpanellistener interface - void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr); + void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) override; // profilechangelistener interface - void profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited = nullptr); + void profileChange( + const rtengine::procparams::PartialProfile* nparams, + const rtengine::ProcEvent& event, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited = nullptr, + bool fromLastSave = false + ) override; // wbprovider interface - void getAutoWB (double& temp, double& green, double equal, double tempBias); - void getCamWB (double& temp, double& green); + void getAutoWB (double& temp, double& green, double equal, double tempBias) override; + void getCamWB (double& temp, double& green) override; // thumbnaillistener interface - void procParamsChanged (Thumbnail* thm, int whoChangedIt); + void procParamsChanged (Thumbnail* thm, int whoChangedIt) override; // batchpparamschangelistener interface - void beginBatchPParamsChange(int numberOfEntries); - void endBatchPParamsChange(); + void beginBatchPParamsChange(int numberOfEntries) override; + void endBatchPParamsChange() override; // imageareatoollistener interface - void spotWBselected (int x, int y, Thumbnail* thm = nullptr); - void cropSelectionReady (); - void rotateSelectionReady (double rotate_deg, Thumbnail* thm = nullptr); - CropGUIListener* startCropEditing (Thumbnail* thm = nullptr); + void spotWBselected (int x, int y, Thumbnail* thm = nullptr) override; + void cropSelectionReady () override; + void rotateSelectionReady (double rotate_deg, Thumbnail* thm = nullptr) override; + CropGUIListener* startCropEditing (Thumbnail* thm = nullptr) override; void optionsChanged (); }; diff --git a/rtgui/bayerpreprocess.cc b/rtgui/bayerpreprocess.cc index 51a0cb62a..89fd6fcb6 100644 --- a/rtgui/bayerpreprocess.cc +++ b/rtgui/bayerpreprocess.cc @@ -16,17 +16,25 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "bayerpreprocess.h" -#include "guiutils.h" #include +#include "bayerpreprocess.h" +#include "eventmapper.h" +#include "guiutils.h" + +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; -BayerPreProcess::BayerPreProcess () : FoldableToolPanel(this, "bayerpreprocess", M("TP_PREPROCESS_LABEL"), true) +BayerPreProcess::BayerPreProcess() : FoldableToolPanel(this, "bayerpreprocess", M("TP_PREPROCESS_LABEL"), true) { - lineDenoise = Gtk::manage(new Adjuster (M("TP_PREPROCESS_LINEDENOISE"), 0, 1000, 1, 0)); - lineDenoise->setAdjusterListener (this); + auto m = ProcEventMapper::getInstance(); + EvLineDenoiseDirection = m->newEvent(DARKFRAME, "HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION"); + EvPDAFLinesFilter = m->newEvent(DARKFRAME, "HISTORY_MSG_PREPROCESS_PDAFLINESFILTER"); + + lineDenoise = Gtk::manage(new Adjuster(M("TP_PREPROCESS_LINEDENOISE"), 0, 1000, 1, 0)); + lineDenoise->setAdjusterListener(this); if (lineDenoise->delay < options.adjusterMaxDelay) { lineDenoise->delay = options.adjusterMaxDelay; @@ -34,8 +42,8 @@ BayerPreProcess::BayerPreProcess () : FoldableToolPanel(this, "bayerpreprocess", lineDenoise->show(); - greenEqThreshold = Gtk::manage(new Adjuster (M("TP_PREPROCESS_GREENEQUIL"), 0, 100, 1, 0)); - greenEqThreshold->setAdjusterListener (this); + greenEqThreshold = Gtk::manage(new Adjuster(M("TP_PREPROCESS_GREENEQUIL"), 0, 100, 1, 0)); + greenEqThreshold->setAdjusterListener(this); if (greenEqThreshold->delay < options.adjusterMaxDelay) { greenEqThreshold->delay = options.adjusterMaxDelay; @@ -43,85 +51,151 @@ BayerPreProcess::BayerPreProcess () : FoldableToolPanel(this, "bayerpreprocess", greenEqThreshold->show(); - pack_start( *lineDenoise, Gtk::PACK_SHRINK, 4); + Gtk::HBox *hb = Gtk::manage(new Gtk::HBox()); + hb->pack_start(*Gtk::manage(new Gtk::Label(M("TP_PREPROCESS_LINEDENOISE_DIRECTION") + ": ")), Gtk::PACK_SHRINK, 0); + lineDenoiseDirection = Gtk::manage(new MyComboBoxText()); + lineDenoiseDirection->append(M("TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL")); + lineDenoiseDirection->append(M("TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL")); + lineDenoiseDirection->append(M("TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH")); + lineDenoiseDirection->append(M("TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES")); + lineDenoiseDirection->show(); + lineDenoiseDirection->signal_changed().connect(sigc::mem_fun(*this, &BayerPreProcess::lineDenoiseDirectionChanged)); - pack_start( *Gtk::manage (new Gtk::HSeparator())); + hb->pack_start(*lineDenoiseDirection); - pack_start( *greenEqThreshold, Gtk::PACK_SHRINK, 4); + pack_start(*lineDenoise, Gtk::PACK_SHRINK, 4); + pack_start(*hb, Gtk::PACK_SHRINK, 4); + pack_start(*Gtk::manage(new Gtk::HSeparator())); + + pack_start(*greenEqThreshold, Gtk::PACK_SHRINK, 4); + + pdafLinesFilter = Gtk::manage(new Gtk::CheckButton((M("TP_PREPROCESS_PDAFLINESFILTER")))); + pdafLinesFilter->show(); + pdafLinesFilter->signal_toggled().connect(sigc::mem_fun(*this, &BayerPreProcess::pdafLinesFilterChanged), true); + + pack_start(*Gtk::manage(new Gtk::HSeparator())); + pack_start(*pdafLinesFilter, Gtk::PACK_SHRINK, 4); } void BayerPreProcess::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { - disableListener (); - - if(pedited ) { - lineDenoise->setEditedState( pedited->raw.bayersensor.linenoise ? Edited : UnEdited ); - greenEqThreshold->setEditedState( pedited->raw.bayersensor.greenEq ? Edited : UnEdited ); - } - - lineDenoise->setValue (pp->raw.bayersensor.linenoise); - greenEqThreshold->setValue (pp->raw.bayersensor.greenthresh); - - enableListener (); -} - -void BayerPreProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) -{ - pp->raw.bayersensor.linenoise = lineDenoise->getIntValue(); - pp->raw.bayersensor.greenthresh = greenEqThreshold->getIntValue(); + disableListener(); if (pedited) { - pedited->raw.bayersensor.linenoise = lineDenoise->getEditedState (); - pedited->raw.bayersensor.greenEq = greenEqThreshold->getEditedState (); + lineDenoise->setEditedState(pedited->raw.bayersensor.linenoise ? Edited : UnEdited); + greenEqThreshold->setEditedState(pedited->raw.bayersensor.greenEq ? Edited : UnEdited); + + if (!pedited->raw.bayersensor.linenoiseDirection) { + lineDenoiseDirection->set_active(3); + } + + pdafLinesFilter->set_inconsistent(!pedited->raw.bayersensor.pdafLinesFilter); + } + + lineDenoise->setValue(pp->raw.bayersensor.linenoise); + int d = int(pp->raw.bayersensor.linenoiseDirection) - 1; + + if (d == 4) { + --d; + } + + lineDenoiseDirection->set_active(d); + greenEqThreshold->setValue(pp->raw.bayersensor.greenthresh); + pdafLinesFilter->set_active(pp->raw.bayersensor.pdafLinesFilter); + + enableListener(); +} + +void BayerPreProcess::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) +{ + pp->raw.bayersensor.linenoise = lineDenoise->getIntValue(); + int d = lineDenoiseDirection->get_active_row_number() + 1; + + if (d == 4) { + ++d; + } + + pp->raw.bayersensor.linenoiseDirection = RAWParams::BayerSensor::LineNoiseDirection(d); + pp->raw.bayersensor.greenthresh = greenEqThreshold->getIntValue(); + pp->raw.bayersensor.pdafLinesFilter = pdafLinesFilter->get_active(); + + if (pedited) { + pedited->raw.bayersensor.linenoise = lineDenoise->getEditedState(); + pedited->raw.bayersensor.greenEq = greenEqThreshold->getEditedState(); + pedited->raw.bayersensor.linenoise = lineDenoiseDirection->get_active_row_number() != 3; + pedited->raw.bayersensor.pdafLinesFilter = !pdafLinesFilter->get_inconsistent(); } } -void BayerPreProcess::adjusterChanged (Adjuster* a, double newval) +void BayerPreProcess::adjusterChanged(Adjuster* a, double newval) { if (listener) { Glib::ustring value = a->getTextValue(); if (a == greenEqThreshold) { - listener->panelChanged (EvPreProcessGEquilThresh, value ); + listener->panelChanged(EvPreProcessGEquilThresh, value); } else if (a == lineDenoise) { - listener->panelChanged (EvPreProcessLineDenoise, value ); + listener->panelChanged(EvPreProcessLineDenoise, value); } } } +void BayerPreProcess::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void BayerPreProcess::setBatchMode(bool batchMode) { - ToolPanel::setBatchMode (batchMode); - lineDenoise->showEditedCB (); - greenEqThreshold->showEditedCB (); + ToolPanel::setBatchMode(batchMode); + lineDenoise->showEditedCB(); + greenEqThreshold->showEditedCB(); + + if (batchMode) { + lineDenoiseDirection->append(M("GENERAL_UNCHANGED")); + } } void BayerPreProcess::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) { - lineDenoise->setDefault( defParams->raw.bayersensor.linenoise); - greenEqThreshold->setDefault (defParams->raw.bayersensor.greenthresh); + lineDenoise->setDefault(defParams->raw.bayersensor.linenoise); + greenEqThreshold->setDefault(defParams->raw.bayersensor.greenthresh); if (pedited) { - lineDenoise->setDefaultEditedState( pedited->raw.bayersensor.linenoise ? Edited : UnEdited); + lineDenoise->setDefaultEditedState(pedited->raw.bayersensor.linenoise ? Edited : UnEdited); greenEqThreshold->setDefaultEditedState(pedited->raw.bayersensor.greenEq ? Edited : UnEdited); } else { - lineDenoise->setDefaultEditedState( Irrelevant ); - greenEqThreshold->setDefaultEditedState(Irrelevant ); + lineDenoise->setDefaultEditedState(Irrelevant); + greenEqThreshold->setDefaultEditedState(Irrelevant); } } -void BayerPreProcess::setAdjusterBehavior (bool linedenoiseadd, bool greenequiladd) +void BayerPreProcess::setAdjusterBehavior(bool linedenoiseadd, bool greenequiladd) { lineDenoise->setAddMode(linedenoiseadd); greenEqThreshold->setAddMode(greenequiladd); } -void BayerPreProcess::trimValues (rtengine::procparams::ProcParams* pp) +void BayerPreProcess::trimValues(rtengine::procparams::ProcParams* pp) { lineDenoise->trimValue(pp->raw.bayersensor.linenoise); greenEqThreshold->trimValue(pp->raw.bayersensor.greenthresh); } + + +void BayerPreProcess::lineDenoiseDirectionChanged() +{ + if (listener) { + listener->panelChanged(EvLineDenoiseDirection, lineDenoiseDirection->get_active_text()); + } +} + +void BayerPreProcess::pdafLinesFilterChanged() +{ + if (listener) { + listener->panelChanged(EvPDAFLinesFilter, pdafLinesFilter->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} diff --git a/rtgui/bayerpreprocess.h b/rtgui/bayerpreprocess.h index 15b2ef7e5..e06a46d31 100644 --- a/rtgui/bayerpreprocess.h +++ b/rtgui/bayerpreprocess.h @@ -30,21 +30,30 @@ class BayerPreProcess : public ToolParamBlock, public AdjusterListener, public F protected: Adjuster* lineDenoise; + MyComboBoxText *lineDenoiseDirection; Adjuster* greenEqThreshold; + Gtk::CheckButton *pdafLinesFilter; + rtengine::ProcEvent EvLineDenoiseDirection; + rtengine::ProcEvent EvPDAFLinesFilter; + public: BayerPreProcess (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; - void adjusterChanged (Adjuster* a, double newval); void hotDeadPixelChanged(); void setAdjusterBehavior (bool linedenoiseadd, bool greenequiladd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; + void lineDenoiseDirectionChanged(); + void pdafLinesFilterChanged(); }; #endif diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index b294c9fee..a681023a6 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -17,14 +17,26 @@ * along with RawTherapee. If not, see . */ #include "bayerprocess.h" -#include "options.h" + +#include "eventmapper.h" #include "guiutils.h" +#include "options.h" + +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RAW_LABEL"), true) { + + auto m = ProcEventMapper::getInstance(); + EvDemosaicBorder = m->newEvent(DEMOSAIC, "HISTORY_MSG_RAW_BORDER"); + EvDemosaicContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_DUALDEMOSAIC_CONTRAST"); + EvDemosaicAutoContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST"); + EvDemosaicPixelshiftDemosaicMethod = m->newEvent(DEMOSAIC, "HISTORY_MSG_PIXELSHIFT_DEMOSAIC"); + Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); method = Gtk::manage (new MyComboBoxText ()); @@ -39,6 +51,32 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA hb1->pack_end (*method, Gtk::PACK_EXPAND_WIDGET, 4); pack_start( *hb1, Gtk::PACK_SHRINK, 4); + dualDemosaicOptions = Gtk::manage(new Gtk::VBox()); + + dualDemosaicContrast = Gtk::manage(new Adjuster(M("TP_RAW_DUALDEMOSAICCONTRAST"), 0, 100, 1, 20)); + dualDemosaicContrast->setAdjusterListener(this); + dualDemosaicContrast->addAutoButton(M("TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP")); + dualDemosaicContrast->setAutoValue(true); + if (dualDemosaicContrast->delay < options.adjusterMaxDelay) { + dualDemosaicContrast->delay = options.adjusterMaxDelay; + } + + dualDemosaicContrast->show(); + dualDemosaicOptions->pack_start(*dualDemosaicContrast); + pack_start( *dualDemosaicOptions, Gtk::PACK_SHRINK, 4); + + borderbox = Gtk::manage(new Gtk::HBox()); + border = Gtk::manage(new Adjuster(M("TP_RAW_BORDER"), 0, 16, 1, 4)); + border->setAdjusterListener (this); + + if (border->delay < options.adjusterMaxDelay) { + border->delay = options.adjusterMaxDelay; + } + + border->show(); + borderbox->pack_start(*border); + pack_start(*borderbox, Gtk::PACK_SHRINK, 4); + imageNumberBox = Gtk::manage (new Gtk::HBox ()); imageNumberBox->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_IMAGENUM") + ": ")), Gtk::PACK_SHRINK, 4); imageNumber = Gtk::manage (new MyComboBoxText ()); @@ -93,18 +131,23 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA lmmseOptions->pack_start(*lmmseIterations); pack_start( *lmmseOptions, Gtk::PACK_SHRINK, 4); - pixelShiftFrame = Gtk::manage (new Gtk::VBox ()); - pixelShiftFrame->set_border_width(0); + // -------------------- PixelShift ---------------------- + + + pixelShiftFrame = Gtk::manage(new Gtk::Frame(M("TP_RAW_PIXELSHIFT"))); + + Gtk::VBox *pixelShiftMainVBox = Gtk::manage (new Gtk::VBox ()); + pixelShiftMainVBox->set_border_width(0); pixelShiftEqualBright = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTEQUALBRIGHT"), multiImage)); pixelShiftEqualBright->setCheckBoxListener (this); pixelShiftEqualBright->set_tooltip_text (M("TP_RAW_PIXELSHIFTEQUALBRIGHT_TOOLTIP")); - pixelShiftFrame->pack_start(*pixelShiftEqualBright); + pixelShiftMainVBox->pack_start(*pixelShiftEqualBright); pixelShiftEqualBrightChannel = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL"), multiImage)); pixelShiftEqualBrightChannel->setCheckBoxListener (this); pixelShiftEqualBrightChannel->set_tooltip_text (M("TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP")); - pixelShiftFrame->pack_start(*pixelShiftEqualBrightChannel); + pixelShiftMainVBox->pack_start(*pixelShiftEqualBrightChannel); Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ()); hb3->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_PIXELSHIFTMOTIONMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); @@ -115,7 +158,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftMotionMethod->set_active(toUnderlying(RAWParams::BayerSensor::PSMotionCorrectionMethod::AUTO)); pixelShiftMotionMethod->show(); hb3->pack_start(*pixelShiftMotionMethod); - pixelShiftFrame->pack_start(*hb3); + pixelShiftMainVBox->pack_start(*hb3); pixelShiftOptions = Gtk::manage (new Gtk::VBox ()); pixelShiftOptions->set_border_width(0); @@ -123,18 +166,24 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftShowMotion = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTSHOWMOTION"), multiImage)); pixelShiftShowMotion->setCheckBoxListener (this); pixelShiftShowMotion->set_tooltip_text (M("TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP")); - pixelShiftFrame->pack_start(*pixelShiftShowMotion); + pixelShiftMainVBox->pack_start(*pixelShiftShowMotion); pixelShiftShowMotionMaskOnly = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY"), multiImage)); pixelShiftShowMotionMaskOnly->setCheckBoxListener (this); pixelShiftShowMotionMaskOnly->set_tooltip_text (M("TP_RAW_PIXELSHIFTSHOWMOTIONMASKONLY_TOOLTIP")); - pixelShiftFrame->pack_start(*pixelShiftShowMotionMaskOnly); + pixelShiftMainVBox->pack_start(*pixelShiftShowMotionMaskOnly); + + + Gtk::HBox* hb4 = Gtk::manage (new Gtk::HBox ()); + hb4->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_PIXELSHIFTDMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); + pixelShiftDemosaicMethod = Gtk::manage (new MyComboBoxText ()); + for(const auto method_string : procparams::RAWParams::BayerSensor::getPSDemosaicMethodStrings()) { + pixelShiftDemosaicMethod->append(M("TP_RAW_" + Glib::ustring(method_string).uppercase())); + } + pixelShiftDemosaicMethod->set_active(0); + hb4->pack_start(*pixelShiftDemosaicMethod); + pixelShiftOptions->pack_start(*hb4); -#ifdef PIXELSHIFTDEV - pixelShiftAutomatic = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTADAPTIVE"), multiImage)); - pixelShiftAutomatic->setCheckBoxListener (this); - pixelShiftOptions->pack_start(*pixelShiftAutomatic); -#endif pixelShiftGreen = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTGREEN"), multiImage)); pixelShiftGreen->setCheckBoxListener (this); pixelShiftOptions->pack_start(*pixelShiftGreen); @@ -193,142 +242,8 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftMedian->set_tooltip_text (M("TP_RAW_PIXELSHIFTMEDIAN_TOOLTIP")); pixelShiftOptions->pack_start(*pixelShiftMedian); - -#ifdef PIXELSHIFTDEV - pixelShiftMedian3 = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTMEDIAN3"), multiImage)); - pixelShiftMedian3->setCheckBoxListener (this); - pixelShiftMedian3->set_tooltip_text (M("TP_RAW_PIXELSHIFTMEDIAN3_TOOLTIP")); - pixelShiftOptions->pack_start(*pixelShiftMedian3); - - pixelShiftNonGreenCross2 = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTNONGREENCROSS2"), multiImage)); - pixelShiftNonGreenCross2->setCheckBoxListener (this); - pixelShiftOptions->pack_start(*pixelShiftNonGreenCross2); - - pixelShiftNonGreenAmaze = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTNONGREENAMAZE"), multiImage)); - pixelShiftNonGreenAmaze->setCheckBoxListener (this); - pixelShiftOptions->pack_start(*pixelShiftNonGreenAmaze); - - pixelShiftNonGreenHorizontal = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTNONGREENHORIZONTAL"), multiImage)); - pixelShiftNonGreenHorizontal->setCheckBoxListener (this); - pixelShiftOptions->pack_start(*pixelShiftNonGreenHorizontal); - - pixelShiftNonGreenVertical = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTNONGREENVERTICAL"), multiImage)); - pixelShiftNonGreenVertical->setCheckBoxListener (this); - pixelShiftOptions->pack_start(*pixelShiftNonGreenVertical); - - pixelShiftExp0 = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTEXP0"), multiImage)); - pixelShiftExp0->setCheckBoxListener (this); - pixelShiftOptions->pack_start(*pixelShiftExp0); -#endif - pixelShiftLmmse = Gtk::manage (new CheckBox(M("TP_RAW_PIXELSHIFTLMMSE"), multiImage)); - pixelShiftLmmse->setCheckBoxListener (this); - 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); - pixelShiftMotion->set_tooltip_text (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP")); - - if (pixelShiftMotion->delay < options.adjusterMaxDelay) { - pixelShiftMotion->delay = options.adjusterMaxDelay; - } - pixelShiftMotion->show(); - pixelShiftOptions->pack_start(*pixelShiftMotion); - - Gtk::HBox* hb2 = Gtk::manage (new Gtk::HBox ()); - hb2->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_PIXELSHIFTMOTIONCORRECTION") + ": ")), Gtk::PACK_SHRINK, 0); - pixelShiftMotionCorrection = Gtk::manage (new MyComboBoxText ()); - pixelShiftMotionCorrection->append("1x1"); - pixelShiftMotionCorrection->append("1x2"); - pixelShiftMotionCorrection->append("3x3"); - pixelShiftMotionCorrection->append("5x5"); - pixelShiftMotionCorrection->append("7x7"); - pixelShiftMotionCorrection->append("3x3 new"); - pixelShiftMotionCorrection->set_active(0); - pixelShiftMotionCorrection->show(); - hb2->pack_start(*pixelShiftMotionCorrection); - pixelShiftOptions->pack_start(*hb2); - pixelShiftStddevFactorGreen = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORGREEN"), 2, 8, 0.1, 5)); - pixelShiftStddevFactorGreen->setAdjusterListener (this); - - if (pixelShiftStddevFactorGreen->delay < options.adjusterMaxDelay) { - pixelShiftStddevFactorGreen->delay = options.adjusterMaxDelay; - } - - pixelShiftStddevFactorGreen->show(); - pixelShiftOptions->pack_start(*pixelShiftStddevFactorGreen); - - pixelShiftStddevFactorRed = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORRED"), 1, 8, 0.1, 5)); - pixelShiftStddevFactorRed->setAdjusterListener (this); - - if (pixelShiftStddevFactorRed->delay < options.adjusterMaxDelay) { - pixelShiftStddevFactorRed->delay = options.adjusterMaxDelay; - } - - pixelShiftStddevFactorRed->show(); - pixelShiftOptions->pack_start(*pixelShiftStddevFactorRed); - - pixelShiftStddevFactorBlue = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTSTDDEVFACTORBLUE"), 1, 8, 0.1, 5)); - pixelShiftStddevFactorBlue->setAdjusterListener (this); - - if (pixelShiftStddevFactorBlue->delay < options.adjusterMaxDelay) { - pixelShiftStddevFactorBlue->delay = options.adjusterMaxDelay; - } - - pixelShiftStddevFactorBlue->show(); - pixelShiftOptions->pack_start(*pixelShiftStddevFactorBlue); -#endif - -#ifdef PIXELSHIFTDEV - pixelShiftNreadIso = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTNREADISO"), -2.0, 2.0, 0.05, 0.0)); - pixelShiftNreadIso->setAdjusterListener (this); - - if (pixelShiftNreadIso->delay < options.adjusterMaxDelay) { - pixelShiftNreadIso->delay = options.adjusterMaxDelay; - } - - pixelShiftNreadIso->show(); - pixelShiftOptions->pack_start(*pixelShiftNreadIso); - - - pixelShiftPrnu = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTPRNU"), 0.3, 2.0, 0.1, 1.0)); - pixelShiftPrnu->setAdjusterListener (this); - - if (pixelShiftPrnu->delay < options.adjusterMaxDelay) { - pixelShiftPrnu->delay = options.adjusterMaxDelay; - } - - pixelShiftPrnu->show(); - pixelShiftOptions->pack_start(*pixelShiftPrnu); - - pixelShiftSum = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMASKTHRESHOLD"), 1.0, 8.0, 0.1, 3.0)); - pixelShiftSum->setAdjusterListener (this); - - if (pixelShiftSum->delay < options.adjusterMaxDelay) { - pixelShiftSum->delay = options.adjusterMaxDelay; - } - - pixelShiftSum->show(); - pixelShiftOptions->pack_start(*pixelShiftSum); - - pixelShiftRedBlueWeight = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTREDBLUEWEIGHT"), 0.1, 1.0, 0.1, 0.7)); - pixelShiftRedBlueWeight->setAdjusterListener (this); - - if (pixelShiftRedBlueWeight->delay < options.adjusterMaxDelay) { - pixelShiftRedBlueWeight->delay = options.adjusterMaxDelay; - } - - pixelShiftRedBlueWeight->show(); - pixelShiftOptions->pack_start(*pixelShiftRedBlueWeight); -#endif - - pixelShiftFrame->pack_start(*pixelShiftOptions); + pixelShiftMainVBox->pack_start(*pixelShiftOptions); + pixelShiftFrame->add(*pixelShiftMainVBox); pixelShiftOptions->hide(); pack_start( *pixelShiftFrame, Gtk::PACK_SHRINK, 4); @@ -336,23 +251,24 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA method->connect(method->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::methodChanged) )); imageNumber->connect(imageNumber->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::imageNumberChanged) )); pixelShiftMotionMethod->connect(pixelShiftMotionMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftMotionMethodChanged) )); -#ifdef PIXELSHIFTDEV - pixelShiftMotionCorrection->connect(pixelShiftMotionCorrection->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::psMotionCorrectionChanged) )); -#endif + pixelShiftDemosaicMethod->connect(pixelShiftDemosaicMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftDemosaicMethodChanged) )); + } +BayerProcess::~BayerProcess () +{ + idle_register.destroy(); +} void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { disableListener (); method->block (true); imageNumber->block (true); + pixelShiftDemosaicMethod->block(true); //allEnhconn.block (true); -#ifdef PIXELSHIFTDEV - pixelShiftMotionCorrection->block (true); -#endif - method->set_active(std::numeric_limits::max()); + border->setValue(pp->raw.bayersensor.border); imageNumber->set_active(pp->raw.bayersensor.imageNum); for (size_t i = 0; i < procparams::RAWParams::BayerSensor::getMethodStrings().size(); ++i) { @@ -362,66 +278,49 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params break; } } + for (size_t i = 0; i < procparams::RAWParams::BayerSensor::getPSDemosaicMethodStrings().size(); ++i) { + if (pp->raw.bayersensor.pixelShiftDemosaicMethod == procparams::RAWParams::BayerSensor::getPSDemosaicMethodStrings()[i]) { + pixelShiftDemosaicMethod->set_active(i); + break; + } + } - //allEnhance->set_active(pp->raw.bayersensor.all_enhance); dcbIterations->setValue (pp->raw.bayersensor.dcb_iterations); dcbEnhance->setValue (pp->raw.bayersensor.dcb_enhance); pixelShiftShowMotion->setValue (pp->raw.bayersensor.pixelShiftShowMotion); + pixelShiftShowMotionMaskOnly->setValue (pp->raw.bayersensor.pixelShiftShowMotionMaskOnly); if (!batchMode) { pixelShiftShowMotionMaskOnly->set_sensitive (pp->raw.bayersensor.pixelShiftShowMotion); } - pixelShiftShowMotionMaskOnly->setValue (pp->raw.bayersensor.pixelShiftShowMotionMaskOnly); pixelShiftHoleFill->setValue (pp->raw.bayersensor.pixelShiftHoleFill); pixelShiftMedian->setValue (pp->raw.bayersensor.pixelShiftMedian); pixelShiftGreen->setValue (pp->raw.bayersensor.pixelShiftGreen); pixelShiftBlur->setValue (pp->raw.bayersensor.pixelShiftBlur); + pixelShiftSmooth->setValue (pp->raw.bayersensor.pixelShiftSmoothFactor); if (!batchMode) { pixelShiftSmooth->set_sensitive (pp->raw.bayersensor.pixelShiftBlur); } - 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); + if (!batchMode) { + pixelShiftEqualBrightChannel->set_sensitive (pp->raw.bayersensor.pixelShiftEqualBright); + } pixelShiftNonGreenCross->setValue (pp->raw.bayersensor.pixelShiftNonGreenCross); ccSteps->setValue (pp->raw.bayersensor.ccSteps); lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations); + dualDemosaicContrast->setAutoValue(pp->raw.bayersensor.dualDemosaicAutoContrast); + dualDemosaicContrast->setValue (pp->raw.bayersensor.dualDemosaicContrast); + pixelShiftMotionMethod->set_active ((int)pp->raw.bayersensor.pixelShiftMotionCorrectionMethod); pixelShiftEperIso->setValue (pp->raw.bayersensor.pixelShiftEperIso); pixelShiftSigma->setValue (pp->raw.bayersensor.pixelShiftSigma); if (!batchMode) { pixelShiftSigma->set_sensitive (pp->raw.bayersensor.pixelShiftBlur); } -#ifdef PIXELSHIFTDEV - pixelShiftStddevFactorGreen->setValue (pp->raw.bayersensor.pixelShiftStddevFactorGreen); - pixelShiftStddevFactorRed->setValue (pp->raw.bayersensor.pixelShiftStddevFactorRed); - pixelShiftStddevFactorBlue->setValue (pp->raw.bayersensor.pixelShiftStddevFactorBlue); - pixelShiftSum->setValue (pp->raw.bayersensor.pixelShiftSum); - pixelShiftMedian3->setValue (pp->raw.bayersensor.pixelShiftMedian3); - if (!batchMode) { - pixelShiftMedian3->set_sensitive (pixelShiftMedian->getValue() != CheckValue::off); - } - pixelShiftAutomatic->setValue (pp->raw.bayersensor.pixelShiftAutomatic); - pixelShiftNonGreenHorizontal->setValue (pp->raw.bayersensor.pixelShiftNonGreenHorizontal); - pixelShiftNonGreenVertical->setValue (pp->raw.bayersensor.pixelShiftNonGreenVertical); - pixelShiftExp0->setValue (pp->raw.bayersensor.pixelShiftExp0); - pixelShiftNonGreenCross2->setValue (pp->raw.bayersensor.pixelShiftNonGreenCross2); - pixelShiftNonGreenAmaze->setValue (pp->raw.bayersensor.pixelShiftNonGreenAmaze); - pixelShiftMotion->setValue (pp->raw.bayersensor.pixelShiftMotion); - pixelShiftMotionCorrection->set_active ((int)pp->raw.bayersensor.pixelShiftMotionCorrection); - if (!batchMode) { - pixelShiftHoleFill->set_sensitive (pixelShiftAutomatic->getValue () != CheckValue::off && pixelShiftMotionCorrection->get_active_row_number() == 5); - pixelShiftBlur->set_sensitive(pixelShiftAutomatic->getValue () != CheckValue::off && pixelShiftMotionCorrection->get_active_row_number() == 5); - pixelShiftSmooth->set_sensitive(pixelShiftAutomatic->getValue () != CheckValue::off && pixelShiftMotionCorrection->get_active_row_number() == 5 && pixelShiftBlur->getValue() != CheckValue::off); - } - pixelShiftNreadIso->setValue (pp->raw.bayersensor.pixelShiftNreadIso); - pixelShiftPrnu->setValue (pp->raw.bayersensor.pixelShiftPrnu); - pixelShiftRedBlueWeight->setValue (pp->raw.bayersensor.pixelShiftRedBlueWeight); -#endif if(pedited) { + border->setEditedState (pedited->raw.bayersensor.border ? Edited : UnEdited); ccSteps->setEditedState (pedited->raw.bayersensor.ccSteps ? Edited : UnEdited); dcbIterations->setEditedState ( pedited->raw.bayersensor.dcbIterations ? Edited : UnEdited); dcbEnhance->setEdited (pedited->raw.bayersensor.dcbEnhance); @@ -432,74 +331,48 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params pixelShiftGreen->setEdited (pedited->raw.bayersensor.pixelShiftGreen); 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); lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited); + dualDemosaicContrast->setEditedState ( pedited->raw.bayersensor.dualDemosaicContrast ? Edited : UnEdited); + dualDemosaicContrast->setAutoInconsistent (multiImage && !pedited->raw.bayersensor.dualDemosaicAutoContrast); pixelShiftEperIso->setEditedState ( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited); pixelShiftSigma->setEditedState ( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited); -#ifdef PIXELSHIFTDEV - pixelShiftNreadIso->setEditedState ( pedited->raw.bayersensor.pixelShiftNreadIso ? Edited : UnEdited); - pixelShiftPrnu->setEditedState ( pedited->raw.bayersensor.pixelShiftPrnu ? Edited : UnEdited); - pixelShiftStddevFactorGreen->setEditedState ( pedited->raw.bayersensor.pixelShiftStddevFactorGreen ? Edited : UnEdited); - pixelShiftStddevFactorRed->setEditedState ( pedited->raw.bayersensor.pixelShiftStddevFactorRed ? Edited : UnEdited); - pixelShiftStddevFactorBlue->setEditedState ( pedited->raw.bayersensor.pixelShiftStddevFactorBlue ? Edited : UnEdited); - pixelShiftSum->setEditedState ( pedited->raw.bayersensor.pixelShiftSum ? Edited : UnEdited); - pixelShiftAutomatic->setEdited (pedited->raw.bayersensor.pixelShiftAutomatic); - pixelShiftNonGreenHorizontal->setEdited (pedited->raw.bayersensor.pixelShiftNonGreenHorizontal); - pixelShiftNonGreenVertical->setEdited (pedited->raw.bayersensor.pixelShiftNonGreenVertical); - pixelShiftMedian3->setEdited (pedited->raw.bayersensor.pixelShiftMedian3); - pixelShiftExp0->setEdited (pedited->raw.bayersensor.pixelShiftExp0); - pixelShiftNonGreenCross2->setEdited (pedited->raw.bayersensor.pixelShiftNonGreenCross2); - pixelShiftNonGreenAmaze->setEdited (pedited->raw.bayersensor.pixelShiftNonGreenAmaze); - pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelShiftMotion ? Edited : UnEdited); - pixelShiftRedBlueWeight->setEditedState ( pedited->raw.bayersensor.pixelShiftRedBlueWeight ? Edited : UnEdited); -#endif if(!pedited->raw.bayersensor.method) { - method->set_active(std::numeric_limits::max()); // No name + method->set_active_text(M("GENERAL_UNCHANGED")); } + if(!pedited->raw.bayersensor.imageNum) { imageNumber->set_active_text(M("GENERAL_UNCHANGED")); } -#ifdef PIXELSHIFTDEV - if(!pedited->raw.bayersensor.pixelShiftMotionCorrection) { - pixelShiftMotionCorrection->set_active_text(M("GENERAL_UNCHANGED")); - } -#endif + if(!pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod) { pixelShiftMotionMethod->set_active_text(M("GENERAL_UNCHANGED")); } + + if(!pedited->raw.bayersensor.pixelShiftDemosaicMethod) { + pixelShiftDemosaicMethod->set_active_text(M("GENERAL_UNCHANGED")); + } + } + lastAutoContrast = pp->raw.bayersensor.dualDemosaicAutoContrast; if (!batchMode) { - 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::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::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(); - } + dcbOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCB) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4)); + lmmseOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::LMMSE)); + dualDemosaicOptions->set_visible(pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::AMAZEVNG4) + || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) + || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)); + if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { + pixelShiftOptions->set_visible(pp->raw.bayersensor.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::CUSTOM); pixelShiftFrame->show(); } else { pixelShiftFrame->hide(); } - // Flase color suppression is applied to all demozaicing method, so don't hide anything + // False color suppression is applied to all demozaicing method, so don't hide anything /*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)) @@ -511,10 +384,8 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params //lastALLen = pp->raw.bayersensor.all_enhance; method->block (false); -#ifdef PIXELSHIFTDEV - pixelShiftMotionCorrection->block (false); -#endif imageNumber->block (false); + pixelShiftDemosaicMethod->block(false); //allEnhconn.block (false); enableListener (); @@ -525,8 +396,10 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.ccSteps = ccSteps->getIntValue(); pp->raw.bayersensor.dcb_iterations = dcbIterations->getIntValue(); pp->raw.bayersensor.dcb_enhance = dcbEnhance->getLastActive (); - //pp->raw.bayersensor.all_enhance = allEnhance->getLastActive (); + pp->raw.bayersensor.border = border->getIntValue(); pp->raw.bayersensor.lmmse_iterations = lmmseIterations->getIntValue(); + pp->raw.bayersensor.dualDemosaicAutoContrast = dualDemosaicContrast->getAutoValue(); + pp->raw.bayersensor.dualDemosaicContrast = dualDemosaicContrast->getValue(); pp->raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)pixelShiftMotionMethod->get_active_row_number(); pp->raw.bayersensor.pixelShiftEperIso = pixelShiftEperIso->getValue(); pp->raw.bayersensor.pixelShiftSigma = pixelShiftSigma->getValue(); @@ -537,50 +410,39 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.pixelShiftGreen = pixelShiftGreen->getLastActive (); 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 (); -#ifdef PIXELSHIFTDEV - pp->raw.bayersensor.pixelShiftStddevFactorGreen = pixelShiftStddevFactorGreen->getValue(); - pp->raw.bayersensor.pixelShiftStddevFactorRed = pixelShiftStddevFactorRed->getValue(); - pp->raw.bayersensor.pixelShiftStddevFactorBlue = pixelShiftStddevFactorBlue->getValue(); - pp->raw.bayersensor.pixelShiftSum = pixelShiftSum->getValue(); - pp->raw.bayersensor.pixelShiftMedian3 = pixelShiftMedian3->getLastActive (); - pp->raw.bayersensor.pixelShiftMotion = pixelShiftMotion->getIntValue(); - pp->raw.bayersensor.pixelShiftMotionCorrection = (RAWParams::BayerSensor::ePSMotionCorrection)pixelShiftMotionCorrection->get_active_row_number(); - pp->raw.bayersensor.pixelShiftAutomatic = pixelShiftAutomatic->getLastActive (); - pp->raw.bayersensor.pixelShiftNonGreenHorizontal = pixelShiftNonGreenHorizontal->getLastActive (); - pp->raw.bayersensor.pixelShiftNonGreenVertical = pixelShiftNonGreenVertical->getLastActive (); - pp->raw.bayersensor.pixelShiftExp0 = pixelShiftExp0->getLastActive (); - pp->raw.bayersensor.pixelShiftNonGreenCross2 = pixelShiftNonGreenCross2->getLastActive (); - pp->raw.bayersensor.pixelShiftNonGreenAmaze = pixelShiftNonGreenAmaze->getLastActive (); - pp->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getValue(); - pp->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getValue(); - pp->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getValue(); -#endif int currentRow = method->get_active_row_number(); - if( currentRow >= 0 && currentRow < std::numeric_limits::max()) { + if( currentRow >= 0 && method->get_active_text() != M("GENERAL_UNCHANGED")) { pp->raw.bayersensor.method = procparams::RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method(currentRow)); } currentRow = imageNumber->get_active_row_number(); - if (currentRow < 4) { + if (currentRow >= 0 && imageNumber->get_active_text() != M("GENERAL_UNCHANGED")) { pp->raw.bayersensor.imageNum = currentRow; } + currentRow = pixelShiftDemosaicMethod->get_active_row_number(); + if( currentRow >= 0 && pixelShiftDemosaicMethod->get_active_text() != M("GENERAL_UNCHANGED")) { + pp->raw.bayersensor.pixelShiftDemosaicMethod = procparams::RAWParams::BayerSensor::getPSDemosaicMethodString(RAWParams::BayerSensor::PSDemosaicMethod(currentRow)); + } + if (pedited) { + pedited->raw.bayersensor.border = border->getEditedState (); pedited->raw.bayersensor.ccSteps = ccSteps->getEditedState (); - pedited->raw.bayersensor.method = method->get_active_row_number() != std::numeric_limits::max(); + pedited->raw.bayersensor.method = method->get_active_text() != M("GENERAL_UNCHANGED"); pedited->raw.bayersensor.imageNum = imageNumber->get_active_text() != M("GENERAL_UNCHANGED"); pedited->raw.bayersensor.dcbIterations = dcbIterations->getEditedState (); pedited->raw.bayersensor.dcbEnhance = !dcbEnhance->get_inconsistent(); //pedited->raw.bayersensor.allEnhance = !allEnhance->get_inconsistent(); pedited->raw.bayersensor.lmmseIterations = lmmseIterations->getEditedState (); + pedited->raw.bayersensor.dualDemosaicAutoContrast = !dualDemosaicContrast->getAutoInconsistent (); + pedited->raw.bayersensor.dualDemosaicContrast = dualDemosaicContrast->getEditedState (); pedited->raw.bayersensor.pixelShiftMotionCorrectionMethod = pixelShiftMotionMethod->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->raw.bayersensor.pixelShiftDemosaicMethod = pixelShiftDemosaicMethod->get_active_text() != M("GENERAL_UNCHANGED"); pedited->raw.bayersensor.pixelShiftEperIso = pixelShiftEperIso->getEditedState (); pedited->raw.bayersensor.pixelShiftSigma = pixelShiftSigma->getEditedState (); pedited->raw.bayersensor.pixelShiftShowMotion = !pixelShiftShowMotion->get_inconsistent(); @@ -590,58 +452,52 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pedited->raw.bayersensor.pixelShiftGreen = !pixelShiftGreen->get_inconsistent(); 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(); -#ifdef PIXELSHIFTDEV - pedited->raw.bayersensor.pixelShiftStddevFactorGreen = pixelShiftStddevFactorGreen->getEditedState (); - pedited->raw.bayersensor.pixelShiftStddevFactorRed = pixelShiftStddevFactorRed->getEditedState (); - pedited->raw.bayersensor.pixelShiftStddevFactorBlue = pixelShiftStddevFactorBlue->getEditedState (); - pedited->raw.bayersensor.pixelShiftSum = pixelShiftSum->getEditedState (); - pedited->raw.bayersensor.pixelShiftMedian3 = !pixelShiftMedian3->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftMotion = pixelShiftMotion->getEditedState (); - pedited->raw.bayersensor.pixelShiftMotionCorrection = pixelShiftMotionCorrection->get_active_text() != M("GENERAL_UNCHANGED"); - pedited->raw.bayersensor.pixelShiftAutomatic = !pixelShiftAutomatic->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = !pixelShiftNonGreenHorizontal->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftNonGreenVertical = !pixelShiftNonGreenVertical->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftExp0 = !pixelShiftExp0->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftNonGreenCross2 = !pixelShiftNonGreenCross2->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftNonGreenAmaze = !pixelShiftNonGreenAmaze->get_inconsistent(); - pedited->raw.bayersensor.pixelShiftNreadIso = pixelShiftNreadIso->getEditedState (); - pedited->raw.bayersensor.pixelShiftPrnu = pixelShiftPrnu->getEditedState (); - pedited->raw.bayersensor.pixelShiftRedBlueWeight = pixelShiftRedBlueWeight->getEditedState (); -#endif } } +void BayerProcess::setAdjusterBehavior (bool falsecoloradd, bool iteradd, bool dualdemozecontrastadd, bool pssigmaadd, bool pssmoothadd, bool pseperisoadd) +{ + border->setAddMode(false); + ccSteps->setAddMode(falsecoloradd); + dcbIterations->setAddMode(iteradd); + lmmseIterations->setAddMode(iteradd); + pixelShiftSmooth->setAddMode(pssmoothadd); + pixelShiftEperIso->setAddMode(pseperisoadd); + pixelShiftSigma->setAddMode(pssigmaadd); + dualDemosaicContrast->setAddMode(dualdemozecontrastadd); +} + +void BayerProcess::trimValues (rtengine::procparams::ProcParams* pp) +{ + border->trimValue(pp->raw.bayersensor.border); + ccSteps->trimValue(pp->raw.bayersensor.ccSteps); + dcbIterations->trimValue(pp->raw.bayersensor.dcb_iterations); + lmmseIterations->trimValue(pp->raw.bayersensor.lmmse_iterations); + pixelShiftSmooth->trimValue(pp->raw.bayersensor.pixelShiftSmoothFactor); + pixelShiftEperIso->trimValue(pp->raw.bayersensor.pixelShiftEperIso); + pixelShiftSigma->trimValue(pp->raw.bayersensor.pixelShiftSigma); + dualDemosaicContrast->trimValue(pp->raw.bayersensor.dualDemosaicContrast); +} + void BayerProcess::setBatchMode(bool batchMode) { method->append (M("GENERAL_UNCHANGED")); - method->set_active(std::numeric_limits::max()); // No name -#ifdef PIXELSHIFTDEV - pixelShiftMotionCorrection->append (M("GENERAL_UNCHANGED")); - pixelShiftMotionCorrection->set_active_text (M("GENERAL_UNCHANGED")); -#endif + method->set_active_text(M("GENERAL_UNCHANGED")); // No name pixelShiftMotionMethod->append (M("GENERAL_UNCHANGED")); pixelShiftMotionMethod->set_active_text (M("GENERAL_UNCHANGED")); + pixelShiftDemosaicMethod->append (M("GENERAL_UNCHANGED")); + pixelShiftDemosaicMethod->set_active_text(M("GENERAL_UNCHANGED")); // No name imageNumber->append (M("GENERAL_UNCHANGED")); imageNumber->set_active_text (M("GENERAL_UNCHANGED")); ToolPanel::setBatchMode (batchMode); + border->showEditedCB (); ccSteps->showEditedCB (); dcbIterations->showEditedCB (); lmmseIterations->showEditedCB (); -#ifdef PIXELSHIFTDEV - pixelShiftMotion->showEditedCB (); - pixelShiftSum->showEditedCB (); - pixelShiftStddevFactorGreen->showEditedCB (); - pixelShiftStddevFactorRed->showEditedCB (); - pixelShiftStddevFactorBlue->showEditedCB (); - pixelShiftNreadIso->showEditedCB (); - pixelShiftPrnu->showEditedCB (); - pixelShiftRedBlueWeight->showEditedCB (); -#endif + dualDemosaicContrast->showEditedCB (); pixelShiftEperIso->showEditedCB (); pixelShiftSigma->showEditedCB (); } @@ -650,51 +506,27 @@ void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams { dcbIterations->setDefault( defParams->raw.bayersensor.dcb_iterations); lmmseIterations->setDefault( defParams->raw.bayersensor.lmmse_iterations); -#ifdef PIXELSHIFTDEV - pixelShiftMotion->setDefault( defParams->raw.bayersensor.pixelShiftMotion); - pixelShiftSum->setDefault( defParams->raw.bayersensor.pixelShiftSum); - pixelShiftStddevFactorGreen->setDefault( defParams->raw.bayersensor.pixelShiftStddevFactorGreen); - pixelShiftStddevFactorRed->setDefault( defParams->raw.bayersensor.pixelShiftStddevFactorRed); - pixelShiftStddevFactorBlue->setDefault( defParams->raw.bayersensor.pixelShiftStddevFactorBlue); - pixelShiftNreadIso->setDefault( defParams->raw.bayersensor.pixelShiftNreadIso); - pixelShiftPrnu->setDefault( defParams->raw.bayersensor.pixelShiftPrnu); - pixelShiftRedBlueWeight->setDefault( defParams->raw.bayersensor.pixelShiftRedBlueWeight); -#endif + dualDemosaicContrast->setDefault( defParams->raw.bayersensor.dualDemosaicContrast); pixelShiftEperIso->setDefault( defParams->raw.bayersensor.pixelShiftEperIso); pixelShiftSigma->setDefault( defParams->raw.bayersensor.pixelShiftSigma); + border->setDefault (defParams->raw.bayersensor.border); ccSteps->setDefault (defParams->raw.bayersensor.ccSteps); if (pedited) { dcbIterations->setDefaultEditedState( pedited->raw.bayersensor.dcbIterations ? Edited : UnEdited); lmmseIterations->setDefaultEditedState( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited); -#ifdef PIXELSHIFTDEV - pixelShiftMotion->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftMotion ? Edited : UnEdited); - pixelShiftSum->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSum ? Edited : UnEdited); - pixelShiftStddevFactorGreen->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftStddevFactorGreen ? Edited : UnEdited); - pixelShiftStddevFactorRed->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftStddevFactorRed ? Edited : UnEdited); - pixelShiftStddevFactorBlue->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftStddevFactorBlue ? Edited : UnEdited); - pixelShiftNreadIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftNreadIso ? Edited : UnEdited); - pixelShiftPrnu->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftPrnu ? Edited : UnEdited); - pixelShiftRedBlueWeight->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftRedBlueWeight ? Edited : UnEdited); -#endif + dualDemosaicContrast->setDefaultEditedState( pedited->raw.bayersensor.dualDemosaicContrast ? Edited : UnEdited); pixelShiftEperIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited); pixelShiftSigma->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited); + border->setDefaultEditedState(pedited->raw.bayersensor.border ? Edited : UnEdited); ccSteps->setDefaultEditedState(pedited->raw.bayersensor.ccSteps ? Edited : UnEdited); } else { dcbIterations->setDefaultEditedState( Irrelevant ); lmmseIterations->setDefaultEditedState( Irrelevant ); -#ifdef PIXELSHIFTDEV - pixelShiftMotion->setDefaultEditedState( Irrelevant ); - pixelShiftSum->setDefaultEditedState( Irrelevant ); - pixelShiftStddevFactorGreen->setDefaultEditedState( Irrelevant ); - pixelShiftStddevFactorRed->setDefaultEditedState( Irrelevant ); - pixelShiftStddevFactorBlue->setDefaultEditedState( Irrelevant ); - pixelShiftNreadIso->setDefaultEditedState( Irrelevant ); - pixelShiftPrnu->setDefaultEditedState( Irrelevant ); - pixelShiftRedBlueWeight->setDefaultEditedState( Irrelevant ); -#endif + dualDemosaicContrast->setDefaultEditedState( Irrelevant ); pixelShiftEperIso->setDefaultEditedState( Irrelevant ); pixelShiftSigma->setDefaultEditedState( Irrelevant ); + border->setDefaultEditedState(Irrelevant); ccSteps->setDefaultEditedState(Irrelevant ); } } @@ -708,74 +540,45 @@ void BayerProcess::adjusterChanged (Adjuster* a, double newval) listener->panelChanged (EvDemosaicFalseColorIter, a->getTextValue() ); } else if (a == lmmseIterations) { listener->panelChanged (EvDemosaicLMMSEIter, a->getTextValue() ); -#ifdef PIXELSHIFTDEV - } else if (a == pixelShiftMotion) { - listener->panelChanged (EvPixelShiftMotion, a->getTextValue() ); - } else if (a == pixelShiftSum) { - listener->panelChanged (EvPixelShiftSum, a->getTextValue() ); - } else if (a == pixelShiftStddevFactorGreen) { - listener->panelChanged (EvPixelShiftStddevFactorGreen, a->getTextValue() ); - } else if (a == pixelShiftStddevFactorRed) { - listener->panelChanged (EvPixelShiftStddevFactorRed, a->getTextValue() ); - } else if (a == pixelShiftStddevFactorBlue) { - listener->panelChanged (EvPixelShiftStddevFactorBlue, a->getTextValue() ); - } else if (a == pixelShiftNreadIso) { - listener->panelChanged (EvPixelShiftNreadIso, a->getTextValue() ); - } else if (a == pixelShiftPrnu) { - listener->panelChanged (EvPixelShiftPrnu, a->getTextValue() ); - } else if (a == pixelShiftRedBlueWeight) { - listener->panelChanged (EvPixelShiftRedBlueWeight, a->getTextValue() ); -#endif + } else if (a == dualDemosaicContrast) { + listener->panelChanged (EvDemosaicContrast, a->getTextValue() ); } else if (a == pixelShiftEperIso) { listener->panelChanged (EvPixelShiftEperIso, a->getTextValue() ); } else if (a == pixelShiftSigma) { listener->panelChanged (EvPixelShiftSigma, a->getTextValue() ); } else if (a == pixelShiftSmooth) { listener->panelChanged (EvPixelShiftSmooth, a->getTextValue() ); + } else if (a == border) { + listener->panelChanged (EvDemosaicBorder, a->getTextValue() ); } } } -#ifdef PIXELSHIFTDEV -void BayerProcess::psMotionCorrectionChanged () -{ - if (!batchMode) { - if(pixelShiftMotionCorrection->get_active_row_number() == 5) { - pixelShiftBlur->set_sensitive(true); - pixelShiftHoleFill->set_sensitive(true); - pixelShiftSmooth->set_sensitive(pixelShiftBlur->getValue() != CheckValue::off); - } else { - pixelShiftBlur->set_sensitive(false); - pixelShiftHoleFill->set_sensitive(false); - pixelShiftSmooth->set_sensitive(false); - } - } - - if (listener) { - listener->panelChanged (EvPixelShiftMotionCorrection, pixelShiftMotionCorrection->get_active_text()); - } -} -#endif - void BayerProcess::methodChanged () { - const int curSelection = method->get_active_row_number(); - const RAWParams::BayerSensor::Method method = RAWParams::BayerSensor::Method(curSelection); + const int currentSelection = method->get_active_row_number(); + const RAWParams::BayerSensor::Method currentMethod = RAWParams::BayerSensor::Method(currentSelection); if (!batchMode) { - if (method == procparams::RAWParams::BayerSensor::Method::DCB) { + if (currentMethod == procparams::RAWParams::BayerSensor::Method::DCB || currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4) { dcbOptions->show(); } else { dcbOptions->hide(); } - if (method == procparams::RAWParams::BayerSensor::Method::LMMSE) { + if (currentMethod == procparams::RAWParams::BayerSensor::Method::LMMSE) { lmmseOptions->show(); } else { lmmseOptions->hide(); } - if (method == procparams::RAWParams::BayerSensor::Method::PIXELSHIFT) { + if (currentMethod == procparams::RAWParams::BayerSensor::Method::AMAZEVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::DCBVNG4 || currentMethod == procparams::RAWParams::BayerSensor::Method::RCDVNG4) { + dualDemosaicOptions->show(); + } else { + dualDemosaicOptions->hide(); + } + + if (currentMethod == procparams::RAWParams::BayerSensor::Method::PIXELSHIFT) { if(pixelShiftMotionMethod->get_active_row_number() == 2) { pixelShiftOptions->show(); } else { @@ -787,21 +590,22 @@ void BayerProcess::methodChanged () } } - Glib::ustring methodName = ""; - bool ppreq = false; - - if (curSelection >= 0 && curSelection < std::numeric_limits::max()) { - methodName = procparams::RAWParams::BayerSensor::getMethodString(method); - - if (method == procparams::RAWParams::BayerSensor::Method::MONO || RAWParams::BayerSensor::Method(oldMethod) == procparams::RAWParams::BayerSensor::Method::MONO) { - ppreq = true; - } + if (listener && method->get_active_row_number() >= 0) { + listener->panelChanged ( + currentMethod == procparams::RAWParams::BayerSensor::Method::MONO || RAWParams::BayerSensor::Method(oldMethod) == procparams::RAWParams::BayerSensor::Method::MONO + ? EvDemosaicMethodPreProc + : EvDemosaicMethod, method->get_active_text()); } - oldMethod = curSelection; + oldMethod = currentSelection; - if (listener) { - listener->panelChanged (ppreq ? EvDemosaicMethodPreProc : EvDemosaicMethod, methodName); +} + +void BayerProcess::pixelShiftDemosaicMethodChanged () +{ + + if (listener && pixelShiftDemosaicMethod->get_active_row_number() >= 0) { + listener->panelChanged (EvDemosaicPixelshiftDemosaicMethod, pixelShiftDemosaicMethod->get_active_text()); } } @@ -834,11 +638,6 @@ void BayerProcess::checkBoxToggled (CheckBox* c, CheckValue newval) listener->panelChanged (EvPixelShiftHoleFill, pixelShiftHoleFill->getValueAsStr ()); } } else if (c == pixelShiftMedian) { -#ifdef PIXELSHIFTDEV - if (!batchMode) { - pixelShiftMedian3->set_sensitive(newval != CheckValue::off); - } -#endif if (listener) { listener->panelChanged (EvPixelShiftMedian, pixelShiftMedian->getValueAsStr ()); } @@ -854,14 +653,6 @@ void BayerProcess::checkBoxToggled (CheckBox* c, CheckValue newval) if (listener) { listener->panelChanged (EvPixelShiftBlur, pixelShiftBlur->getValueAsStr ()); } - } else if (c == pixelShiftLmmse) { - 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); @@ -878,61 +669,33 @@ void BayerProcess::checkBoxToggled (CheckBox* c, CheckValue newval) listener->panelChanged (EvPixelShiftNonGreenCross, pixelShiftNonGreenCross->getValueAsStr ()); } } -#ifdef PIXELSHIFTDEV - else if (c == pixelShiftAutomatic) { - if (!batchMode) { - pixelShiftMotion->set_sensitive(newval != CheckValue::off); - pixelShiftEperIso->set_sensitive(newval != CheckValue::off); - pixelShiftNreadIso->set_sensitive(newval != CheckValue::off); - pixelShiftPrnu->set_sensitive(newval != CheckValue::off); - pixelShiftSigma->set_sensitive(newval != CheckValue::off); - pixelShiftSum->set_sensitive(newval != CheckValue::off); - pixelShiftRedBlueWeight->set_sensitive(newval != CheckValue::off); - pixelShiftStddevFactorGreen->set_sensitive(newval != CheckValue::off); - pixelShiftStddevFactorRed->set_sensitive(newval != CheckValue::off); - pixelShiftStddevFactorBlue->set_sensitive(newval != CheckValue::off); - pixelShiftNonGreenHorizontal->set_sensitive(newval != CheckValue::off); - pixelShiftNonGreenVertical->set_sensitive(newval != CheckValue::off); - pixelShiftHoleFill->set_sensitive(newval != CheckValue::off && pixelShiftMotionCorrection->get_active_row_number() == 5); - pixelShiftMedian3->set_sensitive(newval != CheckValue::off && pixelShiftMedian->getValue () != CheckValue::off); - pixelShiftGreen->set_sensitive(newval != CheckValue::off); - pixelShiftBlur->set_sensitive(newval != CheckValue::off && pixelShiftMotionCorrection->get_active_row_number() == 5); - pixelShiftSmooth->set_sensitive(newval != CheckValue::off && pixelShiftMotionCorrection->get_active_row_number() == 5 && pixelShiftBlur->getValue () != CheckValue::off); - pixelShiftExp0->set_sensitive(newval != CheckValue::off); - pixelShiftNonGreenCross->set_sensitive(newval != CheckValue::off); - pixelShiftNonGreenCross2->set_sensitive(newval != CheckValue::off); - pixelShiftNonGreenAmaze->set_sensitive(newval != CheckValue::off); +} + +void BayerProcess::adjusterAutoToggled(Adjuster* a, bool newval) +{ + if (multiImage) { + if (dualDemosaicContrast->getAutoInconsistent()) { + dualDemosaicContrast->setAutoInconsistent (false); + dualDemosaicContrast->setAutoValue (false); + } else if (lastAutoContrast) { + dualDemosaicContrast->setAutoInconsistent (true); } - if (listener) { - listener->panelChanged (EvPixelShiftAutomatic, pixelShiftAutomatic->getValueAsStr ()); - } - } else if (c == pixelShiftNonGreenHorizontal) { - if (listener) { - listener->panelChanged (EvPixelShiftNonGreenHorizontal, pixelShiftNonGreenHorizontal->getValueAsStr ()); - } - } else if (c == pixelShiftNonGreenVertical) { - if (listener) { - listener->panelChanged (EvPixelShiftNonGreenVertical, pixelShiftNonGreenVertical->getValueAsStr ()); - } - } else if (c == pixelShiftMedian3) { - if (listener) { - listener->panelChanged (EvPixelShiftMedian3, pixelShiftMedian3->getValueAsStr ()); - } - } else if (c == pixelShiftExp0) { - if (listener) { - listener->panelChanged (EvPixelShiftExp0, pixelShiftExp0->getValueAsStr ()); - } - } else if (c == pixelShiftNonGreenCross2) { - if (listener) { - listener->panelChanged (EvPixelShiftGreenAmaze, pixelShiftNonGreenCross2->getValueAsStr ()); - } - } else if (c == pixelShiftNonGreenAmaze) { - if (listener) { - listener->panelChanged (EvPixelShiftNonGreenAmaze, pixelShiftNonGreenAmaze->getValueAsStr ()); + lastAutoContrast = dualDemosaicContrast->getAutoValue(); + } + + if (listener) { + + if (a == dualDemosaicContrast) { + if (dualDemosaicContrast->getAutoInconsistent()) { + listener->panelChanged (EvDemosaicAutoContrast, M ("GENERAL_UNCHANGED")); + } else if (dualDemosaicContrast->getAutoValue()) { + listener->panelChanged (EvDemosaicAutoContrast, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvDemosaicAutoContrast, M ("GENERAL_DISABLED")); + } } } -#endif } void BayerProcess::pixelShiftMotionMethodChanged () @@ -946,66 +709,55 @@ void BayerProcess::pixelShiftMotionMethodChanged () pixelShiftOptions->show(); pixelShiftShowMotion->show(); pixelShiftShowMotionMaskOnly->show(); - } else { + } else if(pixelShiftMotionMethod->get_active_row_number() > 0) { pixelShiftOptions->hide(); pixelShiftShowMotion->show(); pixelShiftShowMotionMaskOnly->show(); } } - if (listener) { + if (listener && pixelShiftMotionMethod->get_active_row_number() >= 0) { listener->panelChanged (EvPixelShiftMotionMethod, pixelShiftMotionMethod->get_active_text()); } } void BayerProcess::FrameCountChanged(int n, int frameNum) { - struct Data { - BayerProcess *me; - int n; - int frameNum; - }; - const auto func = [](gpointer data) -> gboolean { - Data *d = static_cast(data); - BayerProcess *me = d->me; - me->imageNumber->block (true); - int n = d->n; - int frameNum = d->frameNum; + idle_register.add( + [this, n, frameNum]() -> bool + { + imageNumber->block(true); - me->imageNumber->remove_all(); - me->imageNumber->append("1"); - for(int i = 2; i <= std::min(n, 4); ++i) { - std::ostringstream entry; - entry << i; - me->imageNumber->append(entry.str()); + imageNumber->remove_all(); + imageNumber->append("1"); + for (int i = 2; i <= std::min(n, 4); ++i) { + std::ostringstream entry; + entry << i; + imageNumber->append(entry.str()); + } + if (n == 2) { + imageNumber->append(M("TP_RAW_IMAGENUM_SN")); + } + imageNumber->set_active(std::min(frameNum, n == 2 ? n : n - 1)); + if (n == 1) { + imageNumberBox->hide(); + } else { + imageNumberBox->show(); + } + imageNumber->block (false); + return false; } - me->imageNumber->set_active(std::min(frameNum, n - 1)); - if(n == 1) { - me->imageNumberBox->hide(); - } else { - me->imageNumberBox->show(); - } - me->imageNumber->block (false); - delete d; - return FALSE; - }; - - idle_register.add(func, new Data { this, n, frameNum }); - - // GThreadLock lock; - // imageNumber->block (true); - - // imageNumber->remove_all(); - // imageNumber->append("1"); - // for(int i = 2; i <= std::min(n, 4); ++i) { - // std::ostringstream entry; - // entry << i; - // imageNumber->append(entry.str()); - // } - // imageNumber->set_active(std::min(frameNum, n - 1)); - // if(n == 1) { - // imageNumberBox->hide(); - // } else { - // imageNumberBox->show(); - // } - // imageNumber->block (false); + ); +} + +void BayerProcess::autoContrastChanged (double autoContrast) +{ + idle_register.add( + [this, autoContrast]() -> bool + { + disableListener(); + dualDemosaicContrast->setValue(autoContrast); + enableListener(); + return false; + } + ); } diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index e1a620474..df0c39d00 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -25,13 +25,15 @@ #include "guiutils.h" #include "toolpanel.h" -class BayerProcess : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel, public rtengine::FrameCountListener +class BayerProcess : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel, public rtengine::FrameCountListener, public rtengine::AutoContrastListener { protected: MyComboBoxText* method; + Gtk::HBox* borderbox; Gtk::HBox *imageNumberBox; + Adjuster* border; MyComboBoxText* imageNumber; Adjuster* ccSteps; Gtk::VBox *dcbOptions; @@ -39,9 +41,10 @@ protected: CheckBox* dcbEnhance; Gtk::VBox *lmmseOptions; Adjuster* lmmseIterations; - Gtk::VBox *pixelShiftFrame; + Gtk::Frame *pixelShiftFrame; Gtk::VBox *pixelShiftOptions; MyComboBoxText* pixelShiftMotionMethod; + MyComboBoxText* pixelShiftDemosaicMethod; CheckBox* pixelShiftShowMotion; CheckBox* pixelShiftShowMotionMaskOnly; CheckBox* pixelShiftNonGreenCross; @@ -49,52 +52,42 @@ protected: CheckBox* pixelShiftBlur; CheckBox* pixelShiftHoleFill; CheckBox* pixelShiftMedian; -// CheckBox* pixelShiftOneGreen; - CheckBox* pixelShiftLmmse; CheckBox* pixelShiftEqualBright; CheckBox* pixelShiftEqualBrightChannel; Adjuster* pixelShiftSmooth; Adjuster* pixelShiftEperIso; Adjuster* pixelShiftSigma; -#ifdef PIXELSHIFTDEV - Adjuster* pixelShiftSum; - Adjuster* pixelShiftMotion; - MyComboBoxText* pixelShiftMotionCorrection; - CheckBox* pixelShiftAutomatic; - CheckBox* pixelShiftNonGreenHorizontal; - CheckBox* pixelShiftNonGreenVertical; - CheckBox* pixelShiftNonGreenCross2; - CheckBox* pixelShiftNonGreenAmaze; - CheckBox* pixelShiftExp0; - CheckBox* pixelShiftMedian3; - Adjuster* pixelShiftStddevFactorGreen; - Adjuster* pixelShiftStddevFactorRed; - Adjuster* pixelShiftStddevFactorBlue; - Adjuster* pixelShiftNreadIso; - Adjuster* pixelShiftPrnu; - Adjuster* pixelShiftRedBlueWeight; -#endif + Gtk::VBox *dualDemosaicOptions; + Adjuster* dualDemosaicContrast; int oldMethod; - + bool lastAutoContrast; IdleRegister idle_register; + + rtengine::ProcEvent EvDemosaicBorder; + rtengine::ProcEvent EvDemosaicAutoContrast; + rtengine::ProcEvent EvDemosaicContrast; + rtengine::ProcEvent EvDemosaicPixelshiftDemosaicMethod; public: BayerProcess (); + ~BayerProcess () override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setAdjusterBehavior(bool falsecoloradd, bool iteradd, bool dualdemozecontrastadd, bool pssigmaadd, bool pssmoothadd, bool pseperisoadd); + void trimValues(rtengine::procparams::ProcParams* pp) override; + void setBatchMode(bool batchMode) override; + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; - void methodChanged (); - void imageNumberChanged (); - void adjusterChanged (Adjuster* a, double newval); - void checkBoxToggled (CheckBox* c, CheckValue newval); + void methodChanged(); + void imageNumberChanged(); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; + void checkBoxToggled(CheckBox* c, CheckValue newval) override; void pixelShiftMotionMethodChanged(); - void FrameCountChanged(int n, int frameNum); -#ifdef PIXELSHIFTDEV - void psMotionCorrectionChanged (); -#endif + void pixelShiftDemosaicMethodChanged(); + void autoContrastChanged (double autoContrast) override; + void FrameCountChanged(int n, int frameNum) override; }; #endif diff --git a/rtgui/bayerrawexposure.cc b/rtgui/bayerrawexposure.cc index 2194d1639..d49486511 100644 --- a/rtgui/bayerrawexposure.cc +++ b/rtgui/bayerrawexposure.cc @@ -17,8 +17,11 @@ * along with RawTherapee. If not, see . */ #include "bayerrawexposure.h" + #include "guiutils.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -65,6 +68,11 @@ BayerRAWExposure::BayerRAWExposure () : FoldableToolPanel(this, "bayerrawexposur pack_start( *PexBlack3, Gtk::PACK_SHRINK, 0);//black G2 pack_start( *PexBlack2, Gtk::PACK_SHRINK, 0);//black B pack_start( *PextwoGreen, Gtk::PACK_SHRINK, 0);//black 2 green + + PexBlack0->setLogScale(100, 0); + PexBlack1->setLogScale(100, 0); + PexBlack2->setLogScale(100, 0); + PexBlack3->setLogScale(100, 0); } void BayerRAWExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) @@ -116,7 +124,7 @@ void BayerRAWExposure::write( rtengine::procparams::ProcParams* pp, ParamsEdited } -void BayerRAWExposure::adjusterChanged (Adjuster* a, double newval) +void BayerRAWExposure::adjusterChanged(Adjuster* a, double newval) { if (listener) { Glib::ustring value = a->getTextValue(); @@ -143,6 +151,10 @@ void BayerRAWExposure::adjusterChanged (Adjuster* a, double newval) } } +void BayerRAWExposure::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void BayerRAWExposure::checkBoxToggled (CheckBox* c, CheckValue newval) { if (c == PextwoGreen) { diff --git a/rtgui/bayerrawexposure.h b/rtgui/bayerrawexposure.h index 5d51babbb..08d415838 100644 --- a/rtgui/bayerrawexposure.h +++ b/rtgui/bayerrawexposure.h @@ -38,14 +38,15 @@ public: BayerRAWExposure (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void adjusterChanged (Adjuster* a, double newval); - void checkBoxToggled (CheckBox* c, CheckValue newval); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; + void checkBoxToggled (CheckBox* c, CheckValue newval) override; void setAdjusterBehavior (bool pexblackadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/blackwhite.cc b/rtgui/blackwhite.cc index 0788a465d..48d37ebab 100644 --- a/rtgui/blackwhite.cc +++ b/rtgui/blackwhite.cc @@ -16,13 +16,17 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "blackwhite.h" -#include "rtimage.h" -#include "../rtengine/color.h" #include #include -#include "guiutils.h" + +#include "blackwhite.h" + #include "edit.h" +#include "guiutils.h" +#include "rtimage.h" + +#include "../rtengine/color.h" +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -90,11 +94,9 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB autoHBox = Gtk::manage (new Gtk::HBox ()); autoch = Gtk::manage (new Gtk::ToggleButton (M("TP_BWMIX_AUTOCH"))); - autoch->set_tooltip_markup (M("TP_BWMIX_AUTOCH_TIP")); autoconn = autoch->signal_toggled().connect( sigc::mem_fun(*this, &BlackWhite::autoch_toggled) ); neutral = Gtk::manage (new Gtk::Button (M("TP_BWMIX_NEUTRAL"))); - neutral->set_tooltip_text (M("TP_BWMIX_NEUTRAL_TIP")); neutralconn = neutral->signal_pressed().connect( sigc::mem_fun(*this, &BlackWhite::neutral_pressed) ); neutral->show(); @@ -130,7 +132,7 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB setting->append (M("TP_BWMIX_SET_ROYGCBPMREL")); setting->append (M("TP_BWMIX_SET_INFRARED")); - setting->set_active (0); + setting->set_active (11); settingHBox->pack_start (*setting); mixerVBox->pack_start (*settingHBox); settingconn = setting->signal_changed().connect ( sigc::mem_fun(*this, &BlackWhite::settingChanged) ); @@ -181,18 +183,18 @@ BlackWhite::BlackWhite (): FoldableToolPanel(this, "blackwhite", M("TP_BWMIX_LAB //----------- RGB / ROYGCBPM Mixer ------------------------------ - imgIcon[0] = Gtk::manage (new RTImage ("Chanmixer-R.png")); - imgIcon[1] = Gtk::manage (new RTImage ("Chanmixer-O.png")); - imgIcon[2] = Gtk::manage (new RTImage ("Chanmixer-Y.png")); - imgIcon[3] = Gtk::manage (new RTImage ("Chanmixer-G.png")); - imgIcon[4] = Gtk::manage (new RTImage ("Chanmixer-C.png")); - imgIcon[5] = Gtk::manage (new RTImage ("Chanmixer-B.png")); - imgIcon[6] = Gtk::manage (new RTImage ("Chanmixer-P.png")); - imgIcon[7] = Gtk::manage (new RTImage ("Chanmixer-M.png")); + imgIcon[0] = Gtk::manage (new RTImage ("circle-red-small.png")); + imgIcon[1] = Gtk::manage (new RTImage ("circle-orange-small.png")); + imgIcon[2] = Gtk::manage (new RTImage ("circle-yellow-small.png")); + imgIcon[3] = Gtk::manage (new RTImage ("circle-green-small.png")); + imgIcon[4] = Gtk::manage (new RTImage ("circle-cyan-small.png")); + imgIcon[5] = Gtk::manage (new RTImage ("circle-blue-small.png")); + imgIcon[6] = Gtk::manage (new RTImage ("circle-purple-small.png")); + imgIcon[7] = Gtk::manage (new RTImage ("circle-magenta-small.png")); - imgIcon[8] = Gtk::manage (new RTImage ("Chanmixer-Rgamma.png")); - imgIcon[9] = Gtk::manage (new RTImage ("Chanmixer-Ggamma.png")); - imgIcon[10] = Gtk::manage (new RTImage ("Chanmixer-Bgamma.png")); + imgIcon[8] = Gtk::manage (new RTImage ("circle-empty-red-small.png")); + imgIcon[9] = Gtk::manage (new RTImage ("circle-empty-green-small.png")); + imgIcon[10] = Gtk::manage (new RTImage ("circle-empty-blue-small.png")); mixerVBox->pack_start (*Gtk::manage (new Gtk::HSeparator())); @@ -377,12 +379,13 @@ void BlackWhite::BWChanged (double redbw, double greenbw, double bluebw) nextgreenbw = greenbw; nextbluebw = bluebw; - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->BWComputed_(); - return FALSE; - }; - - idle_register.add(func, this); + idle_register.add( + [this]() -> bool + { + BWComputed_(); + return false; + } + ); } bool BlackWhite::BWComputed_ () @@ -390,9 +393,21 @@ bool BlackWhite::BWComputed_ () disableListener (); mixerRed->setValue (nextredbw); + adjusterChanged(mixerRed, mixerRed->getValue()); mixerGreen->setValue (nextgreenbw); + adjusterChanged(mixerGreen, mixerGreen->getValue()); mixerBlue->setValue (nextbluebw); + adjusterChanged(mixerBlue, mixerBlue->getValue()); + autoconn.block (true); + autoch->set_active (true); + autoconn.block (false); + lastAuto = false; + nextcount++; enableListener (); + if (listener && nextcount <= 1 ) { + // activated only 1 time, but perhaps in some cases if we want that all is update pp3, auto, sliders : nextcount <= 2 but it cost time and result is identical + listener->panelChanged (EvAutoch, M("GENERAL_ENABLED")); + } updateRGBLabel(); @@ -791,6 +806,7 @@ void BlackWhite::filterChanged () if (listener && (multiImage || getEnabled())) { listener->panelChanged (EvBWfilter, filter->get_active_text ()); + listener->panelChanged (EvAutoch, M("GENERAL_ENABLED")); } } @@ -886,8 +902,9 @@ void BlackWhite::neutral_pressed () updateRGBLabel(); + nextcount = 0; if(listener) { - listener->panelChanged (EvNeutralBW, M("ADJUSTER_RESET_TO_DEFAULT")); + listener->panelChanged (EvNeutralBW, M("GENERAL_RESET")); } } @@ -1082,15 +1099,15 @@ void BlackWhite::autoch_toggled () } -void BlackWhite::adjusterChanged (Adjuster* a, double newval) +void BlackWhite::adjusterChanged(Adjuster* a, double newval) { - // Checking "listener" to avoid "autoch" getting toggled off because it has to change the sliders when toggling on if (listener && (a == mixerRed || a == mixerGreen || a == mixerBlue || a == mixerOrange || a == mixerYellow || a == mixerMagenta || a == mixerPurple || a == mixerCyan) ) { if (multiImage && autoch->get_inconsistent()) { autoch->set_inconsistent (false); } + nextcount = 0; autoconn.block(true); autoch->set_active (false); autoconn.block(false); @@ -1134,6 +1151,10 @@ void BlackWhite::adjusterChanged (Adjuster* a, double newval) } } +void BlackWhite::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void BlackWhite::updateRGBLabel () { if (!batchMode) { diff --git a/rtgui/blackwhite.h b/rtgui/blackwhite.h index 5f0ffec44..45f1e5b7b 100644 --- a/rtgui/blackwhite.h +++ b/rtgui/blackwhite.h @@ -39,31 +39,32 @@ class BlackWhite final : public: BlackWhite (); - ~BlackWhite (); + ~BlackWhite () override; - 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 autoOpenCurve (); - void setEditProvider (EditDataProvider *provider); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void autoOpenCurve () override; + void setEditProvider (EditDataProvider *provider) override; void autoch_toggled (); void neutral_pressed (); void updateRGBLabel (); - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; void setAdjusterBehavior (bool bwadd, bool bwgadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; void enabledcc_toggled (); - void enabledChanged (); + void enabledChanged () override; void methodChanged (); void filterChanged (); void settingChanged (); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); - void BWChanged (double redbw, double greenbw, double bluebw); + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; + void BWChanged (double redbw, double greenbw, double bluebw) override; bool BWComputed_ (); - void curveChanged (CurveEditor* ce); + void curveChanged (CurveEditor* ce) override; void curveMode1Changed (); bool curveMode1Changed_ (); void curveMode1Changed2 (); @@ -138,6 +139,7 @@ private: double nextredbw; double nextgreenbw; double nextbluebw; + int nextcount = 0; IdleRegister idle_register; }; diff --git a/rtgui/bqentryupdater.cc b/rtgui/bqentryupdater.cc index 1bb7e4257..f5adf56f9 100644 --- a/rtgui/bqentryupdater.cc +++ b/rtgui/bqentryupdater.cc @@ -73,14 +73,8 @@ void BatchQueueEntryUpdater::process (guint8* oimg, int ow, int oh, int newh, BQ 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 --git a/rtgui/bqentryupdater.h b/rtgui/bqentryupdater.h index 75040b109..e25f5aed4 100644 --- a/rtgui/bqentryupdater.h +++ b/rtgui/bqentryupdater.h @@ -28,8 +28,8 @@ class BQEntryUpdateListener { public: - virtual ~BQEntryUpdateListener () {} - virtual void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) {} + virtual ~BQEntryUpdateListener() = default; + virtual void updateImage(guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) = 0; }; class BatchQueueEntryUpdater diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc index dbb3b2946..35aeb6c91 100644 --- a/rtgui/cacheimagedata.cc +++ b/rtgui/cacheimagedata.cc @@ -22,6 +22,8 @@ #include "version.h" #include +#include "../rtengine/procparams.h" + 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), frameCount(1), @@ -301,3 +303,7 @@ int CacheImageData::save (const Glib::ustring& fname) } } +rtengine::procparams::IPTCPairs CacheImageData::getIPTCData(unsigned int frame) const +{ + return {}; +} diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h index 52675d77b..d3aea803b 100644 --- a/rtgui/cacheimagedata.h +++ b/rtgui/cacheimagedata.h @@ -29,7 +29,7 @@ class CacheImageData: public rtengine::FramesMetaData public: - // basic informations + // basic information Glib::ustring md5; Glib::ustring version; bool supported; @@ -87,29 +87,30 @@ public: // FramesMetaData interface //------------------------------------------------------------------------- - 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; } + unsigned int getRootCount () const override { return -1; } + unsigned int getFrameCount () const override { return frameCount; } + bool hasExif (unsigned int frame = 0) const override { return false; } + rtexif::TagDirectory* getRootExifData (unsigned int root = 0) const override { return nullptr; } + rtexif::TagDirectory* getFrameExifData (unsigned int frame = 0) const override { return nullptr; } + rtexif::TagDirectory* getBestExifData (rtengine::ImageSource *imgSource, rtengine::procparams::RAWParams *rawParams) const override { return nullptr; } + bool hasIPTC (unsigned int frame = 0) const override { return false; } + rtengine::procparams::IPTCPairs getIPTCData (unsigned int frame = 0) const override; + tm getDateTime (unsigned int frame = 0) const override { return tm{}; } + time_t getDateTimeAsTS(unsigned int frame = 0) const override { return time_t(-1); } + int getISOSpeed (unsigned int frame = 0) const override { return iso; } + double getFNumber (unsigned int frame = 0) const override { return fnumber; } + double getFocalLen (unsigned int frame = 0) const override { return focalLen; } + double getFocalLen35mm (unsigned int frame = 0) const override { return focalLen35mm; } + float getFocusDist (unsigned int frame = 0) const override { return focusDist; } + double getShutterSpeed (unsigned int frame = 0) const override { return shutter; } + double getExpComp (unsigned int frame = 0) const override { return atof(expcomp.c_str()); } + std::string getMake (unsigned int frame = 0) const override { return camMake; } + std::string getModel (unsigned int frame = 0) const override { return camModel; } + std::string getLens (unsigned int frame = 0) const override { return lens; } + std::string getOrientation (unsigned int frame = 0) const override { return ""; } // TODO + bool getPixelShift () const override { return isPixelShift; } + bool getHDR (unsigned int frame = 0) const override { return isHDR; } + std::string getImageType (unsigned int frame) const override { return isPixelShift ? "PS" : isHDR ? "HDR" : "STD"; } + rtengine::IIOSampleFormat getSampleFormat (unsigned int frame = 0) const override { return sampleFormat; } }; #endif diff --git a/rtgui/cachemanager.cc b/rtgui/cachemanager.cc index 5b18d5d33..d86f6c41f 100644 --- a/rtgui/cachemanager.cc +++ b/rtgui/cachemanager.cc @@ -57,7 +57,9 @@ void CacheManager::init () auto error = g_mkdir_with_parents (baseDir.c_str(), cacheDirMode); for (const auto& cacheDir : cacheDirs) { - error |= g_mkdir_with_parents (Glib::build_filename (baseDir, cacheDir).c_str(), cacheDirMode); + if (strncmp(cacheDir, "aehistograms", 12)) { // don't create aehistograms folder. + error |= g_mkdir_with_parents (Glib::build_filename (baseDir, cacheDir).c_str(), cacheDirMode); + } } if (error != 0 && options.rtSettings.verbose) { @@ -172,7 +174,7 @@ void CacheManager::deleteEntry (const Glib::ustring& fname) void CacheManager::clearFromCache (const Glib::ustring& fname, bool purge) const { - deleteFiles (fname, getMD5 (fname), purge, purge); + deleteFiles (fname, getMD5 (fname), true, purge); } void CacheManager::renameEntry (const std::string& oldfilename, const std::string& oldmd5, const std::string& newfilename) @@ -183,9 +185,6 @@ void CacheManager::renameEntry (const std::string& oldfilename, const std::strin auto error = g_rename (getCacheFileName ("profiles", oldfilename, paramFileExtension, oldmd5).c_str (), getCacheFileName ("profiles", newfilename, paramFileExtension, newmd5).c_str ()); error |= g_rename (getCacheFileName ("images", oldfilename, ".rtti", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".rtti", newmd5).c_str ()); - error |= g_rename (getCacheFileName ("images", oldfilename, ".cust16", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".cust16", newmd5).c_str ()); - error |= g_rename (getCacheFileName ("images", oldfilename, ".cust", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".cust", newmd5).c_str ()); - error |= g_rename (getCacheFileName ("images", oldfilename, ".jpg", oldmd5).c_str (), getCacheFileName ("images", newfilename, ".jpg", newmd5).c_str ()); error |= g_rename (getCacheFileName ("aehistograms", oldfilename, "", oldmd5).c_str (), getCacheFileName ("aehistograms", newfilename, "", newmd5).c_str ()); error |= g_rename (getCacheFileName ("embprofiles", oldfilename, ".icc", oldmd5).c_str (), getCacheFileName ("embprofiles", newfilename, ".icc", newmd5).c_str ()); error |= g_rename (getCacheFileName ("data", oldfilename, ".txt", oldmd5).c_str (), getCacheFileName ("data", newfilename, ".txt", newmd5).c_str ()); @@ -238,6 +237,7 @@ void CacheManager::clearImages () const { MyMutex::MyLock lock (mutex); + deleteDir ("data"); deleteDir ("images"); deleteDir ("aehistograms"); deleteDir ("embprofiles"); @@ -275,9 +275,6 @@ void CacheManager::deleteFiles (const Glib::ustring& fname, const std::string& m } auto error = g_remove (getCacheFileName ("images", fname, ".rtti", md5).c_str ()); - error |= g_remove (getCacheFileName ("images", fname, ".cust16", md5).c_str ()); - error |= g_remove (getCacheFileName ("images", fname, ".cust", md5).c_str ()); - error |= g_remove (getCacheFileName ("images", fname, ".jpg", md5).c_str ()); error |= g_remove (getCacheFileName ("aehistograms", fname, "", md5).c_str ()); error |= g_remove (getCacheFileName ("embprofiles", fname, ".icc", md5).c_str ()); @@ -342,6 +339,25 @@ Glib::ustring CacheManager::getCacheFileName (const Glib::ustring& subDir, void CacheManager::applyCacheSizeLimitation () const { + // first count files without fetching file name and timestamp. + std::size_t numFiles = 0; + try { + + const auto dirName = Glib::build_filename (baseDir, "data"); + const auto dir = Gio::File::create_for_path (dirName); + + auto enumerator = dir->enumerate_children (""); + + while (numFiles <= options.maxCacheEntries && enumerator->next_file ()) { + ++numFiles; + } + + } catch (Glib::Exception&) {} + + if (numFiles <= options.maxCacheEntries) { + return; + } + using FNameMTime = std::pair; std::vector files; diff --git a/rtgui/cacorrection.cc b/rtgui/cacorrection.cc index e303b5660..c91eec145 100644 --- a/rtgui/cacorrection.cc +++ b/rtgui/cacorrection.cc @@ -16,20 +16,24 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "cacorrection.h" #include + +#include "cacorrection.h" + #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; CACorrection::CACorrection () : FoldableToolPanel(this, "cacorrection", M("TP_CACORRECTION_LABEL")) { - Gtk::Image* icaredL = Gtk::manage (new RTImage ("ajd-ca-red1.png")); - Gtk::Image* icaredR = Gtk::manage (new RTImage ("ajd-ca-red2.png")); - Gtk::Image* icablueL = Gtk::manage (new RTImage ("ajd-ca-blue1.png")); - Gtk::Image* icablueR = Gtk::manage (new RTImage ("ajd-ca-blue2.png")); + Gtk::Image* icaredL = Gtk::manage (new RTImage ("circle-red-cyan-small.png")); + Gtk::Image* icaredR = Gtk::manage (new RTImage ("circle-cyan-red-small.png")); + Gtk::Image* icablueL = Gtk::manage (new RTImage ("circle-blue-yellow-small.png")); + Gtk::Image* icablueR = Gtk::manage (new RTImage ("circle-yellow-blue-small.png")); red = Gtk::manage (new Adjuster (M("TP_CACORRECTION_RED"), -0.005, 0.005, 0.0001, 0, icaredL, icaredR)); red->setAdjusterListener (this); @@ -40,6 +44,9 @@ CACorrection::CACorrection () : FoldableToolPanel(this, "cacorrection", M("TP_CA pack_start (*red); pack_start (*blue); + red->setLogScale(10, 0); + blue->setLogScale(10, 0); + show_all(); } @@ -94,6 +101,10 @@ void CACorrection::adjusterChanged (Adjuster* a, double newval) } } +void CACorrection::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void CACorrection::setAdjusterBehavior (bool badd) { diff --git a/rtgui/cacorrection.h b/rtgui/cacorrection.h index fd34bc942..198037060 100644 --- a/rtgui/cacorrection.h +++ b/rtgui/cacorrection.h @@ -34,14 +34,15 @@ public: CACorrection (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; void setAdjusterBehavior (bool badd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/checkbox.h b/rtgui/checkbox.h index 5b3088704..b5ab4945f 100644 --- a/rtgui/checkbox.h +++ b/rtgui/checkbox.h @@ -33,10 +33,9 @@ enum class CheckValue { class CheckBoxListener { - public: - virtual ~CheckBoxListener() {}; - virtual void checkBoxToggled (CheckBox* c, CheckValue newval) {} + virtual ~CheckBoxListener() = default; + virtual void checkBoxToggled(CheckBox* c, CheckValue newval) = 0; }; diff --git a/rtgui/chmixer.cc b/rtgui/chmixer.cc index c6c098883..4a3411e8b 100644 --- a/rtgui/chmixer.cc +++ b/rtgui/chmixer.cc @@ -17,31 +17,35 @@ * along with RawTherapee. If not, see . */ #include "chmixer.h" + #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), false, true) { - imgIcon[0] = Gtk::manage (new RTImage ("Chanmixer-RR.png")); - imgIcon[1] = Gtk::manage (new RTImage ("Chanmixer-RG.png")); - imgIcon[2] = Gtk::manage (new RTImage ("Chanmixer-RB.png")); - imgIcon[3] = Gtk::manage (new RTImage ("Chanmixer-GR.png")); - imgIcon[4] = Gtk::manage (new RTImage ("Chanmixer-GG.png")); - imgIcon[5] = Gtk::manage (new RTImage ("Chanmixer-GB.png")); - imgIcon[6] = Gtk::manage (new RTImage ("Chanmixer-BR.png")); - imgIcon[7] = Gtk::manage (new RTImage ("Chanmixer-BG.png")); - imgIcon[8] = Gtk::manage (new RTImage ("Chanmixer-BB.png")); + imgIcon[0] = Gtk::manage (new RTImage ("circle-red-small.png")); + imgIcon[1] = Gtk::manage (new RTImage ("circle-green-red-small.png")); + imgIcon[2] = Gtk::manage (new RTImage ("circle-blue-red-small.png")); + imgIcon[3] = Gtk::manage (new RTImage ("circle-red-green-small.png")); + imgIcon[4] = Gtk::manage (new RTImage ("circle-green-small.png")); + imgIcon[5] = Gtk::manage (new RTImage ("circle-blue-green-small.png")); + imgIcon[6] = Gtk::manage (new RTImage ("circle-red-blue-small.png")); + imgIcon[7] = Gtk::manage (new RTImage ("circle-green-blue-small.png")); + imgIcon[8] = Gtk::manage (new RTImage ("circle-blue-small.png")); Gtk::Label* rlabel = Gtk::manage (new Gtk::Label ()); rlabel->set_markup (Glib::ustring("\t") + M("TP_CHMIXER_RED") + Glib::ustring(":")); rlabel->set_alignment(Gtk::ALIGN_START); - red[0] = Gtk::manage (new Adjuster ("", -200, 200, 1, 100, imgIcon[0])); - red[1] = Gtk::manage (new Adjuster ("", -200, 200, 1, 0, imgIcon[1])); - red[2] = Gtk::manage (new Adjuster ("", -200, 200, 1, 0, imgIcon[2])); + constexpr double RANGE = 500.0; + red[0] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 100, imgIcon[0])); + red[1] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 0, imgIcon[1])); + red[2] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 0, imgIcon[2])); Gtk::HSeparator* rsep = Gtk::manage (new Gtk::HSeparator ()); @@ -58,9 +62,9 @@ ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), f glabel->set_alignment(Gtk::ALIGN_START); - green[0] = Gtk::manage (new Adjuster ("", -200, 200, 1, 0, imgIcon[3])); - green[1] = Gtk::manage (new Adjuster ("", -200, 200, 1, 100, imgIcon[4])); - green[2] = Gtk::manage (new Adjuster ("", -200, 200, 1, 0, imgIcon[5])); + green[0] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 0, imgIcon[3])); + green[1] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 100, imgIcon[4])); + green[2] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 0, imgIcon[5])); Gtk::HSeparator* gsep = Gtk::manage (new Gtk::HSeparator ()); @@ -75,14 +79,18 @@ ChMixer::ChMixer (): FoldableToolPanel(this, "chmixer", M("TP_CHMIXER_LABEL"), f Gtk::Label* blabel = Gtk::manage (new Gtk::Label ()); blabel->set_markup (Glib::ustring("\t") + M("TP_CHMIXER_BLUE") + Glib::ustring(":")); blabel->set_alignment(Gtk::ALIGN_START); - blue[0] = Gtk::manage (new Adjuster ("", -200, 200, 1, 0, imgIcon[6])); - blue[1] = Gtk::manage (new Adjuster ("", -200, 200, 1, 0, imgIcon[7])); - blue[2] = Gtk::manage (new Adjuster ("", -200, 200, 1, 100, imgIcon[8])); + blue[0] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 0, imgIcon[6])); + blue[1] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 0, imgIcon[7])); + blue[2] = Gtk::manage (new Adjuster ("", -RANGE, RANGE, 0.1, 100, imgIcon[8])); for (int i = 0; i < 3; i++) { red[i]->setAdjusterListener (this); green[i]->setAdjusterListener (this); blue[i]->setAdjusterListener (this); + + red[i]->setLogScale(10, red[i]->getValue()); + green[i]->setLogScale(10, green[i]->getValue()); + blue[i]->setLogScale(10, blue[i]->getValue()); } pack_start (*blabel); @@ -111,9 +119,9 @@ void ChMixer::read (const ProcParams* pp, const ParamsEdited* pedited) } for (int i = 0; i < 3; i++) { - red[i]->setValue (pp->chmixer.red[i]); - green[i]->setValue (pp->chmixer.green[i]); - blue[i]->setValue (pp->chmixer.blue[i]); + red[i]->setValue (pp->chmixer.red[i] / 10.0); + green[i]->setValue (pp->chmixer.green[i] / 10.0); + blue[i]->setValue (pp->chmixer.blue[i] / 10.0); } enableListener (); @@ -123,9 +131,9 @@ void ChMixer::write (ProcParams* pp, ParamsEdited* pedited) { for (int i = 0; i < 3; i++) { - pp->chmixer.red[i] = (int) red[i]->getValue (); - pp->chmixer.green[i] = (int) green[i]->getValue (); - pp->chmixer.blue[i] = (int) blue[i]->getValue (); + pp->chmixer.red[i] = red[i]->getValue() * 10; + pp->chmixer.green[i] = green[i]->getValue() * 10; + pp->chmixer.blue[i] = blue[i]->getValue() * 10; } pp->chmixer.enabled = getEnabled(); @@ -143,9 +151,9 @@ void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi { for (int i = 0; i < 3; i++) { - red[i]->setDefault (defParams->chmixer.red[i]); - green[i]->setDefault (defParams->chmixer.green[i]); - blue[i]->setDefault (defParams->chmixer.blue[i]); + red[i]->setDefault (defParams->chmixer.red[i] / 10.f); + green[i]->setDefault (defParams->chmixer.green[i] / 10.f); + blue[i]->setDefault (defParams->chmixer.blue[i] / 10.f); } if (pedited) @@ -162,18 +170,21 @@ void ChMixer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi } } -void ChMixer::adjusterChanged (Adjuster* a, double newval) +void ChMixer::adjusterChanged(Adjuster* a, double newval) { 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(), - (int)blue[0]->getValue(), (int)blue[1]->getValue(), (int)blue[2]->getValue()); + red[0]->getValue(), red[1]->getValue(), red[2]->getValue(), + green[0]->getValue(), green[1]->getValue(), green[2]->getValue(), + blue[0]->getValue(), blue[1]->getValue(), blue[2]->getValue()); listener->panelChanged (EvChMixer, descr); } } +void ChMixer::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} void ChMixer::enabledChanged() { @@ -215,8 +226,14 @@ void ChMixer::trimValues (rtengine::procparams::ProcParams* pp) { for (int i = 0; i < 3; i++) { - red[i]->trimValue(pp->chmixer.red[i]); - green[i]->trimValue(pp->chmixer.green[i]); - blue[i]->trimValue(pp->chmixer.blue[i]); + double r = pp->chmixer.red[i] / 10.0; + double g = pp->chmixer.green[i] / 10.0; + double b = pp->chmixer.blue[i] / 10.0; + red[i]->trimValue(r); + green[i]->trimValue(g); + blue[i]->trimValue(b); + pp->chmixer.red[i] = r * 10; + pp->chmixer.green[i] = g * 10; + pp->chmixer.blue[i] = b * 10; } } diff --git a/rtgui/chmixer.h b/rtgui/chmixer.h index 410ac0d16..7e372cbc2 100644 --- a/rtgui/chmixer.h +++ b/rtgui/chmixer.h @@ -36,15 +36,16 @@ public: ChMixer (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; void setAdjusterBehavior (bool rgbadd); - void trimValues (rtengine::procparams::ProcParams* pp); - void enabledChanged(); + void trimValues (rtengine::procparams::ProcParams* pp) override; + void enabledChanged() override; }; #endif diff --git a/rtgui/clipboard.cc b/rtgui/clipboard.cc index dfd78cdd1..c8eb94d7b 100644 --- a/rtgui/clipboard.cc +++ b/rtgui/clipboard.cc @@ -18,62 +18,146 @@ */ #include "clipboard.h" +#include "../rtengine/procparams.h" + Clipboard clipboard; -Clipboard::Clipboard () : _hasIPTC(false), partProfile (false), hasDiagonalCurveDataType(DCT_Empty), hasFlatCurveDataType(FCT_Empty) {} +Clipboard::Clipboard () : + _hasIPTC(false), + iptc(new rtengine::procparams::IPTCPairs), + partProfile(new rtengine::procparams::PartialProfile(false)), + hasDiagonalCurveDataType(DCT_Empty), + hasFlatCurveDataType(FCT_Empty) +{ +} Clipboard::~Clipboard () { - partProfile.deleteInstance(); + partProfile->deleteInstance(); +} + +bool Clipboard::hasIPTC() const +{ + return _hasIPTC; +} + +const rtengine::procparams::IPTCPairs& Clipboard::getIPTC() const +{ + return *iptc; +} + +void Clipboard::setIPTC(const rtengine::procparams::IPTCPairs& iptcc) +{ + *iptc = iptcc; + _hasIPTC = true; +} + +const rtengine::procparams::PartialProfile& Clipboard::getPartialProfile() const +{ + return *partProfile; } /* * set both the "pparams" and "pedited" field of the PartialProfile; each one can be NULL */ -void Clipboard::setPartialProfile (const rtengine::procparams::PartialProfile& pprofile) +void Clipboard::setPartialProfile(const rtengine::procparams::PartialProfile& pprofile) { if (pprofile.pparams) { - if (!partProfile.pparams) { - partProfile.pparams = new rtengine::procparams::ProcParams(); + if (!partProfile->pparams) { + partProfile->pparams = new rtengine::procparams::ProcParams(); } - *partProfile.pparams = *pprofile.pparams; + *partProfile->pparams = *pprofile.pparams; } else { - if (partProfile.pparams) { - delete partProfile.pparams; - partProfile.pparams = nullptr; + if (partProfile->pparams) { + delete partProfile->pparams; + partProfile->pparams = nullptr; } } if (pprofile.pedited) { - if (!partProfile.pedited) { - partProfile.pedited = new ParamsEdited(); + if (!partProfile->pedited) { + partProfile->pedited = new ParamsEdited(); } - *partProfile.pedited = *pprofile.pedited; + *partProfile->pedited = *pprofile.pedited; } else { - if (partProfile.pedited) { - delete partProfile.pedited; - partProfile.pedited = nullptr; + if (partProfile->pedited) { + delete partProfile->pedited; + partProfile->pedited = nullptr; } } } +const rtengine::procparams::ProcParams& Clipboard::getProcParams() const +{ + return *partProfile->pparams; +} + /* * this method copy the procparams to "pparams" and delete "pedited" */ -void Clipboard::setProcParams (const rtengine::procparams::ProcParams& pparams) +void Clipboard::setProcParams(const rtengine::procparams::ProcParams& pparams) { // copy procparams - if (!partProfile.pparams) { - partProfile.pparams = new rtengine::procparams::ProcParams(); + if (!partProfile->pparams) { + partProfile->pparams = new rtengine::procparams::ProcParams(); } - *partProfile.pparams = pparams; + *partProfile->pparams = pparams; // delete pedited - if (partProfile.pedited) { - delete partProfile.pedited; - partProfile.pedited = nullptr; + if (partProfile->pedited) { + delete partProfile->pedited; + partProfile->pedited = nullptr; } } + +const ParamsEdited& Clipboard::getParamsEdited() const +{ + return *partProfile->pedited; +} + +bool Clipboard::hasProcParams() const +{ + return partProfile->pparams; +} + +bool Clipboard::hasPEdited() const +{ + return partProfile->pedited; +} + +DiagonalCurveType Clipboard::hasDiagonalCurveData() const +{ + return hasDiagonalCurveDataType; +} + +const std::vector& Clipboard::getDiagonalCurveData() const +{ + return diagonalCurve; +} + +void Clipboard::setDiagonalCurveData(const std::vector& p, DiagonalCurveType type) +{ + diagonalCurve = p; + hasDiagonalCurveDataType = type; + return; +} + +FlatCurveType Clipboard::hasFlatCurveData() const +{ + return hasFlatCurveDataType; +} + +const std::vector& Clipboard:: getFlatCurveData() const +{ + return flatCurve; +} + +void Clipboard::setFlatCurveData(const std::vector& p, FlatCurveType type) +{ + flatCurve = p; + hasFlatCurveDataType = type; + return; +} diff --git a/rtgui/clipboard.h b/rtgui/clipboard.h index eff5c08c8..74c9f6770 100644 --- a/rtgui/clipboard.h +++ b/rtgui/clipboard.h @@ -19,96 +19,64 @@ #ifndef _CLIPBOARD_ #define _CLIPBOARD_ +#include #include -#include "../rtengine/rtengine.h" -#include "../rtengine/procparams.h" -#include "paramsedited.h" -#include "myflatcurve.h" + #include "mydiagonalcurve.h" +#include "myflatcurve.h" +#include "paramsedited.h" + +#include "../rtengine/rtengine.h" + +namespace rtengine +{ + +namespace procparams +{ + +class PartialProfile; + +} + +} class Clipboard { +public: + Clipboard (); + ~Clipboard (); + bool hasIPTC() const; + const rtengine::procparams::IPTCPairs& getIPTC() const; + void setIPTC(const rtengine::procparams::IPTCPairs& iptcc); + + const rtengine::procparams::PartialProfile& getPartialProfile() const; + void setPartialProfile(const rtengine::procparams::PartialProfile& pprofile); + + const rtengine::procparams::ProcParams& getProcParams() const; + void setProcParams(const rtengine::procparams::ProcParams& pparams); + + const ParamsEdited& getParamsEdited() const; + + bool hasProcParams() const; + bool hasPEdited() const; + + DiagonalCurveType hasDiagonalCurveData() const; + const std::vector& getDiagonalCurveData() const; + void setDiagonalCurveData(const std::vector& p, DiagonalCurveType type); + + void setFlatCurveData(const std::vector& p, FlatCurveType type); + const std::vector& getFlatCurveData() const; + FlatCurveType hasFlatCurveData() const; + +private: bool _hasIPTC; - rtengine::procparams::IPTCPairs iptc; - rtengine::procparams::PartialProfile partProfile; + const std::unique_ptr iptc; + const std::unique_ptr partProfile; DiagonalCurveType hasDiagonalCurveDataType; FlatCurveType hasFlatCurveDataType; std::vector diagonalCurve; std::vector flatCurve; - - -public: - void setIPTC (const rtengine::procparams::IPTCPairs& iptcc) - { - iptc = iptcc; - _hasIPTC = true; - } - const rtengine::procparams::IPTCPairs& getIPTC () - { - return iptc; - } - bool hasIPTC () - { - return _hasIPTC; - } - - void setPartialProfile (const rtengine::procparams::PartialProfile& pprofile); - const rtengine::procparams::PartialProfile& getPartialProfile () - { - return partProfile; - }; - void setProcParams (const rtengine::procparams::ProcParams& pparams); - const rtengine::procparams::ProcParams& getProcParams () - { - return *partProfile.pparams; - } - const ParamsEdited& getParamsEdited () - { - return *partProfile.pedited; - } - bool hasProcParams () - { - return partProfile.pparams; - } - bool hasPEdited () - { - return partProfile.pedited; - } - - void setDiagonalCurveData (std::vector& p, DiagonalCurveType type ) - { - diagonalCurve = p; - hasDiagonalCurveDataType = type; - return; - } - const std::vector & getDiagonalCurveData () - { - return diagonalCurve; - } - DiagonalCurveType hasDiagonalCurveData () - { - return hasDiagonalCurveDataType; - } - - void setFlatCurveData (std::vector& p, FlatCurveType type ) - { - flatCurve = p; - hasFlatCurveDataType = type; - return; - } - const std::vector & getFlatCurveData () - { - return flatCurve; - } - FlatCurveType hasFlatCurveData () - { - return hasFlatCurveDataType; - } - - Clipboard (); - ~Clipboard (); - }; extern Clipboard clipboard; diff --git a/rtgui/coarsepanel.cc b/rtgui/coarsepanel.cc index a201b1f7f..92c312554 100644 --- a/rtgui/coarsepanel.cc +++ b/rtgui/coarsepanel.cc @@ -17,8 +17,11 @@ * along with RawTherapee. If not, see . */ #include "coarsepanel.h" + #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -28,25 +31,25 @@ CoarsePanel::CoarsePanel () : ToolPanel (), oldhflip(false), oldvflip(false) degree = 0; degreechanged = true; - Gtk::Image* rotateli = Gtk::manage (new RTImage ("stock-rotate-270.png")); + Gtk::Image* rotateli = Gtk::manage (new RTImage ("rotate-left-90.png")); rotate_left = Gtk::manage (new Gtk::Button ()); rotate_left->add (*rotateli); rotate_left->set_relief(Gtk::RELIEF_NONE); pack_start (*rotate_left); - Gtk::Image* rotateri = Gtk::manage (new RTImage ("stock-rotate-90.png")); + Gtk::Image* rotateri = Gtk::manage (new RTImage ("rotate-right-90.png")); rotate_right = Gtk::manage (new Gtk::Button ()); rotate_right->add (*rotateri); rotate_right->set_relief(Gtk::RELIEF_NONE); pack_start (*rotate_right); - Gtk::Image* fliphi = Gtk::manage (new RTImage ("stock-flip-horizontal.png")); + Gtk::Image* fliphi = Gtk::manage (new RTImage ("flip-horizontal.png")); hflip = Gtk::manage (new Gtk::ToggleButton ()); hflip->add (*fliphi); hflip->set_relief(Gtk::RELIEF_NONE); pack_start (*hflip); - Gtk::Image* flipvi = Gtk::manage (new RTImage ("stock-flip-vertical.png")); + Gtk::Image* flipvi = Gtk::manage (new RTImage ("flip-vertical.png")); vflip = Gtk::manage (new Gtk::ToggleButton ()); vflip->add (*flipvi); vflip->set_relief(Gtk::RELIEF_NONE); diff --git a/rtgui/coarsepanel.h b/rtgui/coarsepanel.h index 7ac1bccc5..bd4668eea 100644 --- a/rtgui/coarsepanel.h +++ b/rtgui/coarsepanel.h @@ -37,8 +37,8 @@ public: CoarsePanel (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; void initBatchBehavior (); void rotateLeft (); diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index f8dee05df..f78a1f32b 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "colorappearance.h" #include + +#include "colorappearance.h" + #include "guiutils.h" + #include "../rtengine/color.h" +#include "../rtengine/procparams.h" #define MINTEMP0 2000 //1200 #define MAXTEMP0 12000 //12000 @@ -230,8 +234,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" } degree->throwOnButtonRelease(); - degree->addAutoButton (M ("TP_COLORAPP_DEGREE_AUTO_TOOLTIP")); - degree->set_tooltip_markup (M ("TP_COLORAPP_DEGREE_TOOLTIP")); + degree->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); p1VBox->pack_start (*degree); // surrsource = Gtk::manage (new Gtk::CheckButton (M ("TP_COLORAPP_SURSOURCE"))); @@ -268,10 +271,10 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" wbmHBox->pack_start (*wbmodel); p1VBox->pack_start (*wbmHBox); - Gtk::Image* itempL = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* itempR = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* igreenL = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenR = Gtk::manage (new RTImage ("ajd-wb-green2.png")); + Gtk::Image* itempL = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* itempR = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* igreenL = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); tempsc = Gtk::manage (new Adjuster (M ("TP_WBALANCE_TEMPERATURE"), MINTEMP0, MAXTEMP0, 5, CENTERTEMP0, itempL, itempR, &wbSlider2Temp, &wbTemp2Slider)); @@ -284,27 +287,25 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" p1VBox->pack_start (*greensc); -// adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ADAPTSCENE"), 0.01, 16384., 0.001, 2000.)); // EV -7 ==> EV 17 - adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ADAPTSCENE"), MINLA0, MAXLA0, 0.01, 1997.4, NULL, NULL, &wbSlider2la, &wbla2Slider)); +// adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), 0.01, 16384., 0.001, 2000.)); // EV -7 ==> EV 17 + adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 1997.4, NULL, NULL, &wbSlider2la, &wbla2Slider)); if (adapscen->delay < options.adjusterMaxDelay) { adapscen->delay = options.adjusterMaxDelay; } adapscen->throwOnButtonRelease(); - adapscen->addAutoButton (M ("TP_COLORAPP_ADAP_AUTO_TOOLTIP")); - adapscen->set_tooltip_markup (M ("TP_COLORAPP_ADAPTSCENE_TOOLTIP")); + adapscen->addAutoButton(); p1VBox->pack_start (*adapscen); - ybscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_YBSCENE"), 1, 90, 1, 18)); + ybscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 1, 90, 1, 18)); if (ybscen->delay < options.adjusterMaxDelay) { ybscen->delay = options.adjusterMaxDelay; } ybscen->throwOnButtonRelease(); - ybscen->addAutoButton (M ("TP_COLORAPP_ADAP_AUTO_TOOLTIP")); - ybscen->set_tooltip_markup (M ("TP_COLORAPP_YBSCENE_TOOLTIP")); + ybscen->addAutoButton(); p1VBox->pack_start (*ybscen); p1Frame->add (*p1VBox); @@ -575,23 +576,23 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" p3VBox = Gtk::manage ( new Gtk::VBox()); p3VBox->set_spacing (2); - Gtk::Image* itempL1 = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* itempR1 = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* igreenL1 = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenR1 = Gtk::manage (new RTImage ("ajd-wb-green2.png")); -// adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ADAPTVIEWING"), 0.1, 16384., 0.1, 16.)); - adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ADAPTVIEWING"), MINLA0, MAXLA0, 0.01, 16, NULL, NULL, &wbSlider2la, &wbla2Slider)); + Gtk::Image* itempL1 = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* itempR1 = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* igreenL1 = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* igreenR1 = Gtk::manage (new RTImage ("circle-green-small.png")); +// adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), 0.1, 16384., 0.1, 16.)); + adaplum = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ABSOLUTELUMINANCE"), MINLA0, MAXLA0, 0.01, 16, NULL, NULL, &wbSlider2la, &wbla2Slider)); if (adaplum->delay < options.adjusterMaxDelay) { adaplum->delay = options.adjusterMaxDelay; } adaplum->throwOnButtonRelease(); - adaplum->set_tooltip_markup (M ("TP_COLORAPP_ADAPTVIEWING_TOOLTIP")); + adaplum->set_tooltip_markup (M ("TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP")); p3VBox->pack_start (*adaplum); -// Gtk::Image* iblueredL = Gtk::manage (new RTImage ("ajd-wb-bluered1.png")); -// Gtk::Image* iblueredR = Gtk::manage (new RTImage ("ajd-wb-bluered2.png")); +// Gtk::Image* iblueredL = Gtk::manage (new RTImage ("circle-blue-small.png")); +// Gtk::Image* iblueredR = Gtk::manage (new RTImage ("circle-red-small.png")); degreeout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_CIECAT_DEGREE"), 0., 100., 1., 100.)); @@ -600,18 +601,17 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" } degreeout->throwOnButtonRelease(); - degreeout->addAutoButton (M ("TP_COLORAPP_DEGREE_AUTO_TOOLTIP")); - degreeout->set_tooltip_markup (M ("TP_COLORAPP_DEGREE_TOOLTIP")); + degreeout->addAutoButton (M ("TP_COLORAPP_CAT02ADAPTATION_TOOLTIP")); p3VBox->pack_start (*degreeout); /* - Gtk::Image* itempL1 = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* itempR1 = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* igreenL1 = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenR1 = Gtk::manage (new RTImage ("ajd-wb-green2.png")); + Gtk::Image* itempL1 = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* itempR1 = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* igreenL1 = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* igreenR1 = Gtk::manage (new RTImage ("circle-green-small.png")); */ tempout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_TEMPERATURE"), MINTEMP0, MAXTEMP0, 5, CENTERTEMP0, itempR1, itempL1, &wbSlider2Temp, &wbTemp2Slider)); greenout = Gtk::manage (new Adjuster (M ("TP_WBALANCE_GREEN"), MINGREEN0, MAXGREEN0, 0.001, 1.0, igreenR1, igreenL1)); - ybout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_YB"), 5, 90, 1, 18)); + ybout = Gtk::manage (new Adjuster (M ("TP_COLORAPP_MEANLUMINANCE"), 5, 90, 1, 18)); tempout->set_tooltip_markup (M ("TP_COLORAPP_TEMP_TOOLTIP")); tempout->show(); @@ -669,7 +669,7 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" //reset button neutral = Gtk::manage (new Gtk::Button (M ("TP_COLORAPP_NEUTRAL"))); setExpandAlignProperties (neutral, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - RTImage *resetImg = Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png")); + RTImage *resetImg = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); setExpandAlignProperties (resetImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); neutral->set_image (*resetImg); neutral->set_tooltip_text (M ("TP_COLORAPP_NEUTRAL_TIP")); @@ -1451,75 +1451,42 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit void ColorAppearance::autoCamChanged (double ccam, double ccamout) { - nextCcam = ccam; - nextCcamout = ccamout; - - const auto func = [] (gpointer data) -> gboolean { - static_cast (data)->autoCamComputed_(); - return FALSE; - }; - - idle_register.add (func, this); -} - -bool ColorAppearance::autoCamComputed_ () -{ - - disableListener (); -// degree->setEnabled (true); - degree->setValue (nextCcam); - degreeout->setValue (nextCcamout); - enableListener (); - - return false; + idle_register.add( + [this, ccam, ccamout]() -> bool + { + disableListener(); + degree->setValue(ccam); + degreeout->setValue(ccamout); + enableListener(); + return false; + } + ); } void ColorAppearance::adapCamChanged (double cadap) { - nextCadap = cadap; - - const auto func = [] (gpointer data) -> gboolean { - static_cast (data)->adapCamComputed_(); - return FALSE; - }; - - idle_register.add (func, this); -} - -bool ColorAppearance::adapCamComputed_ () -{ - - disableListener (); -// degree->setEnabled (true); - adapscen->setValue (nextCadap); -// ybscen->setValue (nextYbscn); - enableListener (); - - return false; + idle_register.add( + [this, cadap]() -> bool + { + disableListener(); + adapscen->setValue(cadap); + enableListener(); + return false; + } + ); } void ColorAppearance::ybCamChanged (int ybsc) { - nextYbscn = ybsc; - - const auto func = [] (gpointer data) -> gboolean { - static_cast (data)->ybCamComputed_(); - return FALSE; - }; - - idle_register.add (func, this); -} - -bool ColorAppearance::ybCamComputed_ () -{ - - disableListener (); -// degree->setEnabled (true); -// adapscen->setValue (nextCadap); - ybscen->setValue (nextYbscn); - enableListener (); - - return false; + idle_register.add( + [this, ybsc]() -> bool + { + disableListener(); + ybscen->setValue(ybsc); + enableListener(); + return false; + } + ); } void ColorAppearance::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) @@ -1544,9 +1511,8 @@ void ColorAppearance::colorForValue (double valX, double valY, enum ColorCaller: caller->ccBlue = double (B); } -void ColorAppearance::adjusterChanged (Adjuster* a, double newval) +void ColorAppearance::adjusterChanged(Adjuster* a, double newval) { - if (listener && (multiImage || getEnabled()) ) { if (a == degree) { listener->panelChanged (EvCATDegree, a->getTextValue()); @@ -1594,9 +1560,8 @@ void ColorAppearance::adjusterChanged (Adjuster* a, double newval) } } -void ColorAppearance::adjusterAutoToggled (Adjuster* a, bool newval) +void ColorAppearance::adjusterAutoToggled(Adjuster* a, bool newval) { - if (multiImage) { if (degree->getAutoInconsistent()) { degree->setAutoInconsistent (false); @@ -1844,11 +1809,21 @@ void ColorAppearance::setBatchMode (bool batchMode) curveEditorG3->setBatchMode (batchMode); } -void ColorAppearance::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 ColorAppearance::updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI +) { - - shape->updateBackgroundHistogram (histLCAM); - shape3->updateBackgroundHistogram (histCCAM); + shape->updateBackgroundHistogram(histLCAM); + shape3->updateBackgroundHistogram(histCCAM); } diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 3829475ae..3f95d9f74 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -38,16 +38,16 @@ class ColorAppearance final : { public: ColorAppearance (); - ~ColorAppearance (); + ~ColorAppearance () override; - 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 adjusterAutoToggled (Adjuster* a, bool newval); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; // void adjusterAdapToggled (Adjuster* a, bool newval); - void enabledChanged (); + void enabledChanged () override; void surroundChanged (); void surrsrcChanged (); void wbmodelChanged (); @@ -58,14 +58,14 @@ public: void datacie_toggled (); void tonecie_toggled (); // void sharpcie_toggled (); - void autoCamChanged (double ccam, double ccamout); + void autoCamChanged (double ccam, double ccamout) override; bool autoCamComputed_ (); - void adapCamChanged (double cadap); + void adapCamChanged (double cadap) override; bool adapCamComputed_ (); - void ybCamChanged (int yb); + void ybCamChanged (int yb) override; bool ybCamComputed_ (); - void curveChanged (CurveEditor* ce); + void curveChanged (CurveEditor* ce) override; void curveMode1Changed (); bool curveMode1Changed_ (); void curveMode2Changed (); @@ -76,12 +76,23 @@ public: void expandCurve (bool isExpanded); bool isCurveExpanded (); - void autoOpenCurve (); + void autoOpenCurve () override; void setAdjusterBehavior (bool degreeadd, bool adapscenadd, bool adaplumadd, bool badpixsladd, bool jlightadd, bool chromaadd, bool contrastadd, bool rstprotectionadd, bool qbrightadd, bool qcontrastadd, bool schromaadd, bool mchromaadd, bool colorhadd); - void trimValues (rtengine::procparams::ProcParams* pp); - 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); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller); + void trimValues (rtengine::procparams::ProcParams* pp) override; + void updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI + ); + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) override; void updateToolState (std::vector &tpOpen); void writeOptions (std::vector &tpOpen); diff --git a/rtgui/colortoning.cc b/rtgui/colortoning.cc index 3d3d21d66..025acb55f 100644 --- a/rtgui/colortoning.cc +++ b/rtgui/colortoning.cc @@ -11,6 +11,24 @@ using namespace rtengine; using namespace rtengine::procparams; +namespace { + +constexpr int ID_LABREGION_HUE = 5; + +inline bool hasMask(const std::vector &dflt, const std::vector &mask) +{ + return !(mask.empty() || mask[0] == FCT_Linear || mask == dflt); +} + + +inline float round_ab(float v) +{ + return int(v * 1000) / 1000.f; +} + +} // namespace + + ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLORTONING_LABEL"), false, true) { nextbw = 0; @@ -25,6 +43,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR method->append (M("TP_COLORTONING_SPLITCOCO")); method->append (M("TP_COLORTONING_SPLITLR")); method->append(M("TP_COLORTONING_LABGRID")); + method->append(M("TP_COLORTONING_LABREGIONS")); method->set_active (0); method->set_tooltip_text (M("TP_COLORTONING_METHOD_TOOLTIP")); @@ -104,8 +123,8 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR pack_start( *opacityCurveEditorG, Gtk::PACK_SHRINK, 2); //---------Chroma curve 1 -------------------- - iby = Gtk::manage (new RTImage ("Chanmixer-BY.png")); - irg = Gtk::manage (new RTImage ("Chanmixer-RG.png")); + iby = Gtk::manage (new RTImage ("circle-yellow-blue-small.png")); + irg = Gtk::manage (new RTImage ("circle-green-red-small.png")); clCurveEditorG = new CurveEditorGroup (options.lastColorToningCurvesDir, M("TP_COLORTONING_CHROMAC")); clCurveEditorG->setCurveListener (this); @@ -146,7 +165,7 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR //--------------------- Reset curves ----------------------------- /* Each curve can reset to a different curve, so this button only save one click now... so we remove it. neutralCurves = Gtk::manage (new Gtk::Button (M("TP_COLORTONING_NEUTRALCUR"))); - RTImage *resetImgc = Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png")); + RTImage *resetImgc = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); neutralCurves->set_image(*resetImgc); neutralCurves->set_tooltip_text (M("TP_COLORTONING_NEUTRALCUR_TIP")); neutralcurvesconn = neutralCurves->signal_pressed().connect( sigc::mem_fun(*this, &ColorToning::neutralCurves_pressed) ); @@ -226,26 +245,26 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR Gtk::VBox *chanMixerMidBox = Gtk::manage (new Gtk::VBox()); Gtk::VBox *chanMixerShadowsBox = Gtk::manage (new Gtk::VBox()); - Gtk::Image* iblueR = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* iyelL = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* imagL = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenR = Gtk::manage (new RTImage ("ajd-wb-green2.png")); - Gtk::Image* icyanL = Gtk::manage (new RTImage ("ajd-wb-bluered1.png")); - Gtk::Image* iredR = Gtk::manage (new RTImage ("ajd-wb-bluered2.png")); + Gtk::Image* iblueR = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* iyelL = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* imagL = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* icyanL = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* iredR = Gtk::manage (new RTImage ("circle-red-small.png")); - Gtk::Image* iblueRm = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* iyelLm = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* imagLm = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenRm = Gtk::manage (new RTImage ("ajd-wb-green2.png")); - Gtk::Image* icyanLm = Gtk::manage (new RTImage ("ajd-wb-bluered1.png")); - Gtk::Image* iredRm = Gtk::manage (new RTImage ("ajd-wb-bluered2.png")); + Gtk::Image* iblueRm = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* iyelLm = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* imagLm = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* igreenRm = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* icyanLm = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* iredRm = Gtk::manage (new RTImage ("circle-red-small.png")); - Gtk::Image* iblueRh = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* iyelLh = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* imagLh = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenRh = Gtk::manage (new RTImage ("ajd-wb-green2.png")); - Gtk::Image* icyanLh = Gtk::manage (new RTImage ("ajd-wb-bluered1.png")); - Gtk::Image* iredRh = Gtk::manage (new RTImage ("ajd-wb-bluered2.png")); + Gtk::Image* iblueRh = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* iyelLh = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* imagLh = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* igreenRh = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* icyanLh = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* iredRh = Gtk::manage (new RTImage ("circle-red-small.png")); redhigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., icyanLh, iredRh )); greenhigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., imagLh , igreenRh)); @@ -318,22 +337,158 @@ ColorToning::ColorToning () : FoldableToolPanel(this, "colortoning", M("TP_COLOR //------------------------------------------------------------------------ // LAB grid - auto m = ProcEventMapper::getInstance(); + 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); + labgrid = Gtk::manage(new LabGrid(EvColorToningLabGridValue, M("TP_COLORTONING_LABGRID_VALUES"))); + pack_start(*labgrid, Gtk::PACK_EXPAND_WIDGET, 4); + //------------------------------------------------------------------------ + + //------------------------------------------------------------------------ + // LAB regions + + const auto add_button = + [&](Gtk::Button *btn, Gtk::Box *box) -> void + { + setExpandAlignProperties(btn, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + btn->set_relief(Gtk::RELIEF_NONE); + btn->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + btn->set_can_focus(false); + btn->set_size_request(-1, 20); + box->pack_start(*btn, false, false); + }; + + EvLabRegionList = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_LIST"); + EvLabRegionAB = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_AB"); + EvLabRegionSaturation = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_SATURATION"); + EvLabRegionLightness = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS"); + EvLabRegionSlope = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_SLOPE"); + EvLabRegionOffset = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_OFFSET"); + EvLabRegionPower = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_POWER"); + EvLabRegionHueMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_HUEMASK"); + EvLabRegionChromaticityMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK"); + EvLabRegionLightnessMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK"); + EvLabRegionMaskBlur = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR"); + EvLabRegionShowMask = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK"); + EvLabRegionChannel = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_COLORTONING_LABREGION_CHANNEL"); + labRegionBox = Gtk::manage(new Gtk::VBox()); + + labRegionList = Gtk::manage(new Gtk::ListViewText(3)); + labRegionList->set_size_request(-1, 150); + labRegionList->set_can_focus(false); + labRegionList->set_column_title(0, "#"); + labRegionList->set_column_title(1, M("TP_COLORTONING_LABREGION_LIST_TITLE")); + labRegionList->set_column_title(2, M("TP_COLORTONING_LABREGION_MASK")); + labRegionList->set_activate_on_single_click(true); + labRegionSelectionConn = labRegionList->get_selection()->signal_changed().connect(sigc::mem_fun(this, &ColorToning::onLabRegionSelectionChanged)); + Gtk::HBox *hb = Gtk::manage(new Gtk::HBox()); + hb->pack_start(*labRegionList, Gtk::PACK_EXPAND_WIDGET); + Gtk::VBox *vb = Gtk::manage(new Gtk::VBox()); + labRegionAdd = Gtk::manage(new Gtk::Button()); + labRegionAdd->add(*Gtk::manage(new RTImage("add-small.png"))); + labRegionAdd->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionAddPressed)); + add_button(labRegionAdd, vb); + labRegionRemove = Gtk::manage(new Gtk::Button()); + labRegionRemove->add(*Gtk::manage(new RTImage("remove-small.png"))); + labRegionRemove->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionRemovePressed)); + add_button(labRegionRemove, vb); + labRegionUp = Gtk::manage(new Gtk::Button()); + labRegionUp->add(*Gtk::manage(new RTImage("arrow-up-small.png"))); + labRegionUp->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionUpPressed)); + add_button(labRegionUp, vb); + labRegionDown = Gtk::manage(new Gtk::Button()); + labRegionDown->add(*Gtk::manage(new RTImage("arrow-down-small.png"))); + labRegionDown->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionDownPressed)); + add_button(labRegionDown, vb); + labRegionCopy = Gtk::manage(new Gtk::Button()); + labRegionCopy->add(*Gtk::manage(new RTImage("arrow-right-small.png"))); + labRegionCopy->signal_clicked().connect(sigc::mem_fun(*this, &ColorToning::labRegionCopyPressed)); + add_button(labRegionCopy, vb); + hb->pack_start(*vb, Gtk::PACK_SHRINK); + labRegionBox->pack_start(*hb, true, true); + + labRegionAB = Gtk::manage(new LabGrid(EvLabRegionAB, M("TP_COLORTONING_LABREGION_ABVALUES"), false)); + labRegionBox->pack_start(*labRegionAB); + + labRegionSaturation = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_SATURATION"), -100, 100, 1, 0)); + labRegionSaturation->setAdjusterListener(this); + labRegionBox->pack_start(*labRegionSaturation); + + labRegionSlope = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_SLOPE"), 0.1, 4.0, 0.001, 1)); + labRegionSlope->setLogScale(4, 0.1); + labRegionSlope->setAdjusterListener(this); + labRegionBox->pack_start(*labRegionSlope); + labRegionOffset = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_OFFSET"), -0.1, 0.1, 0.001, 0)); + labRegionOffset->setAdjusterListener(this); + labRegionBox->pack_start(*labRegionOffset); + labRegionPower = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_POWER"), 0.1, 4.0, 0.001, 1)); + labRegionPower->setAdjusterListener(this); + labRegionPower->setLogScale(4, 0.1); + labRegionBox->pack_start(*labRegionPower); + + hb = Gtk::manage(new Gtk::HBox()); + labRegionChannel = Gtk::manage(new MyComboBoxText()); + labRegionChannel->append(M("TP_COLORTONING_LABREGION_CHANNEL_ALL")); + labRegionChannel->append(M("TP_COLORTONING_LABREGION_CHANNEL_R")); + labRegionChannel->append(M("TP_COLORTONING_LABREGION_CHANNEL_G")); + labRegionChannel->append(M("TP_COLORTONING_LABREGION_CHANNEL_B")); + labRegionChannel->set_active(0); + labRegionChannel->signal_changed().connect(sigc::mem_fun(*this, &ColorToning::labRegionChannelChanged)); + + hb->pack_start(*Gtk::manage(new Gtk::Label(M("TP_COLORTONING_LABREGION_CHANNEL") + ": ")), Gtk::PACK_SHRINK); + hb->pack_start(*labRegionChannel); + labRegionBox->pack_start(*hb); + + labRegionBox->pack_start(*Gtk::manage(new Gtk::HSeparator())); + + CurveEditorGroup *labRegionEditorG = Gtk::manage(new CurveEditorGroup(options.lastColorToningCurvesDir, M("TP_COLORTONING_LABREGION_MASK"))); + labRegionEditorG->setCurveListener(this); + + labRegionHueMask = static_cast(labRegionEditorG->addCurve(CT_Flat, M("TP_COLORTONING_LABREGION_HUEMASK"), nullptr, false, true)); + labRegionHueMask->setIdentityValue(0.); + labRegionHueMask->setResetCurve(FlatCurveType(default_params.labregions[0].hueMask[0]), default_params.labregions[0].hueMask); + labRegionHueMask->setCurveColorProvider(this, ID_LABREGION_HUE); + labRegionHueMask->setBottomBarColorProvider(this, ID_LABREGION_HUE); + labRegionHueMask->setEditID(EUID_Lab_HHCurve, BT_SINGLEPLANE_FLOAT); + + labRegionChromaticityMask = static_cast(labRegionEditorG->addCurve(CT_Flat, M("TP_COLORTONING_LABREGION_CHROMATICITYMASK"), nullptr, false, false)); + labRegionChromaticityMask->setIdentityValue(0.); + labRegionChromaticityMask->setResetCurve(FlatCurveType(default_params.labregions[0].chromaticityMask[0]), default_params.labregions[0].chromaticityMask); + labRegionChromaticityMask->setBottomBarColorProvider(this, ID_LABREGION_HUE+1); + labRegionChromaticityMask->setEditID(EUID_Lab_CCurve, BT_SINGLEPLANE_FLOAT); + + labRegionLightnessMask = static_cast(labRegionEditorG->addCurve(CT_Flat, M("TP_COLORTONING_LABREGION_LIGHTNESSMASK"), nullptr, false, false)); + labRegionLightnessMask->setIdentityValue(0.); + labRegionLightnessMask->setResetCurve(FlatCurveType(default_params.labregions[0].lightnessMask[0]), default_params.labregions[0].lightnessMask); + labRegionLightnessMask->setBottomBarBgGradient(milestones); + labRegionLightnessMask->setEditID(EUID_Lab_LCurve, BT_SINGLEPLANE_FLOAT); + + labRegionData = default_params.labregions; + labRegionSelected = 0; + { + auto n = labRegionList->append("1"); + labRegionList->set_text(n, 1, "a=0 b=0 s=0 l=0"); + } + + labRegionEditorG->curveListComplete(); + labRegionEditorG->show(); + labRegionBox->pack_start(*labRegionEditorG, Gtk::PACK_SHRINK, 2); + + labRegionMaskBlur = Gtk::manage(new Adjuster(M("TP_COLORTONING_LABREGION_MASKBLUR"), -10, 100, 0.1, 0)); + labRegionMaskBlur->setLogScale(10, 0); + labRegionMaskBlur->setAdjusterListener(this); + labRegionBox->pack_start(*labRegionMaskBlur); + + labRegionShowMask = Gtk::manage(new Gtk::CheckButton(M("TP_COLORTONING_LABREGION_SHOWMASK"))); + labRegionShowMask->signal_toggled().connect(sigc::mem_fun(*this, &ColorToning::labRegionShowMaskChanged)); + labRegionBox->pack_start(*labRegionShowMask, Gtk::PACK_SHRINK, 4); + + pack_start(*labRegionBox, Gtk::PACK_EXPAND_WIDGET, 4); + + labRegionSaturation->delay = options.adjusterMaxDelay; + labRegionSlope->delay = options.adjusterMaxDelay; + labRegionOffset->delay = options.adjusterMaxDelay; + labRegionPower->delay = options.adjusterMaxDelay; + labRegionMaskBlur->delay = options.adjusterMaxDelay; //------------------------------------------------------------------------ show_all(); @@ -358,6 +513,7 @@ void ColorToning::setListener(ToolPanelListener *tpl) { ToolPanel::setListener(tpl); labgrid->setListener(tpl); + labRegionAB->setListener(tpl); } /* @@ -373,11 +529,11 @@ void ColorToning::neutralCurves_pressed () { enableListener(); if (listener && enabled->get_active() && changed) - listener->panelChanged (EvColorToningNeutralcur, M("ADJUSTER_RESET_TO_DEFAULT")); + listener->panelChanged (EvColorToningNeutralcur, M("GENERAL_RESET")); } */ -// Will only reset the chanel mixer +// Will only reset the channel mixer void ColorToning::neutral_pressed () { disableListener(); @@ -395,7 +551,7 @@ void ColorToning::neutral_pressed () enableListener(); if (listener && getEnabled()) { - listener->panelChanged (EvColorToningNeutral, M("ADJUSTER_RESET_TO_DEFAULT")); + listener->panelChanged (EvColorToningNeutral, M("GENERAL_RESET")); } } @@ -409,6 +565,20 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) clshape->setCurve (pp->colorToning.clcurve); cl2shape->setCurve (pp->colorToning.cl2curve); + labRegionData = pp->colorToning.labregions; + if (labRegionData.empty()) { + labRegionData.emplace_back(rtengine::ColorToningParams::LabCorrectionRegion()); + } + if (pp->colorToning.labregionsShowMask >= 0) { + labRegionSelected = pp->colorToning.labregionsShowMask; + labRegionShowMask->set_active(true); + } else { + labRegionSelected = 0; + labRegionShowMask->set_active(false); + } + labRegionPopulateList(); + labRegionShow(labRegionSelected); + if (pedited) { redlow->setEditedState (pedited->colorToning.redlow ? Edited : UnEdited); greenlow->setEditedState (pedited->colorToning.greenlow ? Edited : UnEdited); @@ -433,6 +603,9 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lumamode->set_inconsistent (!pedited->colorToning.lumamode); labgrid->setEdited(pedited->colorToning.labgridALow || pedited->colorToning.labgridBLow || pedited->colorToning.labgridAHigh || pedited->colorToning.labgridBHigh); + + labRegionAB->setEdited(pedited->colorToning.labregions); + labRegionShowMask->set_inconsistent(!pedited->colorToning.labregionsShowMask); } redlow->setValue (pp->colorToning.redlow); @@ -464,10 +637,10 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) lastLumamode = pp->colorToning.lumamode; - labgrid->setParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh, false); + labgrid->setParams(pp->colorToning.labgridALow / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridBLow / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridAHigh / ColorToningParams::LABGRID_CORR_MAX, pp->colorToning.labgridBHigh / ColorToningParams::LABGRID_CORR_MAX, false); if (pedited && !pedited->colorToning.method) { - method->set_active (5); + method->set_active (7); } else if (pp->colorToning.method == "Lab") { method->set_active (0); } else if (pp->colorToning.method == "RGBSliders") { @@ -480,6 +653,8 @@ void ColorToning::read (const ProcParams* pp, const ParamsEdited* pedited) method->set_active (4); } else if (pp->colorToning.method == "LabGrid") { method->set_active(5); + } else if (pp->colorToning.method == "LabRegions") { + method->set_active(6); } methodChanged(); @@ -533,6 +708,19 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.strength = strength->getIntValue(); labgrid->getParams(pp->colorToning.labgridALow, pp->colorToning.labgridBLow, pp->colorToning.labgridAHigh, pp->colorToning.labgridBHigh); + pp->colorToning.labgridALow *= ColorToningParams::LABGRID_CORR_MAX; + pp->colorToning.labgridAHigh *= ColorToningParams::LABGRID_CORR_MAX; + pp->colorToning.labgridBLow *= ColorToningParams::LABGRID_CORR_MAX; + pp->colorToning.labgridBHigh *= ColorToningParams::LABGRID_CORR_MAX; + + labRegionGet(labRegionSelected); + labRegionShow(labRegionSelected, true); + pp->colorToning.labregions = labRegionData; + if (labRegionShowMask->get_active()) { + pp->colorToning.labregionsShowMask = labRegionSelected; + } else { + pp->colorToning.labregionsShowMask = -1; + } if (pedited) { pedited->colorToning.redlow = redlow->getEditedState (); @@ -560,6 +748,9 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorToning.shadowsColSat = shadowsColSat->getEditedState (); pedited->colorToning.labgridALow = pedited->colorToning.labgridBLow = pedited->colorToning.labgridAHigh = pedited->colorToning.labgridBHigh = labgrid->getEdited(); + + pedited->colorToning.labregions = labRegionAB->getEdited(); + pedited->colorToning.labregionsShowMask = !labRegionShowMask->get_inconsistent(); } if (method->get_active_row_number() == 0) { @@ -574,6 +765,8 @@ void ColorToning::write (ProcParams* pp, ParamsEdited* pedited) pp->colorToning.method = "Splitlr"; } else if (method->get_active_row_number() == 5) { pp->colorToning.method = "LabGrid"; + } else if (method->get_active_row_number() == 6) { + pp->colorToning.method = "LabRegions"; } if (twocolor->get_active_row_number() == 0) { @@ -630,7 +823,8 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* 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); + labgrid->setDefault(defParams->colorToning.labgridALow / ColorToningParams::LABGRID_CORR_MAX, defParams->colorToning.labgridBLow / ColorToningParams::LABGRID_CORR_MAX, defParams->colorToning.labgridAHigh / ColorToningParams::LABGRID_CORR_MAX, defParams->colorToning.labgridBHigh / ColorToningParams::LABGRID_CORR_MAX); + if (pedited) { redlow->setDefaultEditedState (pedited->colorToning.redlow ? Edited : UnEdited); @@ -649,6 +843,8 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* 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); + + labRegionAB->setEdited(pedited->colorToning.labregions ? Edited : UnEdited); } else { redlow->setDefaultEditedState (Irrelevant); greenlow->setDefaultEditedState (Irrelevant); @@ -666,6 +862,7 @@ void ColorToning::setDefaults (const ProcParams* defParams, const ParamsEdited* shadowsColSat->setDefaultEditedState (Irrelevant); strength->setDefaultEditedState (Irrelevant); labgrid->setEdited(Edited); + labRegionAB->setEdited(Edited); } } @@ -688,83 +885,50 @@ void ColorToning::setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool } -void ColorToning::adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop) -{ - if (listener && getEnabled()) - listener->panelChanged (a == hlColSat ? EvColorToningHighights : EvColorToningShadows, - Glib::ustring::compose(Glib::ustring(M("TP_COLORTONING_HUE") + ": %1" + "\n" + M("TP_COLORTONING_STRENGTH") + ": %2"), int(newTop), int(newBottom))); -} - void ColorToning::autoColorTonChanged(int bwct, int satthres, int satprot) { nextbw = bwct; nextsatth = satthres; nextsatpr = satprot; - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->CTComp_(); - return FALSE; - }; - - idle_register.add(func, this); + idle_register.add( + [this]() -> bool + { + disableListener(); + saturatedOpacity->setValue(nextsatpr); + satProtectionThreshold->setValue(nextsatth); + enableListener(); + return false; + } + ); } -bool ColorToning::CTComp_ () +void ColorToning::adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop) { - - disableListener (); - saturatedOpacity->setValue (nextsatpr); - satProtectionThreshold->setValue (nextsatth); - /* if(nextbw==1) { - saturatedOpacity->show(); - satProtectionThreshold->show(); - autosat->show(); - } - else { - saturatedOpacity->hide(); - satProtectionThreshold->hide(); - autosat->hide(); - } - */ - enableListener (); - - return false; + if (listener && getEnabled()) { + listener->panelChanged( + a == hlColSat + ? EvColorToningHighights + : EvColorToningShadows, + Glib::ustring::compose(Glib::ustring(M("TP_COLORTONING_HUE") + ": %1" + "\n" + M("TP_COLORTONING_STRENGTH") + ": %2"), int(newTop), int(newBottom)) + ); + } } -void ColorToning::adjusterChanged (Adjuster* a, double newval) +void ColorToning::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) { +} - if (!listener || !getEnabled()) { - return; - } +void ColorToning::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) +{ +} - if (a == redlow) { - listener->panelChanged (EvColorToningredlow, redlow->getTextValue()); - } else if (a == greenlow) { - listener->panelChanged (EvColorToninggreenlow, greenlow->getTextValue()); - } else if (a == bluelow) { - listener->panelChanged (EvColorToningbluelow, bluelow->getTextValue()); - } else if (a == redmed) { - listener->panelChanged (EvColorToningredmed, redmed->getTextValue()); - } else if (a == greenmed) { - listener->panelChanged (EvColorToninggreenmed, greenmed->getTextValue()); - } else if (a == bluemed) { - listener->panelChanged (EvColorToningbluemed, bluemed->getTextValue()); - } else if (a == redhigh) { - listener->panelChanged (EvColorToningredhigh, redhigh->getTextValue()); - } else if (a == greenhigh) { - listener->panelChanged (EvColorToninggreenhigh, greenhigh->getTextValue()); - } else if (a == bluehigh) { - listener->panelChanged (EvColorToningbluehigh, bluehigh->getTextValue()); - } else if (a == balance) { - listener->panelChanged (EvColorToningbalance, balance->getTextValue()); - } else if (a == satProtectionThreshold) { - listener->panelChanged (EvColorToningSatThreshold, a->getTextValue()); - } else if (a == saturatedOpacity) { - listener->panelChanged (EvColorToningSatProtection, a->getTextValue()); - } else if (a == strength) { - listener->panelChanged (EvColorToningStrength, a->getTextValue()); - } +void ColorToning::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) +{ +} + +void ColorToning::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ } //Two Color changed @@ -828,8 +992,9 @@ void ColorToning::methodChanged () { if (!batchMode) { - labgridBox->hide(); - + labgrid->hide(); + labRegionBox->hide(); + if (method->get_active_row_number() == 0) { // Lab colorSep->show(); colorCurveEditorG->show(); @@ -977,7 +1142,7 @@ void ColorToning::methodChanged () chanMixerBox->hide(); neutrHBox->hide(); lumamode->show(); - } else if (method->get_active_row_number() == 5) { // Lab Grid + } else if (method->get_active_row_number() == 5 || method->get_active_row_number() == 6) { // Lab Grid or Lab Regions colorSep->hide(); colorCurveEditorG->hide(); twocolor->hide(); @@ -996,7 +1161,11 @@ void ColorToning::methodChanged () neutrHBox->hide(); lumamode->hide(); - labgridBox->show(); + if (method->get_active_row_number() == 5) { + labgrid->show(); + } else { + labRegionBox->show(); + } } } @@ -1053,6 +1222,17 @@ void ColorToning::colorForValue (double valX, double valY, enum ColorCaller::Ele } } else if (callerId == 4) { // color curve vertical and horizontal crosshair Color::hsv2rgb01(float(valY), 1.0f, 0.5f, R, G, B); + } else if (callerId == ID_LABREGION_HUE) { + // TODO + float x = valX - 1.f/6.f; + if (x < 0.f) { + x += 1.f; + } + x = log2lin(x, 3.f); + // float x = valX; + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + } else if (callerId == ID_LABREGION_HUE+1) { + Color::hsv2rgb01(float(valY), float(valX), 0.5f, R, G, B); } caller->ccRed = double(R); @@ -1072,6 +1252,12 @@ void ColorToning::curveChanged (CurveEditor* ce) listener->panelChanged (EvColorToningCLCurve, M("HISTORY_CUSTOMCURVE")); } else if (ce == cl2shape) { listener->panelChanged (EvColorToningLLCurve, M("HISTORY_CUSTOMCURVE")); + } else if (ce == labRegionHueMask) { + listener->panelChanged(EvLabRegionHueMask, M("HISTORY_CUSTOMCURVE")); + } else if (ce == labRegionChromaticityMask) { + listener->panelChanged(EvLabRegionChromaticityMask, M("HISTORY_CUSTOMCURVE")); + } else if (ce == labRegionLightnessMask) { + listener->panelChanged(EvLabRegionLightnessMask, M("HISTORY_CUSTOMCURVE")); } } } @@ -1141,6 +1327,55 @@ void ColorToning::trimValues (rtengine::procparams::ProcParams* pp) bluehigh->trimValue(pp->colorToning.bluehigh); } +void ColorToning::adjusterChanged(Adjuster* a, double newval) +{ + if (!listener || !getEnabled()) { + return; + } + + if (a == redlow) { + listener->panelChanged (EvColorToningredlow, redlow->getTextValue()); + } else if (a == greenlow) { + listener->panelChanged (EvColorToninggreenlow, greenlow->getTextValue()); + } else if (a == bluelow) { + listener->panelChanged (EvColorToningbluelow, bluelow->getTextValue()); + } else if (a == redmed) { + listener->panelChanged (EvColorToningredmed, redmed->getTextValue()); + } else if (a == greenmed) { + listener->panelChanged (EvColorToninggreenmed, greenmed->getTextValue()); + } else if (a == bluemed) { + listener->panelChanged (EvColorToningbluemed, bluemed->getTextValue()); + } else if (a == redhigh) { + listener->panelChanged (EvColorToningredhigh, redhigh->getTextValue()); + } else if (a == greenhigh) { + listener->panelChanged (EvColorToninggreenhigh, greenhigh->getTextValue()); + } else if (a == bluehigh) { + listener->panelChanged (EvColorToningbluehigh, bluehigh->getTextValue()); + } else if (a == balance) { + listener->panelChanged (EvColorToningbalance, balance->getTextValue()); + } else if (a == satProtectionThreshold) { + listener->panelChanged (EvColorToningSatThreshold, a->getTextValue()); + } else if (a == saturatedOpacity) { + listener->panelChanged (EvColorToningSatProtection, a->getTextValue()); + } else if (a == strength) { + listener->panelChanged (EvColorToningStrength, a->getTextValue()); + } else if (a == labRegionSaturation) { + listener->panelChanged(EvLabRegionSaturation, a->getTextValue()); + } else if (a == labRegionSlope) { + listener->panelChanged(EvLabRegionSlope, a->getTextValue()); + } else if (a == labRegionOffset) { + listener->panelChanged(EvLabRegionOffset, a->getTextValue()); + } else if (a == labRegionPower) { + listener->panelChanged(EvLabRegionPower, a->getTextValue()); + } else if (a == labRegionMaskBlur) { + listener->panelChanged(EvLabRegionMaskBlur, a->getTextValue()); + } +} + +void ColorToning::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void ColorToning::setBatchMode (bool batchMode) { ToolPanel::setBatchMode (batchMode); @@ -1166,8 +1401,233 @@ void ColorToning::setBatchMode (bool batchMode) } -bool ColorToning::resetPressed(GdkEventButton* event) + +void ColorToning::onLabRegionSelectionChanged() { - labgrid->reset(event->state & GDK_CONTROL_MASK); - return false; + auto s = labRegionList->get_selected(); + if (!s.empty()) { + // update the selected values + labRegionGet(labRegionSelected); + labRegionSelected = s[0]; + labRegionShow(labRegionSelected); + if (labRegionShowMask->get_active()) { + labRegionShowMaskChanged(); + } + } +} + + +void ColorToning::labRegionGet(int idx) +{ + if (idx < 0 || size_t(idx) >= labRegionData.size()) { + return; + } + + auto &r = labRegionData[idx]; + double la, lb; + labRegionAB->getParams(la, lb, r.a, r.b); + r.saturation = labRegionSaturation->getValue(); + r.slope = labRegionSlope->getValue(); + r.offset = labRegionOffset->getValue(); + r.power = labRegionPower->getValue(); + r.hueMask = labRegionHueMask->getCurve(); + r.chromaticityMask = labRegionChromaticityMask->getCurve(); + r.lightnessMask = labRegionLightnessMask->getCurve(); + r.maskBlur = labRegionMaskBlur->getValue(); + r.channel = labRegionChannel->get_active_row_number() - 1; +} + + +void ColorToning::labRegionAddPressed() +{ + labRegionSelected = labRegionData.size(); + labRegionData.push_back(rtengine::ColorToningParams::LabCorrectionRegion()); + labRegionPopulateList(); + labRegionShow(labRegionSelected); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } +} + + +void ColorToning::labRegionRemovePressed() +{ + if (labRegionList->size() > 1) { + labRegionData.erase(labRegionData.begin() + labRegionSelected); + labRegionSelected = LIM(labRegionSelected-1, 0, int(labRegionData.size()-1)); + labRegionPopulateList(); + labRegionShow(labRegionSelected); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } + } +} + + +void ColorToning::labRegionUpPressed() +{ + if (labRegionSelected > 0) { + auto r = labRegionData[labRegionSelected]; + labRegionData.erase(labRegionData.begin() + labRegionSelected); + --labRegionSelected; + labRegionData.insert(labRegionData.begin() + labRegionSelected, r); + labRegionPopulateList(); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } + } +} + + +void ColorToning::labRegionDownPressed() +{ + if (labRegionSelected < int(labRegionData.size()-1)) { + auto r = labRegionData[labRegionSelected]; + labRegionData.erase(labRegionData.begin() + labRegionSelected); + ++labRegionSelected; + labRegionData.insert(labRegionData.begin() + labRegionSelected, r); + labRegionPopulateList(); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } + } +} + + +void ColorToning::labRegionCopyPressed() +{ + if (labRegionSelected < int(labRegionData.size())) { + auto r = labRegionData[labRegionSelected]; + labRegionData.push_back(r); + labRegionSelected = labRegionData.size()-1; + labRegionPopulateList(); + + if (listener) { + listener->panelChanged(EvLabRegionList, M("HISTORY_CHANGED")); + } + } +} + + +void ColorToning::labRegionShowMaskChanged() +{ + if (listener) { + listener->panelChanged(EvLabRegionShowMask, labRegionShowMask->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + + +void ColorToning::labRegionPopulateList() +{ + ConnectionBlocker b(labRegionSelectionConn); + labRegionList->clear_items(); + rtengine::ColorToningParams::LabCorrectionRegion dflt; + + for (size_t i = 0; i < labRegionData.size(); ++i) { + auto &r = labRegionData[i]; + auto j = labRegionList->append(std::to_string(i+1)); + labRegionList->set_text(j, 1, Glib::ustring::compose("a=%1 b=%2 S=%3\ns=%4 o=%5 p=%6", round_ab(r.a), round_ab(r.b), r.saturation, r.slope, r.offset, r.power)); + const char *ch = ""; + switch (r.channel) { + case rtengine::ColorToningParams::LabCorrectionRegion::CHAN_R: + ch = "\n[Red]"; break; + case rtengine::ColorToningParams::LabCorrectionRegion::CHAN_G: + ch = "\n[Green]"; break; + case rtengine::ColorToningParams::LabCorrectionRegion::CHAN_B: + ch = "\n[Blue]"; break; + default: + ch = ""; + } + labRegionList->set_text( + j, 2, Glib::ustring::compose( + "%1%2%3%4%5", + hasMask(dflt.hueMask, r.hueMask) ? "H" : "", + hasMask(dflt.chromaticityMask, r.chromaticityMask) ? "C" : "", + hasMask(dflt.lightnessMask, r.lightnessMask) ? "L" : "", + r.maskBlur ? Glib::ustring::compose(" b=%1", r.maskBlur) : "", + ch)); + } +} + + +void ColorToning::labRegionShow(int idx, bool list_only) +{ + const bool disable = listener; + if (disable) { + disableListener(); + } + rtengine::ColorToningParams::LabCorrectionRegion dflt; + auto &r = labRegionData[idx]; + if (!list_only) { + labRegionAB->setParams(0, 0, r.a, r.b, false); + labRegionSaturation->setValue(r.saturation); + labRegionSlope->setValue(r.slope); + labRegionOffset->setValue(r.offset); + labRegionPower->setValue(r.power); + labRegionHueMask->setCurve(r.hueMask); + labRegionChromaticityMask->setCurve(r.chromaticityMask); + labRegionLightnessMask->setCurve(r.lightnessMask); + labRegionMaskBlur->setValue(r.maskBlur); + labRegionChannel->set_active(r.channel+1); + } + labRegionList->set_text(idx, 1, Glib::ustring::compose("a=%1 b=%2 S=%3\ns=%4 o=%5 p=%6", round_ab(r.a), round_ab(r.b), r.saturation, r.slope, r.offset, r.power)); + const char *ch = ""; + switch (r.channel) { + case rtengine::ColorToningParams::LabCorrectionRegion::CHAN_R: + ch = "\n[Red]"; break; + case rtengine::ColorToningParams::LabCorrectionRegion::CHAN_G: + ch = "\n[Green]"; break; + case rtengine::ColorToningParams::LabCorrectionRegion::CHAN_B: + ch = "\n[Blue]"; break; + default: + ch = ""; + } + labRegionList->set_text( + idx, 2, Glib::ustring::compose( + "%1%2%3%4%5", + hasMask(dflt.hueMask, r.hueMask) ? "H" : "", + hasMask(dflt.chromaticityMask, r.chromaticityMask) ? "C" : "", + hasMask(dflt.lightnessMask, r.lightnessMask) ? "L" : "", + r.maskBlur ? Glib::ustring::compose(" b=%1", r.maskBlur) : "", ch)); + Gtk::TreePath pth; + pth.push_back(idx); + labRegionList->get_selection()->select(pth); + if (disable) { + enableListener(); + } +} + + +void ColorToning::labRegionChannelChanged() +{ + if (listener) { + listener->panelChanged(EvLabRegionChannel, labRegionChannel->get_active_text()); + } +} + + +void ColorToning::setEditProvider(EditDataProvider *provider) +{ + labRegionHueMask->setEditProvider(provider); + labRegionChromaticityMask->setEditProvider(provider); + labRegionLightnessMask->setEditProvider(provider); +} + + +float ColorToning::blendPipetteValues(CurveEditor *ce, float chan1, float chan2, float chan3) +{ + if (ce == labRegionChromaticityMask && chan1 > 0.f) { + return lin2log(chan1, 10.f); + } else if (ce == labRegionHueMask && chan1 > 0.f) { + float x = chan1 + 1.f/6.f; + if (x > 1.f) { + x -= 1.f; + } + return lin2log(x, 3.f); + } + return CurveListener::blendPipetteValues(ce, chan1, chan2, chan3); } diff --git a/rtgui/colortoning.h b/rtgui/colortoning.h index 73ac1dff2..29a71b03b 100644 --- a/rtgui/colortoning.h +++ b/rtgui/colortoning.h @@ -25,35 +25,54 @@ class ColorToning final : { public: ColorToning (); - ~ColorToning(); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void trimValues (rtengine::procparams::ProcParams* pp); - void adjusterChanged (Adjuster* a, double newval); - void adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop); + ~ColorToning() override; + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void trimValues (rtengine::procparams::ProcParams* pp) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; void setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool satOpacityAdd, bool strprotectAdd, bool balanceAdd); void neutral_pressed (); //void neutralCurves_pressed (); - void autoColorTonChanged (int bwct, int satthres, int satprot); + void autoColorTonChanged (int bwct, int satthres, int satprot) override; bool CTComp_ (); - void enabledChanged (); - void curveChanged (CurveEditor* ce); + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + + void enabledChanged () override; + void curveChanged (CurveEditor* ce) override; void autosatChanged (); - void autoOpenCurve (); + void autoOpenCurve () override; void methodChanged (); void twocolorChanged (bool changedbymethod); void twoColorChangedByGui (); void lumamodeChanged (); - void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; + + void setListener(ToolPanelListener *tpl) override; + + void setEditProvider(EditDataProvider *provider) override; + float blendPipetteValues(CurveEditor *ce, float chan1, float chan2, float chan3) override; - void setListener(ToolPanelListener *tpl); - private: - bool resetPressed(GdkEventButton* event); + void onLabRegionSelectionChanged(); + void labRegionAddPressed(); + void labRegionRemovePressed(); + void labRegionUpPressed(); + void labRegionDownPressed(); + void labRegionCopyPressed(); + void labRegionShowMaskChanged(); + void labRegionChannelChanged(); + void labRegionPopulateList(); + void labRegionShow(int idx, bool list_only=false); + void labRegionGet(int idx); //Gtk::HSeparator* satLimiterSep; Gtk::HSeparator* colorSep; @@ -107,9 +126,43 @@ private: sigc::connection lumamodeConn; rtengine::ProcEvent EvColorToningLabGridValue; - Gtk::Button *labgridReset; LabGrid *labgrid; - Gtk::HBox *labgridBox; + + rtengine::ProcEvent EvLabRegionList; + rtengine::ProcEvent EvLabRegionAB; + rtengine::ProcEvent EvLabRegionSaturation; + rtengine::ProcEvent EvLabRegionLightness; + rtengine::ProcEvent EvLabRegionSlope; + rtengine::ProcEvent EvLabRegionOffset; + rtengine::ProcEvent EvLabRegionPower; + rtengine::ProcEvent EvLabRegionHueMask; + rtengine::ProcEvent EvLabRegionChromaticityMask; + rtengine::ProcEvent EvLabRegionLightnessMask; + rtengine::ProcEvent EvLabRegionMaskBlur; + rtengine::ProcEvent EvLabRegionShowMask; + rtengine::ProcEvent EvLabRegionChannel; + + Gtk::VBox *labRegionBox; + Gtk::ListViewText *labRegionList; + Gtk::Button *labRegionAdd; + Gtk::Button *labRegionRemove; + Gtk::Button *labRegionUp; + Gtk::Button *labRegionDown; + Gtk::Button *labRegionCopy; + LabGrid *labRegionAB; + Adjuster *labRegionSaturation; + Adjuster *labRegionSlope; + Adjuster *labRegionOffset; + Adjuster *labRegionPower; + MyComboBoxText *labRegionChannel; + FlatCurveEditor *labRegionHueMask; + FlatCurveEditor *labRegionChromaticityMask; + FlatCurveEditor *labRegionLightnessMask; + Adjuster *labRegionMaskBlur; + Gtk::CheckButton *labRegionShowMask; + std::vector labRegionData; + int labRegionSelected; + sigc::connection labRegionSelectionConn; IdleRegister idle_register; }; diff --git a/rtgui/config.h.in b/rtgui/config.h.in index fdf64b73c..2d1f41dbc 100644 --- a/rtgui/config.h.in +++ b/rtgui/config.h.in @@ -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 --git a/rtgui/coordinateadjuster.cc b/rtgui/coordinateadjuster.cc index 209ef0902..2525a07e5 100644 --- a/rtgui/coordinateadjuster.cc +++ b/rtgui/coordinateadjuster.cc @@ -127,7 +127,6 @@ void CoordinateAdjuster::createWidgets(const std::vector &axis) Gtk::Grid *box = Gtk::manage (new Gtk::Grid()); box->set_orientation(Gtk::ORIENTATION_HORIZONTAL); - box->set_column_spacing(3); setExpandAlignProperties(currAdjuster->label, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); setExpandAlignProperties(currAdjuster->spinButton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); diff --git a/rtgui/coordinateadjuster.h b/rtgui/coordinateadjuster.h index e6e16b7a2..33ea92bb2 100644 --- a/rtgui/coordinateadjuster.h +++ b/rtgui/coordinateadjuster.h @@ -57,7 +57,7 @@ public: /** @brief Update the position of the edited point ; will trigger events * * @param pos New position - * @param chanIdx Chanel index as given in the std::vector upon instantiation + * @param chanIdx Channel index as given in the std::vector upon instantiation */ virtual void setPos(double pos, int chanIdx) = 0; virtual void stopNumericalAdjustment() = 0; @@ -91,7 +91,7 @@ public: // used to update the AxisAdjuster's parameters void updateGUI(const Axis &axis); - // useed to update the displayed value + // used to update the displayed value void setValue(double newValue); //bool keyPressed(GdkEventKey* event); void valueChanged(); @@ -136,7 +136,7 @@ public: /// For more complex adjuster CoordinateAdjuster(CoordinateProvider *provider, CurveEditorSubGroup *parent, const std::vector &axis); - virtual ~CoordinateAdjuster(); + ~CoordinateAdjuster() override; // Update the Axis list, e.g. on Curve change, but MUST have the same axis count void setAxis(const std::vector &axis); diff --git a/rtgui/crop.cc b/rtgui/crop.cc index 29c64501d..de693d399 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -17,9 +17,12 @@ * along with RawTherapee. If not, see . */ #include "crop.h" + #include "options.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -28,36 +31,28 @@ extern Options options; namespace { -class RefreshSpinHelper +inline void get_custom_ratio(int w, int h, double &rw, double &rh) { - -public: - Crop* crop; - bool notify; - RefreshSpinHelper (Crop* _crop, bool _notify) - : crop(_crop), notify(_notify) {} -}; - -int refreshSpinsUI (void* data) -{ - RefreshSpinHelper* rsh = static_cast(data); - rsh->crop->refreshSpins (rsh->notify); - delete rsh; - return 0; + if (w < h) { + double r = double(h) / double(w); + int rr = r * 100 + 0.5; + rw = 1.0; + rh = rr / 100.0; + } else { + double r = double(w) / double(h); + int rr = r * 100 + 0.5; + rw = rr / 100.0; + rh = 1.0; + } } -int notifyListenerUI (void* data) -{ - static_cast(data)->notifyListener(); - return 0; -} - -} +} // namespace Crop::Crop(): FoldableToolPanel(this, "crop", M("TP_CROP_LABEL"), false, true), crop_ratios{ {M("GENERAL_ASIMAGE"), 0.0}, + {M("GENERAL_CURRENT"), -1.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 @@ -99,88 +94,141 @@ Crop::Crop(): maxw = 3000; maxh = 2000; - Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); + methodgrid = Gtk::manage(new Gtk::Grid()); + methodgrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(methodgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + Gtk::Label* xlab = Gtk::manage (new Gtk::Label (M("TP_CROP_X") + ":")); + setExpandAlignProperties(xlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - hb1->pack_start (*Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("TP_CROP_X") + ": "))); x = Gtk::manage (new MySpinButton ()); - x->set_size_request (60, -1); - hb1->pack_start (*x); + setExpandAlignProperties(x, true, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + x->set_width_chars(6); + + Gtk::Label* ylab = Gtk::manage (new Gtk::Label (M("TP_CROP_Y") + ":")); + setExpandAlignProperties(ylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - hb1->pack_start (*Gtk::manage (new Gtk::Label (Glib::ustring(" ") + M("TP_CROP_Y") + ": "))); y = Gtk::manage (new MySpinButton ()); - y->set_size_request (60, -1); - hb1->pack_start (*y); + setExpandAlignProperties(y, true, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + y->set_width_chars(6); - pack_start (*hb1, Gtk::PACK_SHRINK, 2); + Gtk::Label* wlab = Gtk::manage (new Gtk::Label (M("TP_CROP_W") + ":")); + setExpandAlignProperties(wlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - Gtk::HBox* hb2 = Gtk::manage (new Gtk::HBox ()); - - hb2->pack_start (*Gtk::manage (new Gtk::Label (M("TP_CROP_W") + ": "))); w = Gtk::manage (new MySpinButton ()); - w->set_size_request (60, -1); - hb2->pack_start (*w); + setExpandAlignProperties(w, true, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + w->set_width_chars(6); + + Gtk::Label* hlab = Gtk::manage (new Gtk::Label (M("TP_CROP_H") + ":")); + setExpandAlignProperties(hlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - hb2->pack_start (*Gtk::manage (new Gtk::Label (M("TP_CROP_H") + ": "))); h = Gtk::manage (new MySpinButton ()); - h->set_size_request (60, -1); - hb2->pack_start (*h); - - pack_start (*hb2, Gtk::PACK_SHRINK, 4); + setExpandAlignProperties(h, true, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + h->set_width_chars(6); selectCrop = Gtk::manage (new Gtk::Button (M("TP_CROP_SELECTCROP"))); - selectCrop->set_image (*Gtk::manage (new RTImage ("crop.png"))); + setExpandAlignProperties(selectCrop, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + selectCrop->get_style_context()->add_class("independent"); + selectCrop->set_image (*Gtk::manage (new RTImage ("crop-small.png"))); - pack_start (*selectCrop, Gtk::PACK_SHRINK, 2); + resetCrop = Gtk::manage (new Gtk::Button (M("TP_CROP_RESETCROP"))); + setExpandAlignProperties(resetCrop, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + resetCrop->get_style_context()->add_class("independent"); + resetCrop->set_image (*Gtk::manage (new RTImage ("undo-small.png"))); - Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ()); + methodgrid->attach (*xlab, 0, 0, 1, 1); + methodgrid->attach (*x, 1, 0, 1, 1); + methodgrid->attach (*ylab, 2, 0, 1, 1); + methodgrid->attach (*y, 3, 0, 1, 1); + methodgrid->attach (*wlab, 0, 1, 1, 1); + methodgrid->attach (*w, 1, 1, 1, 1); + methodgrid->attach (*hlab, 2, 1, 1, 1); + methodgrid->attach (*h, 3, 1, 1, 1); + methodgrid->attach (*selectCrop, 0, 2, 2, 1); + methodgrid->attach (*resetCrop, 2, 2, 2, 1); + pack_start (*methodgrid, Gtk::PACK_EXPAND_WIDGET, 0 ); + + Gtk::HSeparator* methodseparator = Gtk::manage (new Gtk::HSeparator()); + methodseparator->get_style_context()->add_class("grid-row-separator"); + pack_start (*methodseparator, Gtk::PACK_SHRINK, 0); + + Gtk::Grid* settingsgrid = Gtk::manage(new Gtk::Grid()); + settingsgrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(settingsgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); fixr = Gtk::manage (new Gtk::CheckButton (M("TP_CROP_FIXRATIO"))); + setExpandAlignProperties(fixr, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); fixr->set_active (1); - hb3->pack_start (*fixr, Gtk::PACK_SHRINK, 4); + Gtk::Grid* ratiogrid = Gtk::manage(new Gtk::Grid()); + ratiogrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(ratiogrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); ratio = Gtk::manage (new MyComboBoxText ()); - hb3->pack_start (*ratio, Gtk::PACK_EXPAND_WIDGET, 4); + setExpandAlignProperties(ratio, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); orientation = Gtk::manage (new MyComboBoxText ()); - hb3->pack_start (*orientation); + setExpandAlignProperties(orientation, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - pack_start (*hb3, Gtk::PACK_SHRINK, 4); + customRatioLabel = Gtk::manage(new Gtk::Label("")); + customRatioLabel->hide(); + setExpandAlignProperties(customRatioLabel, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - Gtk::HBox* hb31 = Gtk::manage (new Gtk::HBox ()); + ratiogrid->set_column_homogeneous (true); + ratiogrid->attach (*ratio, 0, 0, 1, 1); + ratiogrid->attach (*customRatioLabel, 1, 0, 1, 1); + ratiogrid->attach (*orientation, 1, 0, 1, 1); + + Gtk::Label* guidelab = Gtk::manage (new Gtk::Label (M("TP_CROP_GUIDETYPE"))); + setExpandAlignProperties(guidelab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - hb31->pack_start (*Gtk::manage (new Gtk::Label (M("TP_CROP_GUIDETYPE"))), Gtk::PACK_SHRINK, 4); guide = Gtk::manage (new MyComboBoxText ()); - hb31->pack_start (*guide); + setExpandAlignProperties(guide, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - pack_start (*hb31, Gtk::PACK_SHRINK, 4); + settingsgrid->attach (*fixr, 0, 0, 1, 1); + settingsgrid->attach (*ratiogrid, 1, 0, 1, 1); + settingsgrid->attach (*guidelab, 0, 1, 1, 1); + settingsgrid->attach (*guide, 1, 1, 1, 1); + pack_start (*settingsgrid, Gtk::PACK_SHRINK, 0 ); - // ppibox START - ppibox = Gtk::manage (new Gtk::VBox()); - ppibox->pack_start (*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_SHRINK, 2); - Gtk::HBox* hb4 = Gtk::manage (new Gtk::HBox ()); - hb4->pack_start (*Gtk::manage (new Gtk::Label (M("TP_CROP_PPI")))); + // ppigrid START + ppigrid = Gtk::manage(new Gtk::Grid()); + ppigrid->get_style_context()->add_class("grid-spacing"); + ppigrid->set_column_homogeneous (true); + setExpandAlignProperties(ppigrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + Gtk::HSeparator* ppiseparator = Gtk::manage (new Gtk::HSeparator()); + ppiseparator->get_style_context()->add_class("grid-row-separator"); + + Gtk::Grid* ppisubgrid = Gtk::manage(new Gtk::Grid()); + ppisubgrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(ppisubgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + Gtk::Label* ppilab = Gtk::manage (new Gtk::Label (M("TP_CROP_PPI"))); + setExpandAlignProperties(ppilab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + ppi = Gtk::manage (new MySpinButton ()); - ppi->set_size_request (60, -1); - hb4->pack_start (*ppi); + setExpandAlignProperties(ppi, true, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); + ppi->set_width_chars(6); - sizebox = Gtk::manage (new Gtk::VBox()); + ppisubgrid->attach (*ppilab, 0, 0, 1, 1); + ppisubgrid->attach (*ppi, 1, 0, 1, 1); sizecm = Gtk::manage (new Gtk::Label (M("GENERAL_NA") + " cm x " + M("GENERAL_NA") + " cm")); + setExpandAlignProperties(sizecm, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + sizein = Gtk::manage (new Gtk::Label (M("GENERAL_NA") + " in x " + M("GENERAL_NA") + " in")); + setExpandAlignProperties(sizein, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - sizebox->pack_start (*sizecm, Gtk::PACK_SHRINK, 4); - sizebox->pack_start (*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_SHRINK, 6); - sizebox->pack_start (*sizein, Gtk::PACK_SHRINK, 4); - sizebox->pack_start (*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_SHRINK, 6); - sizebox->pack_start (*hb4, Gtk::PACK_SHRINK, 2); - - ppibox->pack_start (*sizebox, Gtk::PACK_SHRINK, 1); - pack_start (*ppibox, Gtk::PACK_SHRINK, 0); + ppigrid->attach (*ppiseparator, 0, 0, 2, 1); + ppigrid->attach (*sizecm, 1, 1, 1, 1); + ppigrid->attach (*sizein, 1, 2, 1, 1); + ppigrid->attach (*ppisubgrid, 0, 1, 1, 2); + pack_start (*ppigrid, Gtk::PACK_SHRINK, 0 ); ppi->set_value (300); - // ppibox END + // ppigrid END // Populate the combobox for (const auto& crop_ratio : crop_ratios) { @@ -240,10 +288,25 @@ Crop::Crop(): oconn = orientation->signal_changed().connect( sigc::mem_fun(*this, &Crop::ratioChanged) ); gconn = guide->signal_changed().connect( sigc::mem_fun(*this, &Crop::notifyListener) ); selectCrop->signal_pressed().connect( sigc::mem_fun(*this, &Crop::selectPressed) ); + resetCrop->signal_pressed().connect( sigc::mem_fun(*this, &Crop::doresetCrop) ); ppi->signal_value_changed().connect( sigc::mem_fun(*this, &Crop::refreshSize) ); nx = ny = nw = nh = 0; lastRotationDeg = 0; + +//GTK318 +#if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 20 + methodgrid->set_row_spacing(4); + methodgrid->set_column_spacing(4); + settingsgrid->set_row_spacing(4); + settingsgrid->set_column_spacing(4); + ppigrid->set_row_spacing(4); + ppigrid->set_column_spacing(4); + ppisubgrid->set_row_spacing(4); + ppisubgrid->set_column_spacing(4); +#endif +//GTK318 + show_all (); } @@ -293,13 +356,6 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) setDimensions (pp->crop.x + pp->crop.w, pp->crop.y + pp->crop.h); } - 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 > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; if (pp->crop.orientation == "Landscape") { @@ -340,6 +396,20 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) nw = pp->crop.w; nh = pp->crop.h; + customRatioLabel->hide(); + orientation->show(); + if (pp->crop.ratio == "As Image") { + ratio->set_active(0); + } else if (pp->crop.ratio == "Current") { + ratio->set_active(1); + updateCurrentRatio(); + customRatioLabel->show(); + orientation->hide(); + } else { + ratio->set_active_text (pp->crop.ratio); + } + fixr->set_active (pp->crop.fixratio); + lastRotationDeg = pp->coarse.rotate; wDirty = false; @@ -392,7 +462,13 @@ void Crop::write (ProcParams* pp, ParamsEdited* pedited) pp->crop.w = nw; pp->crop.h = nh; pp->crop.fixratio = fixr->get_active (); - pp->crop.ratio = ratio->get_active_text (); + if (ratio->get_active_row_number() == 0) { + pp->crop.ratio = "As Image"; + } else if (ratio->get_active_row_number() == 1) { + pp->crop.ratio = "Current"; + } else { + 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 > 0 && crop_ratios[ratio->get_active_row_number()].value < 1.0; @@ -481,6 +557,29 @@ void Crop::selectPressed () } } +void Crop::doresetCrop () +{ + xDirty = true; + yDirty = true; + wDirty = true; + hDirty = true; + + int X = 0; + int Y = 0; + int W = maxw; + int H = maxh; + cropResized (X, Y, W, H); + idle_register.add( + [this]() -> bool + { + notifyListener(); + return false; + } + ); + + refreshSpins(); +} + void Crop::notifyListener () { @@ -514,16 +613,26 @@ void Crop::enabledChanged () void Crop::hFlipCrop () { - nx = maxw - nx - nw; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::vFlipCrop () { - ny = maxh - ny - nh; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::rotateCrop (int deg, bool hflip, bool vflip) @@ -563,7 +672,13 @@ void Crop::rotateCrop (int deg, bool hflip, bool vflip) } lastRotationDeg = deg; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::positionChanged () @@ -577,7 +692,13 @@ void Crop::positionChanged () int W = nw; int H = nh; cropMoved (X, Y, W, H); - idle_register.add(notifyListenerUI, this); + idle_register.add( + [this]() -> bool + { + notifyListener(); + return false; + } + ); } void Crop::widthChanged () @@ -590,7 +711,13 @@ void Crop::widthChanged () int W = (int)w->get_value (); int H = nh; cropWidth2Resized (X, Y, W, H); - idle_register.add(notifyListenerUI, this); + idle_register.add( + [this]() -> bool + { + notifyListener(); + return false; + } + ); } void Crop::heightChanged () @@ -603,7 +730,13 @@ void Crop::heightChanged () int W = nw; int H = (int)h->get_value (); cropHeight2Resized (X, Y, W, H); - idle_register.add(notifyListenerUI, this); + idle_register.add( + [this]() -> bool + { + notifyListener(); + return false; + } + ); } // Fixed ratio toggle button @@ -628,8 +761,17 @@ void Crop::ratioFixedChanged () // change to orientation or ration void Crop::ratioChanged () { + if (ratio->get_active_row_number() == 1) { + orientation->hide(); + updateCurrentRatio(); + customRatioLabel->show(); + } else { + orientation->show(); + customRatioLabel->hide(); + } + if (!fixr->get_active ()) { - fixr->set_active(true); // will ajust ratio anyway + fixr->set_active(true); // will adjust ratio anyway } else { adjustCropToRatio(); } @@ -639,23 +781,62 @@ void Crop::ratioChanged () void Crop::adjustCropToRatio() { if (fixr->get_active() && !fixr->get_inconsistent()) { + int W1 = nw, W2 = nw; + int H1 = nh, H2 = nh; + int X1 = nx, X2 = nx; + int Y1 = ny, Y2 = ny; -// int W = w->get_value (); -// int H = h->get_value (); - int W = nw; - int H = nh; - int X = nx; - int Y = ny; + float r = getRatio(); - if (W >= H) { - cropWidth2Resized (X, Y, W, H); + H1 = round(W1 / r); + Y1 = ny + (nh - H1)/2.0; + if (Y1 < 0) { + Y1 = 0; + } + if (H1 > maxh) { + H1 = maxh; + W1 = round(H1 * r); + X1 = nx + (nw - W1)/2.0; + } + if (Y1+H1 > maxh) { + Y1 = maxh - H1; + } + + W2 = round(H2 * r); + X2 = nx + (nw - W2)/2.0; + if (X2 < 0) { + X2 = 0; + } + if (W2 > maxw) { + W2 = maxw; + H2 = round(W2 / r); + Y2 = ny + (nh - H2)/2.0; + } + if (X2+W2 > maxw) { + X2 = maxw - W2; + } + + if (W1 * H1 >= W2 * H2) { + nx = X1; + ny = Y1; + nw = W1; + nh = H1; } else { - cropHeight2Resized (X, Y, W, H); + nx = X2; + ny = Y2; + nw = W2; + nh = H2; } } // This will save the options - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, true)); + idle_register.add( + [this]() -> bool + { + refreshSpins(true); + return false; + } + ); } void Crop::refreshSize () @@ -727,28 +908,15 @@ void Crop::setDimensions (int mw, int mh) refreshSize (); } -void Crop::sizeChanged (int x, int y, int ow, int oh) +void Crop::sizeChanged(int x, int y, int ow, int oh) { - struct Params { - Crop* crop; - int x; - int y; - }; - - Params* const params = new Params{ - this, - x, - y - }; - - const auto func = [](gpointer data) -> gboolean { - Params* const params = static_cast(data); - params->crop->setDimensions(params->x, params->y); - delete params; - return FALSE; - }; - - idle_register.add(func, params); + idle_register.add( + [this, x, y]() -> bool + { + setDimensions(x, y); + return false; + } + ); } bool Crop::refreshSpins (bool notify) @@ -774,6 +942,10 @@ bool Crop::refreshSpins (bool notify) wconn.block (false); hconn.block (false); + if (ratio->get_active_row_number() == 1 && !fixr->get_active()) { + updateCurrentRatio(); + } + refreshSize (); if (notify) { @@ -812,7 +984,13 @@ void Crop::cropMoved (int &X, int &Y, int &W, int &H) nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); // Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); } @@ -856,7 +1034,13 @@ void Crop::cropWidth1Resized (int &X, int &Y, int &W, int &H, float custom_ratio nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropWidth2Resized (int &X, int &Y, int &W, int &H, float custom_ratio) @@ -896,7 +1080,13 @@ void Crop::cropWidth2Resized (int &X, int &Y, int &W, int &H, float custom_ratio nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropHeight1Resized (int &X, int &Y, int &W, int &H, float custom_ratio) @@ -939,7 +1129,13 @@ void Crop::cropHeight1Resized (int &X, int &Y, int &W, int &H, float custom_rati nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropHeight2Resized (int &X, int &Y, int &W, int &H, float custom_ratio) @@ -979,7 +1175,13 @@ void Crop::cropHeight2Resized (int &X, int &Y, int &W, int &H, float custom_rati nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropTopLeftResized (int &X, int &Y, int &W, int &H, float custom_ratio) @@ -1021,7 +1223,13 @@ void Crop::cropTopLeftResized (int &X, int &Y, int &W, int &H, float custom_rati nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropTopRightResized (int &X, int &Y, int &W, int &H, float custom_ratio) @@ -1061,7 +1269,13 @@ void Crop::cropTopRightResized (int &X, int &Y, int &W, int &H, float custom_rat nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropBottomLeftResized (int &X, int &Y, int &W, int &H, float custom_ratio) @@ -1101,7 +1315,13 @@ void Crop::cropBottomLeftResized (int &X, int &Y, int &W, int &H, float custom_r nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropBottomRightResized (int &X, int &Y, int &W, int &H, float custom_ratio) @@ -1138,7 +1358,13 @@ void Crop::cropBottomRightResized (int &X, int &Y, int &W, int &H, float custom_ nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropInit (int &x, int &y, int &w, int &h) @@ -1252,17 +1478,28 @@ void Crop::cropResized (int &x, int &y, int& x2, int& y2) nw = W; nh = H; - idle_register.add(refreshSpinsUI, new RefreshSpinHelper(this, false)); + idle_register.add( + [this]() -> bool + { + refreshSpins(false); + return false; + } + ); } void Crop::cropManipReady () { - idle_register.add(notifyListenerUI, this); + idle_register.add( + [this]() -> bool + { + notifyListener(); + return false; + } + ); } -double Crop::getRatio () +double Crop::getRatio () const { - double r = -1.0; if (!fixr->get_active()) { @@ -1296,5 +1533,16 @@ void Crop::setBatchMode (bool batchMode) ratio->append (M("GENERAL_UNCHANGED")); orientation->append (M("GENERAL_UNCHANGED")); guide->append (M("GENERAL_UNCHANGED")); - removeIfThere (this, ppibox); + removeIfThere (this, ppigrid); + removeIfThere (methodgrid, selectCrop); + removeIfThere (methodgrid, resetCrop); +} + + +void Crop::updateCurrentRatio() +{ + double rw, rh; + get_custom_ratio(w->get_value(), h->get_value(), rw, rh); + customRatioLabel->set_text(Glib::ustring::compose("%1:%2", rw, rh)); + crop_ratios[1].value = double(w->get_value())/double(h->get_value()); } diff --git a/rtgui/crop.h b/rtgui/crop.h index e786d8364..ed0661598 100644 --- a/rtgui/crop.h +++ b/rtgui/crop.h @@ -41,42 +41,43 @@ class Crop final : { public: Crop(); - ~Crop(); + ~Crop() override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void ratioChanged (); void ratioFixedChanged (); // The toggle button void refreshSize (); void selectPressed (); + void doresetCrop (); void setDimensions (int mw, int mh); - void enabledChanged (); + void enabledChanged () override; void positionChanged (); void widthChanged (); void heightChanged (); bool refreshSpins (bool notify = false); void notifyListener (); - void sizeChanged (int w, int h, int ow, int oh); + void sizeChanged (int w, int h, int ow, int oh) override; void trim (rtengine::procparams::ProcParams* pp, int ow, int oh); void readOptions (); void writeOptions (); - void cropMoved (int &x, int &y, int &w, int &h); - void cropWidth1Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropWidth2Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropHeight1Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropHeight2Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropTopLeftResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropTopRightResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropBottomLeftResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropBottomRightResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f); - void cropInit (int &x, int &y, int &w, int &h); - void cropResized (int &x, int &y, int& x2, int& y2); - void cropManipReady (); - bool inImageArea (int x, int y); - double getRatio (); + void cropMoved (int &x, int &y, int &w, int &h) override; + void cropWidth1Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropWidth2Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropHeight1Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropHeight2Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropTopLeftResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropTopRightResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropBottomLeftResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropBottomRightResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) override; + void cropInit (int &x, int &y, int &w, int &h) override; + void cropResized (int &x, int &y, int& x2, int& y2) override; + void cropManipReady () override; + bool inImageArea (int x, int y) override; + double getRatio () const override; void setCropPanelListener (CropPanelListener* cl) { @@ -94,15 +95,18 @@ private: double value; }; - const std::vector crop_ratios; + std::vector crop_ratios; void adjustCropToRatio(); + void updateCurrentRatio(); Gtk::CheckButton* fixr; MyComboBoxText* ratio; MyComboBoxText* orientation; MyComboBoxText* guide; + Gtk::Button* selectCrop; + Gtk::Button* resetCrop; CropPanelListener* clistener; int opt; MySpinButton* x; @@ -112,8 +116,10 @@ private: MySpinButton* ppi; Gtk::Label* sizecm; Gtk::Label* sizein; - Gtk::VBox* ppibox; - Gtk::VBox* sizebox; + Gtk::Grid* ppigrid; + Gtk::Grid* methodgrid; + Gtk::Label *customRatioLabel; + int maxw, maxh; double nx, ny; int nw, nh; diff --git a/rtgui/cropguilistener.h b/rtgui/cropguilistener.h index 239e9d002..7a791ef93 100644 --- a/rtgui/cropguilistener.h +++ b/rtgui/cropguilistener.h @@ -23,21 +23,21 @@ class CropGUIListener { public: - virtual ~CropGUIListener() {} - virtual void cropMoved (int &x, int &y, int &w, int &h) = 0; - virtual void cropWidth1Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropWidth2Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropHeight1Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropHeight2Resized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropTopLeftResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropTopRightResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropBottomLeftResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropBottomRightResized (int &x, int &y, int &w, int &h, float custom_ratio=0.f) = 0; - virtual void cropInit (int &x, int &y, int &w, int &h) = 0; - virtual void cropResized (int &x, int &y, int& x2, int& y2) = 0; - virtual void cropManipReady () = 0; - virtual bool inImageArea (int x, int y) = 0; - virtual double getRatio () = 0; + virtual ~CropGUIListener() = default; + virtual void cropMoved(int &x, int &y, int &w, int &h) = 0; + virtual void cropWidth1Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropWidth2Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropHeight1Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropHeight2Resized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropTopLeftResized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropTopRightResized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropBottomLeftResized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropBottomRightResized(int &x, int &y, int &w, int &h, float custom_ratio = 0.f) = 0; + virtual void cropInit(int &x, int &y, int &w, int &h) = 0; + virtual void cropResized(int &x, int &y, int& x2, int& y2) = 0; + virtual void cropManipReady() = 0; + virtual bool inImageArea(int x, int y) = 0; + virtual double getRatio() const = 0; }; #endif diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc index 6228cb1c7..ab2f3626c 100644 --- a/rtgui/crophandler.cc +++ b/rtgui/crophandler.cc @@ -23,25 +23,45 @@ #include "guiutils.h" #include "cropwindow.h" #include "imagearea.h" + #include "../rtengine/dcrop.h" +#include "../rtengine/procparams.h" #include "../rtengine/refreshmap.h" #include "../rtengine/rt_math.h" 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() : + cropParams(new procparams::CropParams), + colorParams(new procparams::ColorManagementParams), + 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 +79,6 @@ CropHandler::~CropHandler () 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) @@ -100,15 +110,9 @@ void CropHandler::newImage (StagedImageProcessor* ipc_, bool isDetailWindow) initial = true; } -void CropHandler::sizeChanged (int x, int y, int ow, int oh) // the ipc notifies it to keep track size changes like rotation +void CropHandler::sizeChanged(int x, int y, int ow, int oh) // the ipc notifies it to keep track size changes like rotation { - compDim (); - -// this should be put into an idle source!!! - /* if (listener) - listener->cropWindowChanged (); - */ } bool CropHandler::isFullDisplay () @@ -123,8 +127,8 @@ bool CropHandler::isFullDisplay () double CropHandler::getFitCropZoom () { - double z1 = (double) wh / cropParams.h; - double z2 = (double) ww / cropParams.w; + double z1 = (double) wh / cropParams->h; + double z2 = (double) ww / cropParams->w; return z1 < z2 ? z1 : z2; } @@ -192,9 +196,10 @@ void CropHandler::setZoom (int z, int centerx, int centery) 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 (); } @@ -293,133 +298,121 @@ void CropHandler::getPosition (int& x, int& y) } -void CropHandler::setDetailedCrop (IImage8* im, IImage8* imtrue, rtengine::procparams::ColorManagementParams cmp, - rtengine::procparams::CropParams cp, int ax, int ay, int aw, int ah, int askip) +void CropHandler::setDetailedCrop( + IImage8* im, + IImage8* imtrue, + const rtengine::procparams::ColorManagementParams& cmp, + const rtengine::procparams::CropParams& cp, + int ax, + int ay, + int aw, + int ah, + int askip +) { - if (!enabled) { return; } cimg.lock (); - cropParams = cp; - colorParams = cmp; + *cropParams = cp; + *colorParams = cmp; - 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); + bool expected = false; - if (idle_helper->destroyed) { - if (idle_helper->pending == 1) { - delete idle_helper; - } else { - idle_helper->pending--; - } + if (redraw_needed.compare_exchange_strong(expected, true)) { + idle_register.add( + [this]() -> bool + { + cimg.lock (); - return FALSE; - } + if (redraw_needed.exchange(false)) { + cropPixbuf.clear (); - CropHandler* ch = idle_helper->cropHandler; + if (!enabled) { + cropimg.clear(); + cropimgtrue.clear(); + cimg.unlock (); + return false; + } - ch->cimg.lock (); - ch->cropPixbuf.clear (); + if (!cropimg.empty()) { + if (cix == cropX && ciy == cropY && ciw == cropW && cih == cropH && cis == (zoom >= 1000 ? 1 : zoom / 10)) { + // calculate final image size + float czoom = zoom >= 1000 ? + zoom / 1000.f : + float((zoom/10) * 10) / float(zoom); + int imw = cropimg_width * czoom; + int imh = cropimg_height * czoom; - if (!ch->enabled) { - delete [] ch->cropimg; - ch->cropimg = nullptr; - delete [] ch->cropimgtrue; - ch->cropimgtrue = nullptr; - ch->cimg.unlock (); - return FALSE; - } + if (imw > ww) { + imw = ww; + } - 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 (imh > wh) { + imh = wh; + } - if (imw > ch->ww) { - imw = ch->ww; + Glib::RefPtr tmpPixbuf = Gdk::Pixbuf::create_from_data (cropimg.data(), Gdk::COLORSPACE_RGB, false, 8, cropimg_width, cropimg_height, 3 * cropimg_width); + cropPixbuf = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh); + tmpPixbuf->scale (cropPixbuf, 0, 0, imw, imh, 0, 0, czoom, czoom, Gdk::INTERP_TILES); + tmpPixbuf.clear (); + + Glib::RefPtr tmpPixbuftrue = Gdk::Pixbuf::create_from_data (cropimgtrue.data(), Gdk::COLORSPACE_RGB, false, 8, cropimg_width, cropimg_height, 3 * cropimg_width); + cropPixbuftrue = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, false, 8, imw, imh); + tmpPixbuftrue->scale (cropPixbuftrue, 0, 0, imw, imh, 0, 0, czoom, czoom, Gdk::INTERP_TILES); + tmpPixbuftrue.clear (); + } + + cropimg.clear(); + cropimgtrue.clear(); + } + + cimg.unlock (); + + if (displayHandler) { + displayHandler->cropImageUpdated (); + + if (initial.exchange(false)) { + displayHandler->initialImageArrived (); + } + } + } else { + cimg.unlock(); } - 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 (); + return false; } - - delete [] ch->cropimg; - ch->cropimg = nullptr; - delete [] ch->cropimgtrue; - ch->cropimgtrue = nullptr; - } - - ch->cimg.unlock (); - - if (ch->displayHandler) { - ch->displayHandler->cropImageUpdated (); - - if (ch->initial) { - ch->displayHandler->initialImageArrived (); - ch->initial = false; - } - } - - idle_helper->pending--; - - return FALSE; - }; - - idle_register.add(func, idle_helper, G_PRIORITY_HIGH_IDLE); + ); + } } cimg.unlock (); } -bool CropHandler::getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip) +void CropHandler::getWindow(int& cwx, int& cwy, int& cww, int& cwh, int& cskip) { - cwx = cropX; cwy = cropY; cww = cropW; @@ -435,8 +428,6 @@ bool CropHandler::getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip) } cskip = zoom >= 1000 ? 1 : zoom/10; - - return true; } void CropHandler::update () @@ -468,13 +459,11 @@ void CropHandler::setEnabled (bool e) 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 --git a/rtgui/crophandler.h b/rtgui/crophandler.h index 1e7a9202b..e0b48d348 100644 --- a/rtgui/crophandler.h +++ b/rtgui/crophandler.h @@ -19,11 +19,17 @@ #ifndef __CROPHANDLER__ #define __CROPHANDLER__ +#include +#include +#include + +#include + #include "../rtengine/rtengine.h" -#include "threadutils.h" + #include "edit.h" #include "lockablecolorpicker.h" -#include +#include "threadutils.h" class CropDisplayHandler { @@ -46,7 +52,7 @@ class CropHandler final : { public: CropHandler (); - ~CropHandler (); + ~CropHandler () override; void setDisplayHandler (CropDisplayHandler* l) { @@ -81,29 +87,33 @@ public: } // DetailedCropListener interface - void setDetailedCrop (rtengine::IImage8* im, rtengine::IImage8* imworking, rtengine::procparams::ColorManagementParams cmp, - rtengine::procparams::CropParams cp, int cx, int cy, int cw, int ch, int skip); - bool getWindow (int& cwx, int& cwy, int& cww, int& cwh, int& cskip); + void setDetailedCrop( + rtengine::IImage8* im, + rtengine::IImage8* imworking, + const rtengine::procparams::ColorManagementParams& cmp, + const rtengine::procparams::CropParams& cp, + int cx, + int cy, + int cw, + int ch, + int skip + ) override; + void getWindow(int& cwx, int& cwy, int& cww, int& cwh, int& cskip) override; + // SizeListener interface - void sizeChanged (int w, int h, int ow, int oh); + void sizeChanged (int w, int h, int ow, int oh) override; void update (); - rtengine::procparams::CropParams cropParams; - rtengine::procparams::ColorManagementParams colorParams; - Glib::RefPtr cropPixbuf; - Glib::RefPtr cropPixbuftrue; + const std::unique_ptr cropParams; + const std::unique_ptr colorParams; + Glib::RefPtr cropPixbuf; // image displayed on monitor, using the monitor profile (i.e. lab to monitor profile) + Glib::RefPtr cropPixbuftrue; // internal image in output color space for analysis (i.e. lab to either Working profile or Output profile, depending on options.rtSettings.HistogramWorking) 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 +122,18 @@ private: 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 --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index 001805362..46227709d 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -16,21 +16,22 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "cropwindow.h" - #include -#include "../rtengine/mytime.h" -#include "../rtengine/rt_math.h" -#include "../rtengine/dcrop.h" +#include "cropwindow.h" -#include "guiutils.h" -#include "threadutils.h" -#include "rtimage.h" #include "cursormanager.h" -#include "options.h" +#include "guiutils.h" #include "imagearea.h" #include "lockablecolorpicker.h" +#include "options.h" +#include "rtimage.h" +#include "threadutils.h" + +#include "../rtengine/dcrop.h" +#include "../rtengine/mytime.h" +#include "../rtengine/procparams.h" +#include "../rtengine/rt_math.h" using namespace rtengine; @@ -44,7 +45,7 @@ CropWindow::CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDet crop_custom_ratio(0.f) { initZoomSteps(); - + Glib::RefPtr context = parent->get_pango_context () ; Pango::FontDescription fontd = context->get_font_description (); fontd.set_weight (Pango::WEIGHT_BOLD); @@ -57,11 +58,11 @@ CropWindow::CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDet titleHeight = ih; - bZoomOut = new LWButton (RTImage::createFromPng ("gtk-zoom-out-small.png"), 0, nullptr, LWButton::Left, LWButton::Center, "Zoom Out"); - bZoomIn = new LWButton (RTImage::createFromPng ("gtk-zoom-in-small.png"), 1, nullptr, LWButton::Left, LWButton::Center, "Zoom In"); - bZoom100 = new LWButton (RTImage::createFromPng ("gtk-zoom-100-small.png"), 2, nullptr, LWButton::Left, LWButton::Center, "Zoom 100/%"); - //bZoomFit = new LWButton (RTImage::createFromPng ("gtk-zoom-fit.png"), 3, NULL, LWButton::Left, LWButton::Center, "Zoom Fit"); - bClose = new LWButton (RTImage::createFromPng ("gtk-close-small.png"), 4, nullptr, LWButton::Right, LWButton::Center, "Close"); + bZoomOut = new LWButton (RTImage::createFromPng ("magnifier-minus-small.png"), 0, nullptr, LWButton::Left, LWButton::Center, "Zoom Out"); + bZoomIn = new LWButton (RTImage::createFromPng ("magnifier-plus-small.png"), 1, nullptr, LWButton::Left, LWButton::Center, "Zoom In"); + bZoom100 = new LWButton (RTImage::createFromPng ("magnifier-1to1-small.png"), 2, nullptr, LWButton::Left, LWButton::Center, "Zoom 100/%"); + //bZoomFit = new LWButton (RTImage::createFromPng ("magnifier-fit.png"), 3, NULL, LWButton::Left, LWButton::Center, "Zoom Fit"); + bClose = new LWButton (RTImage::createFromPng ("cancel-small.png"), 4, nullptr, LWButton::Right, LWButton::Center, "Close"); buttonSet.add (bZoomOut); buttonSet.add (bZoomIn); @@ -267,15 +268,26 @@ void CropWindow::flawnOver (bool isFlawnOver) this->isFlawnOver = isFlawnOver; } -void CropWindow::scroll (int state, GdkScrollDirection direction, int x, int y) +void CropWindow::scroll (int state, GdkScrollDirection direction, int x, int y, double deltaX, double deltaY) { + double delta = 0.0; + if (abs(deltaX) > abs(deltaY)) { + delta = deltaX; + } else { + delta = deltaY; + } + if (delta == 0.0 && direction == GDK_SCROLL_SMOOTH) { + // sometimes this case happens. To avoid zooming into the wrong direction in this case, we just do nothing + return; + } + bool isUp = direction == GDK_SCROLL_UP || (direction == GDK_SCROLL_SMOOTH && delta < 0.0); if ((state & GDK_CONTROL_MASK) && onArea(ColorPicker, x, y)) { // resizing a color picker - if (direction == GDK_SCROLL_UP) { + if (isUp) { hoveredPicker->incSize(); updateHoveredPicker(); iarea->redraw (); - }else if (direction == GDK_SCROLL_DOWN) { + } else { hoveredPicker->decSize(); updateHoveredPicker(); iarea->redraw (); @@ -287,9 +299,9 @@ void CropWindow::scroll (int state, GdkScrollDirection direction, int x, int y) screenCoordToImage(newCenterX, newCenterY, newCenterX, newCenterY); - if (direction == GDK_SCROLL_UP && !isMaxZoom()) { + if (isUp && !isMaxZoom()) { zoomIn (true, newCenterX, newCenterY); - } else if (!isMinZoom()) { + } else if (!isUp && !isMinZoom()) { zoomOut (true, newCenterX, newCenterY); } } @@ -341,10 +353,10 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) } else { if (onArea (CropImage, x, y)) { // events inside of the image domain crop_custom_ratio = 0.f; - if ((bstate & GDK_SHIFT_MASK) && cropHandler.cropParams.w > 0 && cropHandler.cropParams.h > 0) { - crop_custom_ratio = float(cropHandler.cropParams.w) / float(cropHandler.cropParams.h); + if ((bstate & GDK_SHIFT_MASK) && cropHandler.cropParams->w > 0 && cropHandler.cropParams->h > 0) { + crop_custom_ratio = float(cropHandler.cropParams->w) / float(cropHandler.cropParams->h); } - + if (iarea->getToolMode () == TMColorPicker) { if (hoveredPicker) { if ((bstate & GDK_CONTROL_MASK) && !(bstate & GDK_SHIFT_MASK)) { @@ -362,7 +374,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) // Add a new Color Picker rtengine::Coord imgPos; screenCoordToImage(x, y, imgPos.x, imgPos.y); - LockableColorPicker *newPicker = new LockableColorPicker(this, &cropHandler.colorParams.output, &cropHandler.colorParams.working); + LockableColorPicker *newPicker = new LockableColorPicker(this, &cropHandler.colorParams->outputProfile, &cropHandler.colorParams->workingProfile); colorPickers.push_back(newPicker); hoveredPicker = newPicker; updateHoveredPicker(&imgPos); @@ -376,49 +388,49 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) } else if (onArea (CropTopLeft, x, y)) { state = SResizeTL; press_x = x; - action_x = cropHandler.cropParams.x; + action_x = cropHandler.cropParams->x; press_y = y; - action_y = cropHandler.cropParams.y; + action_y = cropHandler.cropParams->y; } else if (onArea (CropTopRight, x, y)) { state = SResizeTR; press_x = x; - action_x = cropHandler.cropParams.w; + action_x = cropHandler.cropParams->w; press_y = y; - action_y = cropHandler.cropParams.y; + action_y = cropHandler.cropParams->y; } else if (onArea (CropBottomLeft, x, y)) { state = SResizeBL; press_x = x; - action_x = cropHandler.cropParams.x; + action_x = cropHandler.cropParams->x; press_y = y; - action_y = cropHandler.cropParams.h; + action_y = cropHandler.cropParams->h; } else if (onArea (CropBottomRight, x, y)) { state = SResizeBR; press_x = x; - action_x = cropHandler.cropParams.w; + action_x = cropHandler.cropParams->w; press_y = y; - action_y = cropHandler.cropParams.h; + action_y = cropHandler.cropParams->h; } else if (onArea (CropTop, x, y)) { state = SResizeH1; press_y = y; - action_y = cropHandler.cropParams.y; + action_y = cropHandler.cropParams->y; } else if (onArea (CropBottom, x, y)) { state = SResizeH2; press_y = y; - action_y = cropHandler.cropParams.h; + action_y = cropHandler.cropParams->h; } else if (onArea (CropLeft, x, y)) { state = SResizeW1; press_x = x; - action_x = cropHandler.cropParams.x; + action_x = cropHandler.cropParams->x; } else if (onArea (CropRight, x, y)) { state = SResizeW2; press_x = x; - action_x = cropHandler.cropParams.w; + action_x = cropHandler.cropParams->w; } else if ((bstate & GDK_SHIFT_MASK) && onArea (CropInside, x, y)) { state = SCropMove; press_x = x; press_y = y; - action_x = cropHandler.cropParams.x; - action_y = cropHandler.cropParams.y; + action_x = cropHandler.cropParams->x; + action_y = cropHandler.cropParams->y; } else if (onArea (CropObserved, x, y)) { state = SObservedMove; press_x = x; @@ -439,11 +451,11 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y) } else if (iarea->getToolMode () == TMCropSelect && cropgl) { state = SCropSelecting; screenCoordToImage (x, y, press_x, press_y); - cropHandler.cropParams.enabled = true; - cropHandler.cropParams.x = press_x; - cropHandler.cropParams.y = press_y; - cropHandler.cropParams.w = cropHandler.cropParams.h = 1; - cropgl->cropInit (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h); + cropHandler.cropParams->enabled = true; + cropHandler.cropParams->x = press_x; + cropHandler.cropParams->y = press_y; + cropHandler.cropParams->w = cropHandler.cropParams->h = 1; + cropgl->cropInit (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h); } else if (iarea->getToolMode () == TMHand) { if (editSubscriber) { if ((cropgl && cropgl->inImageArea(iarea->posImage.x, iarea->posImage.y) && (editSubscriber->getEditingType() == ET_PIPETTE && (bstate & GDK_CONTROL_MASK))) || editSubscriber->getEditingType() == ET_OBJECTS) { @@ -754,10 +766,6 @@ void CropWindow::buttonRelease (int button, int num, int bstate, int x, int y) } iarea->setToolHand (); - - if (pmhlistener) { - pmhlistener->toggleFreeze(); - } } state = SNormal; @@ -820,57 +828,57 @@ void CropWindow::pointerMoved (int bstate, int x, int y) action_y = y; iarea->redraw (); } else if (state == SResizeH1 && cropgl) { - int oy = cropHandler.cropParams.y; - cropHandler.cropParams.y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.h += oy - cropHandler.cropParams.y; - cropgl->cropHeight1Resized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + int oy = cropHandler.cropParams->y; + cropHandler.cropParams->y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->h += oy - cropHandler.cropParams->y; + cropgl->cropHeight1Resized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SResizeH2 && cropgl) { - cropHandler.cropParams.h = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; - cropgl->cropHeight2Resized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + cropHandler.cropParams->h = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; + cropgl->cropHeight2Resized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SResizeW1 && cropgl) { - int ox = cropHandler.cropParams.x; - cropHandler.cropParams.x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.w += ox - cropHandler.cropParams.x; - cropgl->cropWidth1Resized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + int ox = cropHandler.cropParams->x; + cropHandler.cropParams->x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->w += ox - cropHandler.cropParams->x; + cropgl->cropWidth1Resized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SResizeW2 && cropgl) { - cropHandler.cropParams.w = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; - cropgl->cropWidth2Resized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + cropHandler.cropParams->w = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; + cropgl->cropWidth2Resized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SResizeTL && cropgl) { - int ox = cropHandler.cropParams.x; - cropHandler.cropParams.x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.w += ox - cropHandler.cropParams.x; - int oy = cropHandler.cropParams.y; - cropHandler.cropParams.y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.h += oy - cropHandler.cropParams.y; - cropgl->cropTopLeftResized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + int ox = cropHandler.cropParams->x; + cropHandler.cropParams->x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->w += ox - cropHandler.cropParams->x; + int oy = cropHandler.cropParams->y; + cropHandler.cropParams->y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->h += oy - cropHandler.cropParams->y; + cropgl->cropTopLeftResized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SResizeTR && cropgl) { - cropHandler.cropParams.w = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; - int oy = cropHandler.cropParams.y; - cropHandler.cropParams.y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.h += oy - cropHandler.cropParams.y; - cropgl->cropTopRightResized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + cropHandler.cropParams->w = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; + int oy = cropHandler.cropParams->y; + cropHandler.cropParams->y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->h += oy - cropHandler.cropParams->y; + cropgl->cropTopRightResized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SResizeBL && cropgl) { - int ox = cropHandler.cropParams.x; - cropHandler.cropParams.x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.w += ox - cropHandler.cropParams.x; - cropHandler.cropParams.h = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; - cropgl->cropBottomLeftResized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + int ox = cropHandler.cropParams->x; + cropHandler.cropParams->x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->w += ox - cropHandler.cropParams->x; + cropHandler.cropParams->h = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; + cropgl->cropBottomLeftResized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SResizeBR && cropgl) { - cropHandler.cropParams.w = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.h = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; - cropgl->cropBottomRightResized (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h, crop_custom_ratio); + cropHandler.cropParams->w = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->h = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; + cropgl->cropBottomRightResized (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h, crop_custom_ratio); iarea->redraw (); } else if (state == SCropMove && cropgl) { - cropHandler.cropParams.x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; - cropHandler.cropParams.y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; - cropgl->cropMoved (cropHandler.cropParams.x, cropHandler.cropParams.y, cropHandler.cropParams.w, cropHandler.cropParams.h); + cropHandler.cropParams->x = action_x + (x - press_x) / zoomSteps[cropZoom].zoom; + cropHandler.cropParams->y = action_y + (y - press_y) / zoomSteps[cropZoom].zoom; + cropgl->cropMoved (cropHandler.cropParams->x, cropHandler.cropParams->y, cropHandler.cropParams->w, cropHandler.cropParams->h); iarea->redraw (); } else if (state == SCropSelecting && cropgl) { screenCoordToImage (x, y, action_x, action_y); @@ -879,19 +887,19 @@ void CropWindow::pointerMoved (int bstate, int x, int y) cropgl->cropResized (cx1, cy1, cx2, cy2); if (cx2 > cx1) { - cropHandler.cropParams.x = cx1; - cropHandler.cropParams.w = cx2 - cx1 + 1; + cropHandler.cropParams->x = cx1; + cropHandler.cropParams->w = cx2 - cx1 + 1; } else { - cropHandler.cropParams.x = cx2; - cropHandler.cropParams.w = cx1 - cx2 + 1; + cropHandler.cropParams->x = cx2; + cropHandler.cropParams->w = cx1 - cx2 + 1; } if (cy2 > cy1) { - cropHandler.cropParams.y = cy1; - cropHandler.cropParams.h = cy2 - cy1 + 1; + cropHandler.cropParams->y = cy1; + cropHandler.cropParams->h = cy2 - cy1 + 1; } else { - cropHandler.cropParams.y = cy2; - cropHandler.cropParams.h = cy1 - cy2 + 1; + cropHandler.cropParams->y = cy2; + cropHandler.cropParams->h = cy1 - cy2 + 1; } iarea->redraw (); @@ -1007,23 +1015,25 @@ void CropWindow::pointerMoved (int bstate, int x, int y) int mx, my; screenCoordToImage (x, y, mx, my); - if (!onArea (CropImage, x, y) || !cropHandler.cropPixbuf) { + MyMutex::MyLock lock(cropHandler.cimg); + + if (!onArea (CropImage, x, y) || !cropHandler.cropPixbuftrue) { cropHandler.getFullImageSize(mx, my); - // pmlistener->pointerMoved (false, cropHandler.colorParams.working, mx, my, -1, -1, -1); - // if (pmhlistener) pmhlistener->pointerMoved (false, cropHandler.colorParams.working, mx, my, -1, -1, -1); + // pmlistener->pointerMoved (false, cropHandler.colorParams->working, mx, my, -1, -1, -1); + // if (pmhlistener) pmhlistener->pointerMoved (false, cropHandler.colorParams->working, mx, my, -1, -1, -1); /* Glib::ustring outputProfile; - outputProfile =cropHandler.colorParams.output ; + outputProfile =cropHandler.colorParams->output ; printf("Using \"%s\" output\n", outputProfile.c_str()); - if(outputProfile=="RT_sRGB") printf("OK SRGB2"); + if(outputProfile==options.rtSettings.srgb) printf("OK SRGB2"); */ - pmlistener->pointerMoved (false, cropHandler.colorParams.output, cropHandler.colorParams.working, mx, my, -1, -1, -1); + pmlistener->pointerMoved (false, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, -1, -1, -1); if (pmhlistener) { - pmhlistener->pointerMoved (false, cropHandler.colorParams.output, cropHandler.colorParams.working, mx, my, -1, -1, -1); + pmhlistener->pointerMoved (false, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, -1, -1, -1); } } else { - /*MyMutex::MyLock lock(cropHandler.cimg); + /* int vx = x - xpos - imgX; int vy = y - ypos - imgY; @@ -1033,7 +1043,6 @@ void CropWindow::pointerMoved (int bstate, int x, int y) */ - cropHandler.cimg.lock (); int vx = x - xpos - imgX; int vy = y - ypos - imgY; @@ -1045,34 +1054,35 @@ void CropWindow::pointerMoved (int bstate, int x, int y) // guint8* pix = cropHandler.cropPixbuf->get_pixels() + vy*cropHandler.cropPixbuf->get_rowstride() + vx*3; // if (vx < cropHandler.cropPixbuf->get_width() && vy < cropHandler.cropPixbuf->get_height()) // pmlistener->pointerMoved (true, mx, my, pix[0], pix[1], pix[2]); - int imwidth = cropHandler.cropPixbuf->get_width(); - int imheight = cropHandler.cropPixbuf->get_height(); - guint8* pix = cropHandler.cropPixbuftrue->get_pixels() + vy * cropHandler.cropPixbuf->get_rowstride() + vx * 3; + int imwidth = cropHandler.cropPixbuftrue->get_width(); + int imheight = cropHandler.cropPixbuftrue->get_height(); - int rval = pix[0]; - int gval = pix[1]; - int bval = pix[2]; if (vx < imwidth && vy < imheight) { + guint8* pix = cropHandler.cropPixbuftrue->get_pixels() + vy * cropHandler.cropPixbuftrue->get_rowstride() + vx * 3; + int rval = pix[0]; + int gval = pix[1]; + int bval = pix[2]; + bool isRaw = false; rtengine::StagedImageProcessor* ipc = iarea->getImProcCoordinator(); if(ipc) { procparams::ProcParams params; ipc->getParams(¶ms); - if(params.raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) || params.raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE)) { + isRaw = params.raw.bayersensor.method == RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::NONE) || params.raw.xtranssensor.method == RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::NONE); + if(isRaw) { ImageSource *isrc = static_cast(ipc->getInitialImage()); isrc->getRawValues(mx, my, params.coarse.rotate, rval, gval, bval); } } - // pmlistener->pointerMoved (true, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); - pmlistener->pointerMoved (true, cropHandler.colorParams.output, cropHandler.colorParams.working, mx, my, rval, gval, bval); - if (pmhlistener) - // pmhlistener->pointerMoved (true, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); - { - pmhlistener->pointerMoved (true, cropHandler.colorParams.output, cropHandler.colorParams.working, mx, my, pix[0], pix[1], pix[2]); + // Updates the Navigator + // TODO: possible double color conversion if rval, gval, bval come from cropHandler.cropPixbuftrue ? see issue #4583 + pmlistener->pointerMoved (true, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, rval, gval, bval, isRaw); + + if (pmhlistener) { + // Updates the HistogramRGBArea + pmhlistener->pointerMoved (true, cropHandler.colorParams->outputProfile, cropHandler.colorParams->workingProfile, mx, my, rval, gval, bval); } } - - cropHandler.cimg.unlock (); } } } @@ -1110,87 +1120,87 @@ bool CropWindow::onArea (CursorArea a, int x, int y) case CropTopLeft: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - y1 >= cropHandler.cropParams.y - CROPRESIZEBORDER && - y1 <= cropHandler.cropParams.y + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + y1 >= cropHandler.cropParams->y - CROPRESIZEBORDER && + y1 <= cropHandler.cropParams->y + CROPRESIZEBORDER && y >= ypos + imgY && - x1 >= cropHandler.cropParams.x - CROPRESIZEBORDER && - x1 <= cropHandler.cropParams.x + CROPRESIZEBORDER && + x1 >= cropHandler.cropParams->x - CROPRESIZEBORDER && + x1 <= cropHandler.cropParams->x + CROPRESIZEBORDER && x >= xpos + imgX; case CropTopRight: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - y1 >= cropHandler.cropParams.y - CROPRESIZEBORDER && - y1 <= cropHandler.cropParams.y + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + y1 >= cropHandler.cropParams->y - CROPRESIZEBORDER && + y1 <= cropHandler.cropParams->y + CROPRESIZEBORDER && y >= ypos + imgY && - x1 >= cropHandler.cropParams.x + cropHandler.cropParams.w - 1 - CROPRESIZEBORDER && - x1 <= cropHandler.cropParams.x + cropHandler.cropParams.w - 1 + CROPRESIZEBORDER && + x1 >= cropHandler.cropParams->x + cropHandler.cropParams->w - 1 - CROPRESIZEBORDER && + x1 <= cropHandler.cropParams->x + cropHandler.cropParams->w - 1 + CROPRESIZEBORDER && x < xpos + imgX + imgW; case CropBottomLeft: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - y1 >= cropHandler.cropParams.y + cropHandler.cropParams.h - 1 - CROPRESIZEBORDER && - y1 <= cropHandler.cropParams.y + cropHandler.cropParams.h - 1 + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + y1 >= cropHandler.cropParams->y + cropHandler.cropParams->h - 1 - CROPRESIZEBORDER && + y1 <= cropHandler.cropParams->y + cropHandler.cropParams->h - 1 + CROPRESIZEBORDER && y < ypos + imgY + imgH && - x1 >= cropHandler.cropParams.x - CROPRESIZEBORDER && - x1 <= cropHandler.cropParams.x + CROPRESIZEBORDER && + x1 >= cropHandler.cropParams->x - CROPRESIZEBORDER && + x1 <= cropHandler.cropParams->x + CROPRESIZEBORDER && x >= xpos + imgX; case CropBottomRight: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - y1 >= cropHandler.cropParams.y + cropHandler.cropParams.h - 1 - CROPRESIZEBORDER && - y1 <= cropHandler.cropParams.y + cropHandler.cropParams.h - 1 + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + y1 >= cropHandler.cropParams->y + cropHandler.cropParams->h - 1 - CROPRESIZEBORDER && + y1 <= cropHandler.cropParams->y + cropHandler.cropParams->h - 1 + CROPRESIZEBORDER && y < ypos + imgY + imgH && - x1 >= cropHandler.cropParams.x + cropHandler.cropParams.w - 1 - CROPRESIZEBORDER && - x1 <= cropHandler.cropParams.x + cropHandler.cropParams.w - 1 + CROPRESIZEBORDER && + x1 >= cropHandler.cropParams->x + cropHandler.cropParams->w - 1 - CROPRESIZEBORDER && + x1 <= cropHandler.cropParams->x + cropHandler.cropParams->w - 1 + CROPRESIZEBORDER && x < xpos + imgX + imgW; case CropTop: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - x1 > cropHandler.cropParams.x + CROPRESIZEBORDER && - x1 < cropHandler.cropParams.x + cropHandler.cropParams.w - 1 - CROPRESIZEBORDER && - y1 > cropHandler.cropParams.y - CROPRESIZEBORDER && - y1 < cropHandler.cropParams.y + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + x1 > cropHandler.cropParams->x + CROPRESIZEBORDER && + x1 < cropHandler.cropParams->x + cropHandler.cropParams->w - 1 - CROPRESIZEBORDER && + y1 > cropHandler.cropParams->y - CROPRESIZEBORDER && + y1 < cropHandler.cropParams->y + CROPRESIZEBORDER && y >= ypos + imgY; case CropBottom: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - x1 > cropHandler.cropParams.x + CROPRESIZEBORDER && - x1 < cropHandler.cropParams.x + cropHandler.cropParams.w - 1 - CROPRESIZEBORDER && - y1 > cropHandler.cropParams.y + cropHandler.cropParams.h - 1 - CROPRESIZEBORDER && - y1 < cropHandler.cropParams.y + cropHandler.cropParams.h - 1 + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + x1 > cropHandler.cropParams->x + CROPRESIZEBORDER && + x1 < cropHandler.cropParams->x + cropHandler.cropParams->w - 1 - CROPRESIZEBORDER && + y1 > cropHandler.cropParams->y + cropHandler.cropParams->h - 1 - CROPRESIZEBORDER && + y1 < cropHandler.cropParams->y + cropHandler.cropParams->h - 1 + CROPRESIZEBORDER && y < ypos + imgY + imgH; case CropLeft: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - y1 > cropHandler.cropParams.y + CROPRESIZEBORDER && - y1 < cropHandler.cropParams.y + cropHandler.cropParams.h - 1 - CROPRESIZEBORDER && - x1 > cropHandler.cropParams.x - CROPRESIZEBORDER && - x1 < cropHandler.cropParams.x + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + y1 > cropHandler.cropParams->y + CROPRESIZEBORDER && + y1 < cropHandler.cropParams->y + cropHandler.cropParams->h - 1 - CROPRESIZEBORDER && + x1 > cropHandler.cropParams->x - CROPRESIZEBORDER && + x1 < cropHandler.cropParams->x + CROPRESIZEBORDER && x >= xpos + imgX; case CropRight: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - y1 > cropHandler.cropParams.y + CROPRESIZEBORDER && - y1 < cropHandler.cropParams.y + cropHandler.cropParams.h - 1 - CROPRESIZEBORDER && - x1 > cropHandler.cropParams.x + cropHandler.cropParams.w - 1 - CROPRESIZEBORDER && - x1 < cropHandler.cropParams.x + cropHandler.cropParams.w - 1 + CROPRESIZEBORDER && + return cropHandler.cropParams->enabled && + y1 > cropHandler.cropParams->y + CROPRESIZEBORDER && + y1 < cropHandler.cropParams->y + cropHandler.cropParams->h - 1 - CROPRESIZEBORDER && + x1 > cropHandler.cropParams->x + cropHandler.cropParams->w - 1 - CROPRESIZEBORDER && + x1 < cropHandler.cropParams->x + cropHandler.cropParams->w - 1 + CROPRESIZEBORDER && x < xpos + imgX + imgW; case CropInside: screenCoordToImage (x, y, x1, y1); - return cropHandler.cropParams.enabled && - y1 > cropHandler.cropParams.y && - y1 < cropHandler.cropParams.y + cropHandler.cropParams.h - 1 && - x1 > cropHandler.cropParams.x && - x1 < cropHandler.cropParams.x + cropHandler.cropParams.w - 1; + return cropHandler.cropParams->enabled && + y1 > cropHandler.cropParams->y && + y1 < cropHandler.cropParams->y + cropHandler.cropParams->h - 1 && + x1 > cropHandler.cropParams->x && + x1 < cropHandler.cropParams->x + cropHandler.cropParams->w - 1; case CropResize: return decorated && x >= xpos + width - 16 && y >= ypos + height - 16 && x < xpos + width && y < ypos + height; @@ -1251,7 +1261,7 @@ void CropWindow::updateCursor (int x, int y) if (onArea (CropObserved, x, y)) { newType = CSMove; } else { - newType = CSOpenHand; + newType = CSCrosshair; } } else if (tm == TMSpotWB) { newType = CSSpotWB; @@ -1284,7 +1294,7 @@ void CropWindow::updateCursor (int x, int y) } else if (state == SCropMove || state == SCropWinMove || state == SObservedMove) { newType = CSMove; } else if (state == SHandMove || state == SCropImgMove) { - newType = CSClosedHand; + newType = CSHandClosed; } else if (state == SResizeW1 || state == SResizeW2) { newType = CSResizeWidth; } else if (state == SResizeH1 || state == SResizeH2) { @@ -1358,7 +1368,7 @@ void CropWindow::expose (Cairo::RefPtr cr) Gdk::Cairo::set_source_pixbuf(cr, rough, posX, posY); cr->rectangle(posX, posY, rtengine::min (rough->get_width (), imgAreaW-imgX), rtengine::min (rough->get_height (), imgAreaH-imgY)); cr->fill(); -// if (cropHandler.cropParams.enabled) +// if (cropHandler.cropParams->enabled) // drawCrop (cr, x+imgX, y+imgY, imgW, imgH, cropX, cropY, zoomSteps[cropZoom].zoom, cropHandler.cropParams); } @@ -1366,7 +1376,7 @@ void CropWindow::expose (Cairo::RefPtr cr) drawObservedFrame (cr); } } else { - CropParams cropParams = cropHandler.cropParams; + CropParams cropParams = *cropHandler.cropParams; if (state == SNormal) { switch (options.cropGuides) { case Options::CROP_GUIDE_NONE: @@ -1379,8 +1389,8 @@ void CropWindow::expose (Cairo::RefPtr cr) break; } } - bool useBgColor = (state == SNormal); - + bool useBgColor = (state == SNormal || state == SDragPicker || state == SDeletePicker || state == SEditDrag1); + if (cropHandler.cropPixbuf) { imgW = cropHandler.cropPixbuf->get_width (); imgH = cropHandler.cropPixbuf->get_height (); @@ -1484,7 +1494,9 @@ void CropWindow::expose (Cairo::RefPtr cr) } } +#ifdef _OPENMP #pragma omp critical +#endif { if(maxthrstdDev_L2 > maxstdDev_L2) { maxstdDev_L2 = maxthrstdDev_L2; @@ -1648,7 +1660,7 @@ void CropWindow::expose (Cairo::RefPtr cr) const int shThreshold = options.shadowThreshold; const float ShawdowFac = 64.f / (options.shadowThreshold + 1); const float HighlightFac = 64.f / (256 - options.highlightThreshold); - const bool showclippedAny = (!showR && !showG && !showB && !showL); // will show clipping if any (all) of RGB chanels is (shadow) clipped + const bool showclippedAny = (!showR && !showG && !showB && !showL); // will show clipping if any (all) of RGB channels is (shadow) clipped #ifdef _OPENMP #pragma omp parallel for schedule(dynamic,16) @@ -1794,7 +1806,7 @@ void CropWindow::expose (Cairo::RefPtr cr) cr->fill(); } - if (cropHandler.cropParams.enabled) { + 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, cropParams, (this == iarea->mainCropWindow), useBgColor, cropHandler.isFullDisplay ()); @@ -1877,7 +1889,7 @@ void CropWindow::expose (Cairo::RefPtr cr) cr->rectangle(posX, posY, rtengine::min (rough->get_width (), imgAreaW-imgX), rtengine::min (rough->get_height (), imgAreaH-imgY)); cr->fill(); - if (cropHandler.cropParams.enabled) { + if (cropHandler.cropParams->enabled) { 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 ()); } @@ -1936,9 +1948,9 @@ void CropWindow::zoomIn (bool toCursor, int cursorX, int cursorY) y = cursorY; } else { if (zoomSteps[cropZoom].zoom <= cropHandler.getFitZoom()) { - if (cropHandler.cropParams.enabled) { - x = cropHandler.cropParams.x + cropHandler.cropParams.w / 2; - y = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; + if (cropHandler.cropParams->enabled) { + x = cropHandler.cropParams->x + cropHandler.cropParams->w / 2; + y = cropHandler.cropParams->y + cropHandler.cropParams->h / 2; } else { int fw, fh; cropHandler.getFullImageSize(fw, fh); @@ -1950,12 +1962,12 @@ void CropWindow::zoomIn (bool toCursor, int cursorX, int cursorY) } else if (zoomVersion != exposeVersion) { screenCoordToImage(xpos + imgX + imgW / 2, ypos + imgY + imgH / 2, x, y); - if (cropHandler.cropParams.enabled) { + if (cropHandler.cropParams->enabled) { // add some gravity towards crop center - int x1 = cropHandler.cropParams.x + cropHandler.cropParams.w / 2; - int y1 = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; - double cropd = sqrt(cropHandler.cropParams.h * cropHandler.cropParams.h + cropHandler.cropParams.w * cropHandler.cropParams.w) * zoomSteps[cropZoom].zoom; - double imd = sqrt(imgW * imgW + imgH + imgH); + int x1 = cropHandler.cropParams->x + cropHandler.cropParams->w / 2; + int y1 = cropHandler.cropParams->y + cropHandler.cropParams->h / 2; + double cropd = sqrt(cropHandler.cropParams->h * cropHandler.cropParams->h + cropHandler.cropParams->w * cropHandler.cropParams->w) * zoomSteps[cropZoom].zoom; + double imd = sqrt(imgW * imgW + imgH * imgH); double d; // the more we can see of the crop, the more gravity towards crop center @@ -2005,16 +2017,16 @@ void CropWindow::zoomOut (bool toCursor, int cursorX, int cursorY) fitZoom = false; } -void CropWindow::zoom11 () +void CropWindow::zoom11 (bool notify) { int x = -1; int y = -1; if (zoomSteps[cropZoom].zoom <= cropHandler.getFitZoom()) { - if (cropHandler.cropParams.enabled) { - x = cropHandler.cropParams.x + cropHandler.cropParams.w / 2; - y = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; + if (cropHandler.cropParams->enabled) { + x = cropHandler.cropParams->x + cropHandler.cropParams->w / 2; + y = cropHandler.cropParams->y + cropHandler.cropParams->h / 2; } else { int fw, fh; cropHandler.getFullImageSize(fw, fh); @@ -2027,7 +2039,7 @@ void CropWindow::zoom11 () screenCoordToImage(xpos + imgX + imgW / 2, ypos + imgY + imgH / 2, x, y); } - changeZoom (zoom11index, true, x, y); + changeZoom (zoom11index, notify, x, y, notify); fitZoom = false; } @@ -2103,7 +2115,7 @@ void CropWindow::zoomFit () void CropWindow::zoomFitCrop () { - if(cropHandler.cropParams.enabled) { + if(cropHandler.cropParams->enabled) { double z = cropHandler.getFitCropZoom (); int cz = int(zoomSteps.size())-1; @@ -2118,8 +2130,8 @@ void CropWindow::zoomFitCrop () zoomVersion = exposeVersion; int centerX, centerY; - centerX = cropHandler.cropParams.x + cropHandler.cropParams.w / 2; - centerY = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; + centerX = cropHandler.cropParams->x + cropHandler.cropParams->w / 2; + centerY = cropHandler.cropParams->y + cropHandler.cropParams->h / 2; setCropAnchorPosition(centerX, centerY); changeZoom (cz, true, centerX, centerY); fitZoom = options.cropAutoFit; @@ -2182,7 +2194,7 @@ void CropWindow::updateHoveredPicker (rtengine::Coord *imgPos) } } } -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) { @@ -2201,7 +2213,8 @@ void CropWindow::changeZoom (int zoom, bool notify, int centerx, int centery) listener->cropZoomChanged (this); } - iarea->redraw (); + if (needsRedraw) + iarea->redraw (); } LockableColorPicker::Validity CropWindow::checkValidity (LockableColorPicker* picker, const rtengine::Coord &pos) @@ -2577,7 +2590,7 @@ void CropWindow::initialImageArrived () { for (auto listener : listeners) { - listener->initialImageArrived (this); + listener->initialImageArrived(); } } diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index c1d7c59cc..395b1b621 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -32,15 +32,15 @@ #include "edit.h" class CropWindow; + class CropWindowListener { - public: - virtual ~CropWindowListener() {} - virtual void cropPositionChanged (CropWindow*) {} - virtual void cropWindowSizeChanged (CropWindow*) {} - virtual void cropZoomChanged (CropWindow*) {} - virtual void initialImageArrived (CropWindow*) {} + virtual ~CropWindowListener() = default; + virtual void cropPositionChanged(CropWindow*) = 0; + virtual void cropWindowSizeChanged(CropWindow*) = 0; + virtual void cropZoomChanged(CropWindow*) = 0; + virtual void initialImageArrived() = 0; }; class ImageArea; @@ -106,7 +106,7 @@ class CropWindow : public LWButtonListener, public CropDisplayHandler, public Ed 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 (); @@ -134,7 +134,7 @@ class CropWindow : public LWButtonListener, public CropDisplayHandler, public Ed public: CropHandler cropHandler; CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDetailWindow); - ~CropWindow (); + ~CropWindow () override; void setDecorated (bool decorated) { @@ -150,19 +150,19 @@ public: } void deleteColorPickers (); - void screenCoordToCropBuffer (int phyx, int phyy, int& cropx, int& cropy); - void screenCoordToImage (int phyx, int phyy, int& imgx, int& imgy); + void screenCoordToCropBuffer (int phyx, int phyy, int& cropx, int& cropy) override; + void screenCoordToImage (int phyx, int phyy, int& imgx, int& imgy) override; void screenCoordToCropCanvas (int phyx, int phyy, int& prevx, int& prevy); - void imageCoordToCropCanvas (int imgx, int imgy, int& phyx, int& phyy); - void imageCoordToScreen (int imgx, int imgy, int& phyx, int& phyy); - void imageCoordToCropBuffer (int imgx, int imgy, int& phyx, int& phyy); - void imageCoordToCropImage (int imgx, int imgy, int& phyx, int& phyy); - int scaleValueToImage (int value); - float scaleValueToImage (float value); - double scaleValueToImage (double value); - int scaleValueToCanvas (int value); - float scaleValueToCanvas (float value); - double scaleValueToCanvas (double value); + void imageCoordToCropCanvas (int imgx, int imgy, int& phyx, int& phyy) override; + void imageCoordToScreen (int imgx, int imgy, int& phyx, int& phyy) override; + void imageCoordToCropBuffer (int imgx, int imgy, int& phyx, int& phyy) override; + void imageCoordToCropImage (int imgx, int imgy, int& phyx, int& phyy) override; + int scaleValueToImage (int value) override; + float scaleValueToImage (float value) override; + double scaleValueToImage (double value) override; + int scaleValueToCanvas (int value) override; + float scaleValueToCanvas (float value) override; + double scaleValueToCanvas (double value) override; double getZoomFitVal (); void setPosition (int x, int y); void getPosition (int& x, int& y); @@ -176,7 +176,7 @@ public: // 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 (); @@ -187,7 +187,7 @@ public: bool isInside (int x, int y); - void scroll (int state, GdkScrollDirection direction, int x, int y); + void scroll (int state, GdkScrollDirection direction, int x, int y, double deltaX=0.0, double deltaY=0.0); void buttonPress (int button, int num, int state, int x, int y); void buttonRelease (int button, int num, int state, int x, int y); void pointerMoved (int bstate, int x, int y); @@ -197,8 +197,8 @@ public: void setEditSubscriber (EditSubscriber* newSubscriber); // interface lwbuttonlistener - void buttonPressed (LWButton* button, int actionCode, void* actionData); - void redrawNeeded (LWButton* button); + void buttonPressed (LWButton* button, int actionCode, void* actionData) override; + void redrawNeeded (LWButton* button) override; // crop handling void getCropRectangle (int& x, int& y, int& w, int& h); @@ -220,10 +220,10 @@ public: void delCropWindowListener (CropWindowListener* l); // crophandlerlistener interface - void cropImageUpdated (); - void cropWindowChanged (); - void initialImageArrived (); - void setDisplayPosition (int x, int y); + void cropImageUpdated () override; + void cropWindowChanged () override; + void initialImageArrived () override; + void setDisplayPosition (int x, int y) override; void remoteMove (int deltaX, int deltaY); void remoteMoveReady (); diff --git a/rtgui/cursormanager.cc b/rtgui/cursormanager.cc index 29d0990ff..34efbcac8 100644 --- a/rtgui/cursormanager.cc +++ b/rtgui/cursormanager.cc @@ -36,40 +36,45 @@ void CursorManager::init (Glib::RefPtr mainWindow) #endif - cResizeWidth = Gdk::Cursor::create (display, Gdk::SB_H_DOUBLE_ARROW); - cResizeHeight = Gdk::Cursor::create (display, Gdk::SB_V_DOUBLE_ARROW); - cResizeDiag = Gdk::Cursor::create (display, Gdk::BOTTOM_RIGHT_CORNER); - cResizeTopLeft = Gdk::Cursor::create (display, Gdk::TOP_LEFT_CORNER); - cResizeTopRight = Gdk::Cursor::create (display, Gdk::TOP_RIGHT_CORNER); - cResizeBottomLeft = Gdk::Cursor::create (display, Gdk::BOTTOM_LEFT_CORNER); - cResizeBottomRight = Gdk::Cursor::create (display, Gdk::BOTTOM_RIGHT_CORNER); - cCropMove = Gdk::Cursor::create (display, Gdk::FLEUR); - cCropMoving = Gdk::Cursor::create (display, Gdk::HAND2); - cCropSelection = Gdk::Cursor::create (display, Gdk::CROSSHAIR); - cLeftTanMove = Gdk::Cursor::create (display, Gdk::SB_LEFT_ARROW); - cRightTanMove = Gdk::Cursor::create (display, Gdk::SB_RIGHT_ARROW); - cAdd = Gdk::Cursor::create (display, Gdk::PLUS); - cWait = Gdk::Cursor::create (display, Gdk::CLOCK); + Glib::RefPtr add = RTImage::createFromFile("crosshair-small.png"); + Glib::RefPtr colPick = RTImage::createFromFile("color-picker-hicontrast.png"); + Glib::RefPtr colPickAdd = RTImage::createFromFile("color-picker-add-hicontrast.png"); + Glib::RefPtr cropDraw = RTImage::createFromFile("crop-point-hicontrast.png"); + Glib::RefPtr crosshair = RTImage::createFromFile("crosshair-hicontrast.png"); + Glib::RefPtr empty = RTImage::createFromFile("empty.png"); + Glib::RefPtr handClosed = RTImage::createFromFile("hand-closed-hicontrast.png"); + Glib::RefPtr handOpen = RTImage::createFromFile("hand-open-hicontrast.png"); + Glib::RefPtr moveBL = RTImage::createFromFile("node-move-sw-ne-hicontrast.png"); + Glib::RefPtr moveBR = RTImage::createFromFile("node-move-nw-se-hicontrast.png"); + Glib::RefPtr moveL = RTImage::createFromFile("node-move-x-hicontrast.png"); + Glib::RefPtr moveR = RTImage::createFromFile("node-move-x-hicontrast.png"); + Glib::RefPtr moveTL = RTImage::createFromFile("node-move-nw-se-hicontrast.png"); + Glib::RefPtr moveTR = RTImage::createFromFile("node-move-sw-ne-hicontrast.png"); + Glib::RefPtr moveX = RTImage::createFromFile("node-move-x-hicontrast.png"); + Glib::RefPtr moveXY = RTImage::createFromFile("node-move-xy-hicontrast.png"); + Glib::RefPtr moveY = RTImage::createFromFile("node-move-y-hicontrast.png"); + Glib::RefPtr rotate = RTImage::createFromFile("rotate-aroundnode-hicontrast.png"); + Glib::RefPtr wait = RTImage::createFromFile("gears.png"); // Currently unused, create *-hicontrast once used. - Glib::RefPtr hand = RTImage::createFromFile ("cross.png"); - Glib::RefPtr close_hand = RTImage::createFromFile ("closedhand.png"); - Glib::RefPtr wbpick = RTImage::createFromFile ("gtk-color-picker-small.png"); - Glib::RefPtr cpick = RTImage::createFromFile ("gtk-color-picker-add.png"); - Glib::RefPtr empty = RTImage::createFromFile ("empty.png"); - Glib::RefPtr move2D = RTImage::createFromFile ("move-2D.png"); - Glib::RefPtr move1DH = RTImage::createFromFile ("move-1D-h.png"); - Glib::RefPtr move1DV = RTImage::createFromFile ("move-1D-v.png"); - Glib::RefPtr moveRotate = RTImage::createFromFile ("move-rotate.png"); - - cHand = hand ? Gdk::Cursor::create (cAdd->get_display(), hand, 10, 10) : Gdk::Cursor::create (cAdd->get_display(), Gdk::HAND2); - cClosedHand = close_hand ? Gdk::Cursor::create (cAdd->get_display(), close_hand, 10, 10) : Gdk::Cursor::create (cAdd->get_display(), Gdk::HAND2); - cWB = wbpick ? Gdk::Cursor::create (cAdd->get_display(), wbpick, 3, 15) : Gdk::Cursor::create (cAdd->get_display(), Gdk::ARROW); - cAddPicker = cpick ? Gdk::Cursor::create (cAdd->get_display(), cpick, 3, 18) : Gdk::Cursor::create (cAdd->get_display(), Gdk::ARROW); - cHidden = empty ? Gdk::Cursor::create (cAdd->get_display(), empty, 12, 12) : Gdk::Cursor::create (cAdd->get_display(), Gdk::FLEUR); - cMove2D = move2D ? Gdk::Cursor::create (cAdd->get_display(), move2D, 11, 11) : Gdk::Cursor::create (cAdd->get_display(), Gdk::FLEUR); - cMove1DH = move1DH ? Gdk::Cursor::create (cAdd->get_display(), move1DH, 11, 11) : Gdk::Cursor::create (cAdd->get_display(), Gdk::FLEUR); - cMove1DV = move1DV ? Gdk::Cursor::create (cAdd->get_display(), move1DV, 11, 11) : Gdk::Cursor::create (cAdd->get_display(), Gdk::FLEUR); - cMoveRotate = moveRotate ? Gdk::Cursor::create (cAdd->get_display(), moveRotate, 11, 11) : Gdk::Cursor::create (cAdd->get_display(), Gdk::CIRCLE); + cAdd = add ? Gdk::Cursor::create(display, add, 8, 8) : Gdk::Cursor::create(display, Gdk::PLUS); + cAddPicker = colPickAdd ? Gdk::Cursor::create(display, colPickAdd, 4, 21) : Gdk::Cursor::create(display, Gdk::PLUS); + cCropDraw = cropDraw ? Gdk::Cursor::create(display, cropDraw, 3, 3) : Gdk::Cursor::create(display, Gdk::DIAMOND_CROSS); + cCrosshair = crosshair ? Gdk::Cursor::create(display, crosshair, 12, 12) : Gdk::Cursor::create(display, Gdk::CROSSHAIR); + cEmpty = empty ? Gdk::Cursor::create(display, empty, 12, 12) : Gdk::Cursor::create(display, Gdk::BLANK_CURSOR); + cHandClosed = handClosed ? Gdk::Cursor::create(display, handClosed, 12, 12) : Gdk::Cursor::create(display, Gdk::HAND1); + cHandOpen = handOpen ? Gdk::Cursor::create(display, handOpen, 12, 12) : Gdk::Cursor::create(display, Gdk::HAND2); + cMoveBL = moveBL ? Gdk::Cursor::create(display, moveBL, 12, 12) : Gdk::Cursor::create(display, Gdk::BOTTOM_LEFT_CORNER); + cMoveBR = moveBR ? Gdk::Cursor::create(display, moveBR, 12, 12) : Gdk::Cursor::create(display, Gdk::BOTTOM_RIGHT_CORNER); + cMoveL = moveL ? Gdk::Cursor::create(display, moveL, 12, 12) : Gdk::Cursor::create(display, Gdk::SB_LEFT_ARROW); + cMoveR = moveR ? Gdk::Cursor::create(display, moveR, 12, 12) : Gdk::Cursor::create(display, Gdk::SB_RIGHT_ARROW); + cMoveTL = moveTL ? Gdk::Cursor::create(display, moveTL, 12, 12) : Gdk::Cursor::create(display, Gdk::TOP_LEFT_CORNER); + cMoveTR = moveTR ? Gdk::Cursor::create(display, moveTR, 12, 12) : Gdk::Cursor::create(display, Gdk::TOP_RIGHT_CORNER); + cMoveX = moveX ? Gdk::Cursor::create(display, moveX, 12, 12) : Gdk::Cursor::create(display, Gdk::SB_H_DOUBLE_ARROW); + cMoveXY = moveXY ? Gdk::Cursor::create(display, moveXY, 12, 12) : Gdk::Cursor::create(display, Gdk::FLEUR); + cMoveY = moveY ? Gdk::Cursor::create(display, moveY, 12, 12) : Gdk::Cursor::create(display, Gdk::SB_V_DOUBLE_ARROW); + cRotate = rotate ? Gdk::Cursor::create(display, rotate, 12, 12) : Gdk::Cursor::create(display, Gdk::EXCHANGE); + cWB = colPick ? Gdk::Cursor::create(display, colPick, 4, 21) : Gdk::Cursor::create(display, Gdk::TARGET); + cWait = wait ? Gdk::Cursor::create(display, wait, 12, 12) : Gdk::Cursor::create(display, Gdk::CLOCK); window = mainWindow; } @@ -77,57 +82,87 @@ void CursorManager::init (Glib::RefPtr mainWindow) /* Set the cursor of the given window */ void CursorManager::setCursor (Glib::RefPtr window, CursorShape shape) { - - if (shape == CSArrow) - // set_cursor without any arguments to select system default + switch (shape) { - window->set_cursor (); - } else if (shape == CSOpenHand) { - window->set_cursor (cHand); - } else if (shape == CSClosedHand) { - window->set_cursor (cClosedHand); - } else if (shape == CSMove) { - window->set_cursor (cCropMove); - } else if (shape == CSResizeWidth) { - window->set_cursor (cResizeWidth); - } else if (shape == CSResizeHeight) { - window->set_cursor (cResizeHeight); - } else if (shape == CSResizeDiagonal) { - window->set_cursor (cResizeDiag); - } else if (shape == CSResizeTopLeft) { - window->set_cursor (cResizeTopLeft); - } else if (shape == CSResizeTopRight) { - window->set_cursor (cResizeTopRight); - } else if (shape == CSResizeBottomLeft) { - window->set_cursor (cResizeBottomLeft); - } else if (shape == CSResizeBottomRight) { - window->set_cursor (cResizeBottomRight); - } else if (shape == CSMove2D) { - window->set_cursor (cMove2D); - } else if (shape == CSMove1DH) { - window->set_cursor (cMove1DH); - } else if (shape == CSMove1DV) { - window->set_cursor (cMove1DV); - } else if (shape == CSMoveRotate) { - window->set_cursor (cMoveRotate); - } else if (shape == CSSpotWB) { - window->set_cursor (cWB); - } else if (shape == CSAddColPicker) { - window->set_cursor (cAddPicker); - } else if (shape == CSCropSelect) { - window->set_cursor (cHand); - } else if (shape == CSMoveLeft) { - window->set_cursor (cLeftTanMove); - } else if (shape == CSMoveRight) { - window->set_cursor (cRightTanMove); - } else if (shape == CSStraighten) { - window->set_cursor (cHand); - } else if (shape == CSWait) { - window->set_cursor (cWait); - } else if (shape == CSPlus) { - window->set_cursor (cAdd); - } else if (shape == CSEmpty) { - window->set_cursor (cHidden); + case CursorShape::CSAddColPicker: + window->set_cursor(cAddPicker); + break; + case CursorShape::CSArrow: + window->set_cursor(); // set_cursor without any arguments to select system default + break; + case CursorShape::CSCropSelect: + window->set_cursor(cCropDraw); + break; + case CursorShape::CSCrosshair: + window->set_cursor(cCrosshair); + break; + case CursorShape::CSEmpty: + window->set_cursor(cEmpty); + break; + case CursorShape::CSHandClosed: + window->set_cursor(cHandClosed); + break; + case CursorShape::CSHandOpen: + window->set_cursor(cHandOpen); + break; + case CursorShape::CSMove: + window->set_cursor(cHandClosed); + break; + case CursorShape::CSMove1DH: + window->set_cursor(cMoveX); + break; + case CursorShape::CSMove1DV: + window->set_cursor(cMoveY); + break; + case CursorShape::CSMove2D: + window->set_cursor(cMoveXY); + break; + case CursorShape::CSMoveLeft: + window->set_cursor(cMoveL); + break; + case CursorShape::CSMoveRight: + window->set_cursor(cMoveR); + break; + case CursorShape::CSMoveRotate: + window->set_cursor(cRotate); + break; + case CursorShape::CSPlus: + window->set_cursor(cAdd); + break; + case CursorShape::CSResizeBottomLeft: + window->set_cursor(cMoveBL); + break; + case CursorShape::CSResizeBottomRight: + window->set_cursor(cMoveBR); + break; + case CursorShape::CSResizeDiagonal: + window->set_cursor(cMoveXY); + break; + case CursorShape::CSResizeHeight: + window->set_cursor(cMoveY); + break; + case CursorShape::CSResizeTopLeft: + window->set_cursor(cMoveTL); + break; + case CursorShape::CSResizeTopRight: + window->set_cursor(cMoveTR); + break; + case CursorShape::CSResizeWidth: + window->set_cursor(cMoveX); + break; + case CursorShape::CSSpotWB: + window->set_cursor(cWB); + break; + case CursorShape::CSStraighten: + window->set_cursor(cRotate); + break; + case CursorShape::CSUndefined: + break; + case CursorShape::CSWait: + window->set_cursor(cWait); + break; + default: + window->set_cursor(cCrosshair); } } diff --git a/rtgui/cursormanager.h b/rtgui/cursormanager.h index fcd856509..7d3f068b2 100644 --- a/rtgui/cursormanager.h +++ b/rtgui/cursormanager.h @@ -22,41 +22,57 @@ #include enum CursorShape { - CSUndefined, CSArrow, CSOpenHand, CSClosedHand, CSMove, CSMoveLeft, - CSMoveRight, CSResizeWidth, CSResizeHeight, CSResizeDiagonal, - CSResizeTopLeft, CSResizeTopRight, CSResizeBottomLeft, CSResizeBottomRight, - CSMove2D, CSMove1DH, CSMove1DV, CSMoveRotate, - CSSpotWB, CSAddColPicker, CSCropSelect, CSStraighten, CSPlus, CSWait, CSEmpty + CSAddColPicker, + CSArrow, + CSCropSelect, + CSCrosshair, + CSEmpty, + CSHandClosed, + CSHandOpen, + CSMove, + CSMove1DH, + CSMove1DV, + CSMove2D, + CSMoveLeft, + CSMoveRight, + CSMoveRotate, + CSPlus, + CSResizeBottomLeft, + CSResizeBottomRight, + CSResizeDiagonal, + CSResizeHeight, + CSResizeTopLeft, + CSResizeTopRight, + CSResizeWidth, + CSSpotWB, + CSStraighten, + CSUndefined, + CSWait }; class CursorManager { private: - Glib::RefPtr cResizeWidth; - Glib::RefPtr cResizeHeight; - Glib::RefPtr cResizeDiag; - Glib::RefPtr cResizeTopLeft; - Glib::RefPtr cResizeTopRight; - Glib::RefPtr cResizeBottomLeft; - Glib::RefPtr cResizeBottomRight; - Glib::RefPtr cCropMove; - Glib::RefPtr cCropMoving; - Glib::RefPtr cLeftTanMove; - Glib::RefPtr cRightTanMove; - Glib::RefPtr cNormal; - Glib::RefPtr cCropSelection; Glib::RefPtr cAdd; - Glib::RefPtr cWait; - Glib::RefPtr cHand; - Glib::RefPtr cClosedHand; - Glib::RefPtr cWB; Glib::RefPtr cAddPicker; - Glib::RefPtr cHidden; - Glib::RefPtr cMove2D; - Glib::RefPtr cMove1DH; - Glib::RefPtr cMove1DV; - Glib::RefPtr cMoveRotate; + Glib::RefPtr cCropDraw; + Glib::RefPtr cCrosshair; + Glib::RefPtr cHandClosed; + Glib::RefPtr cHandOpen; + Glib::RefPtr cEmpty; + Glib::RefPtr cMoveBL; + Glib::RefPtr cMoveBR; + Glib::RefPtr cMoveL; + Glib::RefPtr cMoveR; + Glib::RefPtr cMoveTL; + Glib::RefPtr cMoveTR; + Glib::RefPtr cMoveX; + Glib::RefPtr cMoveY; + Glib::RefPtr cMoveXY; + Glib::RefPtr cRotate; + Glib::RefPtr cWB; + Glib::RefPtr cWait; Glib::RefPtr display; Glib::RefPtr window; diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc index 9f2dbffab..3d1223bdf 100644 --- a/rtgui/curveeditor.cc +++ b/rtgui/curveeditor.cc @@ -25,6 +25,47 @@ #include +namespace { + +class CurveTypePopUpButton: public PopUpToggleButton { +public: + CurveTypePopUpButton(const Glib::ustring &label=""): + PopUpToggleButton(label) {} + + void setPosIndexMap(const std::vector &pmap) + { + posidxmap_ = pmap; + } + +protected: + int posToIndex(int pos) const override + { + if (pos < 0 || size_t(pos) >= posidxmap_.size()) { + return pos; + } + return posidxmap_[pos]; + } + + int indexToPos(int index) const override + { + if (index < 0 || size_t(index) >= posidxmap_.size()) { + return index; + } + for (int i = 0, n = int(posidxmap_.size()); i < n; ++i) { + if (posidxmap_[i] == index) { + return i; + } + } + return -1; + } + +private: + std::vector posidxmap_; +}; + +} // namespace + + bool CurveEditor::reset() { return subGroup->curveReset(this); @@ -33,12 +74,14 @@ bool CurveEditor::reset() DiagonalCurveEditor::DiagonalCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup) : CurveEditor::CurveEditor(text, static_cast(ceGroup), ceSubGroup) { - // Order set in the same order than "enum DiagonalCurveType". Shouldn't change, for compatibility reason - curveType->addEntry("curveType-linear.png", M("CURVEEDITOR_LINEAR")); // 0 Linear - curveType->addEntry("curveType-spline.png", M("CURVEEDITOR_CUSTOM")); // 1 Spline - curveType->addEntry("curveType-parametric.png", M("CURVEEDITOR_PARAMETRIC")); // 2 Parametric - curveType->addEntry("curveType-NURBS.png", M("CURVEEDITOR_NURBS")); // 3 NURBS + curveType->addEntry("curve-linear-small.png", M("CURVEEDITOR_LINEAR")); // 0 Linear + curveType->addEntry("curve-spline-small.png", M("CURVEEDITOR_CUSTOM")); // 1 Spline + curveType->addEntry("curve-catmullrom-small.png", M("CURVEEDITOR_CATMULLROM")); // 4 CatmullRom + curveType->addEntry("curve-parametric-small.png", M("CURVEEDITOR_PARAMETRIC")); // 2 Parametric + curveType->addEntry("curve-nurbs-small.png", M("CURVEEDITOR_NURBS")); // 3 NURBS + static_cast(curveType)->setPosIndexMap({ 0, 1, 4, 2, 3 }); curveType->setSelected(DCT_Linear); + curveType->show(); rangeLabels[0] = M("CURVEEDITOR_SHADOWS"); @@ -65,6 +108,9 @@ std::vector DiagonalCurveEditor::getCurve () case (DCT_NURBS): return curve = NURBSCurveEd; + case (DCT_CatumullRom): + return curve = catmullRomCurveEd; + default: // returning Linear or Unchanged curve.push_back((double)(selected)); @@ -96,6 +142,13 @@ void DiagonalCurveEditor::setResetCurve(DiagonalCurveType cType, const std::vect break; + case (DCT_CatumullRom): + if (resetCurve.size() && DiagonalCurveType(resetCurve.at(0)) == cType) { + catmullRomResetCurve = resetCurve; + } + + break; + default: break; } @@ -145,8 +198,8 @@ FlatCurveEditor::FlatCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, identityValue = 0.5; // Order set in the same order than "enum FlatCurveType". Shouldn't change, for compatibility reason - curveType->addEntry("curveType-flatLinear.png", M("CURVEEDITOR_LINEAR")); // 0 Linear - curveType->addEntry("curveType-controlPoints.png", M("CURVEEDITOR_MINMAXCPOINTS")); // 1 Min/Max ControlPoints + curveType->addEntry("curve-flat-small.png", M("CURVEEDITOR_LINEAR")); // 0 Linear + curveType->addEntry("curve-controlpoints-small.png", M("CURVEEDITOR_MINMAXCPOINTS")); // 1 Min/Max ControlPoints curveType->setSelected(FCT_Linear); curveType->show(); } @@ -209,9 +262,9 @@ CurveEditor::CurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEd subGroup = ceSubGroup; if (group && text.size()) { - curveType = new PopUpToggleButton(text + ":"); + curveType = new CurveTypePopUpButton(text + ":"); } else { - curveType = new PopUpToggleButton(); + curveType = new CurveTypePopUpButton(); } curveType->set_tooltip_text(M("CURVEEDITOR_TYPE")); @@ -254,7 +307,7 @@ void CurveEditor::setUnChanged (bool uc) /* * Update the backgrounds histograms */ -void CurveEditor::updateBackgroundHistogram (LUTu & hist) +void CurveEditor::updateBackgroundHistogram(const LUTu& hist) { // Copy the histogram in the curve editor cache if (hist) { @@ -265,7 +318,7 @@ void CurveEditor::updateBackgroundHistogram (LUTu & hist) } // Then call the curve editor group to eventually update the histogram - subGroup->updateBackgroundHistogram (this); + subGroup->updateBackgroundHistogram(this); } // Open up the curve if it has modifications and it's not already opened @@ -443,5 +496,5 @@ CursorShape CurveEditor::getCursor(const int objectID) return CSResizeHeight; } - return CSOpenHand; + return CSHandOpen; } diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h index 3f279ff05..4cf49a377 100644 --- a/rtgui/curveeditor.h +++ b/rtgui/curveeditor.h @@ -88,12 +88,12 @@ protected: public: CurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup); - virtual ~CurveEditor (); + ~CurveEditor () override; void typeSelectionChanged (int n); void curveTypeToggled(); bool isUnChanged (); void setUnChanged (bool uc); - void updateBackgroundHistogram (LUTu & hist); + void updateBackgroundHistogram(const LUTu& hist); void setLeftBarColorProvider(ColorProvider* cp, int callerId); void setBottomBarColorProvider(ColorProvider* cp, int callerId); @@ -127,12 +127,12 @@ public: sigc::signal signal_curvepoint_click(); sigc::signal signal_curvepoint_release(); - void switchOffEditMode (); - bool mouseOver(const int modifierKey); - bool button1Pressed(const int modifierKey); - bool button1Released(); - bool drag1(const int modifierKey); - CursorShape getCursor(const int objectID); + void switchOffEditMode () override; + bool mouseOver(const int modifierKey) override; + bool button1Pressed(const int modifierKey) override; + bool button1Released() override; + bool drag1(const int modifierKey) override; + CursorShape getCursor(const int objectID) override; }; @@ -156,12 +156,14 @@ protected: std::vector paramResetCurve; std::vector NURBSCurveEd; std::vector NURBSResetCurve; + std::vector catmullRomCurveEd; + std::vector catmullRomResetCurve; Glib::ustring rangeLabels[4]; double rangeMilestones[3]; public: DiagonalCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup); - std::vector getCurve (); + std::vector getCurve () override; void setRangeLabels(Glib::ustring r1, Glib::ustring r2, Glib::ustring r3, Glib::ustring r4); void getRangeLabels(Glib::ustring &r1, Glib::ustring &r2, Glib::ustring &r3, Glib::ustring &r4); void setRangeDefaultMilestones(double m1, double m2, double m3); @@ -191,15 +193,15 @@ protected: public: FlatCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup, bool isPeriodic = true); - virtual void setIdentityValue (const double iValue = 0.5) + void setIdentityValue (const double iValue = 0.5) override { identityValue = iValue; } - virtual double getIdentityValue () + double getIdentityValue () override { return identityValue; }; - std::vector getCurve (); + std::vector getCurve () override; // set the reset curve for a given curve type. This is optional; all curve type have a default reset curve void setResetCurve(FlatCurveType cType, const std::vector &resetCurve); diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index e8f636f8b..4e5f038d6 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -152,7 +152,7 @@ void CurveEditorGroup::newLine() if (isHeader) { curve_reset = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties(curve_reset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - curve_reset->add (*Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png"))); + curve_reset->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); curve_reset->set_relief (Gtk::RELIEF_NONE); curve_reset->set_tooltip_text (M("CURVEEDITOR_TOOLTIPLINEAR")); curve_reset->signal_clicked().connect( sigc::mem_fun(*this, &CurveEditorGroup::curveResetPressed) ); @@ -370,7 +370,7 @@ void CurveEditorGroup::setTooltip( Glib::ustring ttip) void CurveEditorGroup::setBatchMode (bool batchMode) { for (std::vector::iterator i = curveEditors.begin(); i != curveEditors.end(); ++i) { - (*i)->curveType->addEntry("unchanged-18.png", M("GENERAL_UNCHANGED")); + (*i)->curveType->addEntry("template-24.png", M("GENERAL_UNCHANGED")); (*i)->curveType->show(); } } diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index ffd522fae..80a1a95a4 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -71,7 +71,7 @@ public: */ CurveEditorGroup(Glib::ustring& curveDir, Glib::ustring groupLabel = ""); - ~CurveEditorGroup(); + ~CurveEditorGroup() override; void newLine(); void curveListComplete(); void setBatchMode (bool batchMode); @@ -97,8 +97,8 @@ protected: void hideCurrentCurve (); void updateGUI (CurveEditor* ce); void curveResetPressed (); - void curveChanged (); - float blendPipetteValues(CurveEditor* ce, float chan1, float chan2, float chan3); + void curveChanged () override; + float blendPipetteValues(CurveEditor* ce, float chan1, float chan2, float chan3) override; void setUnChanged (bool uc, CurveEditor* ce); }; diff --git a/rtgui/darkframe.cc b/rtgui/darkframe.cc index 9f1f61d18..77e9c53a6 100644 --- a/rtgui/darkframe.cc +++ b/rtgui/darkframe.cc @@ -16,12 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "darkframe.h" -#include "options.h" -#include "guiutils.h" #include + +#include "darkframe.h" + +#include "guiutils.h" +#include "options.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -33,7 +37,7 @@ DarkFrame::DarkFrame () : FoldableToolPanel(this, "darkframe", M("TP_DARKFRAME_L bindCurrentFolder (*darkFrameFile, options.lastDarkframeDir); dfLabel = Gtk::manage(new Gtk::Label(M("GENERAL_FILE"))); btnReset = Gtk::manage(new Gtk::Button()); - btnReset->set_image (*Gtk::manage(new RTImage ("gtk-cancel.png"))); + btnReset->set_image (*Gtk::manage(new RTImage ("cancel-small.png"))); hbdf->pack_start(*dfLabel, Gtk::PACK_SHRINK, 0); hbdf->pack_start(*darkFrameFile); hbdf->pack_start(*btnReset, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/darkframe.h b/rtgui/darkframe.h index 0660c953d..c385a2153 100644 --- a/rtgui/darkframe.h +++ b/rtgui/darkframe.h @@ -55,8 +55,8 @@ public: DarkFrame (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; void darkFrameChanged (); void darkFrameReset (); diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc index 5f70925e7..7d29b8c8f 100644 --- a/rtgui/defringe.cc +++ b/rtgui/defringe.cc @@ -16,9 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "defringe.h" -#include #include +#include + +#include "defringe.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -149,9 +152,8 @@ void Defringe::curveChanged () } } -void Defringe::adjusterChanged (Adjuster* a, double newval) +void Defringe::adjusterChanged(Adjuster* a, double newval) { - if (listener && getEnabled()) { if (a == radius) { @@ -162,6 +164,10 @@ void Defringe::adjusterChanged (Adjuster* a, double newval) } } +void Defringe::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void Defringe::enabledChanged () { diff --git a/rtgui/defringe.h b/rtgui/defringe.h index ef0bfd2aa..1aa6cc303 100644 --- a/rtgui/defringe.h +++ b/rtgui/defringe.h @@ -41,17 +41,18 @@ protected: public: Defringe (); - ~Defringe (); - 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 autoOpenCurve (); - void curveChanged (); + ~Defringe () override; + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void autoOpenCurve () override; + void curveChanged () override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; }; diff --git a/rtgui/dehaze.cc b/rtgui/dehaze.cc new file mode 100644 index 000000000..8204210db --- /dev/null +++ b/rtgui/dehaze.cc @@ -0,0 +1,155 @@ +/** -*- 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 +#include + +#include "dehaze.h" + +#include "eventmapper.h" + +#include "../rtengine/procparams.h" + +using namespace rtengine; +using namespace rtengine::procparams; + +Dehaze::Dehaze(): FoldableToolPanel(this, "dehaze", M("TP_DEHAZE_LABEL"), false, true) +{ + auto m = ProcEventMapper::getInstance(); + EvDehazeEnabled = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_ENABLED"); + EvDehazeStrength = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_STRENGTH"); + EvDehazeShowDepthMap = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP"); + EvDehazeDepth = m->newEvent(HDR, "HISTORY_MSG_DEHAZE_DEPTH"); + + strength = Gtk::manage(new Adjuster(M("TP_DEHAZE_STRENGTH"), 0., 100., 1., 50.)); + strength->setAdjusterListener(this); + strength->show(); + + depth = Gtk::manage(new Adjuster(M("TP_DEHAZE_DEPTH"), 0., 100., 1., 25.)); + depth->setAdjusterListener(this); + depth->show(); + + showDepthMap = Gtk::manage(new Gtk::CheckButton(M("TP_DEHAZE_SHOW_DEPTH_MAP"))); + showDepthMap->signal_toggled().connect(sigc::mem_fun(*this, &Dehaze::showDepthMapChanged)); + showDepthMap->show(); + + pack_start(*strength); + pack_start(*depth); + pack_start(*showDepthMap); +} + + +void Dehaze::read(const ProcParams *pp, const ParamsEdited *pedited) +{ + disableListener(); + + if (pedited) { + strength->setEditedState(pedited->dehaze.strength ? Edited : UnEdited); + depth->setEditedState(pedited->dehaze.depth ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->dehaze.enabled); + showDepthMap->set_inconsistent(!pedited->dehaze.showDepthMap); + } + + setEnabled(pp->dehaze.enabled); + strength->setValue(pp->dehaze.strength); + depth->setValue(pp->dehaze.depth); + showDepthMap->set_active(pp->dehaze.showDepthMap); + + enableListener(); +} + + +void Dehaze::write(ProcParams *pp, ParamsEdited *pedited) +{ + pp->dehaze.strength = strength->getValue(); + pp->dehaze.depth = depth->getValue(); + pp->dehaze.enabled = getEnabled(); + pp->dehaze.showDepthMap = showDepthMap->get_active(); + + if (pedited) { + pedited->dehaze.strength = strength->getEditedState(); + pedited->dehaze.depth = depth->getEditedState(); + pedited->dehaze.enabled = !get_inconsistent(); + pedited->dehaze.showDepthMap = !showDepthMap->get_inconsistent(); + } +} + +void Dehaze::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) +{ + strength->setDefault(defParams->dehaze.strength); + depth->setDefault(defParams->dehaze.depth); + + if (pedited) { + strength->setDefaultEditedState(pedited->dehaze.strength ? Edited : UnEdited); + depth->setDefaultEditedState(pedited->dehaze.depth ? Edited : UnEdited); + } else { + strength->setDefaultEditedState(Irrelevant); + depth->setDefaultEditedState(Irrelevant); + } +} + + +void Dehaze::adjusterChanged(Adjuster* a, double newval) +{ + if (listener && getEnabled()) { + if (a == strength) { + listener->panelChanged(EvDehazeStrength, a->getTextValue()); + } else if (a == depth) { + listener->panelChanged(EvDehazeDepth, a->getTextValue()); + } + } +} + + +void Dehaze::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvDehazeEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvDehazeEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvDehazeEnabled, M("GENERAL_DISABLED")); + } + } +} + + +void Dehaze::showDepthMapChanged() +{ + if (listener) { + listener->panelChanged(EvDehazeShowDepthMap, showDepthMap->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + + +void Dehaze::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + + strength->showEditedCB(); + depth->showEditedCB(); +} + + +void Dehaze::setAdjusterBehavior(bool strengthAdd) +{ + strength->setAddMode(strengthAdd); +} + diff --git a/rtgui/dehaze.h b/rtgui/dehaze.h new file mode 100644 index 000000000..322e0bf0c --- /dev/null +++ b/rtgui/dehaze.h @@ -0,0 +1,53 @@ +/** -*- 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "toolpanel.h" + +class Dehaze: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +{ +private: + Adjuster *strength; + Adjuster *depth; + Gtk::CheckButton *showDepthMap; + + rtengine::ProcEvent EvDehazeEnabled; + rtengine::ProcEvent EvDehazeStrength; + rtengine::ProcEvent EvDehazeDepth; + rtengine::ProcEvent EvDehazeShowDepthMap; + +public: + + Dehaze(); + + void read(const rtengine::procparams::ProcParams *pp, const ParamsEdited *pedited=nullptr) override; + void write(rtengine::procparams::ProcParams *pp, ParamsEdited *pedited=nullptr) override; + void setDefaults(const rtengine::procparams::ProcParams *defParams, const ParamsEdited *pedited=nullptr) override; + void setBatchMode(bool batchMode) override; + + void adjusterChanged(Adjuster *a, double newval) override; + void enabledChanged() override; + void showDepthMapChanged(); + void setAdjusterBehavior(bool strengthAdd); + void adjusterAutoToggled(Adjuster* a, bool newval) override {} +}; + diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index 43a58b674..8f48ea3d7 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -32,6 +32,8 @@ #include "diagonalcurveeditorsubgroup.h" #include "rtimage.h" +#include "../rtengine/curves.h" + DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, Glib::ustring& curveDir) : CurveEditorSubGroup(curveDir) { @@ -50,35 +52,49 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // custom curve customCurveGrid = new Gtk::Grid (); customCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); - customCurveGrid->set_row_spacing(2); - customCurveGrid->set_column_spacing(2); + customCurveGrid->get_style_context()->add_class("curve-mainbox"); customCurve = Gtk::manage (new MyDiagonalCurve ()); customCurve->setType (DCT_Spline); - Gtk::Grid* custombbox = Gtk::manage (new Gtk::Grid ()); // curvebboxpos 0=above, 1=right, 2=below, 3=left + Gtk::Grid* customCurveBox= Gtk::manage (new Gtk::Grid ()); + customCurveBox->get_style_context()->add_class("curve-curvebox"); + customCurveBox->add(*customCurve); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + Gtk::Grid* custombbox = Gtk::manage (new Gtk::Grid ()); // curvebboxpos 0=above, 1=right, 2=below, 3=left + custombbox->get_style_context()->add_class("curve-buttonbox"); + + if (options.curvebboxpos == 0) { custombbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(custombbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + customCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + custombbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(custombbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + customCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { custombbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(custombbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + customCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + custombbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(custombbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + customCurveGrid->get_style_context()->add_class("left"); } editPointCustom = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointCustom, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); + initButton(*editPointCustom, Glib::ustring("edit-point.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); editCustom = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editCustom, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editCustom, Glib::ustring("crosshair-node-curve.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); + initButton(*copyCustom, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); pasteCustom = Gtk::manage (new Gtk::Button ()); - initButton(*pasteCustom, Glib::ustring("edit-paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteCustom, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); loadCustom = Gtk::manage (new Gtk::Button ()); - initButton(*loadCustom, Glib::ustring("gtk-open.png"), Gtk::ALIGN_END, false); + initButton(*loadCustom, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); saveCustom = Gtk::manage (new Gtk::Button ()); - initButton(*saveCustom, Glib::ustring("gtk-save-large.png"), Gtk::ALIGN_END, false); + initButton(*saveCustom, Glib::ustring("save.png"), Gtk::ALIGN_END, false); custombbox->attach_next_to(*editPointCustom, sideStart, 1, 1); custombbox->attach_next_to(*editCustom, sideStart, 1, 1); @@ -88,22 +104,23 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, custombbox->attach_next_to(*saveCustom, sideEnd, 1, 1); customCoordAdjuster = Gtk::manage (new CoordinateAdjuster(customCurve, this)); + customCoordAdjuster->get_style_context()->add_class("curve-spinbuttonbox"); // Button box position: 0=above, 1=right, 2=below, 3=left - customCurveGrid->add(*customCurve); + customCurveGrid->add(*customCurveBox); customCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - customCurveGrid->attach_next_to(*custombbox, *customCurve, Gtk::POS_TOP, 1, 1); - customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurve, Gtk::POS_BOTTOM, 1, 1); + customCurveGrid->attach_next_to(*custombbox, *customCurveBox, Gtk::POS_TOP, 1, 1); + customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - customCurveGrid->attach_next_to(*custombbox, *customCurve, Gtk::POS_RIGHT, 1, 1); - customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurve, Gtk::POS_BOTTOM, 2, 1); + customCurveGrid->attach_next_to(*custombbox, *customCurveBox, Gtk::POS_RIGHT, 1, 1); + customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurve, Gtk::POS_BOTTOM, 1, 1); + customCurveGrid->attach_next_to(*customCoordAdjuster, *customCurveBox, Gtk::POS_BOTTOM, 1, 1); customCurveGrid->attach_next_to(*custombbox, *customCoordAdjuster, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - customCurveGrid->attach_next_to(*custombbox, *customCurve, Gtk::POS_LEFT, 1, 1); + customCurveGrid->attach_next_to(*custombbox, *customCurveBox, Gtk::POS_LEFT, 1, 1); customCurveGrid->attach_next_to(*customCoordAdjuster, *custombbox, Gtk::POS_BOTTOM, 2, 1); } @@ -126,36 +143,50 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // NURBS curve NURBSCurveGrid = new Gtk::Grid (); - NURBSCurveGrid->set_row_spacing(4); - NURBSCurveGrid->set_column_spacing(4); NURBSCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + NURBSCurveGrid->get_style_context()->add_class("curve-mainbox"); NURBSCurve = Gtk::manage (new MyDiagonalCurve ()); NURBSCurve->setType (DCT_NURBS); - Gtk::Grid* NURBSbbox = Gtk::manage (new Gtk::Grid ()); + Gtk::Grid* NURBSCurveBox= Gtk::manage (new Gtk::Grid ()); + NURBSCurveBox->get_style_context()->add_class("curve-curvebox"); + NURBSCurveBox->add(*NURBSCurve); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + Gtk::Grid* NURBSbbox = Gtk::manage (new Gtk::Grid ()); + NURBSbbox->get_style_context()->add_class("curve-buttonbox"); + + if (options.curvebboxpos == 0) { NURBSbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(NURBSbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + NURBSCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + NURBSbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(NURBSbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + NURBSCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { NURBSbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(NURBSbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + NURBSCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + NURBSbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(NURBSbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + NURBSCurveGrid->get_style_context()->add_class("left"); } editPointNURBS = Gtk::manage (new Gtk::ToggleButton ()); - initButton(*editPointNURBS, Glib::ustring("gtk-edit.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); + initButton(*editPointNURBS, Glib::ustring("edit-point.png"), Gtk::ALIGN_START, false, "CURVEEDITOR_EDITPOINT_HINT"); editNURBS = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editNURBS, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editNURBS, Glib::ustring("crosshair-node-curve.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); + initButton(*copyNURBS, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); pasteNURBS = Gtk::manage (new Gtk::Button ()); - initButton(*pasteNURBS, Glib::ustring("edit-paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteNURBS, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); loadNURBS = Gtk::manage (new Gtk::Button ()); - initButton(*loadNURBS, Glib::ustring("gtk-open.png"), Gtk::ALIGN_END, false); + initButton(*loadNURBS, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); saveNURBS = Gtk::manage (new Gtk::Button ()); - initButton(*saveNURBS, Glib::ustring("gtk-save-large.png"), Gtk::ALIGN_END, false); + initButton(*saveNURBS, Glib::ustring("save.png"), Gtk::ALIGN_END, false); NURBSbbox->attach_next_to(*editPointNURBS, sideStart, 1, 1); NURBSbbox->attach_next_to(*editNURBS, sideStart, 1, 1); @@ -165,22 +196,23 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, NURBSbbox->attach_next_to(*saveNURBS, sideEnd, 1, 1); NURBSCoordAdjuster = Gtk::manage (new CoordinateAdjuster(NURBSCurve, this)); + NURBSCoordAdjuster->get_style_context()->add_class("curve-spinbuttonbox"); // Button box position: 0=above, 1=right, 2=below, 3=left - NURBSCurveGrid->add(*NURBSCurve); + NURBSCurveGrid->add(*NURBSCurveBox); NURBSCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurve, Gtk::POS_TOP, 1, 1); - NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurve, Gtk::POS_BOTTOM, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurveBox, Gtk::POS_TOP, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurve, Gtk::POS_RIGHT, 1, 1); - NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurve, Gtk::POS_BOTTOM, 2, 1); + NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurveBox, Gtk::POS_RIGHT, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurve, Gtk::POS_BOTTOM, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSCurveBox, Gtk::POS_BOTTOM, 1, 1); NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCoordAdjuster, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurve, Gtk::POS_LEFT, 1, 1); + NURBSCurveGrid->attach_next_to(*NURBSbbox, *NURBSCurveBox, Gtk::POS_LEFT, 1, 1); NURBSCurveGrid->attach_next_to(*NURBSCoordAdjuster, *NURBSbbox, Gtk::POS_BOTTOM, 2, 1); } @@ -203,37 +235,52 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // parametric curve paramCurveGrid = new Gtk::Grid (); - paramCurveGrid->set_row_spacing(4); - paramCurveGrid->set_column_spacing(4); paramCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + paramCurveGrid->get_style_context()->add_class("curve-mainbox"); paramCurve = Gtk::manage (new MyDiagonalCurve ()); paramCurve->setType (DCT_Parametric); - Gtk::Grid* parambbox = Gtk::manage (new Gtk::Grid ()); + Gtk::Grid* paramCurveBox= Gtk::manage (new Gtk::Grid ()); + paramCurveBox->get_style_context()->add_class("curve-curvebox"); + paramCurveBox->add(*paramCurve); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + Gtk::Grid* parambbox = Gtk::manage (new Gtk::Grid ()); + parambbox->get_style_context()->add_class("curve-buttonbox"); + + if (options.curvebboxpos == 0) { parambbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(parambbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + paramCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + parambbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(parambbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + paramCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { parambbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(parambbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + paramCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + parambbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(parambbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + paramCurveGrid->get_style_context()->add_class("left"); } shcSelector = Gtk::manage (new SHCSelector ()); - shcSelector->set_name("CurveSHCSelector"); // To handle the 4px gap between the SHCSelector and the curve through CSS + shcSelector->set_name("CurveSHCSelector"); + paramCurveBox->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); editParam = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editParam, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editParam, Glib::ustring("crosshair-node-curve.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); + initButton(*copyParam, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); pasteParam = Gtk::manage (new Gtk::Button ()); - initButton(*pasteParam, Glib::ustring("edit-paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteParam, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); loadParam = Gtk::manage (new Gtk::Button ()); - initButton(*loadParam, Glib::ustring("gtk-open.png"), Gtk::ALIGN_END, false); + initButton(*loadParam, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); saveParam = Gtk::manage (new Gtk::Button ()); - initButton(*saveParam, Glib::ustring("gtk-save-large.png"), Gtk::ALIGN_END, false); + initButton(*saveParam, Glib::ustring("save.png"), Gtk::ALIGN_END, false); parambbox->attach_next_to(*editParam, sideStart, 1, 1); parambbox->attach_next_to(*copyParam, sideEnd, 1, 1); @@ -270,8 +317,7 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, // paramCurveSliderBox needed to set vspacing(4) between curve+shc and sliders without vspacing between each slider Gtk::Grid* paramCurveSliderBox = Gtk::manage (new Gtk::Grid()); paramCurveSliderBox->set_orientation(Gtk::ORIENTATION_VERTICAL); - paramCurveSliderBox->set_column_spacing(2); - paramCurveSliderBox->set_row_spacing(2); + paramCurveSliderBox->get_style_context()->add_class("curve-sliderbox"); paramCurveSliderBox->attach_next_to(*evhighlights, Gtk::POS_TOP, 1, 1); paramCurveSliderBox->attach_next_to(*evlights, Gtk::POS_TOP, 1, 1); @@ -281,24 +327,20 @@ DiagonalCurveEditorSubGroup::DiagonalCurveEditorSubGroup (CurveEditorGroup* prt, paramCurveGrid->show_all (); // Button box position: 0=above, 1=right, 2=below, 3=left - paramCurveGrid->add(*paramCurve); + paramCurveGrid->add(*paramCurveBox); paramCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - paramCurveGrid->attach_next_to(*parambbox, *paramCurve, Gtk::POS_TOP, 1, 1); - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*paramCurveSliderBox, *shcSelector, Gtk::POS_BOTTOM, 1, 1); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_TOP, 1, 1); + paramCurveGrid->attach_next_to(*paramCurveSliderBox, *paramCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*parambbox, *paramCurve, Gtk::POS_RIGHT, 1, 2); - paramCurveGrid->attach_next_to(*paramCurveSliderBox, *shcSelector, Gtk::POS_BOTTOM, 2, 1); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_RIGHT, 1, 1); + paramCurveGrid->attach_next_to(*paramCurveSliderBox, *paramCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*parambbox, *shcSelector, Gtk::POS_BOTTOM, 1, 1); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_BOTTOM, 1, 1); paramCurveGrid->attach_next_to(*paramCurveSliderBox, *parambbox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - paramCurveGrid->attach_next_to(*shcSelector, *paramCurve, Gtk::POS_BOTTOM, 1, 1); - paramCurveGrid->attach_next_to(*parambbox, *paramCurve, Gtk::POS_LEFT, 1, 2); + paramCurveGrid->attach_next_to(*parambbox, *paramCurveBox, Gtk::POS_LEFT, 1, 1); paramCurveGrid->attach_next_to(*paramCurveSliderBox, *parambbox, Gtk::POS_BOTTOM, 2, 1); } @@ -351,6 +393,7 @@ DiagonalCurveEditor* DiagonalCurveEditorSubGroup::addCurve(Glib::ustring curveLa storeCurveValues(newCE, getCurveFromGUI(DCT_Spline)); storeCurveValues(newCE, getCurveFromGUI(DCT_Parametric)); storeCurveValues(newCE, getCurveFromGUI(DCT_NURBS)); + storeCurveValues(newCE, getCurveFromGUI(DCT_CatumullRom)); return newCE; } @@ -395,6 +438,7 @@ void DiagonalCurveEditorSubGroup::pipetteMouseOver(EditDataProvider *provider, i switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) { case (DCT_Spline): + case (DCT_CatumullRom): customCurve->pipetteMouseOver(curveEditor, provider, modifierKey); customCurve->setDirty(true); break; @@ -469,6 +513,7 @@ bool DiagonalCurveEditorSubGroup::pipetteButton1Pressed(EditDataProvider *provid switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) { case (DCT_Spline): + case (DCT_CatumullRom): isDragging = customCurve->pipetteButton1Pressed(provider, modifierKey); break; @@ -497,6 +542,7 @@ void DiagonalCurveEditorSubGroup::pipetteButton1Released(EditDataProvider *provi switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) { case (DCT_Spline): + case (DCT_CatumullRom): customCurve->pipetteButton1Released(provider); break; @@ -520,6 +566,7 @@ void DiagonalCurveEditorSubGroup::pipetteDrag(EditDataProvider *provider, int mo switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) { case (DCT_Spline): + case (DCT_CatumullRom): customCurve->pipetteDrag(provider, modifierKey); break; @@ -573,6 +620,7 @@ void DiagonalCurveEditorSubGroup::refresh(CurveEditor *curveToRefresh) if (curveToRefresh != nullptr && curveToRefresh == static_cast(parent->displayedCurve)) { switch((DiagonalCurveType)(curveToRefresh->curveType->getSelected())) { case (DCT_Spline): + case (DCT_CatumullRom): customCurve->refresh(); break; @@ -621,9 +669,7 @@ void DiagonalCurveEditorSubGroup::switchGUI() } else { // dCurve ave a ColorProvider or a background gradient defined, so we create/update the object if (!leftBar) { - leftBar = new ColoredBar(RTO_Bottom2Top); - - + leftBar = new ColoredBar(RTO_Bottom2Top); } if (barColorProvider) { @@ -661,9 +707,10 @@ void DiagonalCurveEditorSubGroup::switchGUI() } } - switch((DiagonalCurveType)(dCurve->curveType->getSelected())) { + switch(auto tp = (DiagonalCurveType)(dCurve->curveType->getSelected())) { case (DCT_Spline): - customCurve->setPoints (dCurve->customCurveEd); + case (DCT_CatumullRom): + customCurve->setPoints(tp == DCT_Spline ? dCurve->customCurveEd : dCurve->catmullRomCurveEd); customCurve->setColorProvider(dCurve->getCurveColorProvider(), dCurve->getCurveCallerId()); customCurve->setColoredBar(leftBar, bottomBar); customCurve->queue_resize_no_redraw(); @@ -734,6 +781,7 @@ void DiagonalCurveEditorSubGroup::savePressed () switch (parent->displayedCurve->selected) { case DCT_Spline: // custom + case DCT_CatumullRom: p = customCurve->getPoints (); break; @@ -755,6 +803,8 @@ void DiagonalCurveEditorSubGroup::savePressed () f << "Linear" << std::endl; } else if (p[ix] == (double)(DCT_Spline)) { f << "Spline" << std::endl; + } else if (p[ix] == (double)(DCT_CatumullRom)) { + f << "CatmullRom" << std::endl; } else if (p[ix] == (double)(DCT_NURBS)) { f << "NURBS" << std::endl; } else if (p[ix] == (double)(DCT_Parametric)) { @@ -796,6 +846,8 @@ void DiagonalCurveEditorSubGroup::loadPressed () p.push_back ((double)(DCT_Linear)); } else if (s == "Spline") { p.push_back ((double)(DCT_Spline)); + } else if (s == "CatmullRom") { + p.push_back ((double)(DCT_CatumullRom)); } else if (s == "NURBS") { p.push_back ((double)(DCT_NURBS)); } else if (s == "Parametric") { @@ -814,7 +866,9 @@ void DiagonalCurveEditorSubGroup::loadPressed () } } - if (p[0] == (double)(DCT_Spline)) { + rtengine::sanitizeCurve(p); + + if (p[0] == (double)(DCT_Spline) || p[0] == (double)(DCT_CatumullRom)) { customCurve->setPoints (p); customCurve->queue_draw (); customCurve->notifyListener (); @@ -859,6 +913,12 @@ void DiagonalCurveEditorSubGroup::copyPressed () clipboard.setDiagonalCurveData (curve, DCT_NURBS); break; + case DCT_CatumullRom: + curve = customCurve->getPoints (); + curve[0] = DCT_CatumullRom; + clipboard.setDiagonalCurveData (curve, DCT_CatumullRom); + break; + default: // (DCT_Linear, DCT_Unchanged) // ... do nothing break; @@ -879,6 +939,7 @@ void DiagonalCurveEditorSubGroup::pastePressed () switch (type) { case DCT_Spline: // custom + case DCT_CatumullRom: customCurve->setPoints (curve); customCurve->queue_draw (); customCurve->notifyListener (); @@ -1016,6 +1077,10 @@ void DiagonalCurveEditorSubGroup::storeDisplayedCurve() storeCurveValues(parent->displayedCurve, getCurveFromGUI(DCT_NURBS)); break; + case (DCT_CatumullRom): + storeCurveValues(parent->displayedCurve, getCurveFromGUI(DCT_CatumullRom)); + break; + default: break; } @@ -1053,6 +1118,10 @@ void DiagonalCurveEditorSubGroup::storeCurveValues (CurveEditor* ce, const std:: (static_cast(ce))->NURBSCurveEd = p; break; + case (DCT_CatumullRom): + (static_cast(ce))->catmullRomCurveEd = p; + break; + default: break; } @@ -1082,6 +1151,14 @@ const std::vector DiagonalCurveEditorSubGroup::getCurveFromGUI (int type case (DCT_NURBS): return NURBSCurve->getPoints (); + case (DCT_CatumullRom): { + auto ret = customCurve->getPoints(); + if (!ret.empty()) { + ret[0] = DCT_CatumullRom; + } + return ret; + } + default: { // linear and other solutions std::vector lcurve (1); @@ -1118,6 +1195,10 @@ bool DiagonalCurveEditorSubGroup::curveReset(CurveEditor *ce) customCurve->reset (dce->customResetCurve, dce->getIdentityValue()); return true; + case (DCT_CatumullRom) : + customCurve->reset (dce->catmullRomResetCurve, dce->getIdentityValue()); + return true; + case (DCT_Parametric) : { DiagonalCurveEditor* dCurve = static_cast(parent->displayedCurve); double mileStone[3]; @@ -1154,14 +1235,17 @@ void DiagonalCurveEditorSubGroup::shcChanged () /* * Listener */ -void DiagonalCurveEditorSubGroup::adjusterChanged (Adjuster* a, double newval) +void DiagonalCurveEditorSubGroup::adjusterChanged(Adjuster* a, double newval) { - paramCurve->setPoints (getCurveFromGUI(DCT_Parametric)); storeDisplayedCurve(); parent->curveChanged (); } +void DiagonalCurveEditorSubGroup::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + /* * Listener called when the mouse is over a parametric curve's slider */ diff --git a/rtgui/diagonalcurveeditorsubgroup.h b/rtgui/diagonalcurveeditorsubgroup.h index 1e3c3bf13..39cc86973 100644 --- a/rtgui/diagonalcurveeditorsubgroup.h +++ b/rtgui/diagonalcurveeditorsubgroup.h @@ -75,36 +75,37 @@ protected: public: DiagonalCurveEditorSubGroup(CurveEditorGroup* prt, Glib::ustring& curveDir); - virtual ~DiagonalCurveEditorSubGroup(); + ~DiagonalCurveEditorSubGroup() override; DiagonalCurveEditor* addCurve(Glib::ustring curveLabel = ""); - virtual void updateBackgroundHistogram (CurveEditor* ce); - void switchGUI(); - void refresh(CurveEditor *curveToRefresh); - void editModeSwitchedOff (); - void pipetteMouseOver(EditDataProvider *provider, int modifierKey); - bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey); - void pipetteButton1Released(EditDataProvider *provider); - void pipetteDrag(EditDataProvider *provider, int modifierKey); - void showCoordinateAdjuster(CoordinateProvider *provider); - void stopNumericalAdjustment(); + void updateBackgroundHistogram (CurveEditor* ce) override; + void switchGUI() override; + void refresh(CurveEditor *curveToRefresh) override; + void editModeSwitchedOff () override; + void pipetteMouseOver(EditDataProvider *provider, int modifierKey) override; + bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey) override; + void pipetteButton1Released(EditDataProvider *provider) override; + void pipetteDrag(EditDataProvider *provider, int modifierKey) override; + void showCoordinateAdjuster(CoordinateProvider *provider) override; + void stopNumericalAdjustment() override; - bool curveReset (CurveEditor *ce); + bool curveReset (CurveEditor *ce) override; protected: - void storeCurveValues (CurveEditor* ce, const std::vector& p); - void storeDisplayedCurve (); - void restoreDisplayedHistogram (); + void storeCurveValues (CurveEditor* ce, const std::vector& p) override; + void storeDisplayedCurve () override; + void restoreDisplayedHistogram () override; void savePressed (); void loadPressed (); void copyPressed (); void pastePressed (); void editPointToggled(Gtk::ToggleButton *button); void editToggled (Gtk::ToggleButton *button); - void removeEditor (); - const std::vector getCurveFromGUI (int type); - void shcChanged (); - void adjusterChanged (Adjuster* a, double newval); + void removeEditor () override; + const std::vector getCurveFromGUI (int type) override; + void shcChanged () override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; bool adjusterEntered (GdkEventCrossing* ev, int ac); bool adjusterLeft (GdkEventCrossing* ev, int ac); void setSubGroupRangeLabels(Glib::ustring r1, Glib::ustring r2, Glib::ustring r3, Glib::ustring r4); diff --git a/rtgui/dirbrowser.cc b/rtgui/dirbrowser.cc index 23d1259ba..e1acbad3e 100644 --- a/rtgui/dirbrowser.cc +++ b/rtgui/dirbrowser.cc @@ -48,14 +48,26 @@ std::vector listSubDirs (const Glib::RefPtr& dir, bool auto enumerator = dir->enumerate_children ("standard::name,standard::type,standard::is-hidden"); - while (auto file = enumerator->next_file ()) { - if (file->get_file_type () != Gio::FILE_TYPE_DIRECTORY) { - continue; + while (true) { + try { + auto file = enumerator->next_file (); + if (!file) { + break; + } + if (file->get_file_type () != Gio::FILE_TYPE_DIRECTORY) { + continue; + } + if (!addHidden && file->is_hidden ()) { + continue; + } + subDirs.push_back (file->get_name ()); + } catch (const Glib::Exception& exception) { + + if (options.rtSettings.verbose) { + std::cerr << exception.what().c_str() << std::endl; + } + } - if (!addHidden && file->is_hidden ()) { - continue; - } - subDirs.push_back (file->get_name ()); } } catch (const Glib::Exception& exception) { @@ -109,13 +121,13 @@ DirBrowser::~DirBrowser() void DirBrowser::fillDirTree () { - openfolder = RTImage::createFromFile ("gtk-open.png"); - closedfolder = RTImage::createFromFile ("folder.png"); - icdrom = RTImage::createFromFile ("drive-optical.png"); - ifloppy = RTImage::createFromFile ("drive-removable-media.png"); - ihdd = RTImage::createFromFile ("drive-harddisk.png"); - iremovable = RTImage::createFromFile ("media-usb.png"); - inetwork = RTImage::createFromFile ("network.png"); + openfolder = RTImage::createFromFile ("folder-open-small.png"); + closedfolder = RTImage::createFromFile ("folder-closed-small.png"); + icdrom = RTImage::createFromFile ("device-optical.png"); + ifloppy = RTImage::createFromFile ("device-floppy.png"); + ihdd = RTImage::createFromFile ("device-hdd.png"); + iremovable = RTImage::createFromFile ("device-usb.png"); + inetwork = RTImage::createFromFile ("device-network.png"); //Create the Tree model: dirTreeModel = Gtk::TreeStore::create(dtColumns); @@ -208,7 +220,7 @@ void DirBrowser::updateDirTree (const Gtk::TreeModel::iterator& iter) void DirBrowser::updateVolumes () { - int nvolumes = GetLogicalDrives (); + unsigned int nvolumes = GetLogicalDrives (); if (nvolumes != volumes) { GThreadLock lock; @@ -234,16 +246,6 @@ int updateVolumesUI (void* br) return 1; } -void DirBrowser::winDirChanged () -{ - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->updateDirTreeRoot(); - - return FALSE; - }; - - idle_register.add(func, this); -} #endif void DirBrowser::fillRoot () @@ -321,14 +323,9 @@ void DirBrowser::row_expanded (const Gtk::TreeModel::iterator& iter, const Gtk:: expandSuccess = true; } -#ifdef WIN32 - Glib::RefPtr monitor = Glib::RefPtr(new WinDirMonitor (iter->get_value (dtColumns.dirname), this)); - iter->set_value (dtColumns.monitor, monitor); -#else Glib::RefPtr monitor = dir->monitor_directory (); iter->set_value (dtColumns.monitor, monitor); monitor->signal_changed().connect (sigc::bind(sigc::mem_fun(*this, &DirBrowser::file_changed), iter, dir->get_parse_name())); -#endif } void DirBrowser::updateDir (const Gtk::TreeModel::iterator& iter) diff --git a/rtgui/dirbrowser.h b/rtgui/dirbrowser.h index e8eefdd36..15b6dd201 100644 --- a/rtgui/dirbrowser.h +++ b/rtgui/dirbrowser.h @@ -21,16 +21,13 @@ #include #include -#ifdef WIN32 -#include "windirmonitor.h" -#endif #include "guiutils.h" +#ifdef WIN32 +#include "windows.h" +#endif class DirBrowser : public Gtk::VBox -#ifdef WIN32 - , public WinDirChangeListener -#endif { public: typedef sigc::signal DirSelectionSignal; @@ -45,11 +42,7 @@ private: Gtk::TreeModelColumn > icon1; Gtk::TreeModelColumn > icon2; Gtk::TreeModelColumn dirname; -#ifdef WIN32 - Gtk::TreeModelColumn > monitor; -#else Gtk::TreeModelColumn > monitor; -#endif DirTreeColumns() { @@ -84,12 +77,11 @@ private: bool expandSuccess; #ifdef WIN32 - int volumes; + unsigned int volumes; public: void updateVolumes (); void updateDirTree (const Gtk::TreeModel::iterator& iter); void updateDirTreeRoot (); - void winDirChanged (); private: void addRoot (char letter); #endif @@ -101,7 +93,7 @@ private: public: DirBrowser (); - ~DirBrowser(); + ~DirBrowser() override; void fillDirTree (); void on_sort_column_changed() const; diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index f79770a62..7be07420e 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -16,12 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "dirpyrdenoise.h" -#include #include +#include + +#include "dirpyrdenoise.h" + #include "edit.h" #include "guiutils.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; extern Options options; @@ -44,8 +48,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP Gtk::VBox * lumaVBox = Gtk::manage ( new Gtk::VBox()); lumaVBox->set_spacing(2); - - ctboxL = Gtk::manage (new Gtk::HBox ()); Gtk::Label* labmL = Gtk::manage (new Gtk::Label (M("TP_DIRPYRDENOISE_LUMINANCE_CONTROL") + ":")); ctboxL->pack_start (*labmL, Gtk::PACK_SHRINK, 1); @@ -66,11 +68,10 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP lshape->setIdentityValue(0.); lshape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); - //lshape->setEditID(EUID_Lab_LCurve, BT_SINGLEPLANE_FLOAT); milestones.push_back( GradientMilestone(0., 0., 0., 0.) ); milestones.push_back( GradientMilestone(1., 1., 1., 1.) ); lshape->setBottomBarBgGradient(milestones); - //lshape->setLeftBarBgGradient(milestones); + milestones.push_back( GradientMilestone(0., 0., 0., 0.) ); milestones.push_back( GradientMilestone(1., 1., 1., 1.) ); NoiscurveEditorG->curveListComplete(); @@ -107,7 +108,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP 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_CHROMINANCE_PREVIEWRESIDUAL_INFO_TOOLTIP")); @@ -129,7 +129,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP 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) ); luma->setAdjusterListener (this); @@ -150,9 +149,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP CCcurveEditorG->curveListComplete(); - - //----------------------------------------- - luma->hide(); Ldetail->show(); @@ -162,8 +158,6 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP chroma->show(); redchro->show(); bluechro->show(); -// perform->show(); -// perform->set_active (true); // ---- Median FIltering ---- @@ -225,10 +219,7 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP smethod = Gtk::manage (new MyComboBoxText ()); 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, 1); pack_start( *hb11, Gtk::PACK_SHRINK, 1); @@ -272,17 +263,9 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP chromaFrame->add(*chromaVBox); pack_start (*chromaFrame); -// pack_start( *hb11, Gtk::PACK_SHRINK, 4); - -// pack_start (*median); - ctboxm->pack_start (*methodmed); ctbox->pack_start (*medmethod); ctboxrgb->pack_start (*rgbmethod); -// pack_start (*ctboxm); -// pack_start (*ctbox); -// pack_start (*ctboxrgb); -// pack_start (*passes,Gtk::PACK_SHRINK, 1); medianVBox->pack_start (*ctboxm); medianVBox->pack_start (*ctbox); @@ -292,11 +275,8 @@ DirPyrDenoise::DirPyrDenoise () : FoldableToolPanel(this, "dirpyrdenoise", M("TP pack_start (*medianFrame); - -// pack_start (*perform); medianConn = median->signal_toggled().connect( sigc::mem_fun(*this, &DirPyrDenoise::medianChanged) ); ctboxrgb->hide(); - } DirPyrDenoise::~DirPyrDenoise () @@ -313,24 +293,18 @@ void DirPyrDenoise::chromaChanged (double autchroma, double autred, double autbl nextred = autred; nextblue = autblue; - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->chromaComputed_(); - return false; - }; - - idle_register.add(func, this); -} - -bool DirPyrDenoise::chromaComputed_ () -{ - - disableListener (); - chroma->setValue (nextchroma); - redchro->setValue (nextred); - bluechro->setValue (nextblue); - enableListener (); - updateNoiseLabel (); - return false; + idle_register.add( + [this]() -> bool + { + disableListener(); + chroma->setValue(nextchroma); + redchro->setValue(nextred); + bluechro->setValue(nextblue); + enableListener(); + updateNoiseLabel(); + return false; + } + ); } void DirPyrDenoise::noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP) @@ -342,22 +316,16 @@ void DirPyrDenoise::noiseTilePrev (int tileX, int tileY, int prevX, int prevY, i nextsizeT = sizeT; nextsizeP = sizeP; - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->TilePrevComputed_(); - return false; - }; - - idle_register.add(func, this); -} - -bool DirPyrDenoise::TilePrevComputed_ () -{ - - disableListener (); - enableListener (); - updateTileLabel (); - updatePrevLabel (); - return false; + idle_register.add( + [this]() -> bool + { + disableListener(); + enableListener(); + updateTileLabel(); + updatePrevLabel(); + return false; + } + ); } void DirPyrDenoise::updateTileLabel () @@ -368,14 +336,12 @@ void DirPyrDenoise::updateTileLabel () sT = nextsizeT; nX = nexttileX; nY = nexttileY; - { - TileLabels->set_text( - 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)) - ); - } + TileLabels->set_text( + 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)) + ); } } void DirPyrDenoise::updatePrevLabel () @@ -386,14 +352,12 @@ void DirPyrDenoise::updatePrevLabel () sP = nextsizeP; pX = nextprevX; pY = nextprevY; - { - PrevLabels->set_text( - 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)) - ); - } + PrevLabels->set_text( + 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)) + ); } } @@ -402,24 +366,18 @@ void DirPyrDenoise::noiseChanged (double nresid, double highresid) nextnresid = nresid; nexthighresid = highresid; - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->noiseComputed_(); - return false; - }; - - idle_register.add(func, this); + idle_register.add( + [this]() -> bool + { + disableListener(); + enableListener(); + updateNoiseLabel(); + return false; + } + ); } -bool DirPyrDenoise::noiseComputed_ () -{ - - disableListener (); - enableListener (); - updateNoiseLabel (); - return false; -} - -void DirPyrDenoise::updateNoiseLabel () +void DirPyrDenoise::updateNoiseLabel() { if (!batchMode) { float nois, high; @@ -438,8 +396,6 @@ void DirPyrDenoise::updateNoiseLabel () } } - - void DirPyrDenoise::read (const ProcParams* pp, const ParamsEdited* pedited) { @@ -647,7 +603,7 @@ void DirPyrDenoise::read (const ProcParams* pp, const ParamsEdited* pedited) medmethodconn.block(false); rgbmethodconn.block(false); methodmedconn.block(false); - updateNoiseLabel (); + updateNoiseLabel(); enableListener (); @@ -1009,11 +965,9 @@ void DirPyrDenoise::setDefaults (const ProcParams* defParams, const ParamsEdited } } -void DirPyrDenoise::adjusterChanged (Adjuster* a, double newval) +void DirPyrDenoise::adjusterChanged(Adjuster* a, double newval) { - - Glib::ustring costr; - costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); + const Glib::ustring costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); if (listener && getEnabled()) { if (a == Ldetail) { @@ -1034,6 +988,10 @@ void DirPyrDenoise::adjusterChanged (Adjuster* a, double newval) } } +void DirPyrDenoise::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void DirPyrDenoise::enabledChanged () { diff --git a/rtgui/dirpyrdenoise.h b/rtgui/dirpyrdenoise.h index cc9a2b5bd..2ee1863ab 100644 --- a/rtgui/dirpyrdenoise.h +++ b/rtgui/dirpyrdenoise.h @@ -38,24 +38,25 @@ class DirPyrDenoise final : { public: DirPyrDenoise (); - ~DirPyrDenoise (); + ~DirPyrDenoise () override; - 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 curveChanged (CurveEditor* ce); - void setEditProvider (EditDataProvider *provider); - void autoOpenCurve (); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void curveChanged (CurveEditor* ce) override; + void setEditProvider (EditDataProvider *provider) override; + void autoOpenCurve () override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void medianChanged (); - void chromaChanged (double autchroma, double autred, double autblue); + void chromaChanged (double autchroma, double autred, double autblue) override; bool chromaComputed_ (); - void noiseChanged (double nresid, double highresid); + void noiseChanged (double nresid, double highresid) override; bool noiseComputed_ (); - void noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP); + void noiseTilePrev (int tileX, int tileY, int prevX, int prevY, int sizeT, int sizeP) override; bool TilePrevComputed_ (); // void perform_toggled (); @@ -71,10 +72,10 @@ public: void methodmedChanged (); void rgbmethodChanged (); void smethodChanged (); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; void setAdjusterBehavior (bool lumaadd, bool lumdetadd, bool chromaadd, bool chromaredadd, bool chromablueadd, bool gammaadd, bool passesadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; Glib::ustring getSettingString (); private: diff --git a/rtgui/dirpyrequalizer.cc b/rtgui/dirpyrequalizer.cc index 69d3af198..b63243465 100644 --- a/rtgui/dirpyrequalizer.cc +++ b/rtgui/dirpyrequalizer.cc @@ -196,6 +196,7 @@ void DirPyrEqualizer::read (const ProcParams* pp, const ParamsEdited* pedited) */ gamutlabConn.block (true); gamutlab->set_active (pp->dirpyrequalizer.gamutlab); + gamutlab->set_sensitive (pp->dirpyrequalizer.skinprotect != 0); gamutlabConn.block (false); lastgamutlab = pp->dirpyrequalizer.gamutlab; @@ -296,13 +297,28 @@ void DirPyrEqualizer::setDefaults (const ProcParams* defParams, const ParamsEdit } } -void DirPyrEqualizer::adjusterChanged (ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) +void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) +{ +} + +void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) +{ +} + +void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) +{ +} + +void DirPyrEqualizer::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) { if (listener && (multiImage || getEnabled()) ) { listener->panelChanged (EvDirPyrEqualizerHueskin, hueskin->getHistoryString()); } } +void DirPyrEqualizer::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ +} void DirPyrEqualizer::setBatchMode (bool batchMode) { @@ -329,9 +345,8 @@ void DirPyrEqualizer::cbdlMethodChanged() -void DirPyrEqualizer::adjusterChanged (Adjuster* a, double newval) +void DirPyrEqualizer::adjusterChanged(Adjuster* a, double newval) { - if (listener && getEnabled()) { if (a == threshold) { listener->panelChanged (EvDirPyrEqualizerThreshold, @@ -339,6 +354,7 @@ void DirPyrEqualizer::adjusterChanged (Adjuster* a, double newval) Glib::ustring::format(std::fixed, std::setprecision(2), threshold->getValue())) ); } else if (a == skinprotect) { + gamutlab->set_sensitive (skinprotect->getValue() != 0); listener->panelChanged (EvDirPyrEqualizerSkin, Glib::ustring::compose("%1", Glib::ustring::format(std::fixed, std::setprecision(2), skinprotect->getValue())) @@ -357,6 +373,10 @@ void DirPyrEqualizer::adjusterChanged (Adjuster* a, double newval) } } +void DirPyrEqualizer::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void DirPyrEqualizer::enabledChanged () { diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h index 9a3517166..d7903116b 100644 --- a/rtgui/dirpyrequalizer.h +++ b/rtgui/dirpyrequalizer.h @@ -55,23 +55,28 @@ protected: public: DirPyrEqualizer (); - virtual ~DirPyrEqualizer (); + ~DirPyrEqualizer () override; - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool skinadd); - void trimValues (rtengine::procparams::ProcParams* pp); - void adjusterChanged (ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight); -// void algoChanged (); + void trimValues (rtengine::procparams::ProcParams* pp) override; void cbdlMethodChanged(); - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged(); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged() override; void gamutlabToggled (); void lumaneutralPressed (); void lumacontrastPlusPressed (); void lumacontrastMinusPressed (); + + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; }; #endif diff --git a/rtgui/distortion.cc b/rtgui/distortion.cc index 1fadec9d9..0ac067ba8 100644 --- a/rtgui/distortion.cc +++ b/rtgui/distortion.cc @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "distortion.h" #include + +#include "distortion.h" + #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -28,18 +32,22 @@ Distortion::Distortion (): FoldableToolPanel(this, "distortion", M("TP_DISTORTIO rlistener = nullptr; autoDistor = Gtk::manage (new Gtk::Button (M("GENERAL_AUTO"))); - autoDistor->set_image (*Gtk::manage (new RTImage ("distortion-auto.png"))); + autoDistor->set_image (*Gtk::manage (new RTImage ("distortion-auto-small.png"))); + autoDistor->get_style_context()->add_class("independent"); autoDistor->set_alignment(0.5f, 0.5f); autoDistor->set_tooltip_text (M("TP_DISTORTION_AUTO_TIP")); idConn = autoDistor->signal_pressed().connect( sigc::mem_fun(*this, &Distortion::idPressed) ); autoDistor->show(); pack_start (*autoDistor); - Gtk::Image* idistL = Gtk::manage (new RTImage ("distortion-pincushion.png")); - Gtk::Image* idistR = Gtk::manage (new RTImage ("distortion-barrel.png")); + Gtk::Image* idistL = Gtk::manage (new RTImage ("distortion-pincushion-small.png")); + Gtk::Image* idistR = Gtk::manage (new RTImage ("distortion-barrel-small.png")); distor = Gtk::manage (new Adjuster (M("TP_DISTORTION_AMOUNT"), -0.5, 0.5, 0.001, 0, idistL, idistR)); distor->setAdjusterListener (this); + + distor->setLogScale(2, 0); + distor->show(); pack_start (*distor); } @@ -80,14 +88,17 @@ void Distortion::setDefaults (const ProcParams* defParams, const ParamsEdited* p } } -void Distortion::adjusterChanged (Adjuster* a, double newval) +void Distortion::adjusterChanged(Adjuster* a, double newval) { - if (listener) { listener->panelChanged (EvDISTAmount, Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), a->getValue())); } } +void Distortion::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void Distortion::setBatchMode (bool batchMode) { diff --git a/rtgui/distortion.h b/rtgui/distortion.h index c2856323d..ce1e81046 100644 --- a/rtgui/distortion.h +++ b/rtgui/distortion.h @@ -37,14 +37,15 @@ public: Distortion (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; void setAdjusterBehavior (bool vadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; void idPressed (); void setLensGeomListener (LensGeomListener* l) { diff --git a/rtgui/dynamicprofilepanel.cc b/rtgui/dynamicprofilepanel.cc index c8a8a1644..d83c70669 100644 --- a/rtgui/dynamicprofilepanel.cc +++ b/rtgui/dynamicprofilepanel.cc @@ -41,6 +41,17 @@ DynamicProfilePanel::EditDialog::EditDialog (const Glib::ustring &title, Gtk::Wi add_optional (M ("EXIFFILTER_CAMERA"), has_camera_, camera_); add_optional (M ("EXIFFILTER_LENS"), has_lens_, lens_); + + imagetype_ = Gtk::manage (new MyComboBoxText()); + imagetype_->append(Glib::ustring("(") + M("DYNPROFILEEDITOR_IMGTYPE_ANY") + ")"); + imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_STD")); + imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_HDR")); + imagetype_->append(M("DYNPROFILEEDITOR_IMGTYPE_PS")); + imagetype_->set_active(0); + hb = Gtk::manage (new Gtk::HBox()); + hb->pack_start (*Gtk::manage (new Gtk::Label (M ("EXIFFILTER_IMAGETYPE"))), false, false, 4); + hb->pack_start (*imagetype_, true, true, 2); + get_content_area()->pack_start (*hb, Gtk::PACK_SHRINK, 4); add_range (M ("EXIFFILTER_ISO"), iso_min_, iso_max_); add_range (M ("EXIFFILTER_APERTURE"), fnumber_min_, fnumber_max_); @@ -81,6 +92,18 @@ void DynamicProfilePanel::EditDialog::set_rule ( has_lens_->set_active (rule.lens.enabled); lens_->set_text (rule.lens.value); + if (!rule.imagetype.enabled) { + imagetype_->set_active(0); + } else if (rule.imagetype.value == "STD") { + imagetype_->set_active(1); + } else if (rule.imagetype.value == "HDR") { + imagetype_->set_active(2); + } else if (rule.imagetype.value == "PS") { + imagetype_->set_active(3); + } else { + imagetype_->set_active(0); + } + profilepath_->updateProfileList(); if (!profilepath_->setActiveRowFromFullPath (rule.profilepath)) { @@ -112,6 +135,21 @@ DynamicProfileRule DynamicProfilePanel::EditDialog::get_rule() ret.lens.enabled = has_lens_->get_active(); ret.lens.value = lens_->get_text(); + ret.imagetype.enabled = imagetype_->get_active_row_number() > 0; + switch (imagetype_->get_active_row_number()) { + case 1: + ret.imagetype.value = "STD"; + break; + case 2: + ret.imagetype.value = "HDR"; + break; + case 3: + ret.imagetype.value = "PS"; + break; + default: + ret.imagetype.value = ""; + } + ret.profilepath = profilepath_->getFullPathFromActiveRow(); return ret; @@ -254,6 +292,16 @@ DynamicProfilePanel::DynamicProfilePanel(): *this, &DynamicProfilePanel::render_lens)); } + cell = Gtk::manage (new Gtk::CellRendererText()); + cols_count = treeview_.append_column (M ("EXIFFILTER_IMAGETYPE"), *cell); + col = treeview_.get_column (cols_count - 1); + + if (col) { + col->set_cell_data_func ( + *cell, sigc::mem_fun ( + *this, &DynamicProfilePanel::render_imagetype)); + } + cell = Gtk::manage (new Gtk::CellRendererText()); cols_count = treeview_.append_column (M ("EXIFFILTER_ISO"), *cell); col = treeview_.get_column (cols_count - 1); @@ -323,6 +371,7 @@ void DynamicProfilePanel::update_rule (Gtk::TreeModel::Row row, row[columns_.expcomp] = rule.expcomp; row[columns_.camera] = rule.camera; row[columns_.lens] = rule.lens; + row[columns_.imagetype] = rule.imagetype; row[columns_.profilepath] = rule.profilepath; } @@ -346,6 +395,7 @@ DynamicProfileRule DynamicProfilePanel::to_rule (Gtk::TreeModel::Row row, ret.camera = row[columns_.camera]; ret.lens = row[columns_.lens]; ret.profilepath = row[columns_.profilepath]; + ret.imagetype = row[columns_.imagetype]; return ret; } @@ -456,6 +506,19 @@ void DynamicProfilePanel::render_lens ( RENDER_OPTIONAL_ (lens); } +void DynamicProfilePanel::render_imagetype ( + Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter) +{ + auto row = *iter; + Gtk::CellRendererText *ct = static_cast(cell); + DynamicProfileRule::Optional o = row[columns_.imagetype]; + if (o.enabled) { + ct->property_text() = M(std::string("DYNPROFILEEDITOR_IMGTYPE_") + o.value); + } else { \ + ct->property_text() = ""; + } +} + #undef RENDER_OPTIONAL_ void DynamicProfilePanel::on_button_up() diff --git a/rtgui/dynamicprofilepanel.h b/rtgui/dynamicprofilepanel.h index dca62f1e6..e271edc5a 100644 --- a/rtgui/dynamicprofilepanel.h +++ b/rtgui/dynamicprofilepanel.h @@ -54,6 +54,7 @@ private: add (camera); add (lens); add (profilepath); + add (imagetype); } Gtk::TreeModelColumn> iso; @@ -63,6 +64,7 @@ private: Gtk::TreeModelColumn> expcomp; Gtk::TreeModelColumn camera; Gtk::TreeModelColumn lens; + Gtk::TreeModelColumn imagetype; Gtk::TreeModelColumn profilepath; }; @@ -74,6 +76,7 @@ private: void render_expcomp (Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); void render_camera (Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); void render_lens (Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); + void render_imagetype (Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); void render_profilepath (Gtk::CellRenderer* cell, const Gtk::TreeModel::iterator& iter); class EditDialog: public Gtk::Dialog @@ -109,6 +112,8 @@ private: Gtk::CheckButton *has_lens_; Gtk::Entry *lens_; + MyComboBoxText *imagetype_; + ProfileStoreComboBox *profilepath_; }; diff --git a/rtgui/edit.cc b/rtgui/edit.cc index 9ee0d63ba..e68fec15c 100644 --- a/rtgui/edit.cc +++ b/rtgui/edit.cc @@ -1140,7 +1140,7 @@ CursorShape EditDataProvider::getCursor(int objectID) currSubscriber->getCursor(objectID); } - return CSOpenHand; + return CSHandOpen; } EditSubscriber* EditDataProvider::getCurrSubscriber() diff --git a/rtgui/edit.h b/rtgui/edit.h index eeeca694d..1540dc5ac 100644 --- a/rtgui/edit.h +++ b/rtgui/edit.h @@ -148,7 +148,7 @@ class EditSubscriber; * * 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. @@ -348,9 +348,9 @@ public: Circle (rtengine::Coord& center, int radius, bool filled = false, bool radiusInImageSpace = false); Circle (int centerX, int centerY, int radius, bool filled = false, bool radiusInImageSpace = false); - void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; }; class Line : public Geometry @@ -363,9 +363,9 @@ public: Line (rtengine::Coord& begin, rtengine::Coord& end); Line (int beginX, int beginY, int endX, int endY); - void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; }; class Polyline : public Geometry @@ -376,9 +376,9 @@ public: Polyline (); - void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; }; class Rectangle : public Geometry @@ -394,9 +394,9 @@ public: void setXYXY(int left, int top, int right, int bottom); void setXYWH(rtengine::Coord topLeft, rtengine::Coord widthHeight); void setXYXY(rtengine::Coord topLeft, rtengine::Coord bottomRight); - void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; }; class OPIcon : public Geometry // OP stands for "On Preview" @@ -431,9 +431,9 @@ public: const Cairo::RefPtr getActiveImg(); const Cairo::RefPtr getDraggedImg(); const Cairo::RefPtr getInsensitiveImg(); - void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; + void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) override; }; class OPAdjuster : public Geometry // OP stands for "On Preview" @@ -717,7 +717,7 @@ inline EditDataProvider* EditSubscriber::getEditProvider () { } inline CursorShape EditSubscriber::getCursor (const int objectID) { - return CSOpenHand; + return CSHandOpen; } inline bool EditSubscriber::mouseOver (const int modifierKey) { diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 6e13cd2a5..6e390cf42 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -38,37 +38,15 @@ using namespace rtengine::procparams; namespace { -struct spparams { - double val; - Glib::ustring str; - MyProgressBar *pProgress; - Glib::RefPtr cssProvider; -}; - -int setprogressStrUI ( void *p ) +void setprogressStrUI(double val, const Glib::ustring str, MyProgressBar* pProgress) { - spparams *s = static_cast (p); - - if ( ! s->str.empty() ) { - s->pProgress->set_text ( M (s->str) ); + if (!str.empty()) { + pProgress->set_text(M(str)); } - if ( s->val >= 0 ) { - s->pProgress->set_fraction ( s->val ); - - if (s->cssProvider) { - if ( s->val < 1.0 ) { - s->cssProvider->load_from_data ("ProgressBar { background-color: red }"); - } else { - s->cssProvider->load_from_data ("ProgressBar { background-color: grey }"); - } - - s->pProgress->get_style_context()->set_background (s->pProgress->get_window()); - } + if (val >= 0.0) { + pProgress->set_fraction(val); } - - delete s; - return FALSE; } @@ -153,7 +131,6 @@ private: Gtk::ToggleButton softProof; Gtk::ToggleButton spGamutCheck; sigc::connection profileConn, intentConn, softproofConn; - bool canSProof; Glib::ustring defprof; rtengine::StagedImageProcessor* const& processor; @@ -205,24 +182,23 @@ private: 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 (); } @@ -274,7 +250,7 @@ private: } #else - profile = "RT_sRGB"; + profile = options.rtSettings.srgb; #endif #if !defined(__APPLE__) // monitor profile not supported on apple @@ -301,8 +277,8 @@ private: 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 +286,7 @@ private: 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 +328,11 @@ private: 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 +344,7 @@ private: 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 +360,6 @@ private: 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 +388,6 @@ public: grid->attach_next_to (spGamutCheck, Gtk::POS_RIGHT, 1, 1); } - void canSoftProof (bool canSP) - { - canSProof = canSP; - updateSoftProofParameters(); - } - void updateProcessor() { if (processor) { @@ -512,8 +475,11 @@ EditorPanel::EditorPanel (FilePanel* filePanel) // build GUI // build left side panel - leftbox = new Gtk::VBox (); - leftbox->set_size_request (230, 250); + leftbox = new Gtk::Paned (Gtk::ORIENTATION_VERTICAL); + + // make a subbox to allow resizing of the histogram (if it's on the left) + leftsubbox = new Gtk::Box (Gtk::ORIENTATION_VERTICAL); + leftsubbox->set_size_request (230, 250); histogramPanel = nullptr; @@ -522,19 +488,22 @@ EditorPanel::EditorPanel (FilePanel* filePanel) ppframe->set_name ("ProfilePanel"); ppframe->add (*profilep); ppframe->set_label (M ("PROFILEPANEL_LABEL")); - //leftbox->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); + //leftsubbox->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); navigator = Gtk::manage (new Navigator ()); navigator->previewWindow->set_size_request (-1, 150); - leftbox->pack_start (*navigator, Gtk::PACK_SHRINK, 2); + leftsubbox->pack_start (*navigator, Gtk::PACK_SHRINK, 2); history = Gtk::manage (new History ()); - leftbox->pack_start (*history); + leftsubbox->pack_start (*history); + leftsubbox->show_all (); + + leftbox->pack2 (*leftsubbox, true, true); leftbox->show_all (); // build the middle of the screen - Gtk::VBox* editbox = Gtk::manage (new Gtk::VBox ()); + Gtk::Box* editbox = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_VERTICAL)); info = Gtk::manage (new Gtk::ToggleButton ()); Gtk::Image* infoimg = Gtk::manage (new RTImage ("info.png")); @@ -548,8 +517,8 @@ EditorPanel::EditorPanel (FilePanel* filePanel) beforeAfter->set_relief (Gtk::RELIEF_NONE); beforeAfter->set_tooltip_markup (M ("MAIN_TOOLTIP_TOGGLE")); - iBeforeLockON = new RTImage ("lock-on.png"); - iBeforeLockOFF = new RTImage ("lock-off.png"); + iBeforeLockON = new RTImage ("padlock-locked-small.png"); + iBeforeLockOFF = new RTImage ("padlock-unlocked-small.png"); Gtk::VSeparator* vsept = Gtk::manage (new Gtk::VSeparator ()); Gtk::VSeparator* vsepz = Gtk::manage (new Gtk::VSeparator ()); @@ -605,7 +574,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) tpc->setEditProvider (iareapanel->imageArea); tpc->getToolBar()->setLockablePickerToolListener (iareapanel->imageArea); - Gtk::HBox* toolBarPanel = Gtk::manage (new Gtk::HBox ()); + Gtk::Box* toolBarPanel = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_HORIZONTAL)); toolBarPanel->set_name ("EditorTopPanel"); toolBarPanel->pack_start (*hidehp, Gtk::PACK_SHRINK, 1); toolBarPanel->pack_start (*vseph, Gtk::PACK_SHRINK, 2); @@ -632,23 +601,30 @@ EditorPanel::EditorPanel (FilePanel* filePanel) toolBarPanel->pack_end (*iareapanel->imageArea->previewModePanel, Gtk::PACK_SHRINK, 0); toolBarPanel->pack_end (*vsepz4, Gtk::PACK_SHRINK, 2); - afterBox = Gtk::manage (new Gtk::VBox ()); + afterBox = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_VERTICAL)); afterBox->pack_start (*iareapanel); - beforeAfterBox = Gtk::manage (new Gtk::HBox()); + beforeAfterBox = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_HORIZONTAL)); beforeAfterBox->set_name ("BeforeAfterContainer"); beforeAfterBox->pack_start (*afterBox); - editbox->pack_start (*toolBarPanel, Gtk::PACK_SHRINK, 2); + MyScrolledToolbar *stb1 = Gtk::manage(new MyScrolledToolbar()); + stb1->set_name("EditorToolbarTop"); + stb1->add(*toolBarPanel); + editbox->pack_start (*stb1, Gtk::PACK_SHRINK, 2); editbox->pack_start (*beforeAfterBox); // build right side panel - vboxright = new Gtk::VBox (false, 0); - vboxright->set_size_request (300, 250); + vboxright = new Gtk::Paned (Gtk::ORIENTATION_VERTICAL); - vboxright->pack_start (*ppframe, Gtk::PACK_SHRINK, 2); + vsubboxright = new Gtk::Box (Gtk::ORIENTATION_VERTICAL, 0); + vsubboxright->set_size_request (300, 250); + + vsubboxright->pack_start (*ppframe, Gtk::PACK_SHRINK, 2); // main notebook - vboxright->pack_start (*tpc->toolPanelNotebook); + vsubboxright->pack_start (*tpc->toolPanelNotebook); + + vboxright->pack2 (*vsubboxright, true, true); // Save buttons Gtk::Grid *iops = new Gtk::Grid (); @@ -657,20 +633,23 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iops->set_row_spacing (2); iops->set_column_spacing (2); - Gtk::Image *saveButtonImage = Gtk::manage (new RTImage ("gtk-save-large.png")); + Gtk::Image *saveButtonImage = Gtk::manage (new RTImage ("save.png")); saveimgas = Gtk::manage (new Gtk::Button ()); + saveimgas->set_relief(Gtk::RELIEF_NONE); saveimgas->add (*saveButtonImage); saveimgas->set_tooltip_markup (M ("MAIN_BUTTON_SAVE_TOOLTIP")); setExpandAlignProperties (saveimgas, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image *queueButtonImage = Gtk::manage (new RTImage ("processing.png")); + Gtk::Image *queueButtonImage = Gtk::manage (new RTImage ("gears.png")); queueimg = Gtk::manage (new Gtk::Button ()); + queueimg->set_relief(Gtk::RELIEF_NONE); queueimg->add (*queueButtonImage); queueimg->set_tooltip_markup (M ("MAIN_BUTTON_PUTTOQUEUE_TOOLTIP")); setExpandAlignProperties (queueimg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image *sendToEditorButtonImage = Gtk::manage (new RTImage ("image-editor.png")); + Gtk::Image *sendToEditorButtonImage = Gtk::manage (new RTImage ("palette-brush.png")); sendtogimp = Gtk::manage (new Gtk::Button ()); + sendtogimp->set_relief(Gtk::RELIEF_NONE); sendtogimp->add (*sendToEditorButtonImage); sendtogimp->set_tooltip_markup (M ("MAIN_BUTTON_SENDTOEDITOR_TOOLTIP")); setExpandAlignProperties (sendtogimp, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); @@ -705,7 +684,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) if (!simpleEditor && !options.tabbedUI) { // Navigation buttons - Gtk::Image *navPrevImage = Gtk::manage (new RTImage ("nav-prev.png")); + Gtk::Image *navPrevImage = Gtk::manage (new RTImage ("arrow2-left.png")); navPrevImage->set_padding (0, 0); navPrev = Gtk::manage (new Gtk::Button ()); navPrev->add (*navPrevImage); @@ -713,7 +692,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) navPrev->set_tooltip_markup (M ("MAIN_BUTTON_NAVPREV_TOOLTIP")); setExpandAlignProperties (navPrev, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image *navNextImage = Gtk::manage (new RTImage ("nav-next.png")); + Gtk::Image *navNextImage = Gtk::manage (new RTImage ("arrow2-right.png")); navNextImage->set_padding (0, 0); navNext = Gtk::manage (new Gtk::Button ()); navNext->add (*navNextImage); @@ -721,7 +700,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) navNext->set_tooltip_markup (M ("MAIN_BUTTON_NAVNEXT_TOOLTIP")); setExpandAlignProperties (navNext, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image *navSyncImage = Gtk::manage (new RTImage ("nav-sync.png")); + Gtk::Image *navSyncImage = Gtk::manage (new RTImage ("arrow-updown.png")); navSyncImage->set_padding (0, 0); navSync = Gtk::manage (new Gtk::Button ()); navSync->add (*navSyncImage); @@ -768,7 +747,11 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iops->attach_next_to (*tbShowHideSidePanels, Gtk::POS_RIGHT, 1, 1); iops->attach_next_to (*tbRightPanel_1, Gtk::POS_RIGHT, 1, 1); - editbox->pack_start (*iops, Gtk::PACK_SHRINK, 0); + MyScrolledToolbar *stb2 = Gtk::manage(new MyScrolledToolbar()); + stb2->set_name("EditorToolbarBottom"); + stb2->add(*iops); + + editbox->pack_start (*stb2, Gtk::PACK_SHRINK, 0); editbox->show_all (); // build screen @@ -784,8 +767,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) hpanedl->set_position (options.historyPanelWidth); } - - Gtk::VPaned * viewpaned = Gtk::manage (new Gtk::VPaned()); + Gtk::Paned *viewpaned = Gtk::manage (new Gtk::Paned (Gtk::ORIENTATION_VERTICAL)); fPanel = filePanel; if (filePanel) { @@ -858,6 +840,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) if (tbTopPanel_1) { tbTopPanel_1->signal_toggled().connect ( sigc::mem_fun (*this, &EditorPanel::tbTopPanel_1_toggled) ); } + } EditorPanel::~EditorPanel () @@ -901,7 +884,9 @@ EditorPanel::~EditorPanel () delete tpc; delete ppframe; + delete leftsubbox; delete leftbox; + delete vsubboxright; delete vboxright; //delete saveAsDialog; @@ -1038,6 +1023,7 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) ipc->setPreviewScale (10); // Important tpc->initImage (ipc, tmb->getType() == FT_Raw); ipc->setHistogramListener (this); + iareapanel->imageArea->indClippedPanel->silentlyDisableSharpMask(); // iarea->fitZoom (); // tell to the editorPanel that the next image has to be fitted to the screen iareapanel->imageArea->setPreviewHandler (previewHandler); @@ -1068,20 +1054,17 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc) // 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(); -// } } else { Gtk::Allocation alloc; iareapanel->imageArea->on_resized (alloc); + + // When passing a photo as an argument to the RawTherapee executable, the user wants + // this auto-loaded photo's thumbnail to be selected and visible in the Filmstrip. + EditorPanel::syncFileBrowser(); } history->resetSnapShotNumber(); + navigator->setInvalid(ipc->getFullWidth(),ipc->getFullHeight()); } void EditorPanel::close () @@ -1158,7 +1141,12 @@ Glib::ustring EditorPanel::getFileName () } // TODO!!! -void EditorPanel::procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited) +void EditorPanel::procParamsChanged( + const rtengine::procparams::ProcParams* params, + const rtengine::ProcEvent& ev, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited +) { // if (ev!=EvPhotoLoaded) @@ -1177,75 +1165,119 @@ void EditorPanel::procParamsChanged (rtengine::procparams::ProcParams* params, r info_toggled(); } -void EditorPanel::setProgressState (bool inProcessing) +void EditorPanel::clearParamChanges() { - struct spsparams { - bool inProcessing; - EditorPanelIdleHelper* epih; - }; +} +void EditorPanel::setProgress(double p) +{ + MyProgressBar* const pl = progressLabel; + + idle_register.add( + [p, pl]() -> bool + { + setprogressStrUI(p, {}, pl); + return false; + } + ); +} + +void EditorPanel::setProgressStr(const Glib::ustring& str) +{ + MyProgressBar* const pl = progressLabel; + + idle_register.add( + [str, pl]() -> bool + { + setprogressStrUI(-1.0, str, pl); + return false; + } + ); +} + +void EditorPanel::setProgressState(bool inProcessing) +{ epih->pending++; - spsparams* p = new spsparams; - p->inProcessing = inProcessing; - p->epih = epih; - - const auto func = [] (gpointer data) -> gboolean { - spsparams* const p = static_cast (data); - - if (p->epih->destroyed) + idle_register.add( + [this, inProcessing]() -> bool { - if (p->epih->pending == 1) { - delete p->epih; - } else { - p->epih->pending--; + if (epih->destroyed) + { + if (epih->pending == 1) { + delete epih; + } else { + --epih->pending; + } + + return false; } - delete p; + epih->epanel->refreshProcessingState(inProcessing); + --epih->pending; - return 0; + return false; } - - p->epih->epanel->refreshProcessingState (p->inProcessing); - p->epih->pending--; - delete p; - - return FALSE; - }; - - idle_register.add (func, p); + ); } -void EditorPanel::setProgress (double p) +void EditorPanel::error(const Glib::ustring& descr) { - spparams *s = new spparams; - s->val = p; - s->pProgress = progressLabel; - idle_register.add (setprogressStrUI, s); } -void EditorPanel::setProgressStr (Glib::ustring str) +void EditorPanel::error(const Glib::ustring& title, const Glib::ustring& descr) { - spparams *s = new spparams; - s->str = str; - s->val = -1; - s->pProgress = progressLabel; - idle_register.add (setprogressStrUI, s); + epih->pending++; + + idle_register.add( + [this, descr, title]() -> bool + { + if (epih->destroyed) { + if (epih->pending == 1) { + delete epih; + } else { + --epih->pending; + } + + return false; + } + + epih->epanel->displayError(title, descr); + --epih->pending; + + return false; + } + ); +} + +void EditorPanel::displayError(const Glib::ustring& title, const Glib::ustring& descr) +{ + GtkWidget* msgd = gtk_message_dialog_new_with_markup (nullptr, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + "%s", + descr.data()); + gtk_window_set_title ((GtkWindow*)msgd, title.data()); + g_signal_connect_swapped (msgd, "response", + G_CALLBACK (gtk_widget_destroy), + msgd); + gtk_widget_show_all (msgd); } // This is only called from the ThreadUI, so within the gtk thread void EditorPanel::refreshProcessingState (bool inProcessingP) { - spparams *s = new spparams; - s->pProgress = progressLabel; + double val; + Glib::ustring str; if (inProcessingP) { if (processingStartedTime == 0) { processingStartedTime = ::time (nullptr); } - s->str = "PROGRESSBAR_PROCESSING"; - s->val = 1.0; + val = 1.0; + str = "PROGRESSBAR_PROCESSING"; } else { // Set proc params of thumbnail. It saves it into the cache and updates the file browser. if (ipc && openThm && tpc->getChangedState()) { @@ -1266,8 +1298,8 @@ void EditorPanel::refreshProcessingState (bool inProcessingP) } // Set progress bar "done" - s->str = "PROGRESSBAR_READY"; - s->val = 0.0; + val = 0.0; + str = "PROGRESSBAR_READY"; #ifdef WIN32 @@ -1282,62 +1314,7 @@ void EditorPanel::refreshProcessingState (bool inProcessingP) isProcessing = inProcessingP; - setprogressStrUI (s); -} - -void EditorPanel::displayError (Glib::ustring title, Glib::ustring descr) -{ - GtkWidget* msgd = gtk_message_dialog_new_with_markup (nullptr, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - "%s", - descr.data()); - gtk_window_set_title ((GtkWindow*)msgd, title.data()); - g_signal_connect_swapped (msgd, "response", - G_CALLBACK (gtk_widget_destroy), - msgd); - gtk_widget_show_all (msgd); -} - -void EditorPanel::error (Glib::ustring title, Glib::ustring descr) -{ - struct errparams { - Glib::ustring descr; - Glib::ustring title; - EditorPanelIdleHelper* epih; - }; - - epih->pending++; - errparams* const p = new errparams; - p->descr = descr; - p->title = title; - p->epih = epih; - - const auto func = [] (gpointer data) -> gboolean { - errparams* const p = static_cast (data); - - if (p->epih->destroyed) - { - if (p->epih->pending == 1) { - delete p->epih; - } else { - p->epih->pending--; - } - - delete p; - - return 0; - } - - p->epih->epanel->displayError (p->title, p->descr); - p->epih->pending--; - delete p; - - return FALSE; - }; - - idle_register.add (func, p); + setprogressStrUI(val, str, progressLabel); } void EditorPanel::info_toggled () @@ -1626,6 +1603,10 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) iareapanel->imageArea->previewModePanel->toggleB(); return true; + case GDK_KEY_p: //preview mode Sharpening Contrast mask + iareapanel->imageArea->indClippedPanel->toggleSharpMask(); + return true; + case GDK_KEY_v: //preview mode Luminosity iareapanel->imageArea->previewModePanel->toggleL(); return true; @@ -1785,7 +1766,7 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, img->setSaveProgressListener (parent->getProgressListener()); if (sf.format == "tif") - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fname, sf.tiffBits, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fname, sf.tiffBits, sf.tiffFloat, 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::IImagefloat::saveAsPNG), fname, sf.pngBits), @@ -1993,6 +1974,7 @@ bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveForm { rtengine::procparams::ProcParams pparams; ipc->getParams (&pparams); + rtengine::ProcessingJob *job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); // save immediately @@ -2000,8 +1982,10 @@ bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveForm int err = 0; - if (sf.format == "tif") { - err = img->saveAsTIFF (filename, sf.tiffBits, sf.tiffUncompressed); + if (gimpPlugin) { + err = img->saveAsTIFF (filename, 32, true, true); + } else if (sf.format == "tif") { + err = img->saveAsTIFF (filename, sf.tiffBits, sf.tiffFloat, sf.tiffUncompressed); } else if (sf.format == "png") { err = img->saveAsPNG (filename, sf.pngBits); } else if (sf.format == "jpg") { @@ -2057,6 +2041,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p SaveFormat sf; sf.format = "tif"; sf.tiffBits = 16; + sf.tiffFloat = false; sf.tiffUncompressed = true; sf.saveParams = true; @@ -2077,7 +2062,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *p ProgressConnector *ld = new ProgressConnector(); img->setSaveProgressListener (parent->getProgressListener()); - ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fileName, sf.tiffBits, sf.tiffUncompressed), + ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImagefloat::saveAsTIFF), fileName, sf.tiffBits, sf.tiffFloat, 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"); @@ -2182,9 +2167,11 @@ void EditorPanel::beforeAfterToggled () beforeLabel = Gtk::manage (new Gtk::Label ()); beforeLabel->set_markup (Glib::ustring ("") + M ("GENERAL_BEFORE") + ""); tbBeforeLock = Gtk::manage (new Gtk::ToggleButton ()); + tbBeforeLock->set_relief(Gtk::RELIEF_NONE); tbBeforeLock->set_tooltip_markup (M ("MAIN_TOOLTIP_BEFOREAFTERLOCK")); tbBeforeLock->signal_toggled().connect ( sigc::mem_fun (*this, &EditorPanel::tbBeforeLock_toggled) ); - beforeHeaderBox = Gtk::manage (new Gtk::HBox ()); + beforeHeaderBox = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_HORIZONTAL)); + beforeHeaderBox->get_style_context()->add_class("smallbuttonbox"); beforeHeaderBox->pack_end (*tbBeforeLock, Gtk::PACK_SHRINK, 2); beforeHeaderBox->pack_end (*beforeLabel, Gtk::PACK_SHRINK, 2); beforeHeaderBox->set_size_request (0, HeaderBoxHeight); @@ -2198,7 +2185,7 @@ void EditorPanel::beforeAfterToggled () afterLabel = Gtk::manage (new Gtk::Label ()); afterLabel->set_markup (Glib::ustring ("") + M ("GENERAL_AFTER") + ""); - afterHeaderBox = Gtk::manage (new Gtk::HBox ()); + afterHeaderBox = Gtk::manage (new Gtk::Box (Gtk::ORIENTATION_HORIZONTAL)); afterHeaderBox->set_size_request (0, HeaderBoxHeight); afterHeaderBox->pack_end (*afterLabel, Gtk::PACK_SHRINK, 2); afterBox->pack_start (*afterHeaderBox, Gtk::PACK_SHRINK, 2); @@ -2217,7 +2204,7 @@ void EditorPanel::beforeAfterToggled () rtengine::RenderingIntent intent; ipc->getMonitorProfile(monitorProfile, intent); beforeIpc->setMonitorProfile(monitorProfile, intent); - + beforeIarea->imageArea->setPreviewHandler (beforePreviewHandler); beforeIarea->imageArea->setImProcCoordinator (beforeIpc); @@ -2242,15 +2229,28 @@ void EditorPanel::tbBeforeLock_toggled () tbBeforeLock->get_active() ? tbBeforeLock->set_image (*iBeforeLockON) : tbBeforeLock->set_image (*iBeforeLockOFF); } -void EditorPanel::histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, - LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI) +void EditorPanel::histogramChanged( + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRedRaw, + const LUTu& histGreenRaw, + const LUTu& histBlueRaw, + const LUTu& histChroma, + const LUTu& histLRETI +) { - if (histogramPanel) { - histogramPanel->histogramChanged (histRed, histGreen, histBlue, histLuma, histRedRaw, histGreenRaw, histBlueRaw, histChroma); + histogramPanel->histogramChanged(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw); } - tpc->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); + tpc->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); } bool EditorPanel::CheckSidePanelsVisibility() @@ -2306,7 +2306,6 @@ void EditorPanel::tbShowHideSidePanels_managestate() void EditorPanel::updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC) { - colorMgmtToolBar->canSoftProof (!printerProfile.empty() && printerProfile != "None"); } void EditorPanel::updateTPVScrollbar (bool hide) @@ -2314,11 +2313,6 @@ void EditorPanel::updateTPVScrollbar (bool hide) tpc->updateTPVScrollbar (hide); } -void EditorPanel::updateTabsUsesIcons (bool useIcons) -{ - tpc->updateTabsUsesIcons (useIcons); -} - void EditorPanel::updateHistogramPosition (int oldPosition, int newPosition) { @@ -2341,17 +2335,17 @@ void EditorPanel::updateHistogramPosition (int oldPosition, int newPosition) if (oldPosition == 0) { // There was no Histogram before, so we create it histogramPanel = Gtk::manage (new HistogramPanel ()); - leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + leftbox->pack1(*histogramPanel, false, false); } else if (oldPosition == 2) { // The histogram was on the right side, so we move it to the left histogramPanel->reference(); removeIfThere (vboxright, histogramPanel, false); - leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + leftbox->pack1(*histogramPanel, false, false); histogramPanel->unreference(); } + leftbox->set_position(options.histogramHeight); histogramPanel->reorder (Gtk::POS_LEFT); - leftbox->reorder_child (*histogramPanel, 0); break; case 2: @@ -2361,21 +2355,22 @@ void EditorPanel::updateHistogramPosition (int oldPosition, int newPosition) if (oldPosition == 0) { // There was no Histogram before, so we create it histogramPanel = Gtk::manage (new HistogramPanel ()); - vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + vboxright->pack1 (*histogramPanel, false, false); } else if (oldPosition == 1) { // The histogram was on the left side, so we move it to the right histogramPanel->reference(); removeIfThere (leftbox, histogramPanel, false); - vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + vboxright->pack1 (*histogramPanel, false, false); histogramPanel->unreference(); } + vboxright->set_position(options.histogramHeight); histogramPanel->reorder (Gtk::POS_RIGHT); - vboxright->reorder_child (*histogramPanel, 0); break; } iareapanel->imageArea->setPointerMotionHListener (histogramPanel); + } diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index 7876d18e1..de5360646 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -45,21 +45,22 @@ struct EditorPanelIdleHelper { }; class RTWindow; + class EditorPanel final : - public Gtk::VBox, - public PParamsChangeListener, - public rtengine::ProgressListener, - public ThumbnailListener, - public HistoryBeforeLineListener, - public rtengine::HistogramListener + public Gtk::VBox, + public PParamsChangeListener, + public rtengine::ProgressListener, + public ThumbnailListener, + public HistoryBeforeLineListener, + public rtengine::HistogramListener { public: explicit EditorPanel (FilePanel* filePanel = nullptr); - ~EditorPanel (); + ~EditorPanel () override; void open (Thumbnail* tmb, rtengine::InitialImage* isrc); void setAspect (); - void on_realize (); + void on_realize () override; void leftPaneButtonReleased (GdkEventButton *event); void rightPaneButtonReleased (GdkEventButton *event); @@ -81,26 +82,48 @@ public: { return realized; } - // progresslistener interface - void setProgress (double p); - void setProgressStr (Glib::ustring str); - void setProgressState (bool inProcessing); - void error (Glib::ustring title, Glib::ustring descr); - void displayError (Glib::ustring title, Glib::ustring descr); // this is called by error in the gtk thread + // ProgressListener interface + void setProgress(double p) override; + void setProgressStr(const Glib::ustring& str) override; + void setProgressState(bool inProcessing) override; + void error(const Glib::ustring& descr) override; + + void error(const Glib::ustring& title, const Glib::ustring& descr); + void displayError(const Glib::ustring& title, const Glib::ustring& descr); // this is called by error in the gtk thread void refreshProcessingState (bool inProcessing); // this is called by setProcessingState in the gtk thread // PParamsChangeListener interface - void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited = nullptr); + void procParamsChanged( + const rtengine::procparams::ProcParams* params, + const rtengine::ProcEvent& ev, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited = nullptr + ) override; + void clearParamChanges() override; // thumbnaillistener interface - void procParamsChanged (Thumbnail* thm, int whoChangedIt); + void procParamsChanged (Thumbnail* thm, int whoChangedIt) override; // HistoryBeforeLineListener - void historyBeforeLineChanged (const rtengine::procparams::ProcParams& params); + void historyBeforeLineChanged (const rtengine::procparams::ProcParams& params) override; // HistogramListener - void histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, - LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI); + void histogramChanged( + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRedRaw, + const LUTu& histGreenRaw, + const LUTu& histBlueRaw, + const LUTu& histChroma, + const LUTu& histLRETI + ) override; // event handlers void info_toggled (); @@ -133,7 +156,6 @@ public: } void updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC); void updateTPVScrollbar (bool hide); - void updateTabsUsesIcons (bool useIcons); void updateHistogramPosition (int oldPosition, int newPosition); void defaultMonitorProfileChanged (const Glib::ustring &profile_name, bool auto_monitor_profile); @@ -173,8 +195,10 @@ private: Gtk::Image *iShowHideSidePanels; Gtk::Image *iShowHideSidePanels_exit; Gtk::Image *iBeforeLockON, *iBeforeLockOFF; - Gtk::VBox *leftbox; - Gtk::VBox *vboxright; + Gtk::Paned *leftbox; + Gtk::Box *leftsubbox; + Gtk::Paned *vboxright; + Gtk::Box *vsubboxright; Gtk::Button* queueimg; Gtk::Button* saveimgas; @@ -191,13 +215,13 @@ private: PreviewHandler* beforePreviewHandler; // for the before-after view Navigator* navigator; ImageAreaPanel* beforeIarea; // for the before-after view - Gtk::VBox* beforeBox; - Gtk::VBox* afterBox; + Gtk::Box* beforeBox; + Gtk::Box* afterBox; Gtk::Label* beforeLabel; Gtk::Label* afterLabel; - Gtk::HBox* beforeAfterBox; - Gtk::HBox* beforeHeaderBox; - Gtk::HBox* afterHeaderBox; + Gtk::Box* beforeAfterBox; + Gtk::Box* beforeHeaderBox; + Gtk::Box* afterHeaderBox; Gtk::ToggleButton* toggleHistogramProfile; Gtk::Frame* ppframe; diff --git a/rtgui/editwindow.cc b/rtgui/editwindow.cc index f42bf4739..30114c006 100644 --- a/rtgui/editwindow.cc +++ b/rtgui/editwindow.cc @@ -53,15 +53,7 @@ EditWindow* EditWindow::getInstance(RTWindow* p, bool restore) EditWindow::EditWindow (RTWindow* p) : parent(p) , isFullscreen(false), isClosed(true) { - Glib::ustring fName = "rt-logo-tiny.png"; - Glib::ustring fullPath = rtengine::findIconAbsolutePath(fName); - - try { - set_default_icon_from_file (fullPath); - } catch(Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } - + set_default_icon(p->get_icon()); set_title_decorated(""); set_modal(false); set_resizable(true); @@ -69,16 +61,16 @@ EditWindow::EditWindow (RTWindow* p) : parent(p) , isFullscreen(false), isClosed property_destroy_with_parent().set_value(false); - mainNB = Gtk::manage (new Gtk::Notebook ()); - mainNB->set_scrollable (true); - mainNB->signal_switch_page().connect_notify( sigc::mem_fun(*this, &EditWindow::on_mainNB_switch_page) ); + mainNB = Gtk::manage(new Gtk::Notebook ()); + mainNB->set_scrollable(true); + mainNB->signal_switch_page().connect_notify(sigc::mem_fun(*this, &EditWindow::on_mainNB_switch_page)); - signal_key_press_event().connect( sigc::mem_fun(*this, &EditWindow::keyPressed) ); + signal_key_press_event().connect(sigc::mem_fun(*this, &EditWindow::keyPressed)); - Gtk::VBox* mainBox = Gtk::manage (new Gtk::VBox ()); - mainBox->pack_start (*mainNB); + Gtk::VBox* mainBox = Gtk::manage(new Gtk::VBox()); + mainBox->pack_start(*mainNB); - add (*mainBox); + add(*mainBox); } @@ -172,11 +164,11 @@ void EditWindow::addEditorPanel (EditorPanel* ep, const std::string &name) // construct closeable tab for the image Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); - hb->pack_start (*Gtk::manage (new RTImage ("rtwindow.png"))); + hb->pack_start (*Gtk::manage (new RTImage ("aperture.png"))); hb->pack_start (*Gtk::manage (new Gtk::Label (Glib::path_get_basename (name)))); hb->set_tooltip_markup (name); Gtk::Button* closeb = Gtk::manage (new Gtk::Button ()); - closeb->set_image (*Gtk::manage(new RTImage ("gtk-close.png"))); + closeb->set_image (*Gtk::manage(new RTImage ("cancel-small.png"))); closeb->set_relief (Gtk::RELIEF_NONE); closeb->set_focus_on_click (false); diff --git a/rtgui/editwindow.h b/rtgui/editwindow.h index 8cf93dbf8..736e46bd4 100644 --- a/rtgui/editwindow.h +++ b/rtgui/editwindow.h @@ -55,12 +55,12 @@ public: void toFront(); bool keyPressed (GdkEventKey* event); - bool on_configure_event(GdkEventConfigure* event); - bool on_delete_event(GdkEventAny* event); + bool on_configure_event(GdkEventConfigure* event) override; + bool on_delete_event(GdkEventAny* event) override; //bool on_window_state_event(GdkEventWindowState* event); void on_mainNB_switch_page(Gtk::Widget* page, guint page_num); void set_title_decorated(Glib::ustring fname); - void on_realize (); + void on_realize () override; }; #endif diff --git a/rtgui/epd.cc b/rtgui/epd.cc index 602585dfb..4b7cca10a 100644 --- a/rtgui/epd.cc +++ b/rtgui/epd.cc @@ -16,9 +16,12 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "epd.h" -#include #include +#include + +#include "epd.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -26,8 +29,6 @@ using namespace rtengine::procparams; EdgePreservingDecompositionUI::EdgePreservingDecompositionUI () : FoldableToolPanel(this, "epd", M("TP_EPD_LABEL"), true, true) { - setEnabledTooltipMarkup(M("TP_EPD_TOOLTIP")); - strength = Gtk::manage(new Adjuster (M("TP_EPD_STRENGTH"), -1.0, 2.0, 0.01, 0.5)); gamma = Gtk::manage(new Adjuster (M("TP_EPD_GAMMA"), 0.8, 1.5, 0.01, 1.)); edgeStopping = Gtk::manage(new Adjuster (M("TP_EPD_EDGESTOPPING"), 0.1, 4.0, 0.01, 0.5)); @@ -143,7 +144,7 @@ void EdgePreservingDecompositionUI::setDefaults(const ProcParams *defParams, con void EdgePreservingDecompositionUI::adjusterChanged(Adjuster* a, double newval) { - if(listener && getEnabled()) { + if (listener && getEnabled()) { if(a == strength) { listener->panelChanged(EvEPDStrength, Glib::ustring::format(std::setw(2), std::fixed, std::setprecision(2), a->getValue())); } else if(a == gamma) { @@ -158,6 +159,10 @@ void EdgePreservingDecompositionUI::adjusterChanged(Adjuster* a, double newval) } } +void EdgePreservingDecompositionUI::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void EdgePreservingDecompositionUI::enabledChanged () { if (listener) { diff --git a/rtgui/epd.h b/rtgui/epd.h index 2e18cc0c9..f2073a976 100644 --- a/rtgui/epd.h +++ b/rtgui/epd.h @@ -36,13 +36,14 @@ public: EdgePreservingDecompositionUI(); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void setAdjusterBehavior (bool stAdd, bool gAdd, bool esAdd, bool scAdd, bool rAdd); }; diff --git a/rtgui/exifpanel.cc b/rtgui/exifpanel.cc index 168106804..1882f4377 100644 --- a/rtgui/exifpanel.cc +++ b/rtgui/exifpanel.cc @@ -21,13 +21,17 @@ #include "guiutils.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; using namespace rtexif; -ExifPanel::ExifPanel () : idata (nullptr) +ExifPanel::ExifPanel() : + idata(nullptr), + changeList(new rtengine::procparams::ExifPairs), + defChangeList(new rtengine::procparams::ExifPairs) { - recursiveOp = true; exifTree = Gtk::manage (new Gtk::TreeView()); @@ -48,9 +52,9 @@ ExifPanel::ExifPanel () : idata (nullptr) 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"); + delicon = RTImage::createFromFile ("cancel-small.png"); + keepicon = RTImage::createFromFile ("tick-small.png"); + editicon = RTImage::createFromFile ("add-small.png"); Gtk::TreeView::Column *viewcol = Gtk::manage (new Gtk::TreeView::Column ("Field Name")); Gtk::CellRendererPixbuf* render_pb = Gtk::manage (new Gtk::CellRendererPixbuf ()); @@ -128,14 +132,14 @@ ExifPanel::ExifPanel () : idata (nullptr) 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_image (*Gtk::manage (new RTImage ("undo.png", "redo.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_image (*Gtk::manage (new RTImage ("undo-all.png", "redo-all.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); @@ -166,7 +170,7 @@ void ExifPanel::read (const ProcParams* pp, const ParamsEdited* pedited) disableListener (); - changeList = pp->exif; + *changeList = pp->exif; setImageData (idata); applyChangeList (); exifSelectionChanged (); @@ -178,13 +182,13 @@ void ExifPanel::write (ProcParams* pp, ParamsEdited* pedited) { // updateChangeList (); - pp->exif = changeList; + pp->exif = *changeList; } void ExifPanel::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { - defChangeList = defParams->exif; + *defChangeList = defParams->exif; } void ExifPanel::setImageData (const FramesMetaData* id) @@ -261,7 +265,7 @@ void ExifPanel::addDirectory (const TagDirectory* dir, Gtk::TreeModel::Children Tag* t2 = (const_cast (dir))->getTagByIndex (j); const TagAttrib* currAttrib = t2->getAttrib(); - if (currAttrib && ((options.lastShowAllExif) || (!options.lastShowAllExif && currAttrib->action != AC_SYSTEM))) { + if (currAttrib && (options.lastShowAllExif || currAttrib->action != AC_SYSTEM)) { addSeparator(); hasContent = true; break; @@ -457,7 +461,7 @@ void ExifPanel::resetAllPressed () { setImageData (idata); - changeList = defChangeList; + *changeList = *defChangeList; applyChangeList (); exifSelectionChanged (); notifyListener (); @@ -661,11 +665,11 @@ void ExifPanel::updateChangeList (Gtk::TreeModel::Children root, std::string pre for (iter = root.begin(); iter != root.end(); ++iter) { if (iter->get_value (exifColumns.edited)) { - changeList[ prefix + iter->get_value (exifColumns.field_nopango) ] = iter->get_value (exifColumns.value_nopango); + (*changeList)[ prefix + iter->get_value (exifColumns.field_nopango) ] = iter->get_value (exifColumns.value_nopango); } else if (iter->get_value (exifColumns.action) == AC_WRITE && iter->get_value (exifColumns.icon) == delicon) { - changeList[ prefix + iter->get_value (exifColumns.field_nopango) ] = "#delete"; + (*changeList)[ prefix + iter->get_value (exifColumns.field_nopango) ] = "#delete"; } else if (iter->get_value (exifColumns.action) == AC_DONTWRITE && iter->get_value (exifColumns.icon) == keepicon) { - changeList[ prefix + iter->get_value (exifColumns.field_nopango) ] = "#keep"; + (*changeList)[ prefix + iter->get_value (exifColumns.field_nopango) ] = "#keep"; } if (iter->get_value (exifColumns.icon) == keepicon) { @@ -677,14 +681,14 @@ void ExifPanel::updateChangeList (Gtk::TreeModel::Children root, std::string pre void ExifPanel::updateChangeList () { - changeList.clear (); + changeList->clear (); updateChangeList (exifTreeModel->children(), ""); } void ExifPanel::applyChangeList () { - for (rtengine::procparams::ExifPairs::iterator i = changeList.begin(); i != changeList.end(); ++i) { + for (rtengine::procparams::ExifPairs::const_iterator i = changeList->begin(); i != changeList->end(); ++i) { editTag (exifTreeModel->children(), i->first, i->second); } } diff --git a/rtgui/exifpanel.h b/rtgui/exifpanel.h index 5121eff4f..c8597a287 100644 --- a/rtgui/exifpanel.h +++ b/rtgui/exifpanel.h @@ -19,7 +19,10 @@ #ifndef _EXIFPANEL_ #define _EXIFPANEL_ +#include + #include + #include "toolpanel.h" class ExifPanel : public Gtk::VBox, public ToolPanel @@ -27,8 +30,8 @@ class ExifPanel : public Gtk::VBox, public ToolPanel private: const rtengine::FramesMetaData* idata; - rtengine::procparams::ExifPairs changeList; - rtengine::procparams::ExifPairs defChangeList; + const std::unique_ptr changeList; + const std::unique_ptr defChangeList; bool recursiveOp; class ExifColumns : public Gtk::TreeModelColumnRecord @@ -97,11 +100,11 @@ private: public: ExifPanel (); - virtual ~ExifPanel(); + ~ExifPanel() override; - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setImageData (const rtengine::FramesMetaData* id); diff --git a/rtgui/exportpanel.cc b/rtgui/exportpanel.cc index 144a107d5..9a4c930d5 100644 --- a/rtgui/exportpanel.cc +++ b/rtgui/exportpanel.cc @@ -22,6 +22,8 @@ #include "options.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -51,7 +53,6 @@ ExportPanel::ExportPanel () : listener (nullptr) //bypass_colorDenoise = Gtk::manage ( new Gtk::CheckButton (M("EXPORT_BYPASS_COLORDENOISE"))); bypass_defringe = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_DEFRINGE"))); bypass_dirpyrDenoise = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_DIRPYRDENOISE"))); - bypass_sh_hq = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_SH_HQ"))); bypass_dirpyrequalizer = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_DIRPYREQUALIZER"))); bypass_wavelet = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_EQUALIZER"))); bypass_raw_ccSteps = Gtk::manage ( new Gtk::CheckButton (M ("EXPORT_BYPASS_RAW_CCSTEPS"))); @@ -61,7 +62,7 @@ ExportPanel::ExportPanel () : listener (nullptr) // ---------------------- Bayer sensor frame ----------------------- - Gtk::Frame *bayerFrame = Gtk::manage ( new Gtk::Frame (M ("TP_RAW_SENSOR_BAYER"))); + Gtk::Frame *bayerFrame = Gtk::manage ( new Gtk::Frame (M ("TP_RAW_SENSOR_BAYER_LABEL"))); Gtk::VBox* bayerFrameVBox = Gtk::manage (new Gtk::VBox ()); Gtk::HBox* hb_raw_bayer_method = Gtk::manage (new Gtk::HBox ()); @@ -84,7 +85,7 @@ ExportPanel::ExportPanel () : listener (nullptr) // ---------------------- Bayer sensor frame ----------------------- - Gtk::Frame *xtransFrame = Gtk::manage ( new Gtk::Frame (M ("TP_RAW_SENSOR_XTRANS"))); + Gtk::Frame *xtransFrame = Gtk::manage ( new Gtk::Frame (M ("TP_RAW_SENSOR_XTRANS_LABEL"))); Gtk::VBox* xtransFrameVBox = Gtk::manage (new Gtk::VBox ()); Gtk::HBox* hb_raw_xtrans_method = Gtk::manage (new Gtk::HBox ()); @@ -120,7 +121,6 @@ ExportPanel::ExportPanel () : listener (nullptr) //pack_start(*bypass_colorDenoise , Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_defringe, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_dirpyrDenoise, Gtk::PACK_SHRINK, 4); - bypass_box->pack_start (*bypass_sh_hq, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_dirpyrequalizer, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_wavelet, Gtk::PACK_SHRINK, 4); @@ -132,9 +132,11 @@ ExportPanel::ExportPanel () : listener (nullptr) bayerFrameVBox->pack_start (*bypass_raw_bayer_linenoise, Gtk::PACK_SHRINK, 4); bayerFrameVBox->pack_start (*bypass_raw_bayer_greenthresh, Gtk::PACK_SHRINK, 4); bayerFrame->add (*bayerFrameVBox); + bypass_box->pack_start(*bayerFrame, Gtk::PACK_SHRINK, 4); xtransFrameVBox->pack_start (*hb_raw_xtrans_method, Gtk::PACK_SHRINK, 4); xtransFrame->add (*xtransFrameVBox); + bypass_box->pack_start(*xtransFrame, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_raw_ccSteps, Gtk::PACK_SHRINK, 4); bypass_box->pack_start (*bypass_raw_ca, Gtk::PACK_SHRINK, 4); @@ -180,14 +182,14 @@ ExportPanel::ExportPanel () : listener (nullptr) // Buttons btnFastExport = Gtk::manage ( new Gtk::Button () ); btnFastExport->set_tooltip_text (M ("EXPORT_PUTTOQUEUEFAST")); - btnFastExport->set_image (*Gtk::manage (new RTImage ("processing.png"))); + btnFastExport->set_image (*Gtk::manage (new RTImage ("gears.png"))); pack_start (*btnFastExport, Gtk::PACK_SHRINK, 4); // add panel ending Gtk::VBox* vboxpe = Gtk::manage (new Gtk::VBox ()); Gtk::HSeparator* hseptpe = Gtk::manage (new Gtk::HSeparator ()); - Gtk::Image* peImg = Gtk::manage (new RTImage ("PanelEnding.png")); + Gtk::Image* peImg = Gtk::manage (new RTImage ("ornament1.png")); vboxpe->pack_start (*hseptpe, Gtk::PACK_SHRINK, 4); vboxpe->pack_start (*peImg); pack_start (*vboxpe, Gtk::PACK_SHRINK, 0); @@ -206,7 +208,6 @@ ExportPanel::ExportPanel () : listener (nullptr) //bypass_colorDenoiseConn = bypass_colorDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_defringeConn = bypass_defringe->signal_toggled().connect (sigc::bind (sigc::mem_fun (*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_dirpyrDenoiseConn = bypass_dirpyrDenoise->signal_toggled().connect (sigc::bind (sigc::mem_fun (*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); - bypass_sh_hqConn = bypass_sh_hq->signal_toggled().connect (sigc::bind (sigc::mem_fun (*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_dirpyrequalizerConn = bypass_dirpyrequalizer->signal_toggled().connect (sigc::bind (sigc::mem_fun (*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); bypass_waveletConn = bypass_wavelet->signal_toggled().connect (sigc::bind (sigc::mem_fun (*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); //bypass_raw_all_enhanceConn = bypass_raw_bayer_all_enhance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*bypass_ALL, &Gtk::CheckButton::set_inconsistent), true)); @@ -258,7 +259,6 @@ void ExportPanel::SaveSettingsAsDefault() //options.fastexport_bypass_colorDenoise = bypass_colorDenoise->get_active (); FE_OPT_STORE_ (options.fastexport_bypass_defringe, bypass_defringe->get_active ()); FE_OPT_STORE_ (options.fastexport_bypass_dirpyrDenoise, bypass_dirpyrDenoise->get_active ()); - FE_OPT_STORE_ (options.fastexport_bypass_sh_hq, bypass_sh_hq->get_active ()); FE_OPT_STORE_ (options.fastexport_bypass_dirpyrequalizer, bypass_dirpyrequalizer->get_active ()); FE_OPT_STORE_ (options.fastexport_bypass_wavelet, bypass_wavelet->get_active ()); //options.fastexport_bypass_raw_bayer_all_enhance = bypass_raw_all_enhance->get_active (); @@ -275,14 +275,14 @@ void ExportPanel::SaveSettingsAsDefault() //saving Bayer demosaic_method int currentRow = raw_bayer_method->get_active_row_number(); - if (currentRow >= 0 && currentRow < std::numeric_limits::max()) { + if (currentRow >= 0) { 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 < std::numeric_limits::max()) { + if (currentRow >= 0) { FE_OPT_STORE_ (options.fastexport_raw_xtrans_method, procparams::RAWParams::XTransSensor::getMethodStrings()[currentRow]); } @@ -322,7 +322,6 @@ void ExportPanel::LoadDefaultSettings() //bypass_colorDenoise->set_active (options.fastexport_bypass_colorDenoise ); bypass_defringe->set_active (options.fastexport_bypass_defringe ); bypass_dirpyrDenoise->set_active (options.fastexport_bypass_dirpyrDenoise ); - bypass_sh_hq->set_active (options.fastexport_bypass_sh_hq ); bypass_dirpyrequalizer->set_active (options.fastexport_bypass_dirpyrequalizer ); bypass_wavelet->set_active (options.fastexport_bypass_wavelet ); //bypass_raw_bayer_all_enhance->set_active (options.fastexport_bypass_raw_bayer_all_enhance ); @@ -337,7 +336,7 @@ void ExportPanel::LoadDefaultSettings() bypass_raw_ff->set_active (options.fastexport_bypass_raw_ff ); // Bayer demosaic method - raw_bayer_method->set_active(std::numeric_limits::max()); + raw_bayer_method->set_active(0); for (size_t i = 0; i < RAWParams::BayerSensor::getMethodStrings().size(); ++i) if (options.fastexport_raw_bayer_method == procparams::RAWParams::BayerSensor::getMethodStrings()[i]) { @@ -346,7 +345,7 @@ void ExportPanel::LoadDefaultSettings() } // X-Trans demosaic method - raw_xtrans_method->set_active(std::numeric_limits::max()); + raw_xtrans_method->set_active(0); for (size_t i = 0; i < procparams::RAWParams::XTransSensor::getMethodStrings().size(); ++i) if (options.fastexport_raw_xtrans_method == procparams::RAWParams::XTransSensor::getMethodStrings()[i]) { @@ -394,7 +393,6 @@ void ExportPanel::bypassALL_Toggled() //bypass_colorDenoiseConn.block (true); bypass_defringeConn.block (true); bypass_dirpyrDenoiseConn.block (true); - bypass_sh_hqConn.block (true); bypass_dirpyrequalizerConn.block (true); bypass_waveletConn.block (true); //bypass_raw_bayer_all_enhanceConn.block (true); @@ -417,7 +415,6 @@ void ExportPanel::bypassALL_Toggled() //bypass_colorDenoise->set_active(bypass_ALL->get_active()); bypass_defringe->set_active (bypass_ALL->get_active()); bypass_dirpyrDenoise->set_active (bypass_ALL->get_active()); - bypass_sh_hq->set_active (bypass_ALL->get_active()); bypass_dirpyrequalizer->set_active (bypass_ALL->get_active()); bypass_wavelet->set_active (bypass_ALL->get_active()); //bypass_raw_bayer_all_enhance->set_active(bypass_ALL->get_active()); @@ -438,7 +435,6 @@ void ExportPanel::bypassALL_Toggled() //bypass_colorDenoiseConn.block (false); bypass_defringeConn.block (false); bypass_dirpyrDenoiseConn.block (false); - bypass_sh_hqConn.block (false); bypass_dirpyrequalizerConn.block (false); bypass_waveletConn.block (false); //bypass_raw_bayer_all_enhanceConn.block (false); @@ -466,7 +462,6 @@ fastexport_bypass_lumaDenoise fastexport_bypass_colorDenoise fastexport_bypass_defringe fastexport_bypass_dirpyrDenoise -fastexport_bypass_sh_hq fastexport_bypass_dirpyrequalizer fastexport_raw_bayer_method fastexport_bypass_raw_bayer_all_enhance diff --git a/rtgui/exportpanel.h b/rtgui/exportpanel.h index be6c9b4e3..dc9aa34a5 100644 --- a/rtgui/exportpanel.h +++ b/rtgui/exportpanel.h @@ -26,9 +26,10 @@ class ExportPanelListener { - public: - virtual void exportRequested () {} + virtual ~ExportPanelListener() = default; + + virtual void exportRequested() = 0; }; class ExportPanel : public Gtk::VBox @@ -48,11 +49,10 @@ protected: //Gtk::CheckButton* bypass_colorDenoise; Gtk::CheckButton* bypass_defringe; Gtk::CheckButton* bypass_dirpyrDenoise; - Gtk::CheckButton* bypass_sh_hq; /* icm_input = "(camera)"; icm_working = "sRGB"; - icm_output = "RT_sRGB"; + icm_output = options.rtSettings.srgb; icm_gamma = "default"; */ Gtk::CheckButton* bypass_dirpyrequalizer; // also could leave untouched but disable only small radius adjustments @@ -88,7 +88,6 @@ protected: //sigc::connection bypass_colorDenoiseConn ; sigc::connection bypass_defringeConn ; sigc::connection bypass_dirpyrDenoiseConn ; - sigc::connection bypass_sh_hqConn ; sigc::connection bypass_dirpyrequalizerConn ; sigc::connection bypass_waveletConn ; //sigc::connection bypass_raw_bayer_all_enhanceConn ; diff --git a/rtgui/fattaltonemap.cc b/rtgui/fattaltonemap.cc index 5e4aa20d9..85d835cc7 100644 --- a/rtgui/fattaltonemap.cc +++ b/rtgui/fattaltonemap.cc @@ -17,41 +17,59 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "fattaltonemap.h" -#include #include +#include + +#include "fattaltonemap.h" + +#include "eventmapper.h" + +#include "../rtengine/procparams.h" + 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)); + threshold = Gtk::manage(new Adjuster (M("TP_TM_FATTAL_THRESHOLD"), -100., 300., 1., 0.0)); + threshold->setLogScale(10, 0); + Gtk::Image *al = Gtk::manage(new RTImage("circle-black-small.png")); + Gtk::Image *ar = Gtk::manage(new RTImage("circle-white-small.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) { + 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(); } @@ -60,11 +78,13 @@ 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(); } } @@ -73,13 +93,16 @@ void FattalToneMapping::setDefaults(const ProcParams *defParams, const ParamsEdi { 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); } } @@ -90,10 +113,16 @@ void FattalToneMapping::adjusterChanged(Adjuster* a, double newval) 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::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void FattalToneMapping::enabledChanged () { if (listener) { @@ -113,11 +142,13 @@ void FattalToneMapping::setBatchMode(bool batchMode) threshold->showEditedCB(); amount->showEditedCB(); + anchor->showEditedCB(); } -void FattalToneMapping::setAdjusterBehavior (bool alphaAdd, bool betaAdd) +void FattalToneMapping::setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd) { - threshold->setAddMode(alphaAdd); - amount->setAddMode(betaAdd); + amount->setAddMode(amountAdd); + threshold->setAddMode(thresholdAdd); + anchor->setAddMode(anchorAdd); } diff --git a/rtgui/fattaltonemap.h b/rtgui/fattaltonemap.h index 2398970ce..76e850c4e 100644 --- a/rtgui/fattaltonemap.h +++ b/rtgui/fattaltonemap.h @@ -28,19 +28,22 @@ class FattalToneMapping: public ToolParamBlock, public AdjusterListener, public 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 alphaAdd, bool betaAdd); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; + void setAdjusterBehavior(bool amountAdd, bool thresholdAdd, bool anchorAdd); }; diff --git a/rtgui/favoritbrowser.cc b/rtgui/favoritbrowser.cc index 29b82f510..379ce26e6 100644 --- a/rtgui/favoritbrowser.cc +++ b/rtgui/favoritbrowser.cc @@ -55,7 +55,7 @@ FavoritBrowser::FavoritBrowser () : listener (NULL), lastSelectedDir ("") add->set_vexpand(false); add->set_halign(Gtk::ALIGN_FILL); add->set_valign(Gtk::ALIGN_START); - add->set_image (*Gtk::manage (new RTImage ("gtk-add.png"))); + add->set_image (*Gtk::manage (new RTImage ("add-small.png"))); add->get_style_context()->add_class("Left"); del = Gtk::manage (new Gtk::Button ()); del->set_tooltip_text(M("MAIN_FRAME_PLACES_DEL")); @@ -63,7 +63,7 @@ FavoritBrowser::FavoritBrowser () : listener (NULL), lastSelectedDir ("") del->set_vexpand(false); del->set_halign(Gtk::ALIGN_FILL); del->set_valign(Gtk::ALIGN_START); - del->set_image (*Gtk::manage (new RTImage ("list-remove.png"))); + del->set_image (*Gtk::manage (new RTImage ("remove-small.png"))); del->get_style_context()->add_class("Right"); Gtk::HBox* buttonBox = Gtk::manage (new Gtk::HBox ()); buttonBox->pack_start (*add); diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index b308911a7..f08e6114d 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -18,19 +18,24 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "filebrowser.h" #include + #include -#include "options.h" -#include "multilangmgr.h" -#include "clipboard.h" -#include "procparamchangers.h" + +#include "filebrowser.h" + #include "batchqueue.h" -#include "../rtengine/dfmanager.h" -#include "../rtengine/ffmanager.h" +#include "clipboard.h" +#include "multilangmgr.h" +#include "options.h" +#include "procparamchangers.h" #include "rtimage.h" #include "threadutils.h" +#include "../rtengine/dfmanager.h" +#include "../rtengine/ffmanager.h" +#include "../rtengine/procparams.h" + extern Options options; namespace @@ -127,6 +132,7 @@ void findOriginalEntries (const std::vector& entries) FileBrowser::FileBrowser () : menuLabel(nullptr), + miOpenDefaultViewer(nullptr), selectDF(nullptr), thisIsDF(nullptr), autoDF(nullptr), @@ -149,7 +155,7 @@ FileBrowser::FileBrowser () : pmenu = new Gtk::Menu (); pmenu->attach (*Gtk::manage(open = new Gtk::MenuItem (M("FILEBROWSER_POPUPOPEN"))), 0, 1, p, p + 1); p++; - pmenu->attach (*Gtk::manage(develop = new MyImageMenuItem (M("FILEBROWSER_POPUPPROCESS"), "processing.png")), 0, 1, p, p + 1); + pmenu->attach (*Gtk::manage(develop = new MyImageMenuItem (M("FILEBROWSER_POPUPPROCESS"), "gears.png")), 0, 1, p, p + 1); p++; pmenu->attach (*Gtk::manage(developfast = new Gtk::MenuItem (M("FILEBROWSER_POPUPPROCESSFAST"))), 0, 1, p, p + 1); p++; @@ -198,13 +204,19 @@ FileBrowser::FileBrowser () : /*********************** * color labels ***********************/ + + // Thumbnail context menu + // Similar image arrays in filecatalog.cc + std::array clabelActiveIcons = {"circle-empty-gray-small.png", "circle-red-small.png", "circle-yellow-small.png", "circle-green-small.png", "circle-blue-small.png", "circle-purple-small.png"}; + std::array clabelInactiveIcons = {"circle-empty-darkgray-small.png", "circle-empty-red-small.png", "circle-empty-yellow-small.png", "circle-empty-green-small.png", "circle-empty-blue-small.png", "circle-empty-purple-small.png"}; + if (options.menuGroupLabel) { pmenu->attach (*Gtk::manage(menuLabel = new Gtk::MenuItem (M("FILEBROWSER_POPUPCOLORLABEL"))), 0, 1, p, p + 1); p++; Gtk::Menu* submenuLabel = Gtk::manage (new Gtk::Menu ()); for (int i = 0; i <= 5; i++) { - submenuLabel->attach (*Gtk::manage(colorlabel[i] = new MyImageMenuItem (M(Glib::ustring::compose("%1%2", "FILEBROWSER_POPUPCOLORLABEL", i)), i == 0 ? "cglabel0.png" : Glib::ustring::compose("%1%2%3", "clabel", i, ".png"))), 0, 1, p, p + 1); + submenuLabel->attach(*Gtk::manage(colorlabel[i] = new MyImageMenuItem(M(Glib::ustring::compose("%1%2", "FILEBROWSER_POPUPCOLORLABEL", i)), clabelActiveIcons[i])), 0, 1, p, p + 1); p++; } @@ -212,7 +224,7 @@ FileBrowser::FileBrowser () : menuLabel->set_submenu (*submenuLabel); } else { for (int i = 0; i <= 5; i++) { - pmenu->attach (*Gtk::manage(colorlabel[i] = new MyImageMenuItem (M(Glib::ustring::compose("%1%2", "FILEBROWSER_POPUPCOLORLABEL", i)), i == 0 ? "cglabel0.png" : Glib::ustring::compose("%1%2%3", "clabel", i, ".png"))), 0, 1, p, p + 1); + pmenu->attach(*Gtk::manage(colorlabel[i] = new MyImageMenuItem(M(Glib::ustring::compose("%1%2", "FILEBROWSER_POPUPCOLORLABEL", i)), clabelInactiveIcons[i])), 0, 1, p, p + 1); p++; } } @@ -225,8 +237,6 @@ FileBrowser::FileBrowser () : * *********************/ #if defined(WIN32) Gtk::manage(miOpenDefaultViewer = new Gtk::MenuItem (M("FILEBROWSER_OPENDEFAULTVIEWER"))); -#else - miOpenDefaultViewer = nullptr; #endif // Build a list of menu items @@ -240,7 +250,7 @@ FileBrowser::FileBrowser () : } // Attach them to menu - if (!mMenuExtProgs.empty() || miOpenDefaultViewer != nullptr) { + if (!mMenuExtProgs.empty() || miOpenDefaultViewer) { amiExtProg = new Gtk::MenuItem*[mMenuExtProgs.size()]; int itemNo = 0; @@ -249,11 +259,12 @@ FileBrowser::FileBrowser () : p++; Gtk::Menu* submenuExtProg = Gtk::manage (new Gtk::Menu()); - if (miOpenDefaultViewer != nullptr) { +#ifdef WIN32 + if (miOpenDefaultViewer) { submenuExtProg->attach (*miOpenDefaultViewer, 0, 1, p, p + 1); p++; } - +#endif for (auto it = mMenuExtProgs.begin(); it != mMenuExtProgs.end(); it++, itemNo++) { submenuExtProg->attach (*Gtk::manage(amiExtProg[itemNo] = new Gtk::MenuItem ((*it).first)), 0, 1, p, p + 1); p++; @@ -262,11 +273,12 @@ FileBrowser::FileBrowser () : submenuExtProg->show_all (); menuExtProg->set_submenu (*submenuExtProg); } else { - if (miOpenDefaultViewer != nullptr) { +#ifdef WIN32 + if (miOpenDefaultViewer) { pmenu->attach (*miOpenDefaultViewer, 0, 1, p, p + 1); p++; } - +#endif for (auto it = mMenuExtProgs.begin(); it != mMenuExtProgs.end(); it++, itemNo++) { pmenu->attach (*Gtk::manage(amiExtProg[itemNo] = new Gtk::MenuItem ((*it).first)), 0, 1, p, p + 1); p++; @@ -334,7 +346,7 @@ FileBrowser::FileBrowser () : * Profile Operations * *********************/ if (options.menuGroupProfileOperations) { - pmenu->attach (*Gtk::manage(menuProfileOperations = new MyImageMenuItem (M("FILEBROWSER_POPUPPROFILEOPERATIONS"), "logoicon-wind.png")), 0, 1, p, p + 1); + pmenu->attach (*Gtk::manage(menuProfileOperations = new Gtk::MenuItem (M("FILEBROWSER_POPUPPROFILEOPERATIONS"))), 0, 1, p, p + 1); p++; Gtk::Menu* submenuProfileOperations = Gtk::manage (new Gtk::Menu ()); @@ -419,9 +431,11 @@ FileBrowser::FileBrowser () : amiExtProg[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), amiExtProg[i])); } - if (miOpenDefaultViewer != nullptr) { +#ifdef WIN32 + if (miOpenDefaultViewer) { miOpenDefaultViewer->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), miOpenDefaultViewer)); } +#endif trash->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), trash)); untrash->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), untrash)); @@ -444,14 +458,14 @@ FileBrowser::FileBrowser () : // A separate pop-up menu for Color Labels int c = 0; - pmenuColorLabels = new Gtk::Menu (); + pmenuColorLabels = new Gtk::Menu(); for (int i = 0; i <= 5; i++) { - pmenuColorLabels->attach (*Gtk::manage(colorlabel_pop[i] = new MyImageMenuItem (M(Glib::ustring::compose("%1%2", "FILEBROWSER_POPUPCOLORLABEL", i)), i == 0 ? "cglabel0.png" : Glib::ustring::compose("%1%2%3", "clabel", i, ".png"))), 0, 1, c, c + 1); + pmenuColorLabels->attach(*Gtk::manage(colorlabel_pop[i] = new MyImageMenuItem(M(Glib::ustring::compose("%1%2", "FILEBROWSER_POPUPCOLORLABEL", i)), clabelActiveIcons[i])), 0, 1, c, c + 1); c++; } - pmenuColorLabels->show_all (); + pmenuColorLabels->show_all(); // Has to be located after creation of applyprof and applypartprof updateProfileList (); @@ -556,32 +570,22 @@ void FileBrowser::doubleClicked (ThumbBrowserEntryBase* entry) void FileBrowser::addEntry (FileBrowserEntry* entry) { - struct addparams { - FileBrowser *browser; - FileBrowserEntry *entry; - unsigned int session_id; - }; + entry->setParent(this); - addparams* const ap = new addparams; - entry->setParent (this); - ap->browser = this; - ap->entry = entry; - ap->session_id = session_id(); + const unsigned int sid = session_id(); - const auto func = [](gpointer data) -> gboolean { - addparams* const ap = static_cast(data); - if (ap->session_id != ap->browser->session_id()) { - delete ap->entry; - delete ap; - } else { - ap->browser->addEntry_(ap->entry); - delete ap; + idle_register.add( + [this, entry, sid]() -> bool + { + if (sid != session_id()) { + delete entry; + } else { + addEntry_(entry); + } + + return false; } - - return FALSE; - }; - - idle_register.add(func, ap); + ); } void FileBrowser::addEntry_ (FileBrowserEntry* entry) @@ -970,7 +974,7 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) // Empty run to update the thumb rtengine::procparams::ProcParams params = mselected[i]->thumbnail->getProcParams (); - mselected[i]->thumbnail->setProcParams (params, nullptr, FILEBROWSER); + mselected[i]->thumbnail->setProcParams (params, nullptr, FILEBROWSER, true, true); } if (!mselected.empty() && bppcl) { @@ -984,8 +988,10 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) tbl->clearFromCacheRequested (mselected, true); //queue_draw (); - } else if (miOpenDefaultViewer != nullptr && m == miOpenDefaultViewer) { +#ifdef WIN32 + } else if (miOpenDefaultViewer && m == miOpenDefaultViewer) { openDefaultViewer(1); +#endif } } @@ -1091,6 +1097,7 @@ void FileBrowser::partPasteProfile () } } +#ifdef WIN32 void FileBrowser::openDefaultViewer (int destination) { bool success = true; @@ -1104,10 +1111,11 @@ void FileBrowser::openDefaultViewer (int destination) } if (!success) { - Gtk::MessageDialog msgd (M("MAIN_MSG_IMAGEUNPROCESSED"), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + Gtk::MessageDialog msgd(getToplevelWindow(this), M("MAIN_MSG_IMAGEUNPROCESSED"), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); } } +#endif bool FileBrowser::keyPressed (GdkEventKey* event) { @@ -1186,6 +1194,7 @@ bool FileBrowser::keyPressed (GdkEventKey* event) } openRequested(mselected); +#ifdef WIN32 } else if (event->keyval == GDK_KEY_F5) { int dest = 1; @@ -1197,6 +1206,7 @@ bool FileBrowser::keyPressed (GdkEventKey* event) openDefaultViewer (dest); return true; +#endif } else if (event->keyval == GDK_KEY_Page_Up) { scrollPage(GDK_SCROLL_UP); return true; @@ -1722,62 +1732,60 @@ void FileBrowser::buttonPressed (LWButton* button, int actionCode, void* actionD } } -void FileBrowser::openNextImage () +void FileBrowser::openNextImage() { MYWRITERLOCK(l, entryRW); if (!fd.empty() && selected.size() > 0 && !options.tabbedUI) { - for (size_t i = 0; i < fd.size() - 1; i++) { if (selected[0]->thumbnail->getFileName() == fd[i]->filename) { // located 1-st image in current selection if (i < fd.size() && tbl) { // find the first not-filtered-out (next) image for (size_t k = i + 1; k < fd.size(); k++) { if (!fd[k]->filtered/*checkFilter (fd[k])*/) { + // clear current selection for (size_t j = 0; j < selected.size(); j++) { selected[j]->selected = false; } - selected.clear (); + selected.clear(); // set new selection fd[k]->selected = true; - selected.push_back (fd[k]); - //queue_draw (); + selected.push_back(fd[k]); + //queue_draw(); MYWRITERLOCK_RELEASE(l); // this will require a read access - notifySelectionListener (); + notifySelectionListener(); MYWRITERLOCK_ACQUIRE(l); - // scroll to the selected position - double h1, v1; - getScrollPosition(h1, v1); + // scroll to the selected position, centered horizontally in the container + double x1, y1; + getScrollPosition(x1, y1); - double h2 = selected[0]->getStartX(); - double v2 = selected[0]->getStartY(); + double x2 = selected[0]->getStartX(); + double y2 = selected[0]->getStartY(); Thumbnail* thumb = (static_cast(fd[k]))->thumbnail; - int minWidth = get_width() - fd[k]->getMinimalWidth(); + int tw = fd[k]->getMinimalWidth(); // thumb width + + int ww = get_width(); // window width MYWRITERLOCK_RELEASE(l); // scroll only when selected[0] is outside of the displayed bounds - if (h2 + minWidth - h1 > get_width()) { - setScrollPosition(h2 - minWidth, v2); - } - - if (h1 > h2) { - setScrollPosition(h2, v2); + // or less than a thumbnail's width from either edge. + if ((x2 > x1 + ww - 2 * tw) || (x2 - tw < x1)) { + setScrollPosition(x2 - (ww - tw) / 2, y2); } // open the selected image - std::vector entries; - entries.push_back (thumb); - tbl->openRequested (entries); + tbl->openRequested({thumb}); + return; } } @@ -1787,62 +1795,60 @@ void FileBrowser::openNextImage () } } -void FileBrowser::openPrevImage () +void FileBrowser::openPrevImage() { MYWRITERLOCK(l, entryRW); if (!fd.empty() && selected.size() > 0 && !options.tabbedUI) { - for (size_t i = 1; i < fd.size(); i++) { if (selected[0]->thumbnail->getFileName() == fd[i]->filename) { // located 1-st image in current selection if (i > 0 && tbl) { // find the first not-filtered-out (previous) image for (ssize_t k = (ssize_t)i - 1; k >= 0; k--) { if (!fd[k]->filtered/*checkFilter (fd[k])*/) { + // clear current selection for (size_t j = 0; j < selected.size(); j++) { selected[j]->selected = false; } - selected.clear (); + selected.clear(); // set new selection fd[k]->selected = true; - selected.push_back (fd[k]); - //queue_draw (); + selected.push_back(fd[k]); + //queue_draw(); MYWRITERLOCK_RELEASE(l); // this will require a read access - notifySelectionListener (); + notifySelectionListener(); MYWRITERLOCK_ACQUIRE(l); - // scroll to the selected position - double h1, v1; - getScrollPosition(h1, v1); + // scroll to the selected position, centered horizontally in the container + double x1, y1; + getScrollPosition(x1, y1); - double h2 = selected[0]->getStartX(); - double v2 = selected[0]->getStartY(); + double x2 = selected[0]->getStartX(); + double y2 = selected[0]->getStartY(); Thumbnail* thumb = (static_cast(fd[k]))->thumbnail; - int minWidth = get_width() - fd[k]->getMinimalWidth(); + int tw = fd[k]->getMinimalWidth(); // thumb width + + int ww = get_width(); // window width MYWRITERLOCK_RELEASE(l); // scroll only when selected[0] is outside of the displayed bounds - if (h2 + minWidth - h1 > get_width()) { - setScrollPosition(h2 - minWidth, v2); - } - - if (h1 > h2) { - setScrollPosition(h2, v2); + // or less than a thumbnail's width from either edge. + if ((x2 > x1 + ww - 2 * tw) || (x2 - tw < x1)) { + setScrollPosition(x2 - (ww - tw) / 2, y2); } // open the selected image - std::vector entries; - entries.push_back (thumb); - tbl->openRequested (entries); + tbl->openRequested({thumb}); + return; } } @@ -1852,11 +1858,8 @@ void FileBrowser::openPrevImage () } } - -void FileBrowser::selectImage (Glib::ustring fname) +void FileBrowser::selectImage(const Glib::ustring& fname, bool doScroll) { - - // need to clear the filter in filecatalog MYWRITERLOCK(l, entryRW); if (!fd.empty() && !options.tabbedUI) { @@ -1869,27 +1872,34 @@ void FileBrowser::selectImage (Glib::ustring fname) selected[j]->selected = false; } - selected.clear (); + selected.clear(); // set new selection fd[i]->selected = true; - selected.push_back (fd[i]); - queue_draw (); + selected.push_back(fd[i]); + queue_draw(); MYWRITERLOCK_RELEASE(l); // this will require a read access - notifySelectionListener (); + notifySelectionListener(); MYWRITERLOCK_ACQUIRE(l); - // scroll to the selected position - double h = selected[0]->getStartX(); - double v = selected[0]->getStartY(); + // scroll to the selected position, centered horizontally in the container + double x = selected[0]->getStartX(); + double y = selected[0]->getStartY(); + + int tw = fd[i]->getMinimalWidth(); // thumb width + + int ww = get_width(); // window width MYWRITERLOCK_RELEASE(l); - setScrollPosition(h, v); + if (doScroll) { + // Center thumb + setScrollPosition(x - (ww - tw) / 2, y); + } return; } @@ -1897,11 +1907,11 @@ void FileBrowser::selectImage (Glib::ustring fname) } } -void FileBrowser::openNextPreviousEditorImage (Glib::ustring fname, eRTNav nextPrevious) +void FileBrowser::openNextPreviousEditorImage (const Glib::ustring& fname, eRTNav nextPrevious) { // let FileBrowser acquire Editor's perspective - selectImage (fname); + selectImage (fname, false); // now switch to the requested image if (nextPrevious == NAV_NEXT) { @@ -1911,20 +1921,15 @@ void FileBrowser::openNextPreviousEditorImage (Glib::ustring fname, eRTNav nextP } } -void FileBrowser::_thumbRearrangementNeeded () -{ - refreshThumbImages (); // arrangeFiles is NOT enough -} - void FileBrowser::thumbRearrangementNeeded () { - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->_thumbRearrangementNeeded(); - - return FALSE; - }; - - idle_register.add(func, this); + idle_register.add( + [this]() -> bool + { + refreshThumbImages();// arrangeFiles is NOT enough + return false; + } + ); } void FileBrowser::selectionChanged () @@ -1974,7 +1979,11 @@ void FileBrowser::setExportPanel (ExportPanel* expanel) exportPanel->setExportPanelListener (this); } -void FileBrowser::updateProfileList () +void FileBrowser::storeCurrentValue() +{ +} + +void FileBrowser::updateProfileList() { // submenu applmenu int p = 0; @@ -2068,6 +2077,10 @@ void FileBrowser::updateProfileList () subMenuList.clear(); } +void FileBrowser::restoreValue() +{ +} + void FileBrowser::openRequested( std::vector mselected) { std::vector entries; diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h index 4efdb7219..d579a48f4 100644 --- a/rtgui/filebrowser.h +++ b/rtgui/filebrowser.h @@ -34,23 +34,20 @@ class ProfileStoreLabel; class FileBrowser; class FileBrowserEntry; + class FileBrowserListener { - public: - virtual ~FileBrowserListener () {} - virtual void filterApplied () {} - virtual void openRequested (std::vector tbe) {} - virtual void developRequested (std::vector tbe, bool fastmode) {} - virtual void renameRequested (std::vector tbe) {} - virtual void deleteRequested (std::vector tbe, bool inclBatchProcessed) {} - virtual void copyMoveRequested (std::vector tbe, bool moveRequested) {} - virtual void selectionChanged (std::vector tbe) {} - virtual void clearFromCacheRequested(std::vector tbe, bool leavenotrace) {} - virtual bool isInTabMode () - { - return false; - } + virtual ~FileBrowserListener() = default; + virtual void filterApplied() = 0; + virtual void openRequested(const std::vector& tbe) = 0; + virtual void developRequested(const std::vector& tbe, bool fastmode) = 0; + virtual void renameRequested(const std::vector& tbe) = 0; + virtual void deleteRequested(const std::vector& tbe, bool inclBatchProcessed) = 0; + virtual void copyMoveRequested(const std::vector& tbe, bool moveRequested) = 0; + virtual void selectionChanged(const std::vector& tbe) = 0; + virtual void clearFromCacheRequested(const std::vector& tbe, bool leavenotrace) = 0; + virtual bool isInTabMode() const = 0; }; /* @@ -64,6 +61,8 @@ class FileBrowser : public ThumbBrowserBase, private: typedef sigc::signal type_trash_changed; + using ThumbBrowserBase::redrawNeeded; + IdleRegister idle_register; unsigned int session_id_; @@ -85,7 +84,7 @@ protected: Gtk::MenuItem* menuRank; Gtk::MenuItem* menuLabel; Gtk::MenuItem* menuFileOperations; - MyImageMenuItem* menuProfileOperations; + Gtk::MenuItem* menuProfileOperations; Gtk::MenuItem* menuExtProg; Gtk::MenuItem** amiExtProg; Gtk::MenuItem* miOpenDefaultViewer; @@ -139,7 +138,7 @@ protected: public: FileBrowser (); - ~FileBrowser (); + ~FileBrowser () override; void addEntry (FileBrowserEntry* entry); // can be called from any thread void addEntry_ (FileBrowserEntry* entry); // this must be executed inside the gtk thread @@ -167,41 +166,45 @@ public: return numFiltered; } - void buttonPressed (LWButton* button, int actionCode, void* actionData); - void redrawNeeded (LWButton* button); - bool checkFilter (ThumbBrowserEntryBase* entry); - void rightClicked (ThumbBrowserEntryBase* entry); - void doubleClicked (ThumbBrowserEntryBase* entry); - bool keyPressed (GdkEventKey* event); + void buttonPressed (LWButton* button, int actionCode, void* actionData) override; + void redrawNeeded (LWButton* button) override; + bool checkFilter (ThumbBrowserEntryBase* entry) override; + void rightClicked (ThumbBrowserEntryBase* entry) override; + void doubleClicked (ThumbBrowserEntryBase* entry) override; + bool keyPressed (GdkEventKey* event) override; - void saveThumbnailHeight (int height); - int getThumbnailHeight (); + void saveThumbnailHeight (int height) override; + int getThumbnailHeight () override; - bool isInTabMode() + bool isInTabMode() override { return tbl ? tbl->isInTabMode() : false; } - void openNextImage (); - void openPrevImage (); + void openNextImage(); + void openPrevImage(); + void selectImage(const Glib::ustring& fname, bool doScroll = true); + void copyProfile (); void pasteProfile (); void partPasteProfile (); - void selectImage (Glib::ustring fname); - void openNextPreviousEditorImage (Glib::ustring fname, eRTNav eNextPrevious); + void openNextPreviousEditorImage(const Glib::ustring& fname, eRTNav eNextPrevious); +#ifdef WIN32 void openDefaultViewer (int destination); +#endif - void thumbRearrangementNeeded (); - void _thumbRearrangementNeeded (); + void thumbRearrangementNeeded () override; - void selectionChanged (); + void selectionChanged () override; void setExportPanel (ExportPanel* expanel); // exportpanel interface - void exportRequested(); + void exportRequested() override; - void updateProfileList (); + void storeCurrentValue() override; + void updateProfileList() override; + void restoreValue() override; type_trash_changed trash_changed(); }; diff --git a/rtgui/filebrowserentry.cc b/rtgui/filebrowserentry.cc index cb3844687..a55e2ffca 100644 --- a/rtgui/filebrowserentry.cc +++ b/rtgui/filebrowserentry.cc @@ -18,15 +18,17 @@ */ #include "filebrowserentry.h" -#include #include +#include -#include "guiutils.h" -#include "threadutils.h" -#include "rtimage.h" #include "cursormanager.h" -#include "thumbbrowserbase.h" +#include "guiutils.h" #include "inspector.h" +#include "rtimage.h" +#include "threadutils.h" +#include "thumbbrowserbase.h" + +#include "../rtengine/procparams.h" #define CROPRESIZEBORDER 4 @@ -40,7 +42,7 @@ 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) + : ThumbBrowserEntryBase (fname), wasInside(false), iatlistener(nullptr), press_x(0), press_y(0), action_x(0), action_y(0), rot_deg(0.0), landscape(true), cropParams(new rtengine::procparams::CropParams), cropgl(nullptr), state(SNormal), crop_custom_ratio(0.f) { thumbnail = thm; @@ -56,11 +58,11 @@ FileBrowserEntry::FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname) scale = 1; if (!iconsLoaded) { - 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"); + editedIcon = RTImage::createFromFile ("tick-small.png"); + recentlySavedIcon = RTImage::createFromFile ("save-small.png"); + enqueuedIcon = RTImage::createFromFile ("gears-small.png"); + hdr = RTImage::createFromFile ("filetype-hdr.png"); + ps = RTImage::createFromFile ("filetype-ps.png"); iconsLoaded = true; } @@ -163,9 +165,9 @@ std::vector > FileBrowserEntry::getSpecificityIconsOnI 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 + if(scale != 1.0 && cropParams->enabled) { // somewhere in pipeline customBackBufferUpdate is called when scale == 1.0, which is nonsense for a thumb if (state == SCropSelecting || state == SResizeH1 || state == SResizeH2 || state == SResizeW1 || state == SResizeW2 || state == SResizeTL || state == SResizeTR || state == SResizeBL || state == SResizeBR || state == SCropMove) { - drawCrop (c, prex, prey, prew, preh, 0, 0, scale, cropParams, true, false); + drawCrop (c, prex, prey, prew, preh, 0, 0, scale, *cropParams, true, false); } else { rtengine::procparams::CropParams cparams = thumbnail->getProcParams().crop; switch (options.cropGuides) { @@ -209,72 +211,44 @@ void FileBrowserEntry::procParamsChanged (Thumbnail* thm, int whoChangedIt) } } -void FileBrowserEntry::updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams) +void FileBrowserEntry::updateImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cropParams) { - - { - GThreadLock lock; - - if ( feih == nullptr || - feih->destroyed ) { - img->free(); - return; - } - - redrawRequests++; - feih->pending++; + if (!feih) { + return; } + redrawRequests++; + feih->pending++; - struct tiupdate { - FileBrowserEntryIdleHelper* feih; - rtengine::IImage8* img; - double scale; - rtengine::procparams::CropParams cropParams; - }; + idle_register.add( + [this, img, scale, cropParams]() -> bool + { + if (feih->destroyed) { + if (feih->pending == 1) { + delete feih; + } else { + --feih->pending; + } - tiupdate* param = new tiupdate{ - feih, - img, - scale, - cropParams - }; - - const gint priority = G_PRIORITY_LOW; - - const auto func = [](gpointer data) -> gboolean { - tiupdate* const params = static_cast(data); - FileBrowserEntryIdleHelper* const feih = params->feih; - - if (feih->destroyed) { - if (feih->pending == 1) { - delete feih; - } else { - feih->pending--; + img->free(); + return false; } - params->img->free (); - delete params; - return 0; - } + feih->fbentry->_updateImage(img, scale, cropParams); + --feih->pending; - feih->fbentry->_updateImage (params->img, params->scale, params->cropParams); - feih->pending--; - - delete params; - - return FALSE; - }; - - idle_register.add(func, param, priority); + return false; + }, + G_PRIORITY_LOW + ); } -void FileBrowserEntry::_updateImage (rtengine::IImage8* img, double s, rtengine::procparams::CropParams cropParams) +void FileBrowserEntry::_updateImage(rtengine::IImage8* img, double s, const rtengine::procparams::CropParams& cropParams) { MYWRITERLOCK(l, lockRW); redrawRequests--; scale = s; - this->cropParams = cropParams; + *this->cropParams = cropParams; bool newLandscape = img->getWidth() > img->getHeight(); bool rotated = false; @@ -347,65 +321,65 @@ bool FileBrowserEntry::motionNotify (int x, int y) action_y = y; parent->redrawNeeded (this); } else if (state == SResizeH1 && cropgl) { - int oy = cropParams.y; - cropParams.y = action_y + (y - press_y) / scale; - cropParams.h += oy - cropParams.y; - cropgl->cropHeight1Resized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + int oy = cropParams->y; + cropParams->y = action_y + (y - press_y) / scale; + cropParams->h += oy - cropParams->y; + cropgl->cropHeight1Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SResizeH2 && cropgl) { - cropParams.h = action_y + (y - press_y) / scale; - cropgl->cropHeight2Resized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + cropParams->h = action_y + (y - press_y) / scale; + cropgl->cropHeight2Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SResizeW1 && cropgl) { - int ox = cropParams.x; - cropParams.x = action_x + (x - press_x) / scale; - cropParams.w += ox - cropParams.x; - cropgl->cropWidth1Resized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + int ox = cropParams->x; + cropParams->x = action_x + (x - press_x) / scale; + cropParams->w += ox - cropParams->x; + cropgl->cropWidth1Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SResizeW2 && cropgl) { - cropParams.w = action_x + (x - press_x) / scale; - cropgl->cropWidth2Resized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + cropParams->w = action_x + (x - press_x) / scale; + cropgl->cropWidth2Resized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SResizeTL && cropgl) { - int ox = cropParams.x; - cropParams.x = action_x + (x - press_x) / scale; - cropParams.w += ox - cropParams.x; - int oy = cropParams.y; - cropParams.y = action_y + (y - press_y) / scale; - cropParams.h += oy - cropParams.y; - cropgl->cropTopLeftResized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + int ox = cropParams->x; + cropParams->x = action_x + (x - press_x) / scale; + cropParams->w += ox - cropParams->x; + int oy = cropParams->y; + cropParams->y = action_y + (y - press_y) / scale; + cropParams->h += oy - cropParams->y; + cropgl->cropTopLeftResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SResizeTR && cropgl) { - cropParams.w = action_x + (x - press_x) / scale; - int oy = cropParams.y; - cropParams.y = action_y + (y - press_y) / scale; - cropParams.h += oy - cropParams.y; - cropgl->cropTopRightResized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + cropParams->w = action_x + (x - press_x) / scale; + int oy = cropParams->y; + cropParams->y = action_y + (y - press_y) / scale; + cropParams->h += oy - cropParams->y; + cropgl->cropTopRightResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SResizeBL && cropgl) { - int ox = cropParams.x; - cropParams.x = action_x + (x - press_x) / scale; - cropParams.w += ox - cropParams.x; - cropParams.h = action_y + (y - press_y) / scale; - cropgl->cropBottomLeftResized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + int ox = cropParams->x; + cropParams->x = action_x + (x - press_x) / scale; + cropParams->w += ox - cropParams->x; + cropParams->h = action_y + (y - press_y) / scale; + cropgl->cropBottomLeftResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SResizeBR && cropgl) { - cropParams.w = action_x + (x - press_x) / scale; - cropParams.h = action_y + (y - press_y) / scale; - cropgl->cropBottomRightResized (cropParams.x, cropParams.y, cropParams.w, cropParams.h, crop_custom_ratio); + cropParams->w = action_x + (x - press_x) / scale; + cropParams->h = action_y + (y - press_y) / scale; + cropgl->cropBottomRightResized (cropParams->x, cropParams->y, cropParams->w, cropParams->h, crop_custom_ratio); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SCropMove && cropgl) { - cropParams.x = action_x + (x - press_x) / scale; - cropParams.y = action_y + (y - press_y) / scale; - cropgl->cropMoved (cropParams.x, cropParams.y, cropParams.w, cropParams.h); + cropParams->x = action_x + (x - press_x) / scale; + cropParams->y = action_y + (y - press_y) / scale; + cropgl->cropMoved (cropParams->x, cropParams->y, cropParams->w, cropParams->h); updateBackBuffer (); parent->redrawNeeded (this); } else if (state == SCropSelecting && cropgl) { @@ -414,19 +388,19 @@ bool FileBrowserEntry::motionNotify (int x, int y) cropgl->cropResized (cx1, cy1, cx2, cy2); if (cx2 > cx1) { - cropParams.x = cx1; - cropParams.w = cx2 - cx1 + 1; + cropParams->x = cx1; + cropParams->w = cx2 - cx1 + 1; } else { - cropParams.x = cx2; - cropParams.w = cx1 - cx2 + 1; + cropParams->x = cx2; + cropParams->w = cx1 - cx2 + 1; } if (cy2 > cy1) { - cropParams.y = cy1; - cropParams.h = cy2 - cy1 + 1; + cropParams->y = cy1; + cropParams->h = cy2 - cy1 + 1; } else { - cropParams.y = cy2; - cropParams.h = cy1 - cy2 + 1; + cropParams->y = cy2; + cropParams->h = cy1 - cy2 + 1; } updateBackBuffer (); @@ -457,71 +431,71 @@ bool FileBrowserEntry::pressNotify (int button, int type, int bstate, int x, i if (!b && selected && inside (x, y)) { if (button == 1 && type == GDK_BUTTON_PRESS && state == SNormal) { - if ((bstate & GDK_SHIFT_MASK) && cropParams.w > 0 && cropParams.h > 0) { - crop_custom_ratio = float(cropParams.w) / float(cropParams.h); + if ((bstate & GDK_SHIFT_MASK) && cropParams->w > 0 && cropParams->h > 0) { + crop_custom_ratio = float(cropParams->w) / float(cropParams->h); } if (onArea (CropTopLeft, ix, iy)) { state = SResizeTL; press_x = x; - action_x = cropParams.x; + action_x = cropParams->x; press_y = y; - action_y = cropParams.y; + action_y = cropParams->y; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropTopRight, ix, iy)) { state = SResizeTR; press_x = x; - action_x = cropParams.w; + action_x = cropParams->w; press_y = y; - action_y = cropParams.y; + action_y = cropParams->y; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropBottomLeft, ix, iy)) { state = SResizeBL; press_x = x; - action_x = cropParams.x; + action_x = cropParams->x; press_y = y; - action_y = cropParams.h; + action_y = cropParams->h; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropBottomRight, ix, iy)) { state = SResizeBR; press_x = x; - action_x = cropParams.w; + action_x = cropParams->w; press_y = y; - action_y = cropParams.h; + action_y = cropParams->h; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropTop, ix, iy)) { state = SResizeH1; press_y = y; - action_y = cropParams.y; + action_y = cropParams->y; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropBottom, ix, iy)) { state = SResizeH2; press_y = y; - action_y = cropParams.h; + action_y = cropParams->h; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropLeft, ix, iy)) { state = SResizeW1; press_x = x; - action_x = cropParams.x; + action_x = cropParams->x; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropRight, ix, iy)) { state = SResizeW2; press_x = x; - action_x = cropParams.w; + action_x = cropParams->w; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if ((bstate & GDK_SHIFT_MASK) && onArea (CropInside, ix, iy)) { state = SCropMove; press_x = x; press_y = y; - action_x = cropParams.x; - action_y = cropParams.y; + action_x = cropParams->x; + action_y = cropParams->y; cropgl = iatlistener->startCropEditing (thumbnail); b = true; } else if (onArea (CropImage, ix, iy)) { @@ -541,10 +515,10 @@ bool FileBrowserEntry::pressNotify (int button, int type, int bstate, int x, i if (cropgl) { state = SCropSelecting; - press_x = cropParams.x = (ix - prex) / scale; - press_y = cropParams.y = (iy - prey) / scale; - cropParams.w = cropParams.h = 1; - cropgl->cropInit (cropParams.x, cropParams.y, cropParams.w, cropParams.h); + press_x = cropParams->x = (ix - prex) / scale; + press_y = cropParams->y = (iy - prey) / scale; + cropParams->w = cropParams->h = 1; + cropgl->cropInit (cropParams->x, cropParams->y, cropParams->w, cropParams->h); b = true; } } @@ -610,67 +584,67 @@ bool FileBrowserEntry::onArea (CursorArea a, int x, int y) return x >= prex && x < prex + prew && y >= prey && y < prey + preh; case CropTopLeft: - return cropParams.enabled && - y1 >= cropParams.y - cropResizeBorder && - y1 <= cropParams.y + cropResizeBorder && - x1 >= cropParams.x - cropResizeBorder && - x1 <= cropParams.x + cropResizeBorder; + return cropParams->enabled && + y1 >= cropParams->y - cropResizeBorder && + y1 <= cropParams->y + cropResizeBorder && + x1 >= cropParams->x - cropResizeBorder && + x1 <= cropParams->x + cropResizeBorder; case CropTopRight: - return cropParams.enabled && - y1 >= cropParams.y - cropResizeBorder && - y1 <= cropParams.y + cropResizeBorder && - x1 >= cropParams.x + cropParams.w - 1 - cropResizeBorder && - x1 <= cropParams.x + cropParams.w - 1 + cropResizeBorder; + return cropParams->enabled && + y1 >= cropParams->y - cropResizeBorder && + y1 <= cropParams->y + cropResizeBorder && + x1 >= cropParams->x + cropParams->w - 1 - cropResizeBorder && + x1 <= cropParams->x + cropParams->w - 1 + cropResizeBorder; case CropBottomLeft: - return cropParams.enabled && - y1 >= cropParams.y + cropParams.h - 1 - cropResizeBorder && - y1 <= cropParams.y + cropParams.h - 1 + cropResizeBorder && - x1 >= cropParams.x - cropResizeBorder && - x1 <= cropParams.x + cropResizeBorder; + return cropParams->enabled && + y1 >= cropParams->y + cropParams->h - 1 - cropResizeBorder && + y1 <= cropParams->y + cropParams->h - 1 + cropResizeBorder && + x1 >= cropParams->x - cropResizeBorder && + x1 <= cropParams->x + cropResizeBorder; case CropBottomRight: - return cropParams.enabled && - y1 >= cropParams.y + cropParams.h - 1 - cropResizeBorder && - y1 <= cropParams.y + cropParams.h - 1 + cropResizeBorder && - x1 >= cropParams.x + cropParams.w - 1 - cropResizeBorder && - x1 <= cropParams.x + cropParams.w - 1 + cropResizeBorder; + return cropParams->enabled && + y1 >= cropParams->y + cropParams->h - 1 - cropResizeBorder && + y1 <= cropParams->y + cropParams->h - 1 + cropResizeBorder && + x1 >= cropParams->x + cropParams->w - 1 - cropResizeBorder && + x1 <= cropParams->x + cropParams->w - 1 + cropResizeBorder; case CropTop: - return cropParams.enabled && - x1 > cropParams.x + cropResizeBorder && - x1 < cropParams.x + cropParams.w - 1 - cropResizeBorder && - y1 > cropParams.y - cropResizeBorder && - y1 < cropParams.y + cropResizeBorder; + return cropParams->enabled && + x1 > cropParams->x + cropResizeBorder && + x1 < cropParams->x + cropParams->w - 1 - cropResizeBorder && + y1 > cropParams->y - cropResizeBorder && + y1 < cropParams->y + cropResizeBorder; case CropBottom: - return cropParams.enabled && - x1 > cropParams.x + cropResizeBorder && - x1 < cropParams.x + cropParams.w - 1 - cropResizeBorder && - y1 > cropParams.y + cropParams.h - 1 - cropResizeBorder && - y1 < cropParams.y + cropParams.h - 1 + cropResizeBorder; + return cropParams->enabled && + x1 > cropParams->x + cropResizeBorder && + x1 < cropParams->x + cropParams->w - 1 - cropResizeBorder && + y1 > cropParams->y + cropParams->h - 1 - cropResizeBorder && + y1 < cropParams->y + cropParams->h - 1 + cropResizeBorder; case CropLeft: - return cropParams.enabled && - y1 > cropParams.y + cropResizeBorder && - y1 < cropParams.y + cropParams.h - 1 - cropResizeBorder && - x1 > cropParams.x - cropResizeBorder && - x1 < cropParams.x + cropResizeBorder; + return cropParams->enabled && + y1 > cropParams->y + cropResizeBorder && + y1 < cropParams->y + cropParams->h - 1 - cropResizeBorder && + x1 > cropParams->x - cropResizeBorder && + x1 < cropParams->x + cropResizeBorder; case CropRight: - return cropParams.enabled && - y1 > cropParams.y + cropResizeBorder && - y1 < cropParams.y + cropParams.h - 1 - cropResizeBorder && - x1 > cropParams.x + cropParams.w - 1 - cropResizeBorder && - x1 < cropParams.x + cropParams.w - 1 + cropResizeBorder; + return cropParams->enabled && + y1 > cropParams->y + cropResizeBorder && + y1 < cropParams->y + cropParams->h - 1 - cropResizeBorder && + x1 > cropParams->x + cropParams->w - 1 - cropResizeBorder && + x1 < cropParams->x + cropParams->w - 1 + cropResizeBorder; case CropInside: - return cropParams.enabled && - y1 > cropParams.y && - y1 < cropParams.y + cropParams.h - 1 && - x1 > cropParams.x && - x1 < cropParams.x + cropParams.w - 1; + return cropParams->enabled && + y1 > cropParams->y && + y1 < cropParams->y + cropParams->h - 1 && + x1 > cropParams->x && + x1 < cropParams->x + cropParams->w - 1; default: /* do nothing */ ; } diff --git a/rtgui/filebrowserentry.h b/rtgui/filebrowserentry.h index 423128ddb..3a3d32977 100644 --- a/rtgui/filebrowserentry.h +++ b/rtgui/filebrowserentry.h @@ -19,23 +19,28 @@ #ifndef _FILEBROWSERENTRY_ #define _FILEBROWSERENTRY_ +#include +#include + #include -#include "thumbbrowserentrybase.h" -#include "thumbnail.h" -#include "filethumbnailbuttonset.h" -#include "thumbnaillistener.h" -#include "thumbimageupdater.h" -#include "imageareatoollistener.h" -#include "editenums.h" + #include "../rtengine/rtengine.h" + #include "crophandler.h" +#include "editenums.h" +#include "filethumbnailbuttonset.h" +#include "imageareatoollistener.h" +#include "thumbbrowserentrybase.h" +#include "thumbimageupdater.h" +#include "thumbnail.h" +#include "thumbnaillistener.h" class FileBrowserEntry; struct FileBrowserEntryIdleHelper { FileBrowserEntry* fbentry; bool destroyed; - int pending; + std::atomic pending; }; class FileThumbnailButtonSet; @@ -51,7 +56,7 @@ class FileBrowserEntry : public ThumbBrowserEntryBase, int press_x, press_y, action_x, action_y; double rot_deg; bool landscape; - rtengine::procparams::CropParams cropParams; + const std::unique_ptr cropParams; CropGUIListener* cropgl; FileBrowserEntryIdleHelper* feih; @@ -63,7 +68,7 @@ class FileBrowserEntry : public ThumbBrowserEntryBase, bool onArea (CursorArea a, int x, int y); void updateCursor (int x, int y); void drawStraightenGuide (Cairo::RefPtr c); - void customBackBufferUpdate (Cairo::RefPtr c); + void customBackBufferUpdate (Cairo::RefPtr c) override; public: @@ -74,8 +79,8 @@ public: static Glib::RefPtr ps; FileBrowserEntry (Thumbnail* thm, const Glib::ustring& fname); - ~FileBrowserEntry (); - void draw (Cairo::RefPtr cc); + ~FileBrowserEntry () override; + void draw (Cairo::RefPtr cc) override; void setImageAreaToolListener (ImageAreaToolListener* l) { @@ -84,23 +89,23 @@ public: FileThumbnailButtonSet* getThumbButtonSet (); - void refreshThumbnailImage (); - void refreshQuickThumbnailImage (); - void calcThumbnailSize (); + void refreshThumbnailImage () override; + void refreshQuickThumbnailImage () override; + void calcThumbnailSize () override; - virtual std::vector > getIconsOnImageArea (); - virtual std::vector > getSpecificityIconsOnImageArea (); - virtual void getIconSize (int& w, int& h); + std::vector > getIconsOnImageArea () override; + std::vector > getSpecificityIconsOnImageArea () override; + void getIconSize (int& w, int& h) override; // thumbnaillistener interface - void procParamsChanged (Thumbnail* thm, int whoChangedIt); + void procParamsChanged (Thumbnail* thm, int whoChangedIt) override; // thumbimageupdatelistener interface - void updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams); - void _updateImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams); // inside gtk thread + void updateImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cropParams) override; + void _updateImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cropParams); // inside gtk thread - virtual bool motionNotify (int x, int y); - virtual bool pressNotify (int button, int type, int bstate, int x, int y); - virtual bool releaseNotify (int button, int type, int bstate, int x, int y); + bool motionNotify (int x, int y) override; + bool pressNotify (int button, int type, int bstate, int x, int y) override; + bool releaseNotify (int button, int type, int bstate, int x, int y) override; }; #endif diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index a2088b9e2..c400a18e3 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -48,6 +48,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : listener(nullptr), fslistener(nullptr), iatlistener(nullptr), + hbToolBar1STB(nullptr), hasValidCurrentEFS(false), filterPanel(nullptr), exportPanel(nullptr), @@ -61,7 +62,6 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : inTabMode = false; set_name ("FileBrowser"); - set_spacing (2); // construct and initialize thumbnail browsers fileBrowser = Gtk::manage( new FileBrowser() ); @@ -74,7 +74,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : trashButtonBox = Gtk::manage( new Gtk::VBox ); Gtk::Button* emptyT = Gtk::manage( new Gtk::Button ()); emptyT->set_tooltip_markup (M("FILEBROWSER_EMPTYTRASHHINT")); - emptyT->set_image (*Gtk::manage(new RTImage ("trash.png"))); + emptyT->set_image (*Gtk::manage(new RTImage ("trash-delete.png"))); emptyT->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::emptyTrash)); trashButtonBox->pack_start (*emptyT, Gtk::PACK_SHRINK, 4); emptyT->show (); @@ -84,8 +84,8 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : hbToolBar1 = Gtk::manage(new Gtk::HBox ()); //setup BrowsePath - iRefreshWhite = new RTImage("refresh-white.png"); - iRefreshRed = new RTImage("refresh-red.png"); + iRefreshWhite = new RTImage("refresh-small.png"); + iRefreshRed = new RTImage("refresh-red-small.png"); BrowsePath = Gtk::manage(new Gtk::Entry ()); BrowsePath->set_width_chars (50); @@ -104,7 +104,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : BrowsePath->signal_key_press_event().connect(sigc::mem_fun(*this, &FileCatalog::BrowsePath_key_pressed)); //setup Query - iQueryClear = new RTImage("gtk-close-small.png"); + iQueryClear = new RTImage("cancel-small.png"); Gtk::Label* labelQuery = Gtk::manage(new Gtk::Label(M("FILEBROWSER_QUERYLABEL"))); Query = Gtk::manage(new Gtk::Entry ()); // cannot use Gtk::manage here as FileCatalog::getFilter will fail on Query->get_text() Query->set_text(""); @@ -127,13 +127,19 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // if NOT a single row toolbar if (!options.FileBrowserToolbarSingleRow) { - pack_start (*hbToolBar1, Gtk::PACK_SHRINK, 0); + hbToolBar1STB = Gtk::manage(new MyScrolledToolbar()); + hbToolBar1STB->set_name("FileBrowserQueryToolbar"); + hbToolBar1STB->add(*hbToolBar1); + pack_start (*hbToolBar1STB, Gtk::PACK_SHRINK, 0); } // setup button bar buttonBar = Gtk::manage( new Gtk::HBox () ); buttonBar->set_name ("ToolBarPanelFileBrowser"); - pack_start (*buttonBar, Gtk::PACK_SHRINK); + MyScrolledToolbar *stb = Gtk::manage(new MyScrolledToolbar()); + stb->set_name("FileBrowserIconToolbar"); + stb->add(*buttonBar); + pack_start (*stb, Gtk::PACK_SHRINK); tbLeftPanel_1 = new Gtk::ToggleButton (); iLeftPanel_1_Show = new RTImage("panel-to-right.png"); @@ -149,11 +155,11 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : vSepiLeftPanel = new Gtk::VSeparator (); buttonBar->pack_start (*vSepiLeftPanel, Gtk::PACK_SHRINK); - iFilterClear = new RTImage ("filterclear.png"); + iFilterClear = new RTImage ("filter-clear.png"); igFilterClear = new RTImage ("filter.png"); bFilterClear = Gtk::manage(new Gtk::ToggleButton ()); bFilterClear->set_active (true); - bFilterClear->set_image(*iFilterClear);// (*Gtk::manage(new RTImage ("filterclear.png"))); + bFilterClear->set_image(*iFilterClear);// (*Gtk::manage(new RTImage ("filter-clear.png"))); bFilterClear->set_relief (Gtk::RELIEF_NONE); bFilterClear->set_tooltip_markup (M("FILEBROWSER_SHOWDIRHINT")); bFilterClear->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); @@ -163,11 +169,14 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : fltrVbox1 = Gtk::manage (new Gtk::VBox()); fltrRankbox = Gtk::manage (new Gtk::HBox()); + fltrRankbox->get_style_context()->add_class("smallbuttonbox"); fltrLabelbox = Gtk::manage (new Gtk::HBox()); + fltrLabelbox->get_style_context()->add_class("smallbuttonbox"); - iUnRanked = new RTImage ("ratednot.png"); - igUnRanked = new RTImage ("ratednotg.png"); + iUnRanked = new RTImage ("star-gold-hollow-small.png"); + igUnRanked = new RTImage ("star-hollow-small.png"); bUnRanked = Gtk::manage( new Gtk::ToggleButton () ); + bUnRanked->get_style_context()->add_class("smallbutton"); bUnRanked->set_active (false); bUnRanked->set_image (*igUnRanked); bUnRanked->set_relief (Gtk::RELIEF_NONE); @@ -177,11 +186,12 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bUnRanked->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); for (int i = 0; i < 5; i++) { - iranked[i] = new RTImage ("rated.png"); - igranked[i] = new RTImage ("grayrated.png"); + iranked[i] = new RTImage ("star-gold-small.png"); + igranked[i] = new RTImage ("star-small.png"); iranked[i]->show (); igranked[i]->show (); bRank[i] = Gtk::manage( new Gtk::ToggleButton () ); + bRank[i]->get_style_context()->add_class("smallbutton"); bRank[i]->set_image (*igranked[i]); bRank[i]->set_relief (Gtk::RELIEF_NONE); fltrRankbox->pack_start (*bRank[i], Gtk::PACK_SHRINK); @@ -189,26 +199,33 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bRank[i]->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); } - iUnCLabeled = new RTImage ("clabel0.png"); - igUnCLabeled = new RTImage ("cglabel0.png"); - bUnCLabeled = Gtk::manage(new Gtk::ToggleButton ()); - bUnCLabeled->set_active (false); - bUnCLabeled->set_image (*igUnCLabeled); - bUnCLabeled->set_relief (Gtk::RELIEF_NONE); - bUnCLabeled->set_tooltip_markup (M("FILEBROWSER_SHOWUNCOLORHINT")); + // Toolbar + // Similar image arrays in filebrowser.cc + std::array clabelActiveIcons = {"circle-gray-small.png", "circle-red-small.png", "circle-yellow-small.png", "circle-green-small.png", "circle-blue-small.png", "circle-purple-small.png"}; + std::array clabelInactiveIcons = {"circle-empty-gray-small.png", "circle-empty-red-small.png", "circle-empty-yellow-small.png", "circle-empty-green-small.png", "circle-empty-blue-small.png", "circle-empty-purple-small.png"}; + + iUnCLabeled = new RTImage(clabelActiveIcons[0]); + igUnCLabeled = new RTImage(clabelInactiveIcons[0]); + bUnCLabeled = Gtk::manage(new Gtk::ToggleButton()); + bUnCLabeled->get_style_context()->add_class("smallbutton"); + bUnCLabeled->set_active(false); + bUnCLabeled->set_image(*igUnCLabeled); + bUnCLabeled->set_relief(Gtk::RELIEF_NONE); + bUnCLabeled->set_tooltip_markup(M("FILEBROWSER_SHOWUNCOLORHINT")); bCateg[7] = bUnCLabeled->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bUnCLabeled, true)); - fltrLabelbox->pack_start (*bUnCLabeled, Gtk::PACK_SHRINK); + fltrLabelbox->pack_start(*bUnCLabeled, Gtk::PACK_SHRINK); bUnCLabeled->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); for (int i = 0; i < 5; i++) { - iCLabeled[i] = new RTImage (Glib::ustring::compose("%1%2%3", "clabel", i + 1, ".png")); - igCLabeled[i] = new RTImage (Glib::ustring::compose("%1%2%3", "cglabel", i + 1, ".png")); - iCLabeled[i]->show (); - igCLabeled[i]->show (); - bCLabel[i] = Gtk::manage(new Gtk::ToggleButton ()); - bCLabel[i]->set_image (*igCLabeled[i]); - bCLabel[i]->set_relief (Gtk::RELIEF_NONE); - fltrLabelbox->pack_start (*bCLabel[i], Gtk::PACK_SHRINK); + iCLabeled[i] = new RTImage(clabelActiveIcons[i+1]); + igCLabeled[i] = new RTImage(clabelInactiveIcons[i+1]); + iCLabeled[i]->show(); + igCLabeled[i]->show(); + bCLabel[i] = Gtk::manage(new Gtk::ToggleButton()); + bCLabel[i]->get_style_context()->add_class("smallbutton"); + bCLabel[i]->set_image(*igCLabeled[i]); + bCLabel[i]->set_relief(Gtk::RELIEF_NONE); + fltrLabelbox->pack_start(*bCLabel[i], Gtk::PACK_SHRINK); bCateg[i + 8] = bCLabel[i]->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bCLabel[i], true)); bCLabel[i]->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); } @@ -233,17 +250,23 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : fltrVbox2 = Gtk::manage (new Gtk::VBox()); fltrEditedBox = Gtk::manage (new Gtk::HBox()); + fltrEditedBox->get_style_context()->add_class("smallbuttonbox"); fltrRecentlySavedBox = Gtk::manage (new Gtk::HBox()); + fltrRecentlySavedBox->get_style_context()->add_class("smallbuttonbox"); // bEdited - iEdited[0] = new RTImage ("editednot-small.png"); - igEdited[0] = new RTImage ("editednotg-small.png"); - iEdited[1] = new RTImage ("edited-small.png"); - igEdited[1] = new RTImage ("editedg-small.png"); + // TODO The "g" variant was the more transparent variant of the icon, used + // when the button was not toggled. Simplify this, change to ordinary + // togglebutton, use CSS for opacity change. + iEdited[0] = new RTImage ("tick-hollow-small.png"); + igEdited[0] = new RTImage ("tick-hollow-small.png"); + iEdited[1] = new RTImage ("tick-small.png"); + igEdited[1] = new RTImage ("tick-small.png"); for (int i = 0; i < 2; i++) { iEdited[i]->show (); bEdited[i] = Gtk::manage(new Gtk::ToggleButton ()); + bEdited[i]->get_style_context()->add_class("smallbutton"); bEdited[i]->set_active (false); bEdited[i]->set_image (*igEdited[i]); bEdited[i]->set_relief (Gtk::RELIEF_NONE); @@ -257,14 +280,18 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : bEdited[1]->set_tooltip_markup (M("FILEBROWSER_SHOWEDITEDHINT")); // RecentlySaved - iRecentlySaved[0] = new RTImage ("savednot.png"); - igRecentlySaved[0] = new RTImage ("savednotg.png"); - iRecentlySaved[1] = new RTImage ("saved.png"); - igRecentlySaved[1] = new RTImage ("savedg.png"); + // TODO The "g" variant was the more transparent variant of the icon, used + // when the button was not toggled. Simplify this, change to ordinary + // togglebutton, use CSS for opacity change. + iRecentlySaved[0] = new RTImage ("saved-no-small.png"); + igRecentlySaved[0] = new RTImage ("saved-no-small.png"); + iRecentlySaved[1] = new RTImage ("saved-yes-small.png"); + igRecentlySaved[1] = new RTImage ("saved-yes-small.png"); for (int i = 0; i < 2; i++) { iRecentlySaved[i]->show (); bRecentlySaved[i] = Gtk::manage(new Gtk::ToggleButton ()); + bRecentlySaved[i]->get_style_context()->add_class("smallbutton"); bRecentlySaved[i]->set_active (false); bRecentlySaved[i]->set_image (*igRecentlySaved[i]); bRecentlySaved[i]->set_relief (Gtk::RELIEF_NONE); @@ -284,18 +311,18 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK); // Trash - iTrashEmpty = new RTImage("trash-show-empty.png") ; - iTrashFull = new RTImage("trash-show-full.png") ; + iTrashShowEmpty = new RTImage("trash-empty-show.png") ; + iTrashShowFull = new RTImage("trash-full-show.png") ; bTrash = Gtk::manage( new Gtk::ToggleButton () ); - bTrash->set_image (*iTrashEmpty); + bTrash->set_image (*iTrashShowEmpty); bTrash->set_relief (Gtk::RELIEF_NONE); bTrash->set_tooltip_markup (M("FILEBROWSER_SHOWTRASHHINT")); bCateg[17] = bTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bTrash, true)); bTrash->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event), false); iNotTrash = new RTImage("trash-hide-deleted.png") ; - iOriginal = new RTImage("filter-original-2.png"); + iOriginal = new RTImage("filter-original.png"); bNotTrash = Gtk::manage( new Gtk::ToggleButton () ); bNotTrash->set_image (*iNotTrash); @@ -374,13 +401,13 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // thumbnail zoom Gtk::HBox* zoomBox = Gtk::manage( new Gtk::HBox () ); zoomInButton = Gtk::manage( new Gtk::Button () ); - zoomInButton->set_image (*Gtk::manage(new RTImage ("gtk-zoom-in.png"))); + zoomInButton->set_image (*Gtk::manage(new RTImage ("magnifier-plus.png"))); zoomInButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomIn)); zoomInButton->set_relief (Gtk::RELIEF_NONE); zoomInButton->set_tooltip_markup (M("FILEBROWSER_ZOOMINHINT")); zoomBox->pack_end (*zoomInButton, Gtk::PACK_SHRINK); zoomOutButton = Gtk::manage( new Gtk::Button () ); - zoomOutButton->set_image (*Gtk::manage(new RTImage ("gtk-zoom-out.png"))); + zoomOutButton->set_image (*Gtk::manage(new RTImage ("magnifier-minus.png"))); zoomOutButton->signal_pressed().connect (sigc::mem_fun(*this, &FileCatalog::zoomOut)); zoomOutButton->set_relief (Gtk::RELIEF_NONE); zoomOutButton->set_tooltip_markup (M("FILEBROWSER_ZOOMOUTHINT")); @@ -432,9 +459,6 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : } selectedDirectory = ""; -#ifdef WIN32 - wdMonitor = NULL; -#endif } FileCatalog::~FileCatalog() @@ -461,8 +485,8 @@ FileCatalog::~FileCatalog() delete igUnRanked; delete iUnCLabeled; delete igUnCLabeled; - delete iTrashEmpty; - delete iTrashFull; + delete iTrashShowEmpty; + delete iTrashShowFull; delete iNotTrash; delete iOriginal; delete iRefreshWhite; @@ -490,6 +514,7 @@ void FileCatalog::exifInfoButtonToggled() } fileBrowser->refreshThumbImages (); + refreshHeight(); } void FileCatalog::on_realize() @@ -512,21 +537,10 @@ void FileCatalog::closeDir () exportPanel->set_sensitive (false); } -#ifndef WIN32 - if (dirMonitor) { dirMonitor->cancel (); } -#else - - if (wdMonitor) { - delete wdMonitor; - wdMonitor = NULL; - } - -#endif - // ignore old requests ++selectedDirectoryId; @@ -564,21 +578,31 @@ std::vector FileCatalog::getFileList () auto enumerator = dir->enumerate_children ("standard::name"); - while (auto file = enumerator->next_file ()) { + while (true) { + try { + auto file = enumerator->next_file (); + if (!file) { + break; + } - const Glib::ustring fname = file->get_name (); + const Glib::ustring fname = file->get_name (); - auto lastdot = fname.find_last_of ('.'); - if (lastdot >= fname.length () - 1) { - continue; + auto lastdot = fname.find_last_of ('.'); + if (lastdot >= fname.length () - 1) { + continue; + } + + const auto fext = fname.substr (lastdot + 1).lowercase (); + if (extensions.count (fext) == 0) { + continue; + } + + names.emplace_back (Glib::build_filename (selectedDirectory, fname)); + } catch (Glib::Exception& exception) { + if (options.rtSettings.verbose) { + std::cerr << exception.what () << std::endl; + } } - - const auto fext = fname.substr (lastdot + 1).lowercase (); - if (extensions.count (fext) == 0) { - continue; - } - - names.emplace_back (Glib::build_filename (selectedDirectory, fname)); } } catch (Glib::Exception& exception) { @@ -633,12 +657,8 @@ void FileCatalog::dirSelected (const Glib::ustring& dirname, const Glib::ustring filepanel->loadingThumbs(M("PROGRESSBAR_LOADINGTHUMBS"), 0); } -#ifdef WIN32 - wdMonitor = new WinDirMonitor (selectedDirectory, this); -#else dirMonitor = dir->monitor_directory (); dirMonitor->signal_changed().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::on_dir_changed), false)); -#endif } catch (Glib::Exception& ex) { std::cout << ex.what(); } @@ -660,6 +680,9 @@ void FileCatalog::enableTabMode(bool enable) } else { buttonBar->show(); hbToolBar1->show(); + if (hbToolBar1STB) { + hbToolBar1STB->show(); + } exifInfo->set_active( options.showFileNames ); } @@ -674,14 +697,14 @@ void FileCatalog::_refreshProgressBar () // 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 ()); Gtk::Label *label = nullptr; if (!previewsToLoad ) { - grid->attach_next_to(*Gtk::manage (new RTImage ("gtk-directory.png")), options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("folder-closed.png")), options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); int filteredCount = min(fileBrowser->getNumFiltered(), previewsLoaded); label = Gtk::manage (new Gtk::Label (M("MAIN_FRAME_FILEBROWSER") + @@ -689,7 +712,7 @@ void FileCatalog::_refreshProgressBar () + Glib::ustring::format(previewsLoaded) + (filteredCount != previewsLoaded ? "]" : ")"))); } else { - grid->attach_next_to(*Gtk::manage (new RTImage ("gtk-find.png")), options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); + grid->attach_next_to(*Gtk::manage (new RTImage ("magnifier.png")), options.mainNBVertical ? Gtk::POS_TOP : Gtk::POS_RIGHT, 1, 1); label = Gtk::manage (new Gtk::Label (M("MAIN_FRAME_FILEBROWSER") + " [" + Glib::ustring::format(std::fixed, std::setprecision(0), std::setw(3), (double)previewsLoaded / previewsToLoad * 100 ) + "%]" )); filepanel->loadingThumbs("", (double)previewsLoaded / previewsToLoad); } @@ -708,18 +731,6 @@ void FileCatalog::_refreshProgressBar () } } -void FileCatalog::filterApplied() -{ - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->_refreshProgressBar(); - - return FALSE; - }; - - idle_register.add(func, this); -} - - void FileCatalog::previewReady (int dir_id, FileBrowserEntry* fdn) { @@ -790,7 +801,7 @@ void FileCatalog::previewsFinishedUI () { { - 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; @@ -844,13 +855,13 @@ void FileCatalog::previewsFinished (int dir_id) currentEFS = dirEFS; } - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->previewsFinishedUI(); - - return FALSE; - }; - - idle_register.add(func, this); + idle_register.add( + [this]() -> bool + { + previewsFinishedUI(); + return false; + } + ); } void FileCatalog::setEnabled (bool e) @@ -872,14 +883,14 @@ void FileCatalog::refreshHeight () { 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; } - if (hbToolBar1->is_visible() && !options.FileBrowserToolbarSingleRow) { - newHeight += hbToolBar1->get_height(); + if (hbToolBar1STB && hbToolBar1STB->is_visible()) { + newHeight += hbToolBar1STB->get_height(); } if (buttonBar->is_visible()) { @@ -889,10 +900,9 @@ void FileCatalog::refreshHeight () set_size_request(0, newHeight + 2); // HOMBRE: yeah, +2, there's always 2 pixels missing... sorry for this dirty hack O:) } -void FileCatalog::_openImage (std::vector tmb) +void FileCatalog::_openImage(const std::vector& tmb) { - - if (enabled && listener != nullptr) { + if (enabled && listener) { bool continueToLoad = true; for (size_t i = 0; i < tmb.size() && continueToLoad; i++) { @@ -907,44 +917,40 @@ void FileCatalog::_openImage (std::vector tmb) } } -struct FCOIParams { - FileCatalog* catalog; - std::vector tmb; -}; - -int openRequestedUI (void* p) +void FileCatalog::filterApplied() { - FCOIParams* params = static_cast(p); - params->catalog->_openImage (params->tmb); - delete params; - - return 0; + idle_register.add( + [this]() -> bool + { + _refreshProgressBar(); + return false; + } + ); } -void FileCatalog::openRequested (std::vector tmb) +void FileCatalog::openRequested(const std::vector& tmb) { - - FCOIParams* params = new FCOIParams; - params->catalog = this; - params->tmb = tmb; - - for (size_t i = 0; i < tmb.size(); i++) { - tmb[i]->increaseRef (); + for (const auto thumb : tmb) { + thumb->increaseRef(); } - idle_register.add(openRequestedUI, params); + idle_register.add( + [this, tmb]() -> bool + { + _openImage(tmb); + return false; + } + ); } -void FileCatalog::deleteRequested (std::vector tbe, bool inclBatchProcessed) +void FileCatalog::deleteRequested(const std::vector& tbe, bool inclBatchProcessed) { - if (tbe.empty()) { return; } - Gtk::MessageDialog msd (M("FILEBROWSER_DELETEDLGLABEL"), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); + Gtk::MessageDialog msd (getToplevelWindow(this), M("FILEBROWSER_DELETEDLGLABEL"), true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO, true); msd.set_secondary_text(Glib::ustring::compose ( inclBatchProcessed ? M("FILEBROWSER_DELETEDLGMSGINCLPROC") : M("FILEBROWSER_DELETEDLGMSG"), tbe.size()), true); - if (msd.run() == Gtk::RESPONSE_YES) { for (unsigned int i = 0; i < tbe.size(); i++) { const auto fname = tbe[i]->filename; @@ -977,15 +983,12 @@ void FileCatalog::deleteRequested (std::vector tbe, bool inc } } - -void FileCatalog::copyMoveRequested (std::vector tbe, bool moveRequested) +void FileCatalog::copyMoveRequested(const std::vector& tbe, bool moveRequested) { - if (tbe.empty()) { return; } - Glib::ustring fc_title; if (moveRequested) { @@ -1089,9 +1092,9 @@ void FileCatalog::copyMoveRequested (std::vector tbe, bool m _refreshProgressBar(); } // Gtk::RESPONSE_OK } -void FileCatalog::developRequested (std::vector tbe, bool fastmode) -{ +void FileCatalog::developRequested(const std::vector& tbe, bool fastmode) +{ if (listener) { std::vector entries; @@ -1130,10 +1133,6 @@ void FileCatalog::developRequested (std::vector tbe, bool fas params.dirpyrDenoise.enabled = false; } - if (options.fastexport_bypass_sh_hq) { - params.sh.hq = false; - } - if (options.fastexport_bypass_dirpyrequalizer) { params.dirpyrequalizer.enabled = false; } @@ -1185,12 +1184,11 @@ void FileCatalog::developRequested (std::vector tbe, bool fas params.raw.bayersensor.method = options.fastexport_raw_bayer_method; params.raw.xtranssensor.method = options.fastexport_raw_xtrans_method; - params.icm.input = options.fastexport_icm_input; - params.icm.working = options.fastexport_icm_working; - params.icm.output = options.fastexport_icm_output; - params.icm.outputIntent = options.fastexport_icm_outputIntent; + params.icm.inputProfile = options.fastexport_icm_input_profile; + params.icm.workingProfile = options.fastexport_icm_working_profile; + params.icm.outputProfile = options.fastexport_icm_output_profile; + params.icm.outputIntent = rtengine::RenderingIntent(options.fastexport_icm_outputIntent); params.icm.outputBPC = options.fastexport_icm_outputBPC; - params.icm.gamma = options.fastexport_icm_gamma; } if (params.resize.enabled) { @@ -1200,12 +1198,13 @@ void FileCatalog::developRequested (std::vector tbe, bool fas params.resize.width = options.fastexport_resize_width; params.resize.height = options.fastexport_resize_height; } - + params.resize.enabled = options.fastexport_resize_enabled; params.resize.scale = options.fastexport_resize_scale; params.resize.appliesTo = options.fastexport_resize_appliesTo; params.resize.method = options.fastexport_resize_method; params.resize.dataspec = options.fastexport_resize_dataspec; + params.resize.allowUpscaling = false; } rtengine::ProcessingJob* pjob = rtengine::ProcessingJob::create (fbe->filename, th->getType() == FT_Raw, params, fastmode && options.fastexport_use_fast_pipeline); @@ -1226,23 +1225,8 @@ void FileCatalog::developRequested (std::vector tbe, bool fas } } -void FileCatalog::exportRequested () +void FileCatalog::renameRequested(const std::vector& tbe) { - -} - -void FileCatalog::setExportPanel (ExportPanel* expanel) -{ - - exportPanel = expanel; - exportPanel->set_sensitive (false); - exportPanel->setExportPanelListener (this); - fileBrowser->setExportPanel(expanel); -} - -void FileCatalog::renameRequested (std::vector tbe) -{ - RenameDialog* renameDlg = new RenameDialog ((Gtk::Window*)get_toplevel()); for (size_t i = 0; i < tbe.size(); i++) { @@ -1297,9 +1281,15 @@ void FileCatalog::renameRequested (std::vector tbe) delete renameDlg; } -void FileCatalog::clearFromCacheRequested (std::vector tbe, bool leavenotrace) +void FileCatalog::selectionChanged(const std::vector& tbe) { + if (fslistener) { + fslistener->selectionChanged (tbe); + } +} +void FileCatalog::clearFromCacheRequested(const std::vector& tbe, bool leavenotrace) +{ if (tbe.empty()) { return; } @@ -1311,6 +1301,11 @@ void FileCatalog::clearFromCacheRequested (std::vector tbe, } } +bool FileCatalog::isInTabMode() const +{ + return inTabMode; +} + void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b, bool isMouseClick) { @@ -1597,26 +1592,6 @@ BrowserFilter FileCatalog::getFilter () anyRankFilterActive || anyCLabelFilterActive || anyEditedFilterActive; } - if( options.rtSettings.verbose ) { - printf ("\n**************** FileCatalog::getFilter *** AFTER STEP 1 \n"); - - for (int i = 0; i <= 5; i++) { - printf ("filter.showRanked[%i] = %i\n", i, filter.showRanked[i]); - } - - for (int i = 0; i <= 5; i++) { - printf ("filter.showCLabeled[%i] = %i\n", i, filter.showCLabeled[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showEdited[%i] = %i\n", i, filter.showEdited[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showRecentlySaved[%i] = %i\n", i, filter.showRecentlySaved[i]); - } - } - filter.multiselect = false; /* @@ -1646,28 +1621,6 @@ BrowserFilter FileCatalog::getFilter () filter.showEdited[i] = anyEditedFilterActive ? bEdited[i]->get_active() : true; filter.showRecentlySaved[i] = anyRecentlySavedFilterActive ? bRecentlySaved[i]->get_active() : true; } - - if( options.rtSettings.verbose ) { - printf ("\n**************** FileCatalog::getFilter *** AFTER STEP 2 \n"); - - for (int i = 0; i <= 5; i++) { - printf ("filter.showRanked[%i] = %i\n", i, filter.showRanked[i]); - } - - for (int i = 0; i <= 5; i++) { - printf ("filter.showCLabeled[%i] = %i\n", i, filter.showCLabeled[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showEdited[%i] = %i\n", i, filter.showEdited[i]); - } - - for (int i = 0; i < 2; i++) { - printf ("filter.showRecentlySaved[%i] = %i\n", i, filter.showRecentlySaved[i]); - } - - printf ("filter.multiselect = %i\n", filter.multiselect); - } } @@ -1764,21 +1717,6 @@ void FileCatalog::reparseDirectory () fileNameList = nfileNameList; } -#ifdef WIN32 - -void FileCatalog::winDirChanged () -{ - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->reparseDirectory(); - - return FALSE; - }; - - idle_register.add(func, this); -} - -#else - void FileCatalog::on_dir_changed (const Glib::RefPtr& file, const Glib::RefPtr& other_file, Gio::FileMonitorEvent event_type, bool internal) { @@ -1793,8 +1731,6 @@ void FileCatalog::on_dir_changed (const Glib::RefPtr& file, const Gli } } -#endif - void FileCatalog::checkAndAddFile (Glib::RefPtr file) { @@ -1873,11 +1809,14 @@ void FileCatalog::addAndOpenFile (const Glib::ustring& fname) FileBrowserEntry* entry = new FileBrowserEntry (tmb, file->get_parse_name ()); previewReady (selectedDirectoryId, entry); // open the file - FCOIParams* params = new FCOIParams; - params->catalog = this; - params->tmb.push_back (tmb); tmb->increaseRef (); - idle_register.add(openRequestedUI, params); + idle_register.add( + [this, tmb]() -> bool + { + _openImage({tmb}); + return false; + } + ); } catch(Gio::Error&) {} } @@ -1930,12 +1869,8 @@ void FileCatalog::refreshEditedState (const std::set& efiles) fileBrowser->refreshEditedState (efiles); } -void FileCatalog::selectionChanged (std::vector tbe) +void FileCatalog::exportRequested() { - - if (fslistener) { - fslistener->selectionChanged (tbe); - } } // Called within GTK UI thread @@ -1955,12 +1890,21 @@ void FileCatalog::setFilterPanel (FilterPanel* fpanel) filterPanel->set_sensitive (false); filterPanel->setFilterPanelListener (this); } + +void FileCatalog::setExportPanel(ExportPanel* expanel) +{ + exportPanel = expanel; + exportPanel->set_sensitive (false); + exportPanel->setExportPanelListener (this); + fileBrowser->setExportPanel(expanel); +} + void FileCatalog::trashChanged () { if (trashIsEmpty()) { - bTrash->set_image(*iTrashEmpty); + bTrash->set_image(*iTrashShowEmpty); } else { - bTrash->set_image(*iTrashFull); + bTrash->set_image(*iTrashShowFull); } } @@ -2012,17 +1956,21 @@ void FileCatalog::updateFBQueryTB (bool singleRow) hbToolBar1->reference(); if (singleRow) { - bool removed = removeIfThere(this, hbToolBar1, false); - - if (removed) { + if (hbToolBar1STB) { + hbToolBar1STB->remove_with_viewport(); + removeIfThere(this, hbToolBar1STB, false); buttonBar->pack_start(*hbToolBar1, Gtk::PACK_EXPAND_WIDGET, 0); + hbToolBar1STB = nullptr; } } else { - bool removed = removeIfThere(buttonBar, hbToolBar1, false); - - if (removed) { - pack_start(*hbToolBar1, Gtk::PACK_SHRINK, 0); - reorder_child(*hbToolBar1, 0); + if (!hbToolBar1STB) { + removeIfThere(buttonBar, hbToolBar1, false); + hbToolBar1STB = Gtk::manage(new MyScrolledToolbar()); + hbToolBar1STB->set_name("FileBrowserQueryToolbar"); + hbToolBar1STB->add(*hbToolBar1); + hbToolBar1STB->show(); + pack_start (*hbToolBar1STB, Gtk::PACK_SHRINK, 0); + reorder_child(*hbToolBar1STB, 0); } } @@ -2564,8 +2512,8 @@ bool FileCatalog::handleShortcutKey (GdkEventKey* event) void FileCatalog::showToolBar() { - if (!options.FileBrowserToolbarSingleRow) { - hbToolBar1->show(); + if (hbToolBar1STB) { + hbToolBar1STB->show(); } buttonBar->show(); @@ -2573,8 +2521,8 @@ void FileCatalog::showToolBar() void FileCatalog::hideToolBar() { - if (!options.FileBrowserToolbarSingleRow) { - hbToolBar1->hide(); + if (hbToolBar1STB) { + hbToolBar1STB->hide(); } buttonBar->hide(); diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 29e4a370a..8b5b14ed2 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -19,9 +19,6 @@ #ifndef _FILECATALOG_ #define _FILECATALOG_ -#ifdef WIN32 -#include "windirmonitor.h" -#endif #include "filebrowser.h" #include "exiffiltersettings.h" #include @@ -48,9 +45,6 @@ class FileCatalog : public Gtk::VBox, public FilterPanelListener, public FileBrowserListener, public ExportPanelListener -#ifdef WIN32 - , public WinDirChangeListener -#endif { public: typedef sigc::slot DirSelectionSlot; @@ -73,6 +67,7 @@ private: Gtk::HBox* buttonBar; Gtk::HBox* hbToolBar1; + MyScrolledToolbar* hbToolBar1STB; Gtk::HBox* fltrRankbox; Gtk::HBox* fltrLabelbox; @@ -104,7 +99,7 @@ private: Gtk::Image* iCLabeled[5], *igCLabeled[5], *iUnCLabeled, *igUnCLabeled; Gtk::Image* iEdited[2], *igEdited[2]; Gtk::Image* iRecentlySaved[2], *igRecentlySaved[2]; - Gtk::Image *iTrashEmpty, *iTrashFull; + Gtk::Image *iTrashShowEmpty, *iTrashShowFull; Gtk::Image *iNotTrash, *iOriginal; Gtk::Image *iRefreshWhite, *iRefreshRed; Gtk::Image *iLeftPanel_1_Show, *iLeftPanel_1_Hide, *iRightPanel_1_Show, *iRightPanel_1_Hide; @@ -141,11 +136,7 @@ private: std::set editedFiles; guint modifierKey; // any modifiers held when rank button was pressed -#ifndef _WIN32 Glib::RefPtr dirMonitor; -#else - WinDirMonitor* wdMonitor; -#endif IdleRegister idle_register; @@ -163,14 +154,14 @@ public: ToolBar* toolBar; FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel); - ~FileCatalog(); + ~FileCatalog() override; void dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile); void closeDir (); void refreshEditedState (const std::set& efiles); // previewloaderlistener interface - void previewReady (int dir_id, FileBrowserEntry* fdn); - void previewsFinished (int dir_id); + void previewReady (int dir_id, FileBrowserEntry* fdn) override; + void previewsFinished (int dir_id) override; void previewsFinishedUI (); void _refreshProgressBar (); @@ -194,10 +185,10 @@ public: } // filterpanel interface - void exifFilterChanged (); + void exifFilterChanged () override; // exportpanel interface - void exportRequested(); + void exportRequested() override; Glib::ustring lastSelectedDir () { @@ -211,13 +202,16 @@ public: void refreshThumbImages (); void refreshHeight (); - void openRequested (std::vector tbe); - void deleteRequested (std::vector tbe, bool inclBatchProcessed); - void copyMoveRequested (std::vector tbe, bool moveRequested); - void developRequested (std::vector tbe, bool fastmode); - void renameRequested (std::vector tbe); - void clearFromCacheRequested(std::vector tbe, bool leavenotrace); - void selectionChanged (std::vector tbe); + void filterApplied() override; + void openRequested(const std::vector& tbe) override; + void deleteRequested(const std::vector& tbe, bool inclBatchProcessed) override; + void copyMoveRequested(const std::vector& tbe, bool moveRequested) override; + void developRequested(const std::vector& tbe, bool fastmode) override; + void renameRequested(const std::vector& tbe) override; + void selectionChanged(const std::vector& tbe) override; + void clearFromCacheRequested(const std::vector& tbe, bool leavenotrace) override; + bool isInTabMode() const override; + void emptyTrash (); bool trashIsEmpty (); @@ -243,9 +237,9 @@ public: void filterChanged (); void runFilterDialog (); - void on_realize(); + void on_realize() override; void reparseDirectory (); - void _openImage (std::vector tmb); + void _openImage (const std::vector& tmb); void zoomIn (); void zoomOut (); @@ -276,11 +270,6 @@ public: bool handleShortcutKey (GdkEventKey* event); - bool isInTabMode() - { - return inTabMode; - } - bool CheckSidePanelsVisibility(); void toggleSidePanels(); void toggleLeftPanel(); @@ -288,13 +277,8 @@ public: void showToolBar(); void hideToolBar(); - void filterApplied(); -#ifndef _WIN32 void on_dir_changed (const Glib::RefPtr& file, const Glib::RefPtr& other_file, Gio::FileMonitorEvent event_type, bool internal); -#else - void winDirChanged (); -#endif }; diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc index b3e3668c5..5a344c8ba 100644 --- a/rtgui/filepanel.cc +++ b/rtgui/filepanel.cc @@ -81,6 +81,7 @@ FilePanel::FilePanel () : parent(nullptr), error(0) tpc->addPParamsChangeListener (history); history->setProfileChangeListener (tpc); + history->set_size_request(-1, 50); Gtk::ScrolledWindow* sFilterPanel = Gtk::manage ( new Gtk::ScrolledWindow() ); filterPanel = Gtk::manage ( new FilterPanel () ); @@ -120,7 +121,7 @@ FilePanel::FilePanel () : parent(nullptr), error(0) tpcPaned = Gtk::manage ( new Gtk::VPaned () ); tpcPaned->pack1 (*tpc->toolPanelNotebook, false, true); - tpcPaned->pack2 (*history, true, true); + tpcPaned->pack2 (*history, true, false); rightNotebook->append_page (*sFilterPanel, *filtLab); rightNotebook->append_page (*inspectorPanel, *inspectLab); @@ -138,12 +139,13 @@ FilePanel::FilePanel () : parent(nullptr), error(0) fileCatalog->setFileSelectionListener (this); - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->init(); - return FALSE; - }; - - idle_register.add(func, this); + idle_register.add( + [this]() -> bool + { + init(); + return false; + } + ); show_all (); } @@ -227,7 +229,6 @@ void FilePanel::on_NB_switch_page(Gtk::Widget* page, guint page_num) bool FilePanel::fileSelected (Thumbnail* thm) { - if (!parent) { return false; } @@ -257,6 +258,16 @@ bool FilePanel::fileSelected (Thumbnail* thm) sigc::bind(sigc::mem_fun(*this, &FilePanel::imageLoaded), thm, ld) ); return true; } + +bool FilePanel::addBatchQueueJobs(const std::vector& entries) +{ + if (parent) { + parent->addBatchQueueJobs (entries); + } + + return true; +} + bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector *pc ) { @@ -291,7 +302,7 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector") + M("MAIN_MSG_CANNOTLOAD") + " \"" + thm->getFileName() + "\" .\n" + M("MAIN_MSG_TOOMANYOPENEDITORS") + ""; - Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); goto MAXGDIHANDLESREACHED; } @@ -312,7 +323,7 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnector") + M("MAIN_MSG_CANNOTLOAD") + " \"" + thm->getFileName() + "\" .\n"; - Gtk::MessageDialog msgd (msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); } #ifdef WIN32 @@ -364,16 +375,6 @@ void FilePanel::open (const Glib::ustring& d) } } -bool FilePanel::addBatchQueueJobs ( std::vector &entries ) -{ - - if (parent) { - parent->addBatchQueueJobs (entries); - } - - return true; -} - void FilePanel::optionsChanged () { @@ -384,16 +385,6 @@ void FilePanel::optionsChanged () bool FilePanel::handleShortcutKey (GdkEventKey* event) { - bool ctrl = event->state & GDK_CONTROL_MASK; - - if (!ctrl) { - switch(event->keyval) { - } - } else { - switch (event->keyval) { - } - } - if(tpc->getToolBar() && tpc->getToolBar()->handleShortcutKey(event)) { return true; } @@ -411,7 +402,7 @@ bool FilePanel::handleShortcutKey (GdkEventKey* event) 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); @@ -424,8 +415,3 @@ void FilePanel::updateTPVScrollbar (bool hide) { tpc->updateTPVScrollbar (hide); } - -void FilePanel::updateTabsUsesIcons (bool useIcons) -{ - tpc->updateTabsUsesIcons (useIcons); -} diff --git a/rtgui/filepanel.h b/rtgui/filepanel.h index d54f5f75a..df61cb60d 100644 --- a/rtgui/filepanel.h +++ b/rtgui/filepanel.h @@ -36,12 +36,11 @@ class RTWindow; class FilePanel final : public Gtk::HPaned, - public FileSelectionListener, - public PParamsChangeListener + public FileSelectionListener { public: FilePanel (); - ~FilePanel (); + ~FilePanel () override; Gtk::Paned* placespaned; Gtk::HPaned* dirpaned; @@ -58,8 +57,8 @@ public: { parent = p; } - void init (); // dont call it directly, the constructor calls it as idle source - void on_realize (); + void init (); // don't call it directly, the constructor calls it as idle source + void on_realize () override; void setAspect(); void open (const Glib::ustring& d); // open a file or a directory void refreshEditedState (const std::set& efiles) @@ -72,15 +71,14 @@ public: void saveOptions (); // interface fileselectionlistener - bool fileSelected (Thumbnail* thm); - bool addBatchQueueJobs ( std::vector &entries ); + bool fileSelected(Thumbnail* thm) override; + bool addBatchQueueJobs(const std::vector& entries) override; void optionsChanged (); bool imageLoaded( Thumbnail* thm, ProgressConnector * ); bool handleShortcutKey (GdkEventKey* event); void updateTPVScrollbar (bool hide); - void updateTabsUsesIcons (bool useIcons); private: void on_NB_switch_page(Gtk::Widget* page, guint page_num); diff --git a/rtgui/fileselectionchangelistener.h b/rtgui/fileselectionchangelistener.h index 1ad905d17..5f1b20fcc 100644 --- a/rtgui/fileselectionchangelistener.h +++ b/rtgui/fileselectionchangelistener.h @@ -19,13 +19,13 @@ #ifndef _FILESELECTIONCHANGELISTENER_ #define _FILESELECTIONCHANGELISTENER_ -#include "thumbnail.h" +class Thumbnail; class FileSelectionChangeListener { - public: - virtual void selectionChanged (const std::vector& selected) {} + virtual ~FileSelectionChangeListener() = default; + virtual void selectionChanged(const std::vector& selected) = 0; }; #endif diff --git a/rtgui/fileselectionlistener.h b/rtgui/fileselectionlistener.h index dc6434dab..0cac24d46 100644 --- a/rtgui/fileselectionlistener.h +++ b/rtgui/fileselectionlistener.h @@ -19,15 +19,15 @@ #ifndef _FILESELECTIONLISTENER_ #define _FILESELECTIONLISTENER_ -#include "thumbnail.h" -#include "batchqueueentry.h" +class Thumbnail; +class BatchQueueEntry; class FileSelectionListener { - public: - virtual bool fileSelected (Thumbnail* thm) = 0; - virtual bool addBatchQueueJobs ( std::vector &entries ) = 0; + virtual ~FileSelectionListener() = default; + virtual bool fileSelected(Thumbnail* thm) = 0; + virtual bool addBatchQueueJobs(const std::vector& entries) = 0; }; #endif diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc index 286324bdf..556397b7b 100644 --- a/rtgui/filethumbnailbuttonset.cc +++ b/rtgui/filethumbnailbuttonset.cc @@ -42,19 +42,19 @@ FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) { if (!iconsLoaded) { - unRankIcon = RTImage::createFromPng ("ratednotg.png"); - rankIcon = RTImage::createFromPng ("rated.png"); - gRankIcon = RTImage::createFromPng ("grayrated.png"); - trashIcon = RTImage::createFromPng ("trash-thumbnail.png"); - unTrashIcon = RTImage::createFromPng ("undelete-thumbnail.png"); - processIcon = RTImage::createFromPng ("processing-thumbnail.png"); + unRankIcon = RTImage::createFromPng ("star-hollow-narrow.png"); + rankIcon = RTImage::createFromPng ("star-gold-narrow.png"); + gRankIcon = RTImage::createFromPng ("star-narrow.png"); + trashIcon = RTImage::createFromPng ("trash-small.png"); + unTrashIcon = RTImage::createFromPng ("trash-remove-small.png"); + processIcon = RTImage::createFromPng ("gears-small.png"); - colorLabelIcon_0 = RTImage::createFromPng ("cglabel0.png"); //("nocolorlabel.png"); - colorLabelIcon_1 = RTImage::createFromPng ("clabel1.png"); - colorLabelIcon_2 = RTImage::createFromPng ("clabel2.png"); - colorLabelIcon_3 = RTImage::createFromPng ("clabel3.png"); - colorLabelIcon_4 = RTImage::createFromPng ("clabel4.png"); - colorLabelIcon_5 = RTImage::createFromPng ("clabel5.png"); + colorLabelIcon_0 = RTImage::createFromPng ("circle-empty-gray-small.png"); + colorLabelIcon_1 = RTImage::createFromPng ("circle-red-small.png"); + colorLabelIcon_2 = RTImage::createFromPng ("circle-yellow-small.png"); + colorLabelIcon_3 = RTImage::createFromPng ("circle-green-small.png"); + colorLabelIcon_4 = RTImage::createFromPng ("circle-blue-small.png"); + colorLabelIcon_5 = RTImage::createFromPng ("circle-purple-small.png"); iconsLoaded = true; } diff --git a/rtgui/filmsimulation.cc b/rtgui/filmsimulation.cc index 89ab31748..e354724ba 100644 --- a/rtgui/filmsimulation.cc +++ b/rtgui/filmsimulation.cc @@ -1,12 +1,13 @@ +#include #include #include #include "filmsimulation.h" -#include - #include "options.h" + #include "../rtengine/clutstore.h" +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -106,14 +107,18 @@ void FilmSimulation::enabledChanged () } } -void FilmSimulation::adjusterChanged( Adjuster* a, double newval ) +void FilmSimulation::adjusterChanged(Adjuster* a, double newval) { - if (listener && (multiImage || getEnabled()) ) { - Glib::ustring value = a->getTextValue(); - listener->panelChanged ( EvFilmSimulationStrength, value ); + if (listener && (multiImage || getEnabled())) { + const Glib::ustring value = a->getTextValue(); + listener->panelChanged(EvFilmSimulationStrength, value); } } +void FilmSimulation::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void FilmSimulation::setBatchMode( bool batchMode ) { ToolPanel::setBatchMode( batchMode ); @@ -135,6 +140,8 @@ void FilmSimulation::read( const rtengine::procparams::ProcParams* pp, const Par : pp->filmSimulation.clutFilename ); m_oldClutFilename = m_clutComboBox->getSelectedClut(); + } else { + m_clutComboBox->set_active(-1); } m_strength->setValue(pp->filmSimulation.strength); @@ -249,7 +256,7 @@ void ClutComboBox::setBatchMode(bool yes) if (batchMode != yes) { batchMode = yes; set_model(m_model()); - if (batchMode && options.multiDisplayMode) { + if (batchMode) { updateUnchangedEntry(); } } @@ -270,7 +277,6 @@ void ClutComboBox::updateUnchangedEntry() 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); } } @@ -425,6 +431,8 @@ void ClutComboBox::setSelectedClut( Glib::ustring filename ) if ( found ) { set_active( found ); + } else { + set_active(-1); } } } diff --git a/rtgui/filmsimulation.h b/rtgui/filmsimulation.h index 8f627c352..5f66b579e 100644 --- a/rtgui/filmsimulation.h +++ b/rtgui/filmsimulation.h @@ -11,7 +11,7 @@ class ClutComboBox : public MyComboBox { public: - ClutComboBox(const Glib::ustring &path); + explicit ClutComboBox(const Glib::ustring &path); //int fillFromDir (const Glib::ustring& path); int foundClutsCount() const; Glib::ustring getSelectedClut(); @@ -34,7 +34,7 @@ private: Glib::RefPtr m_model; ClutColumns m_columns; int count; - ClutModel(const Glib::ustring &path); + explicit ClutModel(const Glib::ustring &path); int parseDir (const Glib::ustring& path); }; @@ -53,16 +53,17 @@ class FilmSimulation : public ToolParamBlock, public AdjusterListener, public Fo public: FilmSimulation(); - void adjusterChanged( Adjuster* a, double newval ); - 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 setAdjusterBehavior( bool strength ); - void trimValues( rtengine::procparams::ProcParams* pp ); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void setBatchMode(bool batchMode) override; + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setAdjusterBehavior(bool strength); + void trimValues(rtengine::procparams::ProcParams* pp) override; private: void onClutSelected(); - void enabledChanged(); + void enabledChanged() override; void updateDisable( bool value ); diff --git a/rtgui/filterpanel.cc b/rtgui/filterpanel.cc index 5f8fa2781..c140acfb0 100644 --- a/rtgui/filterpanel.cc +++ b/rtgui/filterpanel.cc @@ -35,7 +35,9 @@ FilterPanel::FilterPanel () : listener (nullptr) Gtk::HBox* fnhb = Gtk::manage(new Gtk::HBox ()); fnvb->pack_start (*enaFNumber, Gtk::PACK_SHRINK, 0); fnumberFrom = Gtk::manage(new Gtk::Entry ()); + fnumberFrom->set_width_chars(1); fnumberTo = Gtk::manage(new Gtk::Entry ()); + fnumberTo->set_width_chars(1); fnhb->pack_start (*fnumberFrom, true, true, 2); fnhb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4); fnhb->pack_start (*fnumberTo, true, true, 2); @@ -47,7 +49,9 @@ FilterPanel::FilterPanel () : listener (nullptr) Gtk::HBox* shb = Gtk::manage(new Gtk::HBox ()); svb->pack_start (*enaShutter, Gtk::PACK_SHRINK, 0); shutterFrom = Gtk::manage(new Gtk::Entry ()); + shutterFrom->set_width_chars(1); shutterTo = Gtk::manage(new Gtk::Entry ()); + shutterTo->set_width_chars(1); shb->pack_start (*shutterFrom, true, true, 2); shb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4); shb->pack_start (*shutterTo, true, true, 2); @@ -59,7 +63,9 @@ FilterPanel::FilterPanel () : listener (nullptr) Gtk::HBox* ihb = Gtk::manage(new Gtk::HBox ()); ivb->pack_start (*enaISO, Gtk::PACK_SHRINK, 0); isoFrom = Gtk::manage(new Gtk::Entry ()); + isoFrom->set_width_chars(1); isoTo = Gtk::manage(new Gtk::Entry ()); + isoTo->set_width_chars(1); ihb->pack_start (*isoFrom, true, true, 2); ihb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4); ihb->pack_start (*isoTo, true, true, 2); @@ -71,7 +77,9 @@ FilterPanel::FilterPanel () : listener (nullptr) Gtk::HBox* fhb = Gtk::manage(new Gtk::HBox ()); fvb->pack_start (*enaFocalLen, Gtk::PACK_SHRINK, 0); focalFrom = Gtk::manage(new Gtk::Entry ()); + focalFrom->set_width_chars(1); focalTo = Gtk::manage(new Gtk::Entry ()); + focalTo->set_width_chars(1); fhb->pack_start (*focalFrom, true, true, 2); fhb->pack_start (*Gtk::manage(new Gtk::Label(" - ")), false, false, 4); fhb->pack_start (*focalTo, true, true, 2); @@ -129,7 +137,7 @@ FilterPanel::FilterPanel () : listener (nullptr) // add panel ending Gtk::VBox* vboxpe = Gtk::manage (new Gtk::VBox ()); Gtk::HSeparator* hseptpe = Gtk::manage (new Gtk::HSeparator ()); - Gtk::Image* peImg = Gtk::manage (new RTImage("PanelEnding.png")); + Gtk::Image* peImg = Gtk::manage (new RTImage("ornament1.png")); vboxpe->pack_start(*hseptpe, Gtk::PACK_SHRINK, 4); vboxpe->pack_start(*peImg); pack_start(*vboxpe, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/filterpanel.h b/rtgui/filterpanel.h index f37695754..7f32a88d9 100644 --- a/rtgui/filterpanel.h +++ b/rtgui/filterpanel.h @@ -24,9 +24,9 @@ class FilterPanelListener { - public: - virtual void exifFilterChanged () {} + virtual ~FilterPanelListener() = default; + virtual void exifFilterChanged () = 0; }; class FilterPanel : public Gtk::VBox diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index a9d51abec..376bb55c2 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -33,6 +33,8 @@ #include "flatcurveeditorsubgroup.h" #include "rtimage.h" +#include "../rtengine/curves.h" + FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::ustring& curveDir) : CurveEditorSubGroup(curveDir) { @@ -45,35 +47,49 @@ FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::u // ControlPoints curve CPointsCurveGrid = new Gtk::Grid (); - CPointsCurveGrid->set_row_spacing(2); - CPointsCurveGrid->set_column_spacing(2); CPointsCurveGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); + CPointsCurveGrid->get_style_context()->add_class("curve-mainbox"); CPointsCurve = Gtk::manage (new MyFlatCurve ()); CPointsCurve->setType (FCT_MinMaxCPoints); + + Gtk::Grid* CPointsCurveBox = Gtk::manage (new Gtk::Grid ()); + CPointsCurveBox->get_style_context()->add_class("curve-curvebox"); + CPointsCurveBox->add(*CPointsCurve); Gtk::Grid* CPointsbbox = Gtk::manage (new Gtk::Grid ()); // curvebboxpos 0=above, 1=right, 2=below, 3=left + CPointsbbox->get_style_context()->add_class("curve-buttonbox"); - if (options.curvebboxpos == 0 || options.curvebboxpos == 2) { + if (options.curvebboxpos == 0) { CPointsbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); setExpandAlignProperties(CPointsbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - } else { + CPointsCurveGrid->get_style_context()->add_class("top"); + } else if (options.curvebboxpos == 2) { + CPointsbbox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); + setExpandAlignProperties(CPointsbbox, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + CPointsCurveGrid->get_style_context()->add_class("bottom"); + } else if (options.curvebboxpos == 1) { CPointsbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); setExpandAlignProperties(CPointsbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + CPointsCurveGrid->get_style_context()->add_class("right"); + } else if (options.curvebboxpos == 3){ + CPointsbbox->set_orientation(Gtk::ORIENTATION_VERTICAL); + setExpandAlignProperties(CPointsbbox, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); + CPointsCurveGrid->get_style_context()->add_class("left"); } editCPoints = Gtk::manage (new Gtk::ToggleButton()); - initButton(*editCPoints, Glib::ustring("editmodehand.png"), Gtk::ALIGN_START, false, "EDIT_PIPETTE_TOOLTIP"); + initButton(*editCPoints, Glib::ustring("crosshair-node-curve.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, "CURVEEDITOR_EDITPOINT_HINT"); + initButton(*editPointCPoints, Glib::ustring("edit-point.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); + initButton(*copyCPoints, Glib::ustring("copy.png"), Gtk::ALIGN_END, true); pasteCPoints = Gtk::manage (new Gtk::Button ()); - initButton(*pasteCPoints, Glib::ustring("edit-paste.png"), Gtk::ALIGN_END, false); + initButton(*pasteCPoints, Glib::ustring("paste.png"), Gtk::ALIGN_END, false); loadCPoints = Gtk::manage (new Gtk::Button ()); - initButton(*loadCPoints, Glib::ustring("gtk-open.png"), Gtk::ALIGN_END, false); + initButton(*loadCPoints, Glib::ustring("folder-open.png"), Gtk::ALIGN_END, false); saveCPoints = Gtk::manage (new Gtk::Button ()); - initButton(*saveCPoints, Glib::ustring("gtk-save-large.png"), Gtk::ALIGN_END, false); + initButton(*saveCPoints, Glib::ustring("save.png"), Gtk::ALIGN_END, false); CPointsbbox->attach_next_to(*editPointCPoints, sideStart, 1, 1); CPointsbbox->attach_next_to(*editCPoints, sideStart, 1, 1); @@ -90,23 +106,24 @@ FlatCurveEditorSubGroup::FlatCurveEditorSubGroup (CurveEditorGroup* prt, Glib::u axis.at(2).setValues(M("CURVEEDITOR_AXIS_LEFT_TAN"), 5, 0.01, 0.1, 0., 1.); axis.at(3).setValues(M("CURVEEDITOR_AXIS_RIGHT_TAN"), 5, 0.01, 0.1, 0., 1.); CPointsCoordAdjuster = Gtk::manage (new CoordinateAdjuster(CPointsCurve, this, axis)); + CPointsCoordAdjuster->get_style_context()->add_class("curve-spinbuttonbox"); } // Button box position: 0=above, 1=right, 2=below, 3=left - CPointsCurveGrid->add(*CPointsCurve); + CPointsCurveGrid->add(*CPointsCurveBox); CPointsCurve->set_hexpand(true); if (options.curvebboxpos == 0) { - CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurve, Gtk::POS_TOP, 1, 1); - CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurve, Gtk::POS_BOTTOM, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurveBox, Gtk::POS_TOP, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurveBox, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 1) { - CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurve, Gtk::POS_RIGHT, 1, 1); - CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurve, Gtk::POS_BOTTOM, 2, 1); + CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurveBox, Gtk::POS_RIGHT, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurveBox, Gtk::POS_BOTTOM, 2, 1); } else if (options.curvebboxpos == 2) { - CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurve, Gtk::POS_BOTTOM, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsCurveBox, Gtk::POS_BOTTOM, 1, 1); CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCoordAdjuster, Gtk::POS_BOTTOM, 1, 1); } else if (options.curvebboxpos == 3) { - CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurve, Gtk::POS_LEFT, 1, 1); + CPointsCurveGrid->attach_next_to(*CPointsbbox, *CPointsCurveBox, Gtk::POS_LEFT, 1, 1); CPointsCurveGrid->attach_next_to(*CPointsCoordAdjuster, *CPointsbbox, Gtk::POS_BOTTOM, 2, 1); } @@ -418,6 +435,8 @@ void FlatCurveEditorSubGroup::loadPressed () } } + rtengine::sanitizeCurve(p); + if (p[0] == (double)(FCT_MinMaxCPoints)) { CPointsCurve->setPoints (p); CPointsCurve->queue_draw (); diff --git a/rtgui/flatcurveeditorsubgroup.h b/rtgui/flatcurveeditorsubgroup.h index 0dc040cfe..ab2abedfb 100644 --- a/rtgui/flatcurveeditorsubgroup.h +++ b/rtgui/flatcurveeditorsubgroup.h @@ -46,32 +46,32 @@ protected: public: FlatCurveEditorSubGroup(CurveEditorGroup* prt, Glib::ustring& curveDir); - virtual ~FlatCurveEditorSubGroup(); + ~FlatCurveEditorSubGroup() override; FlatCurveEditor* addCurve(Glib::ustring curveLabel = "", bool periodic = true); //virtual void updateBackgroundHistogram (CurveEditor* ce); - void switchGUI(); - void refresh(CurveEditor *curveToRefresh); - void editModeSwitchedOff(); - void pipetteMouseOver(EditDataProvider *provider, int modifierKey); - bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey); - void pipetteButton1Released(EditDataProvider *provider); - void pipetteDrag(EditDataProvider *provider, int modifierKey); - void showCoordinateAdjuster(CoordinateProvider *provider); - void stopNumericalAdjustment(); + void switchGUI() override; + void refresh(CurveEditor *curveToRefresh) override; + void editModeSwitchedOff() override; + void pipetteMouseOver(EditDataProvider *provider, int modifierKey) override; + bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey) override; + void pipetteButton1Released(EditDataProvider *provider) override; + void pipetteDrag(EditDataProvider *provider, int modifierKey) override; + void showCoordinateAdjuster(CoordinateProvider *provider) override; + void stopNumericalAdjustment() override; - bool curveReset (CurveEditor *ce); + bool curveReset (CurveEditor *ce) override; protected: - void storeCurveValues (CurveEditor* ce, const std::vector& p); - void storeDisplayedCurve (); - void restoreDisplayedHistogram (); + void storeCurveValues (CurveEditor* ce, const std::vector& p) override; + void storeDisplayedCurve () override; + void restoreDisplayedHistogram () override; void savePressed (); void loadPressed (); void copyPressed (); void pastePressed (); - void removeEditor (); - const std::vector getCurveFromGUI (int type); + void removeEditor () override; + const std::vector getCurveFromGUI (int type) override; void editPointToggled(Gtk::ToggleButton *button); void editToggled (Gtk::ToggleButton *button); }; diff --git a/rtgui/flatfield.cc b/rtgui/flatfield.cc index 2b57aa470..3cbd7acf1 100644 --- a/rtgui/flatfield.cc +++ b/rtgui/flatfield.cc @@ -16,12 +16,16 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "flatfield.h" -#include "options.h" -#include "guiutils.h" #include + +#include "flatfield.h" + +#include "guiutils.h" +#include "options.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -33,7 +37,7 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L bindCurrentFolder (*flatFieldFile, options.lastFlatfieldDir); ffLabel = Gtk::manage(new Gtk::Label(M("GENERAL_FILE"))); flatFieldFileReset = Gtk::manage(new Gtk::Button()); - flatFieldFileReset->set_image (*Gtk::manage(new RTImage ("gtk-cancel.png"))); + flatFieldFileReset->set_image (*Gtk::manage(new RTImage ("cancel-small.png"))); hbff->pack_start(*ffLabel, Gtk::PACK_SHRINK, 0); hbff->pack_start(*flatFieldFile); hbff->pack_start(*flatFieldFileReset, Gtk::PACK_SHRINK, 0); @@ -104,6 +108,11 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L } } +FlatField::~FlatField () +{ + idle_register.destroy(); +} + void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { disableListener (); @@ -136,7 +145,7 @@ void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi flatFieldClipControl->setAutoInconsistent(multiImage && !pedited->raw.ff_AutoClipControl); if( !pedited->raw.ff_BlurType ) { - flatFieldBlurType->set_active(std::numeric_limits::max()); // No name + flatFieldBlurType->set_active_text(M("GENERAL_UNCHANGED")); } } @@ -217,7 +226,7 @@ void FlatField::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedit int currentRow = flatFieldBlurType->get_active_row_number(); - if( currentRow >= 0 && currentRow < std::numeric_limits::max()) { + if( currentRow >= 0 && flatFieldBlurType->get_active_text() != M("GENERAL_UNCHANGED")) { pp->raw.ff_BlurType = procparams::RAWParams::getFlatFieldBlurTypeStrings()[currentRow]; } @@ -227,16 +236,15 @@ void FlatField::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedit 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() != std::numeric_limits::max(); + pedited->raw.ff_BlurType = flatFieldBlurType->get_active_text() != M("GENERAL_UNCHANGED"); } } -void FlatField::adjusterChanged (Adjuster* a, double newval) +void FlatField::adjusterChanged(Adjuster* a, double newval) { if (listener) { - - Glib::ustring value = a->getTextValue(); + const Glib::ustring value = a->getTextValue(); if (a == flatFieldBlurRadius) { listener->panelChanged (EvFlatFieldBlurRadius, value); @@ -248,7 +256,6 @@ void FlatField::adjusterChanged (Adjuster* a, double newval) void FlatField::adjusterAutoToggled (Adjuster* a, bool newval) { - if (multiImage) { if (flatFieldClipControl->getAutoInconsistent()) { flatFieldClipControl->setAutoInconsistent(false); @@ -340,20 +347,14 @@ void FlatField::flatFieldBlurTypeChanged () const int curSelection = flatFieldBlurType->get_active_row_number(); const RAWParams::FlatFieldBlurType blur_type = RAWParams::FlatFieldBlurType(curSelection); - Glib::ustring s; - - if (curSelection >= 0 && curSelection < std::numeric_limits::max()) { - s = flatFieldBlurType->get_active_text(); - } - if (multiImage || blur_type == procparams::RAWParams::FlatFieldBlurType::AREA) { flatFieldClipControl->show(); } else { flatFieldClipControl->hide(); } - if (listener) { - listener->panelChanged (EvFlatFieldBlurType, s); + if (listener && curSelection >= 0) { + listener->panelChanged (EvFlatFieldBlurType, flatFieldBlurType->get_active_text()); } } @@ -411,3 +412,16 @@ void FlatField::setShortcutPath(const Glib::ustring& path) } catch (Glib::Error&) {} } + +void FlatField::flatFieldAutoClipValueChanged(int n) +{ + idle_register.add( + [this, n]() -> bool + { + disableListener(); + flatFieldClipControl->setValue(n); + enableListener(); + return false; + } + ); +} diff --git a/rtgui/flatfield.h b/rtgui/flatfield.h index 4c0a33a54..46e2f6ddd 100644 --- a/rtgui/flatfield.h +++ b/rtgui/flatfield.h @@ -35,7 +35,7 @@ public: // add other info here }; -class FlatField : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class FlatField : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener { protected: @@ -58,19 +58,21 @@ protected: bool b_filter_asCurrent; bool israw; + IdleRegister idle_register; public: FlatField (); + ~FlatField () override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void setAdjusterBehavior (bool clipctrladd); - void trimValues (rtengine::procparams::ProcParams* pp); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + void trimValues (rtengine::procparams::ProcParams* pp) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; - void adjusterChanged (Adjuster* a, double newval); - void adjusterAutoToggled (Adjuster* a, bool newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; void flatFieldFileChanged (); void flatFieldFile_Reset (); void flatFieldAutoSelectChanged (); @@ -80,6 +82,7 @@ public: { ffp = p; }; + void flatFieldAutoClipValueChanged(int n = 0) override; }; #endif diff --git a/rtgui/gradient.cc b/rtgui/gradient.cc index cbaa39066..fd99e9939 100644 --- a/rtgui/gradient.cc +++ b/rtgui/gradient.cc @@ -2,7 +2,10 @@ * This file is part of RawTherapee. */ #include "gradient.h" + #include "rtimage.h" + +#include "../rtengine/procparams.h" #include "../rtengine/rt_math.h" using namespace rtengine; @@ -13,7 +16,8 @@ Gradient::Gradient () : FoldableToolPanel(this, "gradient", M("TP_GRADIENT_LABEL editHBox = Gtk::manage (new Gtk::HBox()); edit = Gtk::manage (new Gtk::ToggleButton()); - edit->add (*Gtk::manage (new RTImage ("editmodehand.png"))); + edit->get_style_context()->add_class("independent"); + edit->add (*Gtk::manage (new RTImage ("crosshair-adjust.png"))); edit->set_tooltip_text(M("EDIT_OBJECT_TOOLTIP")); editConn = edit->signal_toggled().connect( sigc::mem_fun(*this, &Gradient::editToggled) ); editHBox->pack_start(*edit, Gtk::PACK_SHRINK, 0); @@ -246,10 +250,9 @@ void Gradient::setDefaults (const ProcParams* defParams, const ParamsEdited* ped } } -void Gradient::adjusterChanged (Adjuster* a, double newval) +void Gradient::adjusterChanged(Adjuster* a, double newval) { - - updateGeometry (int(centerX->getValue()), int(centerY->getValue()), feather->getValue(), degree->getValue()); + updateGeometry(int(centerX->getValue()), int(centerY->getValue()), feather->getValue(), degree->getValue()); if (listener && getEnabled()) { @@ -265,6 +268,10 @@ void Gradient::adjusterChanged (Adjuster* a, double newval) } } +void Gradient::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void Gradient::enabledChanged () { @@ -345,7 +352,7 @@ CursorShape Gradient::getCursor(const int objectID) return CSMove2D; default: - return CSOpenHand; + return CSHandOpen; } } diff --git a/rtgui/gradient.h b/rtgui/gradient.h index 2201ea7c4..8812d6670 100644 --- a/rtgui/gradient.h +++ b/rtgui/gradient.h @@ -35,28 +35,29 @@ protected: public: Gradient (); - ~Gradient (); + ~Gradient () override; - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void setAdjusterBehavior (bool degreeadd, bool featheradd, bool strengthadd, bool centeradd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; void updateGeometry (const int centerX, const int centerY, const double feather, const double degree, const int fullWidth=-1, const int fullHeight=-1); - void setEditProvider (EditDataProvider* provider); + void setEditProvider (EditDataProvider* provider) override; // EditSubscriber interface - CursorShape getCursor(const int objectID); - bool mouseOver(const int modifierKey); - bool button1Pressed(const int modifierKey); - bool button1Released(); - bool drag1(const int modifierKey); - void switchOffEditMode (); + CursorShape getCursor(const int objectID) override; + bool mouseOver(const int modifierKey) override; + bool button1Pressed(const int modifierKey) override; + bool button1Released() override; + bool drag1(const int modifierKey) override; + void switchOffEditMode () override; }; #endif diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 49ce25b60..e2a40bcf8 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -23,6 +23,7 @@ #include "../rtengine/rt_math.h" #include "../rtengine/utils.h" #include "../rtengine/icons.h" +#include "../rtengine/procparams.h" #include "rtimage.h" #include "multilangmgr.h" @@ -43,27 +44,28 @@ IdleRegister::~IdleRegister() destroy(); } -void IdleRegister::add(GSourceFunc function, gpointer data, gint priority) +void IdleRegister::add(std::function function, gint priority) { - const auto dispatch = [](gpointer data) -> gboolean { - DataWrapper* const data_wrapper = static_cast(data); + const auto dispatch = + [](gpointer data) -> gboolean + { + DataWrapper* const data_wrapper = static_cast(data); - if (!data_wrapper->function(data_wrapper->data)) { - data_wrapper->self->mutex.lock(); - data_wrapper->self->ids.erase(data_wrapper); - data_wrapper->self->mutex.unlock(); + if (!data_wrapper->function()) { + data_wrapper->self->mutex.lock(); + data_wrapper->self->ids.erase(data_wrapper); + data_wrapper->self->mutex.unlock(); - delete data_wrapper; - return FALSE; - } + delete data_wrapper; + return FALSE; + } - return TRUE; - }; + return TRUE; + }; DataWrapper* const data_wrapper = new DataWrapper{ this, - function, - data + std::move(function) }; mutex.lock(); @@ -336,7 +338,7 @@ void drawCrop (Cairo::RefPtr cr, int imx, int imy, int imw, int } } 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." */ @@ -553,11 +555,11 @@ void ExpanderBox::hideBox() void MyExpander::init() { - inconsistentPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("expanderInconsistent.png")); - enabledPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("expanderEnabled.png")); - disabledPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("expanderDisabled.png")); - openedPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("expanderOpened.png")); - closedPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("expanderClosed.png")); + inconsistentPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("power-inconsistent-small.png")); + enabledPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("power-on-small.png")); + disabledPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("power-off-small.png")); + openedPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("expander-open-small.png")); + closedPBuf = Gdk::Pixbuf::create_from_file(rtengine::findIconAbsolutePath("expander-closed-small.png")); } MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) : @@ -945,6 +947,9 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event) double step = adjust->get_step_increment(); double value2 = 0.; +// printf("MyScrolledwindow::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n", +// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event); + if (event->direction == GDK_SCROLL_DOWN) { value2 = value + step; @@ -955,13 +960,20 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event) if (value2 != value) { scroll->set_value(value2); } - } else { + } else if (event->direction == GDK_SCROLL_UP) { value2 = value - step; if (value2 < lower) { value2 = lower; } + if (value2 != value) { + scroll->set_value(value2); + } + } else if (event->direction == GDK_SCROLL_SMOOTH) { + if (abs(event->delta_y) > 0.1) { + value2 = rtengine::LIM(value + (event->delta_y > 0 ? step : -step), lower, upper); + } if (value2 != value) { scroll->set_value(value2); } @@ -981,16 +993,93 @@ void MyScrolledWindow::get_preferred_height_for_width_vfunc (int width, int &min natural_height = minimum_height = 50; } +/* + * + * Derived class of some widgets to properly handle the scroll wheel ; + * the user has to use the Shift key to be able to change the widget's value, + * otherwise the mouse wheel will scroll the toolbar. + * + */ +MyScrolledToolbar::MyScrolledToolbar () +{ + set_policy (Gtk::POLICY_EXTERNAL, Gtk::POLICY_NEVER); + get_style_context()->add_class("scrollableToolbar"); + + // Works fine with Gtk 3.22, but a a custom made get_preferred_height had to be created as a workaround + // taken from the official Gtk3.22 source code + //set_propagate_natural_height(true); +} + +bool MyScrolledToolbar::on_scroll_event (GdkEventScroll* event) +{ + Glib::RefPtr adjust = get_hadjustment(); + Gtk::Scrollbar *scroll = get_hscrollbar(); + + if (adjust && scroll) { + double upper = adjust->get_upper(); + double lower = adjust->get_lower(); + double value = adjust->get_value(); + double step = adjust->get_step_increment() * 2; + double value2 = 0.; + +// printf("MyScrolledToolbar::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n", +// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event); + + if (event->direction == GDK_SCROLL_DOWN) { + value2 = rtengine::min(value + step, upper); + if (value2 != value) { + scroll->set_value(value2); + } + } else if (event->direction == GDK_SCROLL_UP) { + value2 = rtengine::max(value - step, lower); + if (value2 != value) { + scroll->set_value(value2); + } + } else if (event->direction == GDK_SCROLL_SMOOTH) { + if (event->delta_x) { // if the user use a pad, it can scroll horizontally + value2 = rtengine::LIM(value + (event->delta_x > 0 ? 30 : -30), lower, upper); + } else if (event->delta_y) { + value2 = rtengine::LIM(value + (event->delta_y > 0 ? 30 : -30), lower, upper); + } + if (value2 != value) { + scroll->set_value(value2); + } + } + } + + return true; +} + +void MyScrolledToolbar::get_preferred_height (int &minimumHeight, int &naturalHeight) +{ + int currMinHeight = 0; + int currNatHeight = 0; + std::vector childs = get_children(); + minimumHeight = naturalHeight = 0; + + for (auto child : childs) + { + if(child->is_visible()) { + child->get_preferred_height(currMinHeight, currNatHeight); + minimumHeight = rtengine::max(currMinHeight, minimumHeight); + naturalHeight = rtengine::max(currNatHeight, naturalHeight); + } + } +} + MyComboBoxText::MyComboBoxText (bool has_entry) : Gtk::ComboBoxText(has_entry) { minimumWidth = naturalWidth = 70; Gtk::CellRendererText* cellRenderer = dynamic_cast(get_first_cell()); cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; + add_events(Gdk::SCROLL_MASK|Gdk::SMOOTH_SCROLL_MASK); } bool MyComboBoxText::on_scroll_event (GdkEventScroll* event) { +// printf("MyComboboxText::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n", +// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event); // If Shift is pressed, the widget is modified if (event->state & GDK_SHIFT_MASK) { Gtk::ComboBoxText::on_scroll_event(event); @@ -1148,6 +1237,8 @@ bool MySpinButton::on_scroll_event (GdkEventScroll* event) bool MyHScale::on_scroll_event (GdkEventScroll* event) { +// printf("MyHScale::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n", +// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event); // If Shift is pressed, the widget is modified if (event->state & GDK_SHIFT_MASK) { Gtk::HScale::on_scroll_event(event); @@ -1179,7 +1270,7 @@ MyFileChooserButton::MyFileChooserButton(const Glib::ustring &title, Gtk::FileCh 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); + img->set_from_icon_name("folder-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(); @@ -1189,7 +1280,7 @@ MyFileChooserButton::MyFileChooserButton(const Glib::ustring &title, Gtk::FileCh if (GTK_MINOR_VERSION < 20) { set_border_width(2); // margin doesn't work on GTK < 3.20 } - + set_name("MyFileChooserButton"); } @@ -1272,14 +1363,14 @@ 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; @@ -1363,63 +1454,15 @@ void MyFileChooserButton::get_preferred_width_for_height_vfunc (int height, int -TextOrIcon::TextOrIcon (Glib::ustring fname, Glib::ustring labelTx, Glib::ustring tooltipTx, TOITypes type) +TextOrIcon::TextOrIcon (const Glib::ustring &fname, const Glib::ustring &labelTx, const Glib::ustring &tooltipTx) { - imgIcon = nullptr; - label = nullptr; - filename = fname; - labelText = labelTx; - tooltipText = tooltipTx; + pack_start(*Gtk::manage(new RTImage(fname)), Gtk::PACK_SHRINK, 0); + set_tooltip_markup("" + labelTx + "\n" + tooltipTx); set_name("TextOrIcon"); - - switchTo(type); -} - -TextOrIcon::~TextOrIcon () -{ - if (imgIcon) { - delete imgIcon; - } - - if (label) { - delete label; - } -} - -void TextOrIcon::switchTo(TOITypes type) -{ - switch (type) { - case (TOI_ICON): - if (!imgIcon) { - removeIfThere(this, label, false); - delete label; - label = nullptr; - imgIcon = new RTImage (filename); - pack_start(*imgIcon, Gtk::PACK_SHRINK, 0); - set_tooltip_markup ("" + labelText + "\n" + tooltipText); - } - - // do nothing if imgIcon exist, which mean that it is currently being displayed - break; - - case(TOI_TEXT): - default: - if (!label) { - removeIfThere(this, imgIcon, false); - delete imgIcon; - imgIcon = nullptr; - label = new Gtk::Label (labelText, Gtk::ALIGN_CENTER); - pack_start(*label, Gtk::PACK_EXPAND_WIDGET, 0); - set_tooltip_markup (tooltipText); - } - - // do nothing if label exist, which mean that it is currently being displayed - break; - } - show_all(); + } MyImageMenuItem::MyImageMenuItem(Glib::ustring label, Glib::ustring imageFileName) diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 2861b4913..fdf1ea5c7 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -19,6 +19,7 @@ #ifndef __GUI_UTILS_ #define __GUI_UTILS_ +#include #include #include @@ -50,14 +51,13 @@ class IdleRegister final : public: ~IdleRegister(); - void add(GSourceFunc function, gpointer data, gint priority = G_PRIORITY_DEFAULT_IDLE); + void add(std::function function, gint priority = G_PRIORITY_DEFAULT_IDLE); void destroy(); private: struct DataWrapper { IdleRegister* const self; - GSourceFunc function; - gpointer data; + std::function function; }; std::map ids; @@ -149,7 +149,7 @@ private: public: explicit ExpanderBox( Gtk::Container *p); - ~ExpanderBox( ) + ~ExpanderBox( ) override { delete pC; } @@ -194,6 +194,8 @@ private: ExpanderBox* expBox; /// Frame that includes the child and control its visibility Gtk::EventBox *imageEvBox; /// Enable/Disable or Open/Close arrow event box + using Gtk::Container::add; + /// Triggered on opened/closed event bool on_toggle(GdkEventButton* event); /// Triggered on enabled/disabled change -> will emit a toggle event to the connected objects @@ -285,14 +287,27 @@ public: class MyScrolledWindow : public Gtk::ScrolledWindow { - bool on_scroll_event (GdkEventScroll* event); - void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const; - void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const; + bool on_scroll_event (GdkEventScroll* event) override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; public: MyScrolledWindow(); }; +/** + * @brief subclass of Gtk::ScrolledWindow in order to handle the large toolbars (wider than available space) + */ +class MyScrolledToolbar : public Gtk::ScrolledWindow +{ + + bool on_scroll_event (GdkEventScroll* event) override; + void get_preferred_height (int &minimumHeight, int &naturalHeight); + +public: + MyScrolledToolbar(); +}; + /** * @brief subclass of Gtk::ComboBox in order to handle the scrollwheel */ @@ -300,9 +315,9 @@ class MyComboBox : public Gtk::ComboBox { int naturalWidth, minimumWidth; - 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; + bool on_scroll_event (GdkEventScroll* event) override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; public: MyComboBox (); @@ -318,9 +333,9 @@ class MyComboBoxText : public Gtk::ComboBoxText int naturalWidth, minimumWidth; sigc::connection myConnection; - 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; + bool on_scroll_event (GdkEventScroll* event) override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; public: explicit MyComboBoxText (bool has_entry = false); @@ -337,8 +352,8 @@ class MySpinButton : public Gtk::SpinButton { protected: - bool on_scroll_event (GdkEventScroll* event); - bool on_key_press_event (GdkEventKey* event); + bool on_scroll_event (GdkEventScroll* event) override; + bool on_key_press_event (GdkEventKey* event) override; public: MySpinButton (); @@ -351,8 +366,8 @@ public: class MyHScale : public Gtk::HScale { - bool on_scroll_event (GdkEventScroll* event); - bool on_key_press_event (GdkEventKey* event); + bool on_scroll_event (GdkEventScroll* event) override; + bool on_key_press_event (GdkEventKey* event) override; }; /** @@ -375,9 +390,9 @@ private: 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; + bool on_scroll_event (GdkEventScroll* event) override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; void set_none(); @@ -386,7 +401,7 @@ public: sigc::signal &signal_selection_changed(); sigc::signal &signal_file_set(); - + std::string get_filename() const; bool set_filename(const std::string &filename); @@ -394,7 +409,7 @@ public: 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; @@ -437,11 +452,6 @@ typedef enum RTOrientation { RTO_Top2Bottom } eRTOrientation; -enum TOITypes { - TOI_TEXT, - TOI_ICON -}; - typedef enum RTNav { NAV_NONE, NAV_NEXT, @@ -454,18 +464,8 @@ typedef enum RTNav { class TextOrIcon : public Gtk::HBox { -protected: - Gtk::Image* imgIcon; - Gtk::Label* label; - Glib::ustring filename; - Glib::ustring labelText; - Glib::ustring tooltipText; - public: - TextOrIcon (Glib::ustring filename, Glib::ustring labelTx, Glib::ustring tooltipTx, TOITypes type); - ~TextOrIcon (); - - void switchTo(TOITypes type); + TextOrIcon (const Glib::ustring &filename, const Glib::ustring &labelTx, const Glib::ustring &tooltipTx); }; class MyImageMenuItem : public Gtk::MenuItem @@ -486,8 +486,8 @@ class MyProgressBar : public Gtk::ProgressBar private: int w; - 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 get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; public: explicit MyProgressBar(int width); diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 002c4608b..8ee19eca8 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -21,12 +21,14 @@ #include "guiutils.h" #include "options.h" #include +#include #include "../rtengine/LUT.h" #include "rtimage.h" #include "../rtengine/improccoordinator.h" #include "../rtengine/color.h" #include "../rtengine/opthelper.h" #include "../rtengine/iccstore.h" + using namespace rtengine; extern Options options; @@ -37,23 +39,19 @@ extern Options options; // HistogramPanel HistogramPanel::HistogramPanel () { - - set_vexpand(false); - set_hexpand(true); - set_valign(Gtk::ALIGN_START); - set_halign(Gtk::ALIGN_FILL); + setExpandAlignProperties(this, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); set_name("HistogramPanel"); histogramArea = Gtk::manage (new HistogramArea (this)); - histogramArea->set_hexpand(true); - histogramArea->set_vexpand(true); + setExpandAlignProperties(histogramArea, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + histogramRGBArea = Gtk::manage (new HistogramRGBArea ()); - histogramRGBArea->set_hexpand(true); - histogramRGBArea->set_vexpand(false); - histogramRGBArea->set_halign(Gtk::ALIGN_FILL); - histogramRGBArea->set_valign(Gtk::ALIGN_END); + setExpandAlignProperties(histogramRGBArea, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_END); histogramRGBArea->show(); + // connecting the two childs + histogramArea->signal_factor_changed().connect( sigc::mem_fun(*histogramRGBArea, &HistogramRGBArea::factorChanged) ); + gfxGrid = Gtk::manage (new Gtk::Grid ()); gfxGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); gfxGrid->set_row_spacing(1); @@ -65,23 +63,25 @@ HistogramPanel::HistogramPanel () gfxGrid->add (*histogramRGBArea); } - redImage = new RTImage ("histRed.png"); - greenImage = new RTImage ("histGreen.png"); - blueImage = new RTImage ("histBlue.png"); - valueImage = new RTImage ("histValue.png"); - chroImage = new RTImage ("histChro.png"); - rawImage = new RTImage ("histRaw.png"); - fullImage = new RTImage ("histFull.png"); - barImage = new RTImage ("histBar.png"); + redImage = new RTImage ("histogram-red-on-small.png"); + greenImage = new RTImage ("histogram-green-on-small.png"); + blueImage = new RTImage ("histogram-blue-on-small.png"); + valueImage = new RTImage ("histogram-silver-on-small.png"); + chroImage = new RTImage ("histogram-gold-on-small.png"); + rawImage = new RTImage ("histogram-bayer-on-small.png"); + barImage = new RTImage ("histogram-bar-on-small.png"); - redImage_g = new RTImage ("histRedg.png"); - greenImage_g = new RTImage ("histGreeng.png"); - blueImage_g = new RTImage ("histBlueg.png"); - valueImage_g = new RTImage ("histValueg.png"); - chroImage_g = new RTImage ("histChrog.png"); - rawImage_g = new RTImage ("histRawg.png"); - fullImage_g = new RTImage ("histFullg.png"); - barImage_g = new RTImage ("histBarg.png"); + redImage_g = new RTImage ("histogram-red-off-small.png"); + greenImage_g = new RTImage ("histogram-green-off-small.png"); + blueImage_g = new RTImage ("histogram-blue-off-small.png"); + valueImage_g = new RTImage ("histogram-silver-off-small.png"); + chroImage_g = new RTImage ("histogram-gold-off-small.png"); + rawImage_g = new RTImage ("histogram-bayer-off-small.png"); + barImage_g = new RTImage ("histogram-bar-off-small.png"); + + mode0Image = new RTImage ("histogram-mode-linear-small.png"); + mode1Image = new RTImage ("histogram-mode-logx-small.png"); + mode2Image = new RTImage ("histogram-mode-logxy-small.png"); showRed = Gtk::manage (new Gtk::ToggleButton ()); showGreen = Gtk::manage (new Gtk::ToggleButton ()); @@ -89,7 +89,7 @@ HistogramPanel::HistogramPanel () showValue = Gtk::manage (new Gtk::ToggleButton ()); showChro = Gtk::manage (new Gtk::ToggleButton ()); showRAW = Gtk::manage (new Gtk::ToggleButton ()); - showFull = Gtk::manage (new Gtk::ToggleButton ()); + showMode = Gtk::manage (new Gtk::Button ()); showBAR = Gtk::manage (new Gtk::ToggleButton ()); showRed->set_name("histButton"); @@ -104,8 +104,8 @@ HistogramPanel::HistogramPanel () showChro->set_can_focus(false); showRAW->set_name("histButton"); showRAW->set_can_focus(false); - showFull->set_name("fullButton"); - showFull->set_can_focus(false); + showMode->set_name("histButton"); + showMode->set_can_focus(false); showBAR->set_name("histButton"); showBAR->set_can_focus(false); @@ -115,7 +115,7 @@ HistogramPanel::HistogramPanel () showValue->set_relief (Gtk::RELIEF_NONE); showChro->set_relief (Gtk::RELIEF_NONE); showRAW->set_relief (Gtk::RELIEF_NONE); - showFull->set_relief (Gtk::RELIEF_NONE); + showMode->set_relief (Gtk::RELIEF_NONE); showBAR->set_relief (Gtk::RELIEF_NONE); showRed->set_tooltip_text (M("HISTOGRAM_TOOLTIP_R")); @@ -124,20 +124,19 @@ HistogramPanel::HistogramPanel () showValue->set_tooltip_text (M("HISTOGRAM_TOOLTIP_L")); showChro->set_tooltip_text (M("HISTOGRAM_TOOLTIP_CHRO")); showRAW->set_tooltip_text (M("HISTOGRAM_TOOLTIP_RAW")); - showFull->set_tooltip_text (M("HISTOGRAM_TOOLTIP_FULL")); + showMode->set_tooltip_text (M("HISTOGRAM_TOOLTIP_MODE")); showBAR->set_tooltip_text (M("HISTOGRAM_TOOLTIP_BAR")); buttonGrid = Gtk::manage (new Gtk::Grid ()); buttonGrid->set_orientation(Gtk::ORIENTATION_VERTICAL); - showRed->set_active (true); - showGreen->set_active (true); - showBlue->set_active (true); - showValue->set_active (true); - showChro->set_active (false);//unactive by default - - showRAW->set_active (false); - showFull->set_active (!options.histogramFullMode); - showBAR->set_active (options.histogramBar); + showRed->set_active (options.histogramRed); + showGreen->set_active (options.histogramGreen); + showBlue->set_active (options.histogramBlue); + showValue->set_active (options.histogramLuma); + showChro->set_active (options.histogramChroma); + showRAW->set_active (options.histogramRAW); + // no showMode->set_active(), as it's not a ToggleButton + showBAR->set_active (options.histogramBar); showRed->set_image (showRed->get_active() ? *redImage : *redImage_g); showGreen->set_image (showGreen->get_active() ? *greenImage : *greenImage_g); @@ -145,41 +144,22 @@ HistogramPanel::HistogramPanel () showValue->set_image (showValue->get_active() ? *valueImage : *valueImage_g); showChro->set_image (showChro->get_active() ? *chroImage : *chroImage_g); showRAW->set_image (showRAW->get_active() ? *rawImage : *rawImage_g); - showFull->set_image (showFull->get_active() ? *fullImage : *fullImage_g); + if (options.histogramDrawMode == 0) + showMode->set_image(*mode0Image); + else if (options.histogramDrawMode == 1) + showMode->set_image(*mode1Image); + else + showMode->set_image(*mode2Image); showBAR->set_image (showBAR->get_active() ? *barImage : *barImage_g); - showRed->set_hexpand(false); - showRed->set_vexpand(false); - showRed->set_halign(Gtk::ALIGN_CENTER); - showRed->set_valign(Gtk::ALIGN_START); - showGreen->set_hexpand(false); - showGreen->set_vexpand(false); - showGreen->set_halign(Gtk::ALIGN_CENTER); - showGreen->set_valign(Gtk::ALIGN_START); - showBlue->set_hexpand(false); - showRed->set_vexpand(false); - showBlue->set_halign(Gtk::ALIGN_CENTER); - showBlue->set_valign(Gtk::ALIGN_START); - showValue->set_hexpand(false); - showValue->set_vexpand(false); - showValue->set_halign(Gtk::ALIGN_CENTER); - showValue->set_valign(Gtk::ALIGN_START); - showChro->set_hexpand(false); - showChro->set_vexpand(false); - showChro->set_halign(Gtk::ALIGN_CENTER); - showChro->set_valign(Gtk::ALIGN_START); - showRAW->set_hexpand(false); - showRAW->set_vexpand(false); - showRAW->set_halign(Gtk::ALIGN_CENTER); - showRAW->set_valign(Gtk::ALIGN_START); - showFull->set_hexpand(false); - showFull->set_vexpand(false); - showFull->set_halign(Gtk::ALIGN_CENTER); - showFull->set_valign(Gtk::ALIGN_START); - showBAR->set_hexpand(false); - showBAR->set_vexpand(false); - showBAR->set_halign(Gtk::ALIGN_CENTER); - showBAR->set_valign(Gtk::ALIGN_START); + setExpandAlignProperties(showRed , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showGreen, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showBlue , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showValue, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showChro , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showRAW , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showMode , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + setExpandAlignProperties(showBAR , false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); showRed->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::red_toggled), showRed ); showGreen->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::green_toggled), showGreen ); @@ -187,7 +167,7 @@ HistogramPanel::HistogramPanel () showValue->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::value_toggled), showValue ); showChro->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::chro_toggled), showChro ); showRAW->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::raw_toggled), showRAW ); - showFull->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::full_toggled), showFull ); + showMode->signal_released().connect( sigc::mem_fun(*this, &HistogramPanel::mode_released), showMode ); showBAR->signal_toggled().connect( sigc::mem_fun(*this, &HistogramPanel::bar_toggled), showBAR ); buttonGrid->add (*showRed); @@ -196,7 +176,7 @@ HistogramPanel::HistogramPanel () buttonGrid->add (*showValue); buttonGrid->add (*showChro); buttonGrid->add (*showRAW); - buttonGrid->add (*showFull); + buttonGrid->add (*showMode); buttonGrid->add (*showBAR); // Put the button vbox next to the window's border to be less disturbing @@ -221,7 +201,9 @@ HistogramPanel::~HistogramPanel () delete valueImage; delete chroImage; delete rawImage; - delete fullImage; + delete mode0Image; + delete mode1Image; + delete mode2Image; delete barImage; delete redImage_g; @@ -230,7 +212,6 @@ HistogramPanel::~HistogramPanel () delete valueImage_g; delete chroImage_g; delete rawImage_g; - delete fullImage_g; delete barImage_g; } @@ -238,34 +219,16 @@ HistogramPanel::~HistogramPanel () void HistogramPanel::resized (Gtk::Allocation& req) { - /* - rconn.block (true); - - int gHeight = req.get_width()/2; - if (gHeight > 150) gHeight = 150; else if (gHeight < 100) gHeight = 100; - int bHeight = req.get_width()/30; - if (bHeight > 10) bHeight = 10; else if (bHeight < 5 ) bHeight = 5; - histogramArea->set_size_request (req.get_width(), gHeight); - histogramRGBArea->set_size_request (req.get_width(), bHeight); - - rconn.block (false); - */ - histogramArea->updateBackBuffer (); histogramArea->queue_draw (); - if (histogramRGBArea->getFreeze()) { - histogramRGBArea->updateFreeze(false); - // set histogramRGBArea invalid; - histogramRGBArea->updateBackBuffer(-1, -1, -1); - // re-set freeze to old state - histogramRGBArea->updateFreeze(true); - histogramRGBArea->queue_draw (); - } else { - // set histogramRGBArea invalid; - histogramRGBArea->updateBackBuffer(-1, -1, -1); - histogramRGBArea->queue_draw (); - } + // set histogramRGBArea invalid; + histogramRGBArea->updateBackBuffer(-1, -1, -1); + histogramRGBArea->queue_draw (); + + // Store current height of the histogram + options.histogramHeight = get_height(); + } void HistogramPanel::red_toggled () @@ -312,26 +275,34 @@ void HistogramPanel::raw_toggled () rgbv_toggled(); } -void HistogramPanel::full_toggled () + +void HistogramPanel::mode_released () { - options.histogramFullMode = !showFull->get_active(); - showFull->set_image(showFull->get_active() ? *fullImage : *fullImage_g); + options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; + if (options.histogramDrawMode == 0) + showMode->set_image(*mode0Image); + else if (options.histogramDrawMode == 1) + showMode->set_image(*mode1Image); + else + showMode->set_image(*mode2Image); rgbv_toggled(); } + void HistogramPanel::bar_toggled () { showBAR->set_image(showBAR->get_active() ? *barImage : *barImage_g); rgbv_toggled(); } + void HistogramPanel::rgbv_toggled () { // Update Display - histogramArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showRAW->get_active(), showFull->get_active(), showChro->get_active()); + histogramArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), options.histogramDrawMode); histogramArea->queue_draw (); - histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showRAW->get_active(), showBAR->get_active(), showChro->get_active()); + histogramRGBArea->updateOptions (showRed->get_active(), showGreen->get_active(), showBlue->get_active(), showValue->get_active(), showChro->get_active(), showRAW->get_active(), showBAR->get_active()); histogramRGBArea->updateBackBuffer (0, 0, 0); - histogramArea->queue_draw (); + histogramRGBArea->queue_draw (); } void HistogramPanel::setHistRGBInvalid () @@ -341,30 +312,17 @@ void HistogramPanel::setHistRGBInvalid () histogramRGBArea->queue_draw (); } -// "Freeze" is not a button, but a RMB-click, so this is not in the RGBV-Toggle method -void HistogramPanel::toggleFreeze () -{ - if (histogramRGBArea->getFreeze()) { - histogramRGBArea->updateFreeze(false); - } else if (histogramRGBArea->getShow()) { - histogramRGBArea->updateFreeze(true); - } - - return; -} - -void HistogramPanel::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b) +void HistogramPanel::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) { if (!validPos) { // do something to un-show vertical bars histogramRGBArea->updateBackBuffer(-1, -1, -1); - histogramRGBArea->queue_draw (); } else { // do something to show vertical bars histogramRGBArea->updateBackBuffer(r, g, b, profile, profileW); - histogramRGBArea->queue_draw (); } + histogramRGBArea->queue_draw (); } /* @@ -386,19 +344,36 @@ void HistogramPanel::reorder (Gtk::PositionType align) } } -// FullModeListener interface: -void HistogramPanel::toggle_button_full () +// DrawModeListener interface: +void HistogramPanel::toggleButtonMode () { - showFull->set_active (!showFull->get_active ()); - showFull->set_image(showFull->get_active() ? *fullImage : *fullImage_g); + if (options.histogramDrawMode == 0) + showMode->set_image(*mode0Image); + else if (options.histogramDrawMode == 1) + showMode->set_image(*mode1Image); + else + showMode->set_image(*mode2Image); +} + +// +// +// +// HistogramScaling +double HistogramScaling::log(double vsize, double val) +{ + //double factor = 10.0; // can be tuned if necessary - higher is flatter curve + return vsize * std::log(factor / (factor + val)) / std::log(factor / (factor + vsize)); } // // // // HistogramRGBArea -HistogramRGBArea::HistogramRGBArea () ://needChroma unactive by default - val(0), r(0), g(0), b(0), frozen(false), valid(false), needRed(true), needGreen(true), needBlue(true), needLuma(true), rawMode(false), showMode(options.histogramBar), barDisplayed(options.histogramBar), needChroma(false), parent(nullptr) +HistogramRGBArea::HistogramRGBArea () : + val(0), r(0), g(0), b(0), valid(false), + needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), + needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), + showMode(options.histogramBar), barDisplayed(options.histogramBar), parent(nullptr) { get_style_context()->add_class("drawingarea"); @@ -445,9 +420,9 @@ void HistogramRGBArea::get_preferred_height_for_width_vfunc (int width, int &min { int bHeight = width / 30; - if (bHeight > 10) { - bHeight = 10; - } else if (bHeight < 5 ) { + if (bHeight > 10) { + bHeight = 10; + } else if (bHeight < 5) { bHeight = 5; } @@ -455,35 +430,25 @@ void HistogramRGBArea::get_preferred_height_for_width_vfunc (int width, int &min natural_height = bHeight; } +// unused? void HistogramRGBArea::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const { get_preferred_width_vfunc (minimum_width, natural_width); } -bool HistogramRGBArea::getFreeze() -{ - return(frozen); -} - bool HistogramRGBArea::getShow() { return(showMode); } -void HistogramRGBArea::updateFreeze (bool f) +void HistogramRGBArea::updateBackBuffer (int r, int g, int b, const Glib::ustring &profile, const Glib::ustring &profileW) { - frozen = f; - return; -} - -void HistogramRGBArea::updateBackBuffer (int r, int g, int b, Glib::ustring profile, Glib::ustring profileW) -{ - if (!get_realized () || frozen || !showMode) { + if (!get_realized () || !showMode || rawMode) { 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; @@ -508,36 +473,56 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, Glib::ustring prof if (needRed) { // Red cc->set_source_rgb(1.0, 0.0, 0.0); - cc->move_to((int)(r * (winw / 256.0)), 0); - cc->line_to((int)(r * (winw / 256.0)), winh - 0); + if (options.histogramDrawMode < 2) { + cc->move_to(r * (winw - 3) / 255.0 + 2, 0); // Rescaling seems needed to fit between boundaries of draw area + cc->line_to(r * (winw - 3) / 255.0 + 2, winh - 0); + } else { + cc->move_to(HistogramScaling::log (255, r) * (winw - 3) / 255.0 + 2, 0); + cc->line_to(HistogramScaling::log (255, r) * (winw - 3) / 255.0 + 2, winh - 0); + } cc->stroke(); } if (needGreen) { // Green cc->set_source_rgb(0.0, 1.0, 0.0); - cc->move_to((int)(g * (winw / 256.0)), 0); - cc->line_to((int)(g * (winw / 256.0)), winh - 0); + if (options.histogramDrawMode < 2) { + cc->move_to(g * (winw - 3) / 255.0 + 2, 0); + cc->line_to(g * (winw - 3) / 255.0 + 2, winh - 0); + } else { + cc->move_to(HistogramScaling::log (255, g) * (winw - 3) / 255.0 + 2, 0); + cc->line_to(HistogramScaling::log (255, g) * (winw - 3) / 255.0 + 2, winh - 0); + } cc->stroke(); } if (needBlue) { // Blue cc->set_source_rgb(0.0, 0.0, 1.0); - cc->move_to((int)(b * (winw / 256.0)), 0); - cc->line_to((int)(b * (winw / 256.0)), winh - 0); + if (options.histogramDrawMode < 2) { + cc->move_to(b * (winw - 3) / 255.0 + 2, 0); + cc->line_to(b * (winw - 3) / 255.0 + 2, winh - 0); + } else { + cc->move_to(HistogramScaling::log (255, b) * (winw - 3) / 255.0 + 2, 0); + cc->line_to(HistogramScaling::log (255, b) * (winw - 3) / 255.0 + 2, winh - 0); + } cc->stroke(); } 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 cc->set_source_rgb(1.0, 1.0, 1.0); - cc->move_to((int)((Lab_L) * (winw / 100.0)), 0); - cc->line_to((int)((Lab_L) * (winw / 100.0)), winh - 0); + if (options.histogramDrawMode < 2) { + cc->move_to(Lab_L * (winw - 3) / 100.0 + 2, 0); + cc->line_to(Lab_L * (winw - 3) / 100.0 + 2, winh - 0); + } else { + cc->move_to(HistogramScaling::log (100, Lab_L) * (winw - 3) / 100.0 + 2, 0); + cc->line_to(HistogramScaling::log (100, Lab_L) * (winw - 3) / 100.0 + 2, winh - 0); + } cc->stroke(); } @@ -545,9 +530,14 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, Glib::ustring prof // Chroma float chromaval = sqrt(Lab_a * Lab_a + Lab_b * Lab_b) / 1.8; // float chromaval = sqrt(Lab_a*Lab_a + Lab_b*Lab_b); - cc->set_source_rgb(0.0, 0.0, 0.0); - cc->move_to((int)(chromaval * (winw / 100.0)), 0); - cc->line_to((int)(chromaval * (winw / 100.0)), winh - 0); + cc->set_source_rgb(0.9, 0.9, 0.0); + if (options.histogramDrawMode < 2) { + cc->move_to(chromaval * (winw - 3) / 100.0 + 2, 0); + cc->line_to(chromaval * (winw - 3) / 100.0 + 2, winh - 0); + } else { + cc->move_to(HistogramScaling::log (100, chromaval) * (winw - 3) / 100.0 + 2, 0); + cc->line_to(HistogramScaling::log (100, chromaval) * (winw - 3) / 100.0 + 2, winh - 0); + } cc->stroke(); } } @@ -557,153 +547,6 @@ void HistogramRGBArea::updateBackBuffer (int r, int g, int b, Glib::ustring prof 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) { @@ -719,61 +562,49 @@ void HistogramRGBArea::update (int valh, int rh, int gh, int bh) harih->pending++; - const auto func = [](gpointer data) -> gboolean { - HistogramRGBAreaIdleHelper* const harih = static_cast(data); + idle_register.add( + [this]() -> bool + { + if (harih->destroyed) { + if (harih->pending == 1) { + delete harih; + } else { + --harih->pending; + } - if (harih->destroyed) { - if (harih->pending == 1) { - delete harih; - } else { - harih->pending--; + return false; } - return 0; + harih->harea->updateBackBuffer(-1, -1, -1); + harih->harea->queue_draw (); + + --harih->pending; + + return false; } - - harih->harea->updateBackBuffer(-1, -1, -1); - harih->harea->queue_draw (); - - harih->pending--; - - return FALSE; - }; - - idle_register.add(func, harih); + ); } -void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool raw, bool bar, bool c) +void HistogramRGBArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, bool bar) { - needRed = r; - needGreen = g; - needBlue = b; - needLuma = l; - rawMode = raw; - showMode = bar; - needChroma = c; - - // Histogram RGB BAR button logic goes here + options.histogramRed = needRed = r; + options.histogramGreen = needGreen = g; + options.histogramBlue = needBlue = b; + options.histogramLuma = needLuma = l; + options.histogramChroma = needChroma = c; + options.histogramRAW = rawMode = raw; + options.histogramBar = showMode = bar; + // Show/hide the RGB bar widget if (bar && !barDisplayed) { - // Toggled on, add (show) the widget parent->add(*this); - options.histogramBar = true; barDisplayed = true; } else if (!bar && barDisplayed) { - // Toggled off, remove (hide) the widget removeIfThere(parent, this, false); - options.histogramBar = false; barDisplayed = false; - // unfreeze - updateFreeze(false); } - // Disable (but don't hide it) the bar button when RAW histogram is displayed - if (rawMode) { - showMode = false; - } } void HistogramRGBArea::on_realize () @@ -808,24 +639,33 @@ bool HistogramRGBArea::on_button_press_event (GdkEventButton* event) { if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { - // do something. Maybe un-freeze ? + // do something? } return true; } +void HistogramRGBArea::factorChanged (double newFactor) +{ + factor = newFactor; +} + // // // // HistogramArea -HistogramArea::HistogramArea (FullModeListener *fml) : //needChroma unactive by default - valid(false), fullMode(options.histogramFullMode), myFullModeListener(fml), oldwidth(-1), oldheight(-1), needLuma(true), needRed(true), needGreen(true), needBlue(true), rawMode(false), needChroma(false) +HistogramArea::HistogramArea (DrawModeListener *fml) : + valid(false), drawMode(options.histogramDrawMode), myDrawModeListener(fml), + oldwidth(-1), oldheight(-1), + needRed(options.histogramRed), needGreen(options.histogramGreen), needBlue(options.histogramBlue), + needLuma(options.histogramLuma), needChroma(options.histogramChroma), rawMode(options.histogramRAW), + isPressed(false), movingPosition(0.0) { - lhist(256); rhist(256); ghist(256); bhist(256); + lhist(256); chist(256); get_style_context()->add_class("drawingarea"); @@ -850,35 +690,28 @@ HistogramArea::~HistogramArea () Gtk::SizeRequestMode HistogramArea::get_request_mode_vfunc () const { - return Gtk::SIZE_REQUEST_HEIGHT_FOR_WIDTH; + return Gtk::SIZE_REQUEST_CONSTANT_SIZE; } void HistogramArea::get_preferred_height_vfunc (int &minimum_height, int &natural_height) const { - int minimumWidth = 0; - int naturalWidth = 0; - get_preferred_width_vfunc (minimumWidth, naturalWidth); - get_preferred_height_for_width_vfunc (minimumWidth, minimum_height, natural_height); + + minimum_height = 100; + natural_height = 200; } void HistogramArea::get_preferred_width_vfunc (int &minimum_width, int &natural_width) const { - minimum_width = 60; - natural_width = 200; + + minimum_width = 200; + natural_width = 400; } void HistogramArea::get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const { - int gHeight = width / 2; - if (gHeight > 150) { - gHeight = 150; - } else if (gHeight < 100) { - gHeight = 100; - } - - minimum_height = gHeight * 0.7; - natural_height = gHeight; + minimum_height = 0; + natural_height = 0; } void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const @@ -886,65 +719,73 @@ void HistogramArea::get_preferred_width_for_height_vfunc (int height, int &minim get_preferred_width_vfunc (minimum_width, natural_width); } -void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool raw, bool full, bool c) +void HistogramArea::updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode) { - needRed = r; - needGreen = g; - needBlue = b; - needLuma = l; - rawMode = raw; - fullMode = !full; - needChroma = c; + options.histogramRed = needRed = r; + options.histogramGreen = needGreen = g; + options.histogramBlue = needBlue = b; + options.histogramLuma = needLuma = l; + options.histogramChroma = needChroma = c; + options.histogramRAW = rawMode = raw; + options.histogramDrawMode = drawMode = mode; updateBackBuffer (); } -void HistogramArea::update (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw, LUTu &histChroma) +void HistogramArea::update( + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histChroma, + const LUTu& histRedRaw, + const LUTu& histGreenRaw, + const LUTu& histBlueRaw +) { if (histRed) { - lhist = histLuma; - chist = histChroma; rhist = histRed; ghist = histGreen; bhist = histBlue; + lhist = histLuma; + chist = histChroma; rhistRaw = histRedRaw; ghistRaw = histGreenRaw; bhistRaw = histBlueRaw; - valid = true; } else { valid = false; } haih->pending++; - // Can be done outside of the GUI thread - const auto func = [](gpointer data) -> gboolean { - HistogramAreaIdleHelper* const haih = static_cast(data); - if (haih->destroyed) { - if (haih->pending == 1) { - delete haih; - } else { - haih->pending--; + // Can be done outside of the GUI thread + idle_register.add( + [this]() -> bool + { + if (haih->destroyed) { + if (haih->pending == 1) { + delete haih; + } else { + --haih->pending; + } + + return false; } - return 0; + haih->harea->setDirty(true); + haih->harea->updateBackBuffer(); + haih->harea->queue_draw(); + + --haih->pending; + + return false; } - - haih->harea->setDirty (true); - haih->harea->updateBackBuffer (); - haih->harea->queue_draw (); - - haih->pending--; - - return FALSE; - }; - - idle_register.add(func, haih); + ); } -SSEFUNCTION void HistogramArea::updateBackBuffer () +void HistogramArea::updateBackBuffer () { if (!get_realized ()) { @@ -961,10 +802,56 @@ SSEFUNCTION void HistogramArea::updateBackBuffer () Cairo::RefPtr cr = Cairo::Context::create(surface); const Glib::RefPtr style = get_style_context(); + // Setup drawing cr->set_source_rgba (0., 0., 0., 0.); cr->set_operator (Cairo::OPERATOR_CLEAR); cr->paint (); - cr->set_operator (Cairo::OPERATOR_OVER); + cr->set_operator (Cairo::OPERATOR_SOURCE); + + // Prepare drawing gridlines first + cr->set_source_rgba (1., 1., 1., 0.25); + cr->set_line_width (1.0); + cr->set_antialias(Cairo::ANTIALIAS_NONE); + cr->set_line_join(Cairo::LINE_JOIN_MITER); + std::valarray ch_ds (1); + ch_ds[0] = 4; + cr->set_dash (ch_ds, 0); + + // determine the number of h-gridlines based on current h + int nrOfHGridPartitions = (int)rtengine::min (16.0, pow (2.0, floor ((h - 100) / 250) + 2)); + int nrOfVGridPartitions = 8; // always show 8 stops (lines at 1,3,7,15,31,63,127) + + // draw vertical gridlines + if (options.histogramDrawMode < 2) { + for (int i = 1; i < nrOfVGridPartitions; i++) { + cr->move_to ((pow(2.0,i) - 1) / 255.0 * w + 0.5, 1.5); + cr->line_to ((pow(2.0,i) - 1) / 255.0 * w + 0.5, h - 2); + cr->stroke (); + } + } else { + for (int i = 1; i < nrOfVGridPartitions; i++) { + cr->move_to (HistogramScaling::log (255, pow(2.0,i) - 1) / 255.0 * w + 0.5, 1.5); + cr->line_to (HistogramScaling::log (255, pow(2.0,i) - 1) / 255.0 * w + 0.5, h - 2); + cr->stroke (); + } + } + + // draw horizontal gridlines + if (options.histogramDrawMode == 0) { + for (int i = 1; i < nrOfHGridPartitions; i++) { + cr->move_to (1.5, i * (double)h / nrOfHGridPartitions + 0.5); + cr->line_to (w - 2, i * (double)h / nrOfHGridPartitions + 0.5); + cr->stroke (); + } + } else { + for (int i = 1; i < nrOfHGridPartitions; i++) { + cr->move_to (1.5, h - HistogramScaling::log (h, i * (double)h / nrOfHGridPartitions) + 0.5); + cr->line_to (w - 2, h - HistogramScaling::log (h, i * (double)h / nrOfHGridPartitions) + 0.5); + cr->stroke (); + } + } + + cr->unset_dash(); if (valid) { // For RAW mode use the other hists @@ -999,83 +886,34 @@ SSEFUNCTION void HistogramArea::updateBackBuffer () } } - // compute height of the full histogram (realheight) and - // does not take into account 0 and 255 values - // them are handled separately + // Compute the highest point of the histogram for scaling + // Values at far left and right end (0 and 255) are handled differently - unsigned int fullhistheight = 0; + unsigned int histheight = 0; for (int i = 1; i < 255; i++) { - if (needLuma && lhisttemp[i] > fullhistheight) { - fullhistheight = lhisttemp[i]; + if (needLuma && lhisttemp[i] > histheight) { + histheight = lhisttemp[i]; } - if (needChroma && chisttemp[i] > fullhistheight) { - fullhistheight = chisttemp[i]; + if (needChroma && chisttemp[i] > histheight) { + histheight = chisttemp[i]; } - if (needRed && rhtemp[i] > fullhistheight) { - fullhistheight = rhtemp[i]; + if (needRed && rhtemp[i] > histheight) { + histheight = rhtemp[i]; } - if (needGreen && ghtemp[i] > fullhistheight) { - fullhistheight = ghtemp[i]; + if (needGreen && ghtemp[i] > histheight) { + histheight = ghtemp[i]; } - if (needBlue && bhtemp[i] > fullhistheight) { - fullhistheight = bhtemp[i]; + if (needBlue && bhtemp[i] > histheight) { + histheight = bhtemp[i]; } } - int realhistheight = fullhistheight; - - // though much faster than before, this still takes a lot of time especially for big files if rawMode is true - if (!fullMode) { - int area = 0; - -#ifdef __SSE2__ - vint onev = _mm_set1_epi32(1); - vint iv = (vint)ZEROV; -#endif - - for (unsigned i = 0; i < fullhistheight; i++) { -#ifdef __SSE2__ - vint areatempv = (vint)ZEROV; - - for (int j = 0; j < 256; j += 4) { - vmask mask1v = _mm_cmpgt_epi32(LVI(lhisttemp[j]), iv); - vmask mask2v = _mm_cmpgt_epi32(LVI(rhtemp[j]), iv); - vmask mask3v = _mm_cmpgt_epi32(LVI(ghtemp[j]), iv); - vmask mask4v = _mm_cmpgt_epi32(LVI(bhtemp[j]), iv); - mask1v = _mm_or_si128(mask1v, mask2v); - mask3v = _mm_or_si128(mask3v, mask4v); - mask2v = _mm_cmpgt_epi32(LVI(chisttemp[j]), iv); - mask1v = _mm_or_si128(mask1v, mask3v); - mask1v = _mm_or_si128(mask1v, mask2v); - areatempv = _mm_add_epi32(areatempv, _mm_and_si128(mask1v, onev)); - - } - - areatempv = _mm_add_epi32(areatempv, (vint)_mm_movehl_ps((vfloat)areatempv, (vfloat)areatempv)); - areatempv = _mm_add_epi32(areatempv, _mm_shuffle_epi32(areatempv, 1)); - area += _mm_cvtsi128_si32(areatempv); - iv = _mm_add_epi32(iv, onev); - -#else - - for (int j = 0; j < 256; j++) - if (lhisttemp[j] > i || rhtemp[j] > i || ghtemp[j] > i || bhtemp[j] > i || chisttemp[j] > i) { - area++; - } - -#endif - - if ((double)area / (256 * (i + 1)) < 0.3) { - realhistheight = i; - break; - } - } - } + int realhistheight = histheight; if (realhistheight < winh - 2) { realhistheight = winh - 2; @@ -1083,22 +921,21 @@ SSEFUNCTION void HistogramArea::updateBackBuffer () cr->set_antialias (Cairo::ANTIALIAS_SUBPIXEL); cr->set_line_width (1.0); + cr->set_operator (Cairo::OPERATOR_OVER); int ui = 0, oi = 0; if (needLuma && !rawMode) { drawCurve(cr, lhist, realhistheight, w, h); - cr->set_source_rgb (0.65, 0.65, 0.65); + cr->set_source_rgba (0.65, 0.65, 0.65, 0.65); cr->fill (); - drawMarks(cr, lhist, realhistheight, w, ui, oi); } if (needChroma && !rawMode) { drawCurve(cr, chist, realhistheight, w, h); - cr->set_source_rgb (0., 0., 0.); + cr->set_source_rgb (0.9, 0.9, 0.); cr->stroke (); - drawMarks(cr, chist, realhistheight, w, ui, oi); } @@ -1106,7 +943,6 @@ SSEFUNCTION void HistogramArea::updateBackBuffer () drawCurve(cr, rhchanged, realhistheight, w, h); cr->set_source_rgb (1.0, 0.0, 0.0); cr->stroke (); - drawMarks(cr, rhchanged, realhistheight, w, ui, oi); } @@ -1114,7 +950,6 @@ SSEFUNCTION void HistogramArea::updateBackBuffer () drawCurve(cr, ghchanged, realhistheight, w, h); cr->set_source_rgb (0.0, 1.0, 0.0); cr->stroke (); - drawMarks(cr, ghchanged, realhistheight, w, ui, oi); } @@ -1122,42 +957,11 @@ SSEFUNCTION void HistogramArea::updateBackBuffer () drawCurve(cr, bhchanged, realhistheight, w, h); cr->set_source_rgb (0.0, 0.0, 1.0); cr->stroke (); - drawMarks(cr, bhchanged, realhistheight, w, ui, oi); } + } - cr->set_source_rgba (1., 1., 1., 0.35); - cr->set_line_width (1.0); - cr->set_antialias(Cairo::ANTIALIAS_NONE); - - // Draw the content - cr->set_line_join(Cairo::LINE_JOIN_MITER); - std::valarray ch_ds (1); - ch_ds[0] = 4; - cr->set_dash (ch_ds, 0); - - cr->move_to(w / 4 + 0.5, 1.5); - cr->line_to(w / 4 + 0.5, h - 2); - cr->stroke(); - cr->move_to(2 * w / 4 + 0.5, 1.5); - cr->line_to(2 * w / 4 + 0.5, h - 2); - cr->stroke(); - cr->move_to(3 * w / 4 + 0.5, 1.5); - cr->line_to(3 * w / 4 + 0.5, h - 2); - cr->stroke(); - cr->move_to(1.5, h / 4 + 0.5); - cr->line_to(w - 2, h / 4 + 0.5); - cr->stroke(); - cr->move_to(1.5, 2 * h / 4 + 0.5); - cr->line_to(w - 2, 2 * h / 4 + 0.5); - cr->stroke(); - cr->move_to(1.5, 3 * h / 4 + 0.5); - cr->line_to(w - 2, 3 * h / 4 + 0.5); - cr->stroke(); - - cr->unset_dash(); - // Draw the frame's border style->render_frame(cr, 0, 0, surface->get_width(), surface->get_height()); @@ -1172,7 +976,7 @@ void HistogramArea::on_realize () Gtk::DrawingArea::on_realize(); Glib::RefPtr window = get_window(); - add_events(Gdk::BUTTON_PRESS_MASK); + add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); } void HistogramArea::drawCurve(Cairo::RefPtr &cr, @@ -1182,14 +986,20 @@ void HistogramArea::drawCurve(Cairo::RefPtr &cr, scale = scale <= 0.f ? 0.001f : scale; // avoid division by zero and negative values for (int i = 0; i < 256; i++) { - double val = data[i] * (double)(vsize - 2) / scale; + double val = data[i] * (double)vsize / scale; - if (val > vsize - 1) { - val = vsize - 1; + if (drawMode > 0) { // scale y for single and double log-scale + val = HistogramScaling::log ((double)vsize, val); } - double posX = (i / 255.0) * (hsize - 1); - double posY = vsize - 1 - val; + double iscaled = i; + if (drawMode == 2) { // scale x for double log-scale + iscaled = HistogramScaling::log (255.0, (double)i); + } + + double posX = (iscaled / 255.0) * (hsize - 1); + double posY = vsize - 2 + val * (4 - vsize) / vsize; + cr->line_to (posX, posY); } @@ -1231,13 +1041,16 @@ bool HistogramArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) bool HistogramArea::on_button_press_event (GdkEventButton* event) { + isPressed = true; + movingPosition = event->x; if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { - fullMode = !fullMode; - options.histogramFullMode = fullMode; - if (myFullModeListener) { - myFullModeListener->toggle_button_full (); + drawMode = (drawMode + 1) % 3; + options.histogramDrawMode = (options.histogramDrawMode + 1) % 3; + + if (myDrawModeListener) { + myDrawModeListener->toggleButtonMode (); } updateBackBuffer (); @@ -1247,3 +1060,34 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event) return true; } +bool HistogramArea::on_button_release_event (GdkEventButton* event) +{ + isPressed = false; + return true; +} + +bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) +{ + if (isPressed) + { + double mod = 1 + (event->x - movingPosition) / get_width(); + + factor /= mod; + if (factor < 1.0) + factor = 1.0; + if (factor > 100.0) + factor = 100.0; + + sigFactorChanged.emit(factor); + + setDirty(true); + queue_draw (); + } + + return true; +} + +HistogramArea::type_signal_factor_changed HistogramArea::signal_factor_changed() +{ + return sigFactorChanged; +} diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index 25fa15c23..f34b07c39 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -43,7 +43,15 @@ struct HistogramRGBAreaIdleHelper { int pending; }; -class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer +class HistogramScaling +{ +public: + double factor; + HistogramScaling() : factor(10.0) {} + double log (double vsize, double val); +}; + +class HistogramRGBArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling { private: typedef const double (*TMatrix)[3]; @@ -56,17 +64,16 @@ protected: int g; int b; - bool frozen; bool valid; bool needRed; bool needGreen; bool needBlue; bool needLuma; + bool needChroma; bool rawMode; bool showMode; bool barDisplayed; - bool needChroma; Gtk::Grid* parent; @@ -74,11 +81,9 @@ protected: public: HistogramRGBArea(); - ~HistogramRGBArea(); + ~HistogramRGBArea() override; - void updateBackBuffer (int r, int g, int b, Glib::ustring profile = "", Glib::ustring profileW = ""); - void updateFreeze (bool f); - bool getFreeze (); + void updateBackBuffer (int r, int g, int b, const Glib::ustring &profile = "", const Glib::ustring &profileW = ""); bool getShow (); void setParent (Gtk::Grid* p) { @@ -86,69 +91,88 @@ public: }; void update (int val, int rh, int gh, int bh); - void updateOptions (bool r, bool g, bool b, bool l, bool raw, bool show, bool c); + void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, bool show); + + void on_realize() override; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool on_button_press_event (GdkEventButton* event) override; + void factorChanged (double newFactor); - void on_realize(); - 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; - void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const; - void get_preferred_width_for_height_vfunc (int h, int &minimum_width, int &natural_width) const; - // Some ... + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int h, int &minimum_width, int &natural_width) const override; + }; - -class FullModeListener +class DrawModeListener { public: - virtual ~FullModeListener() {} - virtual void toggle_button_full () {} + virtual ~DrawModeListener() = default; + virtual void toggleButtonMode() = 0; }; -class HistogramArea : public Gtk::DrawingArea, public BackBuffer +class HistogramArea : public Gtk::DrawingArea, public BackBuffer, private HistogramScaling { +public: + typedef sigc::signal type_signal_factor_changed; + private: IdleRegister idle_register; + type_signal_factor_changed sigFactorChanged; protected: - LUTu lhist, rhist, ghist, bhist, chist; - LUTu lhistRaw, rhistRaw, ghistRaw, bhistRaw; + LUTu rhist, ghist, bhist, lhist, chist; + LUTu rhistRaw, ghistRaw, bhistRaw, lhistRaw; //lhistRaw is unused? bool valid; - bool fullMode; - FullModeListener *myFullModeListener; + int drawMode; + DrawModeListener *myDrawModeListener; int oldwidth, oldheight; - bool needLuma, needRed, needGreen, needBlue, rawMode, needChroma; + bool needRed, needGreen, needBlue, needLuma, needChroma; + bool rawMode; + bool isPressed; + double movingPosition; HistogramAreaIdleHelper* haih; public: - explicit HistogramArea(FullModeListener *fml = nullptr); - ~HistogramArea(); + explicit HistogramArea(DrawModeListener *fml = nullptr); + ~HistogramArea() override; void updateBackBuffer (); - void update (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw, LUTu &histChroma); - void updateOptions (bool r, bool g, bool b, bool l, bool raw, bool full , bool c); - void on_realize(); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - bool on_button_press_event (GdkEventButton* event); + void update( + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histChroma, + const LUTu& histRedRaw, + const LUTu& histGreenRaw, + const LUTu& histBlueRaw + ); + void updateOptions (bool r, bool g, bool b, bool l, bool c, bool raw, int mode); + void on_realize() override; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool on_button_press_event (GdkEventButton* event) override; + bool on_button_release_event (GdkEventButton* event) override; + bool on_motion_notify_event (GdkEventMotion* event) override; + type_signal_factor_changed signal_factor_changed(); private: void drawCurve(Cairo::RefPtr &cr, LUTu & data, double scale, int hsize, int vsize); void drawMarks(Cairo::RefPtr &cr, LUTu & data, double scale, int hsize, int & ui, int & oi); - 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; - 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; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; }; -class HistogramPanel : public Gtk::Grid, public PointerMotionListener, public FullModeListener +class HistogramPanel : public Gtk::Grid, public PointerMotionListener, public DrawModeListener { protected: @@ -162,16 +186,15 @@ protected: Gtk::ToggleButton* showBlue; Gtk::ToggleButton* showValue; Gtk::ToggleButton* showRAW; - Gtk::ToggleButton* showFull; Gtk::ToggleButton* showBAR; Gtk::ToggleButton* showChro; + Gtk::Button* showMode; Gtk::Image *redImage; Gtk::Image *greenImage; Gtk::Image *blueImage; Gtk::Image *valueImage; Gtk::Image *rawImage; - Gtk::Image *fullImage; Gtk::Image *barImage; Gtk::Image *chroImage; @@ -180,10 +203,12 @@ protected: Gtk::Image *blueImage_g; Gtk::Image *valueImage_g; Gtk::Image *rawImage_g; - Gtk::Image *fullImage_g; Gtk::Image *barImage_g; Gtk::Image *chroImage_g; + Gtk::Image *mode0Image; + Gtk::Image *mode1Image; + Gtk::Image *mode2Image; sigc::connection rconn; void setHistInvalid (); @@ -191,16 +216,23 @@ protected: public: HistogramPanel (); - ~HistogramPanel (); + ~HistogramPanel () override; - void histogramChanged (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw, LUTu &histChroma) + void histogramChanged( + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histChroma, + const LUTu& histRedRaw, + const LUTu& histGreenRaw, + const LUTu& histBlueRaw) { - histogramArea->update (histRed, histGreen, histBlue, histLuma, histRedRaw, histGreenRaw, histBlueRaw, histChroma); + histogramArea->update(histRed, histGreen, histBlue, histLuma, histChroma, histRedRaw, histGreenRaw, histBlueRaw); } // pointermotionlistener interface - void pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b); - // added pointermotionlistener interface - void toggleFreeze(); + void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) override; + // TODO should be protected void setHistRGBInvalid (); @@ -210,14 +242,14 @@ public: void blue_toggled (); void value_toggled (); void raw_toggled (); - void full_toggled (); void chro_toggled (); void bar_toggled (); + void mode_released (); void rgbv_toggled (); void resized (Gtk::Allocation& req); - // fullModeListener interface - void toggle_button_full (); + // drawModeListener interface + void toggleButtonMode () override; }; #endif diff --git a/rtgui/history.cc b/rtgui/history.cc index 6b07ee7b2..4d435c460 100644 --- a/rtgui/history.cc +++ b/rtgui/history.cc @@ -17,10 +17,13 @@ * along with RawTherapee. If not, see . */ #include "history.h" + +#include "eventmapper.h" +#include "guiutils.h" #include "multilangmgr.h" #include "rtimage.h" -#include "guiutils.h" -#include "eventmapper.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -88,7 +91,7 @@ History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(null //addBookmark->get_style_context()->set_junction_sides(Gtk::JUNCTION_RIGHT); addBookmark->get_style_context()->add_class("Left"); addBookmark->set_tooltip_markup (M("HISTORY_NEWSNAPSHOT_TOOLTIP")); - Gtk::Image* addimg = Gtk::manage (new RTImage ("gtk-add.png")); + Gtk::Image* addimg = Gtk::manage (new RTImage ("add-small.png")); addBookmark->set_image (*addimg); ahbox->pack_start (*addBookmark); @@ -96,7 +99,7 @@ History::History (bool bookmarkSupport) : historyVPaned(nullptr), blistener(null setExpandAlignProperties(delBookmark, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //delBookmark->get_style_context()->set_junction_sides(Gtk::JUNCTION_LEFT); delBookmark->get_style_context()->add_class("Right"); - Gtk::Image* delimg = Gtk::manage (new RTImage ("list-remove.png")); + Gtk::Image* delimg = Gtk::manage (new RTImage ("remove-small.png")); delBookmark->set_image (*delimg); ahbox->pack_start (*delBookmark); @@ -154,12 +157,6 @@ void History::initHistory () bookmarkModel->clear (); } -void History::clearParamChanges () -{ - - initHistory (); -} - void History::historySelectionChanged () { @@ -216,9 +213,13 @@ void History::bookmarkSelectionChanged () } } -void History::procParamsChanged (ProcParams* params, ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited) +void History::procParamsChanged( + const ProcParams* params, + const ProcEvent& ev, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited +) { - // to prevent recursion, we filter out the events triggered by the history and events that should not be registered if (ev == EvHistoryBrowsed || ev == EvMonitorTransform) { return; @@ -300,6 +301,11 @@ void History::procParamsChanged (ProcParams* params, ProcEvent ev, Glib::ustring selchangebm.block (false); } +void History::clearParamChanges () +{ + initHistory (); +} + void History::addBookmarkWithText (Glib::ustring text) { diff --git a/rtgui/history.h b/rtgui/history.h index 8fbe256e4..196b29b67 100644 --- a/rtgui/history.h +++ b/rtgui/history.h @@ -27,9 +27,9 @@ class HistoryBeforeLineListener { - public: - virtual void historyBeforeLineChanged (const rtengine::procparams::ProcParams& params) {} + virtual ~HistoryBeforeLineListener() = default; + virtual void historyBeforeLineChanged(const rtengine::procparams::ProcParams& params) = 0; }; class History : public Gtk::VBox, public PParamsChangeListener @@ -106,8 +106,13 @@ public: } // pparamschangelistener interface - void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited = nullptr); - void clearParamChanges (); + void procParamsChanged( + const rtengine::procparams::ProcParams* params, + const rtengine::ProcEvent& ev, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited = nullptr + ) override; + void clearParamChanges () override; void historySelectionChanged (); void bookmarkSelectionChanged (); diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index 1dfb017a7..7db76aa9f 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -16,9 +16,10 @@ * * 2010 Ilya Popov */ - #include "hsvequalizer.h" + #include "../rtengine/color.h" +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; diff --git a/rtgui/hsvequalizer.h b/rtgui/hsvequalizer.h index fc3d22984..8d34b486b 100644 --- a/rtgui/hsvequalizer.h +++ b/rtgui/hsvequalizer.h @@ -29,7 +29,7 @@ #include "colorprovider.h" -class HSVEqualizer : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public CurveListener, public ColorProvider +class HSVEqualizer : public ToolParamBlock, public FoldableToolPanel, public CurveListener, public ColorProvider { protected: @@ -42,19 +42,19 @@ protected: public: HSVEqualizer (); - virtual ~HSVEqualizer (); + ~HSVEqualizer () override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void curveChanged (CurveEditor* ce); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void curveChanged (CurveEditor* ce) override; //void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL); - void setBatchMode (bool batchMode); - void setEditProvider (EditDataProvider *provider); - void autoOpenCurve (); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void setBatchMode (bool batchMode) override; + void setEditProvider (EditDataProvider *provider) override; + void autoOpenCurve () override; + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; //void adjusterChanged (Adjuster* a, double newval); - void enabledChanged(); + void enabledChanged() override; }; #endif diff --git a/rtgui/iccprofilecreator.cc b/rtgui/iccprofilecreator.cc new file mode 100644 index 000000000..584412120 --- /dev/null +++ b/rtgui/iccprofilecreator.cc @@ -0,0 +1,1499 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 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 . + */ +#include +#include "iccprofilecreator.h" +#include "multilangmgr.h" +#include "cachemanager.h" +#include "addsetids.h" +#include "../rtengine/icons.h" +#include "../rtengine/color.h" +#include "rtimage.h" +#ifdef _OPENMP +#include +#endif + +extern Options options; + +namespace rtengine +{ + +extern const Settings* settings; + +} + +const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free + +ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow) + : Gtk::Dialog(M("MAIN_BUTTON_ICCPROFCREATOR"), *rtwindow, true) + , primariesPreset(options.ICCPC_primariesPreset) + , redPrimaryX(options.ICCPC_redPrimaryX) + , redPrimaryY(options.ICCPC_redPrimaryY) + , greenPrimaryX(options.ICCPC_greenPrimaryX) + , greenPrimaryY(options.ICCPC_greenPrimaryY) + , bluePrimaryX(options.ICCPC_bluePrimaryX) + , bluePrimaryY(options.ICCPC_bluePrimaryY) + , gammaPreset(options.ICCPC_gammaPreset) + , gamma(options.ICCPC_gamma) + , slope(options.ICCPC_slope) + , appendParamsToDesc(options.ICCPC_appendParamsToDesc) + , profileVersion(options.ICCPC_profileVersion) + , illuminant(options.ICCPC_illuminant) + , description(options.ICCPC_description) + , copyright(options.ICCPC_copyright) + , parent(rtwindow) +{ + + set_default_size(600, -1); + + Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid()); + mainGrid->set_column_spacing(3); + mainGrid->set_row_spacing(3); + + //--------------------------------- primaries + + Gtk::Label* prilab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_PRIMARIES"))); + setExpandAlignProperties(prilab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*prilab, 0, 0, 1, 1); + + primaries = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(primaries, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + primaries->append(M("ICCPROFCREATOR_CUSTOM")); + primaries->append(M("ICCPROFCREATOR_PRIM_ACESP0")); + primaries->append(M("ICCPROFCREATOR_PRIM_ACESP1")); + primaries->append(M("ICCPROFCREATOR_PRIM_ADOBE")); + primaries->append(M("ICCPROFCREATOR_PRIM_PROPH")); + primaries->append(M("ICCPROFCREATOR_PRIM_REC2020")); + primaries->append(M("ICCPROFCREATOR_PRIM_SRGB")); + primaries->append(M("ICCPROFCREATOR_PRIM_WIDEG")); + primaries->append(M("ICCPROFCREATOR_PRIM_BEST")); + primaries->append(M("ICCPROFCREATOR_PRIM_BETA")); + primaries->append(M("ICCPROFCREATOR_PRIM_BRUCE")); + primaries->set_tooltip_text(M("ICCPROFCREATOR_PRIM_TOOLTIP")); + mainGrid->attach(*primaries, 1, 0, 1, 1); + + primariesGrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(primariesGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + primariesGrid->set_column_spacing(5); + + /* + Gtk::Image* gamuts0 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl0 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts1 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl1 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts2 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl2 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts3 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl3 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts4 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl4 = Gtk::manage(new RTImage("rt-logo-small.png")); + Gtk::Image* gamuts5 = Gtk::manage(new RTImage("rt-logo-tiny.png")); + Gtk::Image* gamutl5 = Gtk::manage(new RTImage("rt-logo-small.png")); + */ + + aPrimariesRedX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDX"), 0.6300, 0.7350, 0.0001, 0.6400/*, gamuts0, gamutl0*/)); + setExpandAlignProperties(aPrimariesRedX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesRedY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDY"), 0.2650, 0.3350, 0.0001, 0.3300/*, gamutl1, gamuts1*/)); + setExpandAlignProperties(aPrimariesRedY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesGreenX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREX"), 0.0000, 0.3100, 0.0001, 0.3000/*, gamutl2, gamuts2*/)); + setExpandAlignProperties(aPrimariesGreenX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesGreenY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREY"), 0.5900, 1.0000, 0.0001, 0.6000/*, gamuts3, gamutl3*/)); + setExpandAlignProperties(aPrimariesGreenY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesBlueX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUX"), 0.0001, 0.1600, 0.0001, 0.1500/*, gamutl4, gamuts4*/)); + setExpandAlignProperties(aPrimariesBlueX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + aPrimariesBlueY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUY"), -0.0800, 0.0700, 0.0001, 0.060/*, gamutl5, gamuts5*/)); + setExpandAlignProperties(aPrimariesBlueY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + primariesGrid->attach(*aPrimariesRedX, 0, 0, 1, 1); + primariesGrid->attach(*aPrimariesRedY, 1, 0, 1, 1); + + primariesGrid->attach(*aPrimariesGreenX, 0, 1, 1, 1); + primariesGrid->attach(*aPrimariesGreenY, 1, 1, 1, 1); + + primariesGrid->attach(*aPrimariesBlueX, 0, 2, 1, 1); + primariesGrid->attach(*aPrimariesBlueY, 1, 2, 1, 1); + + mainGrid->attach(*primariesGrid, 1, 1, 1, 1); + + //--------------------------------- output gamma + + Gtk::Label* galab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_TRC_PRESET"))); + setExpandAlignProperties(galab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*galab, 0, 2, 1, 1); + + trcPresets = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(trcPresets, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + std::vector outputTRCPresets; + outputTRCPresets.push_back(M("ICCPROFCREATOR_CUSTOM")); + + for (unsigned int i = 0; i < sizeof(sTRCPreset) / sizeof(sTRCPreset[0]); i++) { + outputTRCPresets.push_back(sTRCPreset[i]); + } + + for (size_t i = 0; i < outputTRCPresets.size(); i++) { + trcPresets->append(outputTRCPresets[i]); + } + + mainGrid->attach(*trcPresets, 1, 2, 1, 1); + + //--------------------------------- sliders gampos and slpos + + aGamma = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_GAMMA"), 1, 3.5, 0.00001, 2.4)); + setExpandAlignProperties(aGamma, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + + if (aGamma->delay < options.adjusterMaxDelay) { + aGamma->delay = options.adjusterMaxDelay; + } + + aGamma->show(); + mainGrid->attach(*aGamma, 1, 3, 1, 1); //gamma + + aSlope = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_SLOPE"), 0, 15, 0.00001, 12.92310)); + setExpandAlignProperties(aSlope, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + + if (aSlope->delay < options.adjusterMaxDelay) { + aSlope->delay = options.adjusterMaxDelay; + } + + aSlope->show(); + mainGrid->attach(*aSlope, 1, 4, 1, 1); //slope + + //--------------------------------- temperature + + Gtk::Label* illlab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ILL"))); + setExpandAlignProperties(illlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*illlab, 0, 5, 1, 1); //slope + cIlluminant = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(cIlluminant, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + cIlluminant->append(M("ICCPROFCREATOR_ILL_DEF")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_41")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_50")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_55")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_60")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_65")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_80")); + cIlluminant->append(M("ICCPROFCREATOR_ILL_INC")); + cIlluminant->set_tooltip_text(M("ICCPROFCREATOR_ILL_TOOLTIP")); + mainGrid->attach(*cIlluminant, 1, 5, 1, 1); + + //--------------------------------- V2 or V4 profiles + + Gtk::Label* proflab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ICCVERSION"))); + setExpandAlignProperties(proflab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*proflab, 0, 6, 1, 1); + iccVersion = Gtk::manage(new MyComboBoxText()); + setExpandAlignProperties(iccVersion, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + iccVersion->append(M("ICCPROFCREATOR_PROF_V4")); + iccVersion->append(M("ICCPROFCREATOR_PROF_V2")); + mainGrid->attach(*iccVersion, 1, 6, 1, 1); + + //--------------------------------- Description + + Gtk::Label* desclab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_DESCRIPTION"))); + setExpandAlignProperties(desclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + mainGrid->attach(*desclab, 0, 7, 1, 2); + eDescription = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eDescription, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + eDescription->set_tooltip_text(M("ICCPROFCREATOR_DESCRIPTION_TOOLTIP")); + mainGrid->attach(*eDescription, 1, 7, 1, 1); + cAppendParamsToDesc = Gtk::manage(new Gtk::CheckButton(M("ICCPROFCREATOR_DESCRIPTION_ADDPARAM"))); + setExpandAlignProperties(cAppendParamsToDesc, true, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*cAppendParamsToDesc, 1, 8, 1, 1); + + //--------------------------------- Copyright + + Gtk::Label* copylab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_COPYRIGHT"))); + setExpandAlignProperties(copylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + mainGrid->attach(*copylab, 0, 9, 1, 1); + Gtk::Grid* copygrid = Gtk::manage(new Gtk::Grid()); + setExpandAlignProperties(copygrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + eCopyright = Gtk::manage(new Gtk::Entry()); + setExpandAlignProperties(eCopyright, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + copygrid->attach(*eCopyright, 0, 0, 1, 1); + resetCopyright = Gtk::manage(new Gtk::Button()); + resetCopyright->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + setExpandAlignProperties(resetCopyright, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + resetCopyright->set_relief(Gtk::RELIEF_NONE); + resetCopyright->set_tooltip_markup(M("ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP")); + resetCopyright->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + resetCopyright->set_can_focus(false); + copygrid->attach(*resetCopyright, 1, 0, 1, 1); + mainGrid->attach(*copygrid, 1, 9, 1, 1); + + //--------------------------------- Adding the mainGrid + + get_content_area()->add(*mainGrid); + + //--------------------------------- Setting default values for Adjusters + + aGamma->setDefault(gamma); + aSlope->setDefault(slope); + aPrimariesRedX->setDefault(redPrimaryX); + aPrimariesRedY->setDefault(redPrimaryY); + aPrimariesGreenX->setDefault(greenPrimaryX); + aPrimariesGreenY->setDefault(greenPrimaryY); + aPrimariesBlueX->setDefault(bluePrimaryX); + aPrimariesBlueY->setDefault(bluePrimaryY); + + //--------------- Updating widgets with actual values (from options) + + if (primariesPreset == "custom") { + primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM")); + } else if (primariesPreset == "ACES-AP0") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP0")); + } else if (primariesPreset == "ACES-AP1") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP1")); + } else if (primariesPreset == "Adobe") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ADOBE")); + } else if (primariesPreset == "ProPhoto") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_PROPH")); + } else if (primariesPreset == "Rec2020") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_REC2020")); + } else if (primariesPreset == "sRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_SRGB")); + } else if (primariesPreset == "Widegamut") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_WIDEG")); + } else if (primariesPreset == "BestRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BEST")); + } else if (primariesPreset == "BetaRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BETA")); + } else if (primariesPreset == "BruceRGB") { + primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BRUCE")); + } + + trcPresets->set_active(0); + + if (gammaPreset != "Custom") { + trcPresets->set_active_text(gammaPreset); + } + + aGamma->setValue(gamma); + aSlope->setValue(slope); + aPrimariesRedX->setValue(redPrimaryX); + aPrimariesRedY->setValue(redPrimaryY); + aPrimariesGreenX->setValue(greenPrimaryX); + aPrimariesGreenY->setValue(greenPrimaryY); + aPrimariesBlueX->setValue(bluePrimaryX); + aPrimariesBlueY->setValue(bluePrimaryY); + + eDescription->set_text(description); + eCopyright->set_text(copyright); + cAppendParamsToDesc->set_active(appendParamsToDesc); + + if (illuminant == "DEF") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_DEF")); + } else if (illuminant == "D41") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_41")); + } else if (illuminant == "D50") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_50")); + } else if (illuminant == "D55") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_55")); + } else if (illuminant == "D60") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_60")); + } else if (illuminant == "D65") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_65")); + } else if (illuminant == "D80") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_80")); + } else if (illuminant == "stdA") { + cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_INC")); + } + + iccVersion->set_active(0); + + if (profileVersion == "v2") { + iccVersion->set_active(1); + } + + trcPresetsChanged(); + illuminantChanged(); + primariesChanged(); + + //--------------- Action area button + + Gtk::Button* save = Gtk::manage(new Gtk::Button(M("GENERAL_SAVE_AS"))); + save->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::savePressed)); + get_action_area()->pack_start(*save); + + Gtk::Button* close = Gtk::manage(new Gtk::Button(M("GENERAL_CLOSE"))); + close->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::closePressed)); + get_action_area()->pack_start(*close); + + //--------------- Show childrens + + show_all_children(); + + //--------------- Connecting the signals + + aPrimariesRedX->setAdjusterListener(this); + aPrimariesRedY->setAdjusterListener(this); + aPrimariesGreenX->setAdjusterListener(this); + aPrimariesGreenY->setAdjusterListener(this); + aPrimariesBlueX->setAdjusterListener(this); + aPrimariesBlueY->setAdjusterListener(this); + aGamma->setAdjusterListener(this); + aSlope->setAdjusterListener(this); + primariesconn = primaries->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::primariesChanged)); + trcpresetsconn = trcPresets->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::trcPresetsChanged)); + illconn = cIlluminant->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::illuminantChanged)); + resetCopyright->signal_clicked().connect(sigc::mem_fun(*this, &ICCProfileCreator::onResetCopyright)); +} + +void ICCProfileCreator::closePressed() +{ + storeValues(); + hide(); +} + +void ICCProfileCreator::updateICCVersion() +{ +// if (cIlluminant->get_active_text() != M("ICCPROFCREATOR_ILL_DEF") || primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { + // iccVersion->set_active_text(M("ICCPROFCREATOR_PROF_V4")); + // iccVersion->set_sensitive(false); +// } else { + // iccVersion->set_sensitive(true); +// } + + iccVersion->set_sensitive(true); +} + +void ICCProfileCreator::adjusterChanged(Adjuster* a, double newval) +{ + if (a == aPrimariesRedX || a == aPrimariesRedY || + a == aPrimariesGreenX || a == aPrimariesGreenY || + a == aPrimariesBlueX || a == aPrimariesBlueY) { + if (primaries->get_active_row_number() > 0) { + ConnectionBlocker blocker(primariesconn); + primaries->set_active(0); + updateICCVersion(); + } + } else if (a == aGamma || a == aSlope) { + if (trcPresets->get_active_row_number() > 0) { + ConnectionBlocker blocker(trcpresetsconn); + trcPresets->set_active(0); + } + } +} + +void ICCProfileCreator::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + +void ICCProfileCreator::primariesChanged() +{ + if (primaries->get_active_row_number() > 0) { + double p[6]; + ColorTemp temp; + Glib::ustring activeValue = primaries->get_active_text(); + Glib::ustring primPresetName = getPrimariesPresetName(activeValue); + getPrimaries(primPresetName, p, temp); + aPrimariesRedX->setValue(p[0]); + aPrimariesRedY->setValue(p[1]); + aPrimariesGreenX->setValue(p[2]); + aPrimariesGreenY->setValue(p[3]); + aPrimariesBlueX->setValue(p[4]); + aPrimariesBlueY->setValue(p[5]); + } + + updateICCVersion(); +} + +void ICCProfileCreator::illuminantChanged() +{ + updateICCVersion(); +} + +void ICCProfileCreator::trcPresetsChanged() +{ + aGamma->block(true); + aSlope->block(true); + + double gamma; + double slope; + getGamma(getGammaPresetName(trcPresets->get_active_text()), gamma, slope); + aGamma->setValue(gamma); + aSlope->setValue(slope); + + aGamma->block(false); + aSlope->block(false); +} + +void ICCProfileCreator::storeValues() +{ + if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V4")) { + options.ICCPC_profileVersion = profileVersion = "v4"; + } else if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V2")) { + options.ICCPC_profileVersion = profileVersion = "v2"; + } + + if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_DEF")) { + options.ICCPC_illuminant = illuminant = "DEF"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_41")) { + options.ICCPC_illuminant = illuminant = "D41"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_50")) { + options.ICCPC_illuminant = illuminant = "D50"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_55")) { + options.ICCPC_illuminant = illuminant = "D55"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_60")) { + options.ICCPC_illuminant = illuminant = "D60"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_65")) { + options.ICCPC_illuminant = illuminant = "D65"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_80")) { + options.ICCPC_illuminant = illuminant = "D80"; + } else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_INC")) { + options.ICCPC_illuminant = illuminant = "stdA"; + } + + options.ICCPC_primariesPreset = primariesPreset = getPrimariesPresetName(primaries->get_active_text()); + options.ICCPC_gammaPreset = gammaPreset = getGammaPresetName(trcPresets->get_active_text()); + options.ICCPC_gamma = gamma = aGamma->getValue(); + options.ICCPC_slope = slope = aSlope->getValue(); + options.ICCPC_redPrimaryX = redPrimaryX = aPrimariesRedX->getValue(); + options.ICCPC_redPrimaryY = redPrimaryY = aPrimariesRedY->getValue(); + options.ICCPC_greenPrimaryX = greenPrimaryX = aPrimariesGreenX->getValue(); + options.ICCPC_greenPrimaryY = greenPrimaryY = aPrimariesGreenY->getValue(); + options.ICCPC_bluePrimaryX = bluePrimaryX = aPrimariesBlueX->getValue(); + options.ICCPC_bluePrimaryY = bluePrimaryY = aPrimariesBlueY->getValue(); + options.ICCPC_description = description = eDescription->get_text(); + options.ICCPC_copyright = copyright = eCopyright->get_text(); + options.ICCPC_appendParamsToDesc = appendParamsToDesc = cAppendParamsToDesc->get_active(); +} + +Glib::ustring ICCProfileCreator::getPrimariesPresetName(const Glib::ustring &preset) +{ + if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) { + return Glib::ustring("ACES-AP0"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) { + return Glib::ustring("ACES-AP1"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) { + return Glib::ustring("Adobe"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) { + return Glib::ustring("ProPhoto"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) { + return Glib::ustring("Rec2020"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) { + return Glib::ustring("sRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) { + return Glib::ustring("Widegamut"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) { + return Glib::ustring("BestRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) { + return Glib::ustring("BetaRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) { + return Glib::ustring("BruceRGB"); + } else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) { + return Glib::ustring("custom"); + } else { + return Glib::ustring(); + } +} + +void ICCProfileCreator::getPrimaries(const Glib::ustring &preset, double *p, ColorTemp &temp) +{ + temp = ColorTemp::D50; + + if (preset == "Widegamut") { + p[0] = 0.7350; //Widegamut primaries + p[1] = 0.2650; + p[2] = 0.1150; + p[3] = 0.8260; + p[4] = 0.1570; + p[5] = 0.0180; + + } else if (preset == "Adobe") { + p[0] = 0.6400; //Adobe primaries + p[1] = 0.3300; + p[2] = 0.2100; + p[3] = 0.7100; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (preset == "sRGB") { + p[0] = 0.6400; // sRGB primaries + p[1] = 0.3300; + p[2] = 0.3000; + p[3] = 0.6000; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (preset == "BruceRGB") { + p[0] = 0.6400; // Bruce primaries + p[1] = 0.3300; + p[2] = 0.2800; + p[3] = 0.6500; + p[4] = 0.1500; + p[5] = 0.0600; + temp = ColorTemp::D65; + } else if (preset == "BetaRGB") { + p[0] = 0.6888; // Beta primaries + p[1] = 0.3112; + p[2] = 0.1986; + p[3] = 0.7551; + p[4] = 0.1265; + p[5] = 0.0352; + } else if (preset == "BestRGB") { + p[0] = 0.7347; // Best primaries + p[1] = 0.2653; + p[2] = 0.2150; + p[3] = 0.7750; + p[4] = 0.1300; + p[5] = 0.0350; + } else if (preset == "Rec2020") { + p[0] = 0.7080; // Rec2020 primaries + p[1] = 0.2920; + p[2] = 0.1700; + p[3] = 0.7970; + p[4] = 0.1310; + p[5] = 0.0460; + temp = ColorTemp::D65; + } else if (preset == "ACES-AP0") { + p[0] = 0.7347; // ACES P0 primaries + p[1] = 0.2653; + p[2] = 0.0000; + p[3] = 1.0; + p[4] = 0.0001; + p[5] = -0.0770; + temp = ColorTemp::D60; + } else if (preset == "ACES-AP1") { + p[0] = 0.713; // ACES P1 primaries + p[1] = 0.293; + p[2] = 0.165; + p[3] = 0.830; + p[4] = 0.128; + p[5] = 0.044; + temp = ColorTemp::D60; + } else if (preset == "ProPhoto") { + p[0] = 0.7347; // ProPhoto and default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + } else if (preset == "custom") { + p[0] = redPrimaryX; + p[1] = redPrimaryY; + p[2] = greenPrimaryX; + p[3] = greenPrimaryY; + p[4] = bluePrimaryX; + p[5] = bluePrimaryY; + + } else { + p[0] = 0.7347; //default primaries + p[1] = 0.2653; + p[2] = 0.1596; + p[3] = 0.8404; + p[4] = 0.0366; + p[5] = 0.0001; + } +} + +Glib::ustring ICCProfileCreator::getGammaPresetName(const Glib::ustring &preset) +{ + Glib::ustring name(trcPresets->get_active_text()); + + if (name == M("ICCPROFCREATOR_CUSTOM")) { + name = "Custom"; + } + + return name; +} + +void ICCProfileCreator::getGamma(const Glib::ustring &preset, double &presetGamma, double &presetSlope) +{ + if (preset == "High_g1.3_s3.35") { + presetGamma = 1.3; + presetSlope = 3.35; + } else if (preset == "Low_g2.6_s6.9") { + presetGamma = 2.6; + presetSlope = 6.9; + } else if (preset == "sRGB_g2.4_s12.92") { + presetGamma = 2.4; + presetSlope = 12.92310; + } else if (preset == "BT709_g2.2_s4.5") { + presetGamma = 2.22; + presetSlope = 4.5; + } else if (preset == "linear_g1.0") { + presetGamma = 1.; + presetSlope = 0.; + } else if (preset == "standard_g2.2") { + presetGamma = 2.2; + presetSlope = 0.; + } else if (preset == "standard_g1.8") { + presetGamma = 1.8; + presetSlope = 0.; + } else if (preset == "Lab_g3.0s9.03296") { + presetGamma = 3.0; + presetSlope = 9.03296; + } else if (preset == "Custom") { + presetGamma = gamma; + presetSlope = slope; + } else { + presetGamma = 2.4; + presetSlope = 12.92310; + } +} + +void ICCProfileCreator::onResetCopyright() +{ + eCopyright->set_text(Options::getICCProfileCopyright()); +} + +// Copyright (c) 2018 Jacques DESMIS +// WARNING: the caller must lock lcmsMutex +void ICCProfileCreator::savePressed() +{ + cmsHPROFILE newProfile = nullptr; + cmsHPROFILE profile_v2_except = nullptr; + + Glib::ustring sNewProfile; + Glib::ustring sPrimariesPreset; + Glib::ustring sGammaPreset; + + storeValues(); + + // -------------------------------------------- Compute the default file name + // -----------------setmedia white point for monitor profile sRGB or AdobeRGB in case of profile used for monitor--------------------- + //instead of calculations made by LCMS..small differences + bool isD65 = (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB"); + bool isD60 = (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0"); + bool isD50 = (primariesPreset == "ProPhoto" || primariesPreset == "Widegamut" || primariesPreset == "BestRGB" || primariesPreset == "BetaRGB"); + // v2except = (profileVersion == "v2" && (primariesPreset == "sRGB" || primariesPreset == "Adobe" || primariesPreset == "Rec2020" || primariesPreset == "BruceRGB" || primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") && illuminant == "DEF"); + // v2except = (profileVersion == "v2" && (isD65 || isD60 || isD50) && illuminant == "DEF"); + v2except = (profileVersion == "v2");// && (isD65 || isD60 || isD50)); + + //necessary for V2 profile + + if (!v2except) { + std::string is_RTv4 = ""; + + //used partially for v4, and in case of if we want to back to old manner for v2 + if (primariesPreset == "ACES-AP0" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp0)) { + sNewProfile = options.rtSettings.ACESp0; + sPrimariesPreset = "ACES-AP0"; + } else if (primariesPreset == "ACES-AP1" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp1)) { + sNewProfile = options.rtSettings.ACESp1; + sPrimariesPreset = "ACES-AP1"; + } else if (primariesPreset == "Adobe" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.adobe)) { + sNewProfile = options.rtSettings.adobe; + sPrimariesPreset = "Medium"; + } else if (primariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto)) { + is_RTv4 = options.rtSettings.prophoto.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.prophoto = "RTv2_Large"; + }; + + sNewProfile = options.rtSettings.prophoto; + + sPrimariesPreset = "Large"; + } else if (primariesPreset == "Rec2020" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.rec2020)) { + sNewProfile = options.rtSettings.rec2020; + sPrimariesPreset = "Rec2020"; + } else if (primariesPreset == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb)) { + sNewProfile = options.rtSettings.srgb; + sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) { + is_RTv4 = options.rtSettings.widegamut.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_Wide"; + }; + + sNewProfile = options.rtSettings.widegamut; + + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) { + is_RTv4 = options.rtSettings.best.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.best = "RTv2_Best"; + }; + + sNewProfile = options.rtSettings.best; + + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) { + sNewProfile = options.rtSettings.beta; + is_RTv4 = options.rtSettings.beta.substr(0, 4); + + if (is_RTv4 == "RTv4") { + options.rtSettings.widegamut = "RTv2_Beta"; + }; + + sPrimariesPreset = "Beta"; + } else if (primariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) { + sNewProfile = options.rtSettings.bruce; + sPrimariesPreset = "Bruce"; + } else if (primariesPreset == "custom") { + sNewProfile = options.rtSettings.srgb; + sPrimariesPreset = "Custom"; + } else { + // Should not occurs + if (rtengine::settings->verbose) { + printf("\"%s\": unknown working profile! - use LCMS2 substitution\n", primariesPreset.c_str()); + } + + return; + } + } else { + //new model for v2 profile different from D50 by entering directly XYZ values and media white point + sNewProfile = "RTv2_Beta";//for copy generate others v2 profile. To change date of new profile, I used "ICC profile inspector" and "save as" + + if (primariesPreset == "ACES-AP0") { + sPrimariesPreset = "ACES-AP0"; + } else if (primariesPreset == "ACES-AP1") { + sPrimariesPreset = "ACES-AP1"; + } else if (primariesPreset == "Adobe") { + sPrimariesPreset = "Medium"; + } else if (primariesPreset == "Rec2020") { + sPrimariesPreset = "Rec2020"; + } else if (primariesPreset == "BruceRGB") { + sPrimariesPreset = "Bruce"; + } else if (primariesPreset == "sRGB") { + sPrimariesPreset = "sRGB"; + } else if (primariesPreset == "ProPhoto") { + sPrimariesPreset = "Large"; + } else if (primariesPreset == "Widegamut") { + sPrimariesPreset = "Wide"; + } else if (primariesPreset == "BestRGB") { + sPrimariesPreset = "Best"; + } else if (primariesPreset == "BetaRGB") { + sPrimariesPreset = "Beta"; + } else if (primariesPreset == "custom") { + sPrimariesPreset = "Custom"; + } + } + + //begin adaptation rTRC gTRC bTRC + //"newProfile" profile has the same characteristics than RGB values, but TRC are adapted... for applying profile + if (rtengine::settings->verbose) { + printf("Output Gamma - profile Primaries as RT profile: \"%s\"\n", sNewProfile.c_str()); + } + + if (!v2except) { + newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile + } else { + profile_v2_except = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile + + } + + /* + if (newProfile == nullptr ) { + + if (rtengine::settings->verbose) { + printf("\"%s\" ICC output profile not found!\n", sNewProfile.c_str()); + } + + return; + } + */ + //change desc Tag , to "free gamma", or "BT709", etc. + Glib::ustring fName; + Glib::ustring sPrimariesAndIlluminant; + double presetGamma = 2.4; + double presetSlope = 12.92310; + const double eps = 0.000000001; // not divide by zero + getGamma(gammaPreset, presetGamma, presetSlope); + + if (gammaPreset == "High_g1.3_s3.35") { + sGammaPreset = "High_g=1.3_s=3.35"; + ga[0] = 1.3 ; //for high dynamic images + ga[1] = 0.998279; + ga[2] = 0.001721; + ga[3] = 0.298507; + ga[4] = 0.005746; + presetGamma = 1.3; + presetSlope = 3.35; + + } else if (gammaPreset == "Low_g2.6_s6.9") { + sGammaPreset = "Low_g=2.6_s=6.9"; + ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images + ga[1] = 0.891161; + ga[2] = 0.108839; + ga[3] = 0.144928; + ga[4] = 0.076332; + presetGamma = 2.6; + presetSlope = 6.9; + + } else if (gammaPreset == "sRGB_g2.4_s12.92") { + sGammaPreset = "sRGB_g=2.4_s=12.92310"; + ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom + ga[1] = 0.947867; + ga[2] = 0.052133; + ga[3] = 0.077381; + ga[4] = 0.039286; + //g3 = 0.00340 + //g4 = 0.0550 + //g5 = 0.449842 + presetGamma = 2.4; + presetSlope = 12.92310; + + } else if (gammaPreset == "BT709_g2.2_s4.5") { + sGammaPreset = "BT709_g=2.2_s=4.5"; + ga[0] = 2.22; //BT709 2.22 4.5 - my preferred as D.Coffin + ga[1] = 0.909995; + ga[2] = 0.090005; + ga[3] = 0.222222; + ga[4] = 0.081071; + //g3=0.018016 + //g4=0.098907 + //g5=0.517448 + presetGamma = 2.22; + presetSlope = 4.5; + + } else if (gammaPreset == "linear_g1.0") { + sGammaPreset = "Linear_g=1.0"; + ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf D.Coffin...) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; + presetGamma = 1.0; + presetSlope = 0.0; + + } else if (gammaPreset == "standard_g2.2") { + sGammaPreset = "g=2.2"; + ga[0] = 2.2; //gamma=2.2(as gamma of Adobe, Widegamut...) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; + presetGamma = 2.19921875; + presetSlope = 0.0; + } else if (gammaPreset == "standard_g1.8") { + sGammaPreset = "g=1.8"; + ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto) + ga[1] = 1.; + ga[2] = 0.; + ga[3] = 1. / eps; + ga[4] = 0.; + presetGamma = 1.80078125; + presetSlope = 0.0; + + } else if (gammaPreset == "Lab_g3.0s9.03296") { + sGammaPreset = "LAB_g3.0_s9.03296"; + ga[0] = 3.0; //Lab gamma =3 slope=9.03296 + ga[1] = 0.8621; + ga[2] = 0.1379; + ga[3] = 0.1107; + ga[4] = 0.08; + presetGamma = 3.0; + presetSlope = 9.03926; + + } else if (gammaPreset == "Custom") { + rtengine::GammaValues g_a; //gamma parameters + double pwr = 1.0 / gamma; + double ts = slope; + double slope2 = slope == 0 ? eps : slope; + + int mode = 0; + rtengine::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] = gamma; + ga[1] = 1. / (1.0 + g_a[4]); + ga[2] = g_a[4] / (1.0 + g_a[4]); + ga[3] = 1. / slope2; + //printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]); + + sGammaPreset = Glib::ustring::compose("g%1_s%2", + Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(6), gamma), + Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope)); + presetGamma = gamma; + presetSlope = slope; + } + + ga[5] = 0.0; + ga[6] = 0.0; + + + sPrimariesAndIlluminant = sPrimariesPreset; + + if (profileVersion == "v4" && illuminant != "DEF") { + sPrimariesPreset += "-" + illuminant; + } + + Glib::ustring profileDesc; + Glib::ustring sGammaSlopeParam;//to save gamma and slope in a dmdd + Glib::ustring sGammaSlopeDesc; //to save gamma and slope in a desc + Glib::ustring sGamma; + Glib::ustring sSlope; + + if (gammaPreset == "Custom") { + sGamma = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(6), gamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), slope); + fName = Glib::ustring::compose("RT%1_%2_g%3_s%4.icc", profileVersion, sPrimariesAndIlluminant, sGamma, sSlope); + profileDesc = sPrimariesPreset; + } else { + sGamma = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(6), presetGamma); + sSlope = Glib::ustring::format(std::setw(6), std::fixed, std::setprecision(5), presetSlope); + fName = Glib::ustring::compose("RT%1_%2_%3.icc", profileVersion, sPrimariesAndIlluminant, sGammaPreset); + profileDesc = sPrimariesPreset + sGammaPreset; + } + + sGammaSlopeParam = Glib::ustring::compose("g%1s%2!", sGamma, sSlope); + sGammaSlopeDesc = Glib::ustring::compose("g=%1 s=%2", sGamma, sSlope); + + // -------------------------------------------- Asking the file name + + Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("ICCPROFCREATOR_SAVEDIALOG_TITLE"), Gtk::FILE_CHOOSER_ACTION_SAVE); + bindCurrentFolder(dialog, options.lastICCProfCreatorDir); + dialog.set_current_name(fName); + //dialog.set_current_folder(lastPath); + + dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); + dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); + + Glib::RefPtr filter_icc = Gtk::FileFilter::create(); + filter_icc->set_name(M("FILECHOOSER_FILTER_COLPROF")); + filter_icc->add_pattern("*.icc"); + dialog.add_filter(filter_icc); + + /* + Glib::RefPtr filter_any = Gtk::FileFilter::create(); + filter_any->set_name(M("FILECHOOSER_FILTER_ANY")); + filter_any->add_pattern("*"); + dialog.add_filter(filter_any); + */ + + dialog.show_all_children(); + //dialog.set_do_overwrite_confirmation (true); + + Glib::ustring absoluteFName; + + do { + int result = dialog.run(); + + if (result != Gtk::RESPONSE_OK) { + return; + } else { + absoluteFName = dialog.get_filename(); + Glib::ustring ext = getExtension(absoluteFName); + + if (ext != "icc") { + absoluteFName += ".icc"; + } + + if (confirmOverwrite(dialog, absoluteFName)) { + //lastPath = Glib::path_get_dirname(absoluteFName); + break; + } + } + } while (1); + + // --------------- main tags ------------------ + /* + if (profileVersion == "v4") { + cmsSetProfileVersion(newProfile, 4.3); + } else { + cmsSetProfileVersion(newProfile, 2.0); + } + */ + +//change + double p[6]; //primaries + ga[6] = 0.0; + + ColorTemp temp; + getPrimaries(primariesPreset, p, temp); + + cmsCIExyY xyD; + cmsCIExyYTRIPLE Primaries = { + {p[0], p[1], 1.0}, // red + {p[2], p[3], 1.0}, // green + {p[4], p[5], 1.0} // blue + }; + + if (v2except) { + cmsSetDeviceClass(profile_v2_except, cmsSigDisplayClass); + cmsSetPCS(profile_v2_except, cmsSigXYZData); + cmsSetHeaderRenderingIntent(profile_v2_except, 0); + } + + + if (profileVersion == "v4" && illuminant != "DEF") { + double tempv4 = 5000.; + + if (illuminant == "D41") { + tempv4 = 4100.; + } else if (illuminant == "D50") { + tempv4 = 5003.; + } else if (illuminant == "D55") { + tempv4 = 5500.; + } else if (illuminant == "D60") { + tempv4 = 6004.; + } else if (illuminant == "D65") { + tempv4 = 6504.; + } else if (illuminant == "D80") { + tempv4 = 8000.; + } else if (illuminant == "stdA") { + tempv4 = 5003.; + } + + cmsWhitePointFromTemp(&xyD, tempv4); + + if (illuminant == "D65") { + xyD = {0.312700492, 0.329000939, 1.0}; + } + + if (illuminant == "D60") { + xyD = {0.32168, 0.33767, 1.0}; + } + + if (illuminant == "D50") { + xyD = {0.3457, 0.3585, 1.0};//white D50 near LCMS values but not perfect...it's a compromise!! + } + + if (illuminant == "stdA") { + xyD = {0.447573, 0.407440, 1.0}; + } + + } else { + if (v2except) { + + cmsCIEXYZ XYZ; + double Wx = 1.0; + double Wy = 1.0; + double Wz = 1.0; + + if (illuminant == "DEF") { + { + Wx = 0.95045471; + Wz = 1.08905029; + XYZ = {Wx, 1.0, Wz};//white D65 + } + + if (primariesPreset == "ACES-AP1" || primariesPreset == "ACES-AP0") { + Wx = 0.952646075; + Wz = 1.008825184; + XYZ = {Wx, 1.0, Wz};//white D60 + } + + if (isD50) { + Wx = 0.964295676; + Wz = 0.825104603; + XYZ = {Wx, 1.0, Wz};//white D50 room (prophoto) near LCMS values but not perfect...it's a compromise!! + } + } else { + if (illuminant == "D65") { + Wx = 0.95045471; + Wz = 1.08905029; + } else if (illuminant == "D50") { + Wx = 0.964295676; + Wz = 0.825104603; + } else if (illuminant == "D55") { + Wx = 0.956565934; + Wz = 0.920253249; + } else if (illuminant == "D60") { + Wx = 0.952646075; + Wz = 1.008825184; + } else if (illuminant == "D41") { + Wx = 0.991488263; + Wz = 0.631604625; + } else if (illuminant == "D80") { + Wx = 0.950095542; + Wz = 1.284213976; + } else if (illuminant == "stdA") { + Wx = 1.098500393; + Wz = 0.355848714; + } + + XYZ = {Wx, 1.0, Wz}; + + } + + cmsCIExyY blackpoint; + + { + blackpoint = {0., 0., 0.}; + } + + cmsWriteTag(profile_v2_except, cmsSigMediaBlackPointTag, &blackpoint); + cmsWriteTag(profile_v2_except, cmsSigMediaWhitePointTag, &XYZ); + cmsCIEXYZ rt; + cmsCIEXYZ bt; + cmsCIEXYZ gt; + + //calculate XYZ matrix for each primaries and each temp (D50, D65...) + + // reduce coordinate of primaries + //printf("p0=%f p1=%f p2=%f p3=%f p4=%f p5=%f \n", p[0], p[1], p[2], p[3],p[4], p[5]); + double Xr = p[0] / p[1]; + double Yr = 1.0; + double Zr = (1.0 - p[0] - p[1]) / p[1]; + double Xg = p[2] / p[3]; + double Yg = 1.0; + double Zg = (1.0 - p[2] - p[3]) / p[3]; + double Xb = p[4] / p[5]; + double Yb = 1.0; + double Zb = (1.0 - p[4] - p[5]) / p[5]; + + using Triple = std::array; + + using Matrix = std::array; + + Matrix input_prim; + Matrix inv_input_prim = {}; + + input_prim[0][0] = Xr; + input_prim[0][1] = Yr; + input_prim[0][2] = Zr; + input_prim[1][0] = Xg; + input_prim[1][1] = Yg; + input_prim[1][2] = Zg; + input_prim[2][0] = Xb; + input_prim[2][1] = Yb; + input_prim[2][2] = Zb; + + //printf("in=%f in01=%f in22=%f\n", input_prim[0][0], input_prim[0][1], input_prim[2][2]); + if (!rtengine::invertMatrix(input_prim, inv_input_prim)) { + std::cout << "Matrix is not invertible, skipping" << std::endl; + } + + //printf("inv=%f inv01=%f inv22=%f\n", inv_input_prim[0][0], inv_input_prim[0][1], inv_input_prim[2][2]); + + //white point D50 used by LCMS + double Wdx = 0.96420; + double Wdy = 1.0; + double Wdz = 0.82490; + + double Sr = Wx * inv_input_prim [0][0] + Wy * inv_input_prim [1][0] + Wz * inv_input_prim [2][0]; + double Sg = Wx * inv_input_prim [0][1] + Wy * inv_input_prim [1][1] + Wz * inv_input_prim [2][1]; + double Sb = Wx * inv_input_prim [0][2] + Wy * inv_input_prim [1][2] + Wz * inv_input_prim [2][2]; + //printf("sr=%f sg=%f sb=%f\n", Sr, Sg, Sb); + + //XYZ matrix for primaries and temp + Matrix mat_xyz = {}; + mat_xyz[0][0] = Sr * Xr; + mat_xyz[0][1] = Sr * Yr; + mat_xyz[0][2] = Sr * Zr; + mat_xyz[1][0] = Sg * Xg; + mat_xyz[1][1] = Sg * Yg; + mat_xyz[1][2] = Sg * Zg; + mat_xyz[2][0] = Sb * Xb; + mat_xyz[2][1] = Sb * Yb; + mat_xyz[2][2] = Sb * Zb; + //printf("mat0=%f mat22=%f\n", mat_xyz[0][0], mat_xyz[2][2]); + + //chromatic adaptation Bradford + Matrix MaBradford = {}; + MaBradford[0][0] = 0.8951; + MaBradford[0][1] = -0.7502; + MaBradford[0][2] = 0.0389; + MaBradford[1][0] = 0.2664; + MaBradford[1][1] = 1.7135; + MaBradford[1][2] = -0.0685; + MaBradford[2][0] = -0.1614; + MaBradford[2][1] = 0.0367; + MaBradford[2][2] = 1.0296; + + Matrix Ma_oneBradford = {}; + Ma_oneBradford[0][0] = 0.9869929; + Ma_oneBradford[0][1] = 0.4323053; + Ma_oneBradford[0][2] = -0.0085287; + Ma_oneBradford[1][0] = -0.1470543; + Ma_oneBradford[1][1] = 0.5183603; + Ma_oneBradford[1][2] = 0.0400428; + Ma_oneBradford[2][0] = 0.1599627; + Ma_oneBradford[2][1] = 0.0492912; + Ma_oneBradford[2][2] = 0.9684867; + + //R G B source + double Rs = Wx * MaBradford[0][0] + Wy * MaBradford[1][0] + Wz * MaBradford[2][0]; + double Gs = Wx * MaBradford[0][1] + Wy * MaBradford[1][1] + Wz * MaBradford[2][1]; + double Bs = Wx * MaBradford[0][2] + Wy * MaBradford[1][2] + Wz * MaBradford[2][2]; + + // R G B destination + double Rd = Wdx * MaBradford[0][0] + Wdy * MaBradford[1][0] + Wdz * MaBradford[2][0]; + double Gd = Wdx * MaBradford[0][1] + Wdy * MaBradford[1][1] + Wdz * MaBradford[2][1]; + double Bd = Wdx * MaBradford[0][2] + Wdy * MaBradford[1][2] + Wdz * MaBradford[2][2]; + + //cone destination + Matrix cone_dest_sourc = {}; + cone_dest_sourc [0][0] = Rd / Rs; + cone_dest_sourc [0][1] = 0.; + cone_dest_sourc [0][2] = 0.; + cone_dest_sourc [1][0] = 0.; + cone_dest_sourc [1][1] = Gd / Gs; + cone_dest_sourc [1][2] = 0.; + cone_dest_sourc [2][0] = 0.; + cone_dest_sourc [2][1] = 0.; + cone_dest_sourc [2][2] = Bd / Bs; + + Matrix cone_ma_one = {}; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + cone_ma_one[i][j] = 0; + + for (int k = 0; k < 3; ++k) { + cone_ma_one[i][j] += cone_dest_sourc [i][k] * Ma_oneBradford[k][j]; + } + } + } + + //generate adaptation bradford matrix + Matrix adapt_chroma = {}; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + adapt_chroma [i][j] = 0; + + for (int k = 0; k < 3; ++k) { + adapt_chroma[i][j] += MaBradford[i][k] * cone_ma_one[k][j]; + } + } + } + + //real matrix XYZ for primaries, temp, Bradford + Matrix mat_xyz_brad = {}; + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + mat_xyz_brad[i][j] = 0; + + for (int k = 0; k < 3; ++k) { + mat_xyz_brad[i][j] += mat_xyz[i][k] * adapt_chroma[k][j]; + } + } + } + + +// printf("adc=%1.10f ad2=%1.10f ad22=%1.10f\n", mat_xyz_brad[0][0], mat_xyz_brad[1][0], mat_xyz_brad[2][2]); + //end generate XYZ matrix + + //write tags + rt = {mat_xyz_brad[0][0], mat_xyz_brad[0][1], mat_xyz_brad[0][2]}; + cmsWriteTag(profile_v2_except, cmsSigRedColorantTag, &rt); + gt = {mat_xyz_brad[1][0], mat_xyz_brad[1][1], mat_xyz_brad[1][2]}; + cmsWriteTag(profile_v2_except, cmsSigGreenColorantTag, >); + bt = {mat_xyz_brad[2][0], mat_xyz_brad[2][1], mat_xyz_brad[2][2]}; + cmsWriteTag(profile_v2_except, cmsSigBlueColorantTag, &bt); + + + } else { + cmsWhitePointFromTemp(&xyD, (double)temp); + } + } + + + if (isD65 && illuminant == "DEF") { + xyD = {0.312700492, 0.329000939, 1.0}; + } + + if (isD60 && illuminant == "DEF") { + xyD = {0.32168, 0.33767, 1.0}; + } + + if (isD50 && illuminant == "DEF") { + xyD = {0.3457, 0.3585, 1.0}; + } + + // Calculate output profile's rTRC gTRC bTRC + + + cmsToneCurve* GammaTRC[3]; + + if (gammaPreset == "standard_g2.2") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 2.19921875);//spec Adobe + } else if (gammaPreset == "standard_g1.8") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.80078125); + } else if (gammaPreset == "linear_g1.0") { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, 1.0); + } else if(gammaPreset == "Custom" && slope == 0.0) { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildGamma(NULL, gamma); + } else { + GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, ga); + } + + + + if (profileVersion == "v4") { + newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); + } else if (profileVersion == "v2") { + if (v2except) { + cmsSetProfileVersion(profile_v2_except, 2.2); + } else { + cmsSetProfileVersion(newProfile, 2.2); + } + } + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]); + } else { + cmsWriteTag(profile_v2_except, cmsSigRedTRCTag, GammaTRC[0]); + cmsWriteTag(profile_v2_except, cmsSigGreenTRCTag, GammaTRC[1]); + cmsWriteTag(profile_v2_except, cmsSigBlueTRCTag, GammaTRC[2]); + } + + // --------------- set dmnd tag ------------------ + + cmsMLU *dmnd; + dmnd = cmsMLUalloc(nullptr, 1); + cmsMLUsetASCII(dmnd, "en", "US", "RawTherapee"); + + if (!v2except) { + cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, dmnd); + } else { + cmsWriteTag(profile_v2_except, cmsSigDeviceMfgDescTag, dmnd); + } + + cmsMLUfree(dmnd); + + + +// --------------- set dmdd tag ------------------ + + if (profileVersion == "v2") { + //write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wGammaSlopeParam; + wGammaSlopeParam << sGammaSlopeParam; + + cmsMLU *dmdd = cmsMLUalloc(nullptr, 1); + + // Language code (2 letters code) : https://www.iso.org/obp/ui/ + // Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sGammaSlopeParam.is_ascii()) { + if (cmsMLUsetASCII(dmdd, "en", "US", sGammaSlopeParam.c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + + } + } + } else if (cmsMLUsetWide(dmdd, "en", "US", wGammaSlopeParam.str().c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigDeviceModelDescTag, dmdd)) { + printf("Error: Can't write cmsSigDeviceModelDescTag!\n"); + } + } + } else { + printf("Error: cmsMLUsetWide failed for dmdd \"%s\" !\n", sGammaSlopeParam.c_str()); + } + + cmsMLUfree(dmdd); + } + +// --------------- set desc tag ------------------ + + Glib::ustring sDescription; + + if (!description.empty()) { + if (cAppendParamsToDesc->get_active()) { + sDescription = description + " / " + sGammaSlopeDesc; + } else { + sDescription = description; + } + } else { + if (cAppendParamsToDesc->get_active()) { + sDescription = profileDesc + " / " + sGammaSlopeDesc; + } else { + sDescription = profileDesc; + } + } + +//write in tag 'dmdd' values of current gamma and slope to retrieve after in Output profile + std::wostringstream wDescription; + wDescription << sDescription; + + cmsMLU *descMLU = cmsMLUalloc(nullptr, 1); + +// Language code (2 letters code) : https://www.iso.org/obp/ui/ +// Country code (2 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php + if (sDescription.is_ascii()) { + if (cmsMLUsetASCII(descMLU, "en", "US", sDescription.c_str())) { + if (!v2except) { + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } + + } else if (cmsMLUsetWide(descMLU, "en", "US", wDescription.str().c_str())) { + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigProfileDescriptionTag, descMLU)) { + printf("Error: Can't write cmsSigProfileDescriptionTag!\n"); + } + } + } else { + printf("Error: cmsMLUsetWide failed for desc \"%s\" !\n", sDescription.c_str()); + } + + cmsMLUfree(descMLU); + +// --------------- set cprt tag ------------------ + + std::wostringstream wCopyright; + wCopyright << copyright; + + cmsMLU *copyMLU = cmsMLUalloc(nullptr, 1); + + if (cmsMLUsetWide(copyMLU, "en", "US", wCopyright.str().c_str())) { + if (!v2except) { + + if (!cmsWriteTag(newProfile, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + } else { + if (!cmsWriteTag(profile_v2_except, cmsSigCopyrightTag, copyMLU)) { + printf("Error: Can't write cmsSigCopyrightTag!\n"); + } + + } + } else { + printf("Error: cmsMLUsetWide failed for cprt \"%s\" !\n", copyright.c_str()); + } + + cmsMLUfree(copyMLU); + + + /* //to read XYZ values + cmsCIEXYZ *redT = static_cast(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag)); + cmsCIEXYZ *greenT = static_cast(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag)); + cmsCIEXYZ *blueT = static_cast(cmsReadTag(newProfile, cmsSigBlueMatrixColumnTag)); + printf("rx=%f gx=%f bx=%f ry=%f gy=%f by=%f rz=%f gz=%f bz=%f\n", redT->X, greenT->X, blueT->X, redT->Y, greenT->Y, blueT->Y, redT->Z, greenT->Z, blueT->Z); + */ + if (!v2except) { + cmsSaveProfileToFile(newProfile, absoluteFName.c_str()); + } else { + cmsSaveProfileToFile(profile_v2_except, absoluteFName.c_str()); + + } + + cmsFreeToneCurve(GammaTRC[0]); +} diff --git a/rtgui/iccprofilecreator.h b/rtgui/iccprofilecreator.h new file mode 100644 index 000000000..23e5b86c8 --- /dev/null +++ b/rtgui/iccprofilecreator.h @@ -0,0 +1,107 @@ +/* + * This file is part of RawTherapee. + * + * Copyright (c) 2018 Jacques DESMIS + * Copyright (c) 2018 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "options.h" +#include +#include "rtwindow.h" + +class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener +{ + +private: + + enum class ColorTemp { + D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50 + D60 = 6005, // for ACESc -> D60 + D65 = 6504 // for sRGB, AdobeRGB, Bruce Rec2020 -> D65 + }; + + cmsFloat64Number ga[7]; // 7 parameters for smoother curves + + //------------------------ Params ----------------------- + Glib::ustring primariesPreset; + double redPrimaryX; + double redPrimaryY; + double greenPrimaryX; + double greenPrimaryY; + double bluePrimaryX; + double bluePrimaryY; + Glib::ustring gammaPreset; + double gamma; + double slope; + bool appendParamsToDesc; + bool v2except; + Glib::ustring profileVersion; + Glib::ustring illuminant; + Glib::ustring description; + Glib::ustring copyright; + //------------------------------------------------------- + + RTWindow *parent; + + Adjuster* aGamma; + Adjuster* aSlope; + Adjuster* aPrimariesRedX; + Adjuster* aPrimariesRedY; + Adjuster* aPrimariesGreenX; + Adjuster* aPrimariesGreenY; + Adjuster* aPrimariesBlueX; + Adjuster* aPrimariesBlueY; + + Gtk::Grid* primariesGrid; + MyComboBoxText* iccVersion; + MyComboBoxText* trcPresets; + sigc::connection trcpresetsconn; + MyComboBoxText* primaries; + sigc::connection primariesconn; + MyComboBoxText* cIlluminant; + sigc::connection illconn; + Gtk::Entry* eDescription; + Gtk::Entry* eCopyright; + Gtk::Button* resetCopyright; + Gtk::CheckButton *cAppendParamsToDesc; + + //Glib::ustring lastPath; + + void initWithDefaults (); + void storeDefaults (); + void storeValues(); + + void updateICCVersion(); + void primariesChanged(); + void illuminantChanged(); + void trcPresetsChanged(); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + static std::vector getGamma(); + Glib::ustring getPrimariesPresetName(const Glib::ustring &preset); + void getPrimaries(const Glib::ustring &preset, double *p, ColorTemp &temp); + Glib::ustring getGammaPresetName(const Glib::ustring &preset); + void getGamma(const Glib::ustring &preset, double &gamma, double &slope); + void savePressed(); + void closePressed(); + void onResetCopyright(); + +public: + explicit ICCProfileCreator (RTWindow *rtwindow); +}; diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index e026243be..ba8bf9cef 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -17,115 +17,132 @@ * along with RawTherapee. If not, see . */ #include + #include "icmpanel.h" -#include "options.h" + +#include "eventmapper.h" #include "guiutils.h" -#include "../rtengine/iccstore.h" -#include "../rtengine/dcp.h" +#include "options.h" #include "rtimage.h" +#include "../rtengine/dcp.h" +#include "../rtengine/iccstore.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; extern Options options; -ICMPanel::ICMPanel () : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunchanged(nullptr), icmplistener(nullptr), lastRefFilename(""), camName("") +ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunchanged(nullptr), icmplistener(nullptr), lastRefFilename(""), camName("") { + auto m = ProcEventMapper::getInstance(); + EvICMprimariMethod = m->newEvent(GAMMA, "HISTORY_MSG_ICM_OUTPUT_PRIMARIES"); + EvICMprofileMethod = m->newEvent(GAMMA, "HISTORY_MSG_ICM_OUTPUT_TYPE"); + EvICMtempMethod = m->newEvent(GAMMA, "HISTORY_MSG_ICM_OUTPUT_TEMP"); + EvICMpredx = m->newEvent(GAMMA, "HISTORY_MSG_ICMPREDX"); + EvICMpredy = m->newEvent(GAMMA, "HISTORY_MSG_ICMPREDY"); + EvICMpgrex = m->newEvent(GAMMA, "HISTORY_MSG_ICMPGREX"); + EvICMpgrey = m->newEvent(GAMMA, "HISTORY_MSG_ICMPGREY"); + EvICMpblux = m->newEvent(GAMMA, "HISTORY_MSG_ICMPBLUX"); + EvICMpbluy = m->newEvent(GAMMA, "HISTORY_MSG_ICMPBLUY"); + EvICMgamm = m->newEvent(AUTOEXP, "HISTORY_MSG_ICM_WORKING_GAMMA"); + EvICMslop = m->newEvent(AUTOEXP, "HISTORY_MSG_ICM_WORKING_SLOPE"); + EvICMtrcinMethod = m->newEvent(AUTOEXP, "HISTORY_MSG_ICM_WORKING_TRC_METHOD"); - isBatchMode = lastToneCurve = lastApplyLookTable = lastApplyBaselineExposureOffset = lastApplyHueSatMap = lastgamfree = false; + isBatchMode = lastToneCurve = lastApplyLookTable = lastApplyBaselineExposureOffset = lastApplyHueSatMap = false; - ipDialog = Gtk::manage (new MyFileChooserButton (M("TP_ICM_INPUTDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)); - ipDialog->set_tooltip_text (M("TP_ICM_INPUTCUSTOM_TOOLTIP")); - bindCurrentFolder (*ipDialog, options.lastIccDir); + ipDialog = Gtk::manage(new MyFileChooserButton(M("TP_ICM_INPUTDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)); + ipDialog->set_tooltip_text(M("TP_ICM_INPUTCUSTOM_TOOLTIP")); + bindCurrentFolder(*ipDialog, options.lastIccDir); // ------------------------------- Input profile - Gtk::Frame *iFrame = Gtk::manage (new Gtk::Frame(M("TP_ICM_INPUTPROFILE")) ); + Gtk::Frame *iFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_INPUTPROFILE"))); iFrame->set_label_align(0.025, 0.5); - iVBox = Gtk::manage ( new Gtk::VBox()); - iVBox->set_spacing(2); + iVBox = Gtk::manage(new Gtk::VBox()); - inone = Gtk::manage (new Gtk::RadioButton (M("TP_ICM_INPUTNONE"))); - inone->set_tooltip_text (M("TP_ICM_INPUTNONE_TOOLTIP")); - iVBox->pack_start (*inone, Gtk::PACK_SHRINK); + inone = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTNONE"))); + inone->set_tooltip_text(M("TP_ICM_INPUTNONE_TOOLTIP")); + iVBox->pack_start(*inone, Gtk::PACK_SHRINK); - iembedded = Gtk::manage (new Gtk::RadioButton (M("TP_ICM_INPUTEMBEDDED"))); - iembedded->set_tooltip_text (M("TP_ICM_INPUTEMBEDDED_TOOLTIP")); - iVBox->pack_start (*iembedded, Gtk::PACK_SHRINK); + iembedded = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTEMBEDDED"))); + iembedded->set_tooltip_text(M("TP_ICM_INPUTEMBEDDED_TOOLTIP")); + iVBox->pack_start(*iembedded, Gtk::PACK_SHRINK); - icamera = Gtk::manage (new Gtk::RadioButton (M("TP_ICM_INPUTCAMERA"))); - icamera->set_tooltip_text (M("TP_ICM_INPUTCAMERA_TOOLTIP")); - iVBox->pack_start (*icamera, Gtk::PACK_SHRINK); + icamera = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTCAMERA"))); + icamera->set_tooltip_text(M("TP_ICM_INPUTCAMERA_TOOLTIP")); + iVBox->pack_start(*icamera, Gtk::PACK_SHRINK); - icameraICC = Gtk::manage (new Gtk::RadioButton (M("TP_ICM_INPUTCAMERAICC"))); - icameraICC->set_tooltip_text (M("TP_ICM_INPUTCAMERAICC_TOOLTIP")); - iVBox->pack_start (*icameraICC, Gtk::PACK_SHRINK); + icameraICC = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTCAMERAICC"))); + icameraICC->set_tooltip_text(M("TP_ICM_INPUTCAMERAICC_TOOLTIP")); + iVBox->pack_start(*icameraICC, Gtk::PACK_SHRINK); - ifromfile = Gtk::manage (new Gtk::RadioButton (M("TP_ICM_INPUTCUSTOM") + ":")); - Gtk::HBox* ffbox = Gtk::manage (new Gtk::HBox ()); - ifromfile->set_tooltip_text (M("TP_ICM_INPUTCUSTOM_TOOLTIP")); - ffbox->pack_start (*ifromfile, Gtk::PACK_SHRINK); - ffbox->pack_start (*ipDialog); + ifromfile = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTCUSTOM") + ":")); + Gtk::HBox* ffbox = Gtk::manage(new Gtk::HBox()); + ifromfile->set_tooltip_text(M("TP_ICM_INPUTCUSTOM_TOOLTIP")); + ffbox->pack_start(*ifromfile, Gtk::PACK_SHRINK); + ffbox->pack_start(*ipDialog); - iVBox->pack_start (*ffbox, Gtk::PACK_SHRINK); + iVBox->pack_start(*ffbox, Gtk::PACK_SHRINK); opts = icamera->get_group(); - icameraICC->set_group (opts); - iembedded->set_group (opts); - ifromfile->set_group (opts); - inone->set_group (opts); + icameraICC->set_group(opts); + iembedded->set_group(opts); + ifromfile->set_group(opts); + inone->set_group(opts); - dcpFrame = Gtk::manage (new Gtk::Frame ("DCP")); + dcpFrame = Gtk::manage(new Gtk::Frame("DCP")); - Gtk::Grid* dcpGrid = Gtk::manage ( new Gtk::Grid()); + Gtk::Grid* dcpGrid = Gtk::manage(new Gtk::Grid()); dcpGrid->set_column_homogeneous(false); dcpGrid->set_row_homogeneous(false); dcpGrid->set_column_spacing(2); dcpGrid->set_row_spacing(2); - Gtk::Grid* dcpIllGrid = Gtk::manage ( new Gtk::Grid()); + Gtk::Grid* dcpIllGrid = Gtk::manage(new Gtk::Grid()); dcpIllGrid->set_column_homogeneous(false); dcpIllGrid->set_row_homogeneous(false); dcpIllGrid->set_column_spacing(2); dcpIllGrid->set_row_spacing(2); - dcpIllLabel = Gtk::manage (new Gtk::Label (M("TP_ICM_DCPILLUMINANT") + ":")); + dcpIllLabel = Gtk::manage(new Gtk::Label(M("TP_ICM_DCPILLUMINANT") + ":")); setExpandAlignProperties(dcpIllLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - dcpIllLabel->set_tooltip_text (M("TP_ICM_DCPILLUMINANT_TOOLTIP")); - dcpIllLabel->show (); - dcpIll = Gtk::manage (new MyComboBoxText ()); + dcpIllLabel->set_tooltip_text(M("TP_ICM_DCPILLUMINANT_TOOLTIP")); + dcpIllLabel->show(); + dcpIll = Gtk::manage(new MyComboBoxText()); setExpandAlignProperties(dcpIll, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - dcpIll->set_tooltip_text (M("TP_ICM_DCPILLUMINANT_TOOLTIP")); - dcpIll->append (M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); - dcpIll->append (M("TP_ICM_DCPILLUMINANT") + " 1"); - dcpIll->append (M("TP_ICM_DCPILLUMINANT") + " 2"); - dcpIll->show (); + dcpIll->set_tooltip_text(M("TP_ICM_DCPILLUMINANT_TOOLTIP")); + dcpIll->append(M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); + dcpIll->append(M("TP_ICM_DCPILLUMINANT") + " 1"); + dcpIll->append(M("TP_ICM_DCPILLUMINANT") + " 2"); + dcpIll->show(); dcpTemperatures[0] = 0; dcpTemperatures[1] = 0; dcpIllGrid->attach_next_to(*dcpIllLabel, Gtk::POS_LEFT, 1, 1); dcpIllGrid->attach_next_to(*dcpIll, *dcpIllLabel, Gtk::POS_RIGHT, 1, 1); - ckbToneCurve = Gtk::manage (new Gtk::CheckButton (M("TP_ICM_TONECURVE"))); - ckbToneCurve->set_sensitive (false); - ckbToneCurve->set_tooltip_text (M("TP_ICM_TONECURVE_TOOLTIP")); + ckbToneCurve = Gtk::manage(new Gtk::CheckButton(M("TP_ICM_TONECURVE"))); + ckbToneCurve->set_sensitive(false); + ckbToneCurve->set_tooltip_text(M("TP_ICM_TONECURVE_TOOLTIP")); setExpandAlignProperties(ckbToneCurve, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - ckbApplyLookTable = Gtk::manage (new Gtk::CheckButton (M("TP_ICM_APPLYLOOKTABLE"))); - ckbApplyLookTable->set_sensitive (false); - ckbApplyLookTable->set_tooltip_text (M("TP_ICM_APPLYLOOKTABLE_TOOLTIP")); + ckbApplyLookTable = Gtk::manage(new Gtk::CheckButton(M("TP_ICM_APPLYLOOKTABLE"))); + ckbApplyLookTable->set_sensitive(false); + ckbApplyLookTable->set_tooltip_text(M("TP_ICM_APPLYLOOKTABLE_TOOLTIP")); setExpandAlignProperties(ckbApplyLookTable, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - ckbApplyHueSatMap = Gtk::manage (new Gtk::CheckButton (M("TP_ICM_APPLYHUESATMAP"))); - ckbApplyHueSatMap->set_sensitive (false); - ckbApplyHueSatMap->set_tooltip_text (M("TP_ICM_APPLYHUESATMAP_TOOLTIP")); + ckbApplyHueSatMap = Gtk::manage(new Gtk::CheckButton(M("TP_ICM_APPLYHUESATMAP"))); + ckbApplyHueSatMap->set_sensitive(false); + ckbApplyHueSatMap->set_tooltip_text(M("TP_ICM_APPLYHUESATMAP_TOOLTIP")); setExpandAlignProperties(ckbApplyHueSatMap, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - ckbApplyBaselineExposureOffset = Gtk::manage (new Gtk::CheckButton (M("TP_ICM_APPLYBASELINEEXPOSUREOFFSET"))); - ckbApplyBaselineExposureOffset->set_sensitive (false); - ckbApplyBaselineExposureOffset->set_tooltip_text (M("TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP")); + ckbApplyBaselineExposureOffset = Gtk::manage(new Gtk::CheckButton(M("TP_ICM_APPLYBASELINEEXPOSUREOFFSET"))); + ckbApplyBaselineExposureOffset->set_sensitive(false); + ckbApplyBaselineExposureOffset->set_tooltip_text(M("TP_ICM_APPLYBASELINEEXPOSUREOFFSET_TOOLTIP")); setExpandAlignProperties(ckbApplyBaselineExposureOffset, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); dcpGrid->attach_next_to(*dcpIllGrid, Gtk::POS_BOTTOM, 1, 1); @@ -136,142 +153,128 @@ ICMPanel::ICMPanel () : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunch dcpFrame->add(*dcpGrid); dcpFrame->set_sensitive(false); - iVBox->pack_start (*dcpFrame); + iVBox->pack_start(*dcpFrame); - saveRef = Gtk::manage (new Gtk::Button (M("TP_ICM_SAVEREFERENCE"))); - saveRef->set_image (*Gtk::manage (new RTImage ("gtk-save-large.png"))); - saveRef->set_alignment (0.5f, 0.5f); - saveRef->set_tooltip_markup (M("TP_ICM_SAVEREFERENCE_TOOLTIP")); - iVBox->pack_start (*saveRef, Gtk::PACK_SHRINK); + saveRef = Gtk::manage(new Gtk::Button(M("TP_ICM_SAVEREFERENCE"))); + saveRef->set_image(*Gtk::manage(new RTImage("save-small.png"))); + saveRef->set_alignment(0.5f, 0.5f); + saveRef->set_tooltip_markup(M("TP_ICM_SAVEREFERENCE_TOOLTIP")); + iVBox->pack_start(*saveRef, Gtk::PACK_SHRINK); iFrame->add(*iVBox); - pack_start (*iFrame, Gtk::PACK_EXPAND_WIDGET); + pack_start(*iFrame, Gtk::PACK_EXPAND_WIDGET); // ---------------------------- Working profile - Gtk::Frame *wFrame = Gtk::manage (new Gtk::Frame(M("TP_ICM_WORKINGPROFILE")) ); + Gtk::Frame *wFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_WORKINGPROFILE"))); wFrame->set_label_align(0.025, 0.5); - Gtk::VBox *wVBox = Gtk::manage ( new Gtk::VBox()); - wVBox->set_spacing(2); + Gtk::VBox *wProfVBox = Gtk::manage(new Gtk::VBox()); - wnames = Gtk::manage (new MyComboBoxText ()); - wVBox->pack_start (*wnames, Gtk::PACK_SHRINK); + wProfNames = Gtk::manage(new MyComboBoxText()); + wProfVBox->pack_start(*wProfNames, Gtk::PACK_SHRINK); - std::vector wpnames = rtengine::ICCStore::getWorkingProfiles(); + std::vector wpnames = rtengine::ICCStore::getInstance()->getWorkingProfiles(); for (size_t i = 0; i < wpnames.size(); i++) { - wnames->append (wpnames[i]); + wProfNames->append(wpnames[i]); } - wnames->set_active (0); + wProfNames->set_active(0); - wFrame->add(*wVBox); - pack_start (*wFrame, Gtk::PACK_EXPAND_WIDGET); + // wFrame->add(*wVBox); + + //-----------------gamma TRC working + + wTRCHBox = Gtk::manage(new Gtk::HBox()); + + Gtk::Label* wtrclab = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKING_TRC"))); + + wTRCHBox->pack_start(*wtrclab, Gtk::PACK_SHRINK); + wTRC = Gtk::manage(new MyComboBoxText()); + wTRCHBox->pack_start(*wTRC, Gtk::PACK_EXPAND_WIDGET); + wProfVBox->pack_start(*wTRCHBox, Gtk::PACK_EXPAND_WIDGET); + wTRC->append(M("TP_ICM_WORKING_TRC_NONE")); + wTRC->append(M("TP_ICM_WORKING_TRC_CUSTOM")); + + wTRC->set_active(0); + wTRC->set_tooltip_text(M("TP_ICM_WORKING_TRC_TOOLTIP")); + + + wGamma = Gtk::manage(new Adjuster(M("TP_ICM_WORKING_TRC_GAMMA"), 0.40, 15.0, 0.001, 2.4)); + wSlope = Gtk::manage(new Adjuster(M("TP_ICM_WORKING_TRC_SLOPE"), 0., 150., 0.01, 12.92310)); + wProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK); + wGamma->show(); + + wProfVBox->pack_start(*wSlope, Gtk::PACK_SHRINK); + wSlope->show(); + + + wGamma->setAdjusterListener(this); + wSlope->setAdjusterListener(this); + + if (wGamma->delay < options.adjusterMaxDelay) { + wGamma->delay = options.adjusterMaxDelay; + } + + if (wSlope->delay < options.adjusterMaxDelay) { + wSlope->delay = options.adjusterMaxDelay; + } + + wFrame->add(*wProfVBox); + + pack_start(*wFrame, Gtk::PACK_EXPAND_WIDGET); // ---------------------------- Output profile - Gtk::Frame *oFrame = Gtk::manage (new Gtk::Frame(M("TP_ICM_OUTPUTPROFILE")) ); + Gtk::Frame *oFrame = Gtk::manage(new Gtk::Frame(M("TP_ICM_OUTPUTPROFILE"))); oFrame->set_label_align(0.025, 0.5); - Gtk::VBox *oVBox = Gtk::manage ( new Gtk::VBox()); - oVBox->set_spacing(2); + Gtk::VBox *oProfVBox = Gtk::manage(new Gtk::VBox()); - onames = Gtk::manage (new MyComboBoxText ()); - oVBox->pack_start (*onames, Gtk::PACK_SHRINK); + oProfNames = Gtk::manage(new MyComboBoxText()); + oProfVBox->pack_start(*oProfNames, Gtk::PACK_SHRINK); - onames->append (M("TP_ICM_NOICM")); - onames->set_active (0); + oProfNames->append(M("TP_ICM_NOICM")); + oProfNames->set_active(0); - std::vector opnames = ICCStore::getInstance()->getProfiles (rtengine::ICCStore::ProfileType::OUTPUT); + std::vector opnames = ICCStore::getInstance()->getProfiles(rtengine::ICCStore::ProfileType::OUTPUT); for (size_t i = 0; i < opnames.size(); i++) { - onames->append (opnames[i]); + oProfNames->append(opnames[i]); } - onames->set_active (0); + oProfNames->set_active(0); // Rendering intent - Gtk::HBox *riHBox = Gtk::manage ( new Gtk::HBox()); - Gtk::Label* outputIntentLbl = Gtk::manage (new Gtk::Label(M("TP_ICM_PROFILEINTENT")+":")); - riHBox->pack_start (*outputIntentLbl, Gtk::PACK_SHRINK); - ointent.reset (new PopUpButton ()); - ointent->addEntry("intent-perceptual.png", M("PREFERENCES_INTENT_PERCEPTUAL")); - ointent->addEntry("intent-relative.png", M("PREFERENCES_INTENT_RELATIVE")); - ointent->addEntry("intent-saturation.png", M("PREFERENCES_INTENT_SATURATION")); - ointent->addEntry("intent-absolute.png", M("PREFERENCES_INTENT_ABSOLUTE")); - ointent->setSelected (1); - ointent->show(); - riHBox->pack_start (*ointent->buttonGroup, Gtk::PACK_EXPAND_PADDING); - oVBox->pack_start(*riHBox, Gtk::PACK_SHRINK); + Gtk::HBox *riHBox = Gtk::manage(new Gtk::HBox()); + Gtk::Label* outputIntentLbl = Gtk::manage(new Gtk::Label(M("TP_ICM_PROFILEINTENT"))); + riHBox->pack_start(*outputIntentLbl, Gtk::PACK_SHRINK); + oRendIntent.reset(new PopUpButton()); + oRendIntent->addEntry("intent-perceptual.png", M("PREFERENCES_INTENT_PERCEPTUAL")); + oRendIntent->addEntry("intent-relative.png", M("PREFERENCES_INTENT_RELATIVE")); + oRendIntent->addEntry("intent-saturation.png", M("PREFERENCES_INTENT_SATURATION")); + oRendIntent->addEntry("intent-absolute.png", M("PREFERENCES_INTENT_ABSOLUTE")); + oRendIntent->setSelected(1); + oRendIntent->show(); + riHBox->pack_start(*oRendIntent->buttonGroup, Gtk::PACK_EXPAND_PADDING); + oProfVBox->pack_start(*riHBox, Gtk::PACK_SHRINK); // Black Point Compensation obpc = Gtk::manage(new Gtk::CheckButton((M("TP_ICM_BPC")))); - obpc->set_active (true); - oVBox->pack_start(*obpc, Gtk::PACK_SHRINK); + obpc->set_active(true); + oProfVBox->pack_start(*obpc, Gtk::PACK_SHRINK); - // Output gamma - - Gtk::HBox* gaHBox = Gtk::manage (new Gtk::HBox ()); - Gtk::Label* galab = Gtk::manage (new Gtk::Label (M("TP_GAMMA_OUTPUT") + ":")); - //galab->set_alignment (0.0, 0.5); - - gaHBox->pack_start (*galab, Gtk::PACK_SHRINK); - wgamma = Gtk::manage (new MyComboBoxText ()); - gaHBox->pack_start (*wgamma, Gtk::PACK_EXPAND_WIDGET); - - oVBox->pack_start(*gaHBox, Gtk::PACK_EXPAND_WIDGET); - - std::vector wpgamma = rtengine::ICCStore::getGamma(); - - for (size_t i = 0; i < wpgamma.size(); i++) { - wgamma->append (wpgamma[i]); - } - - wgamma->set_active (0); - - Gtk::Frame* fgFrame = Gtk::manage (new Gtk::Frame ()); - - Gtk::VBox *fgVBox = Gtk::manage ( new Gtk::VBox()); - fgVBox->set_spacing(2); - - freegamma = Gtk::manage(new Gtk::CheckButton((M("TP_GAMMA_FREE")))); - freegamma->set_active (false); - fgFrame->set_label_widget(*freegamma); - - gampos = Gtk::manage(new Adjuster (M("TP_GAMMA_CURV"), 1, 3.5, 0.01, 2.22)); - gampos->setAdjusterListener (this); - - if (gampos->delay < options.adjusterMaxDelay) { - gampos->delay = options.adjusterMaxDelay; - } - - gampos->show(); - slpos = Gtk::manage(new Adjuster (M("TP_GAMMA_SLOP"), 0, 15, 0.01, 4.5)); - slpos->setAdjusterListener (this); - - if (slpos->delay < options.adjusterMaxDelay) { - slpos->delay = options.adjusterMaxDelay; - } - - slpos->show(); - fgVBox->pack_start( *gampos, Gtk::PACK_SHRINK);//gamma - fgVBox->pack_start( *slpos, Gtk::PACK_SHRINK);//slope - - fgFrame->add(*fgVBox); - oVBox->pack_start(*fgFrame, Gtk::PACK_EXPAND_WIDGET); - - oFrame->add(*oVBox); - pack_start (*oFrame, Gtk::PACK_EXPAND_WIDGET); + oFrame->add(*oProfVBox); + pack_start(*oFrame, Gtk::PACK_EXPAND_WIDGET); // ---------------------------- Output gamma list entries - Glib::RefPtr filter_icc = Gtk::FileFilter::create(); filter_icc->set_name(M("FILECHOOSER_FILTER_COLPROF")); filter_icc->add_pattern("*.dcp"); @@ -294,38 +297,41 @@ ICMPanel::ICMPanel () : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iunch filter_any->set_name(M("FILECHOOSER_FILTER_ANY")); filter_any->add_pattern("*"); - ipDialog->add_filter (filter_icc); - ipDialog->add_filter (filter_iccdng); - ipDialog->add_filter (filter_any); + ipDialog->add_filter(filter_icc); + ipDialog->add_filter(filter_iccdng); + ipDialog->add_filter(filter_any); +#ifdef WIN32 + ipDialog->set_show_hidden(true); // ProgramData is hidden on Windows +#endif oldip = ""; - wnamesconn = wnames->signal_changed().connect( sigc::mem_fun(*this, &ICMPanel::wpChanged) ); - onamesconn = onames->signal_changed().connect( sigc::mem_fun(*this, &ICMPanel::opChanged) ); - ointentconn = ointent->signal_changed().connect( sigc::mem_fun(*this, &ICMPanel::oiChanged) ); - wgammaconn = wgamma->signal_changed().connect( sigc::mem_fun(*this, &ICMPanel::gpChanged) ); - dcpillconn = dcpIll->signal_changed().connect( sigc::mem_fun(*this, &ICMPanel::dcpIlluminantChanged) ); + wprofnamesconn = wProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wpChanged)); + oprofnamesconn = oProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::opChanged)); + orendintentconn = oRendIntent->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::oiChanged)); + dcpillconn = dcpIll->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::dcpIlluminantChanged)); + wtrcconn = wTRC->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wtrcinChanged)); - obpcconn = obpc->signal_toggled().connect( sigc::mem_fun(*this, &ICMPanel::oBPCChanged) ); - gamcsconn = freegamma->signal_toggled().connect ( sigc::mem_fun(*this, &ICMPanel::GamChanged)); - tcurveconn = ckbToneCurve->signal_toggled().connect ( sigc::mem_fun(*this, &ICMPanel::toneCurveChanged)); - ltableconn = ckbApplyLookTable->signal_toggled().connect ( sigc::mem_fun(*this, &ICMPanel::applyLookTableChanged)); - beoconn = ckbApplyBaselineExposureOffset->signal_toggled().connect ( sigc::mem_fun(*this, &ICMPanel::applyBaselineExposureOffsetChanged)); - hsmconn = ckbApplyHueSatMap->signal_toggled().connect ( sigc::mem_fun(*this, &ICMPanel::applyHueSatMapChanged)); + obpcconn = obpc->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::oBPCChanged)); + tcurveconn = ckbToneCurve->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::toneCurveChanged)); + ltableconn = ckbApplyLookTable->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyLookTableChanged)); + beoconn = ckbApplyBaselineExposureOffset->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyBaselineExposureOffsetChanged)); + hsmconn = ckbApplyHueSatMap->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyHueSatMapChanged)); - icamera->signal_toggled().connect( sigc::mem_fun(*this, &ICMPanel::ipChanged) ); - icameraICC->signal_toggled().connect( sigc::mem_fun(*this, &ICMPanel::ipChanged) ); - iembedded->signal_toggled().connect( sigc::mem_fun(*this, &ICMPanel::ipChanged) ); - ifromfile->signal_toggled().connect( sigc::mem_fun(*this, &ICMPanel::ipChanged) ); + icamera->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::ipChanged)); + icameraICC->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::ipChanged)); + iembedded->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::ipChanged)); + ifromfile->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::ipChanged)); - ipc = ipDialog->signal_selection_changed().connect( sigc::mem_fun(*this, &ICMPanel::ipSelectionChanged) ); - saveRef->signal_pressed().connect( sigc::mem_fun(*this, &ICMPanel::saveReferencePressed) ); + ipc = ipDialog->signal_selection_changed().connect(sigc::mem_fun(*this, &ICMPanel::ipSelectionChanged)); + saveRef->signal_pressed().connect(sigc::mem_fun(*this, &ICMPanel::saveReferencePressed)); - show_all (); + show_all(); } -void ICMPanel::updateRenderingIntent (const Glib::ustring &profile) { - const uint8_t supportedIntents = rtengine::ICCStore::getInstance()->getOutputIntents (profile); +void ICMPanel::updateRenderingIntent(const Glib::ustring &profile) +{ + const uint8_t supportedIntents = rtengine::ICCStore::getInstance()->getOutputIntents(profile); const bool supportsPerceptual = supportedIntents & 1 << INTENT_PERCEPTUAL; const bool supportsRelative = supportedIntents & 1 << INTENT_RELATIVE_COLORIMETRIC; const bool supportsSaturation = supportedIntents & 1 << INTENT_SATURATION; @@ -334,44 +340,44 @@ void ICMPanel::updateRenderingIntent (const Glib::ustring &profile) { //printf("Intents: %d / Perceptual: %d Relative: %d Saturation: %d Absolute: %d\n", supportedIntents, supportsPerceptual, supportsRelative, supportsSaturation, supportsAbsolute); if (!profile.empty() && (supportsPerceptual || supportsRelative || supportsSaturation || supportsAbsolute)) { - ointent->set_sensitive (true); - ointent->setItemSensitivity(0, supportsPerceptual); - ointent->setItemSensitivity(1, supportsRelative); - ointent->setItemSensitivity(2, supportsSaturation); - ointent->setItemSensitivity(3, supportsAbsolute); + oRendIntent->set_sensitive(true); + oRendIntent->setItemSensitivity(0, supportsPerceptual); + oRendIntent->setItemSensitivity(1, supportsRelative); + oRendIntent->setItemSensitivity(2, supportsSaturation); + oRendIntent->setItemSensitivity(3, supportsAbsolute); } else { - ointent->setItemSensitivity(0, true); - ointent->setItemSensitivity(1, true); - ointent->setItemSensitivity(2, true); - ointent->setItemSensitivity(3, true); - ointent->set_sensitive (false); - ointent->setSelected (1); + oRendIntent->setItemSensitivity(0, true); + oRendIntent->setItemSensitivity(1, true); + oRendIntent->setItemSensitivity(2, true); + oRendIntent->setItemSensitivity(3, true); + oRendIntent->set_sensitive(false); + oRendIntent->setSelected(1); } } -void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) +void ICMPanel::updateDCP(int dcpIlluminant, Glib::ustring dcp_name) { ConnectionBlocker dcpillconn_(dcpillconn); if (isBatchMode) { dcpFrame->set_sensitive(true); - ckbToneCurve->set_sensitive (true); - ckbApplyLookTable->set_sensitive (true); - ckbApplyBaselineExposureOffset->set_sensitive (true); - ckbApplyHueSatMap->set_sensitive (true); - dcpIllLabel->set_sensitive (true); - dcpIll->set_sensitive (true); + ckbToneCurve->set_sensitive(true); + ckbApplyLookTable->set_sensitive(true); + ckbApplyBaselineExposureOffset->set_sensitive(true); + ckbApplyHueSatMap->set_sensitive(true); + dcpIllLabel->set_sensitive(true); + dcpIll->set_sensitive(true); if (dcpTemperatures[0] != 0 || dcpTemperatures[1] != 0) { int curr_active = dcpIll->get_active_row_number(); - dcpIll->remove_all (); - dcpIll->append (M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); - dcpIll->append (M("TP_ICM_DCPILLUMINANT") + " 1"); - dcpIll->append (M("TP_ICM_DCPILLUMINANT") + " 2"); - dcpIll->append (M("GENERAL_UNCHANGED")); + dcpIll->remove_all(); + dcpIll->append(M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); + dcpIll->append(M("TP_ICM_DCPILLUMINANT") + " 1"); + dcpIll->append(M("TP_ICM_DCPILLUMINANT") + " 2"); + dcpIll->append(M("GENERAL_UNCHANGED")); dcpTemperatures[0] = 0; dcpTemperatures[1] = 0; - dcpIll->set_active (curr_active); + dcpIll->set_active(curr_active); } if (dcpIll->get_active_row_number() == -1 && dcpIlluminant == -1) { @@ -380,22 +386,22 @@ void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) dcpIll->set_active(dcpIlluminant); } - dcpIll->set_sensitive (true); - dcpIllLabel->set_sensitive (true); + dcpIll->set_sensitive(true); + dcpIllLabel->set_sensitive(true); return; } - ckbToneCurve->set_sensitive (false); - ckbApplyLookTable->set_sensitive (false); - ckbApplyBaselineExposureOffset->set_sensitive (false); - ckbApplyHueSatMap->set_sensitive (false); - dcpIllLabel->set_sensitive (false); - dcpIll->set_sensitive (false); + ckbToneCurve->set_sensitive(false); + ckbApplyLookTable->set_sensitive(false); + ckbApplyBaselineExposureOffset->set_sensitive(false); + ckbApplyHueSatMap->set_sensitive(false); + dcpIllLabel->set_sensitive(false); + dcpIll->set_sensitive(false); dcpFrame->set_sensitive(false); DCPProfile* dcp = nullptr; - if(dcp_name == "(cameraICC)") { + if (dcp_name == "(cameraICC)") { dcp = DCPStore::getInstance()->getStdProfile(camName); } else if (ifromfile->get_active() && DCPStore::getInstance()->isValidDCPFileName(dcp_name)) { dcp = DCPStore::getInstance()->getProfile(dcp_name); @@ -405,19 +411,19 @@ void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) dcpFrame->set_sensitive(true); if (dcp->getHasToneCurve()) { - ckbToneCurve->set_sensitive (true); + ckbToneCurve->set_sensitive(true); } if (dcp->getHasLookTable()) { - ckbApplyLookTable->set_sensitive (true); + ckbApplyLookTable->set_sensitive(true); } if (dcp->getHasBaselineExposureOffset()) { - ckbApplyBaselineExposureOffset->set_sensitive (true); + ckbApplyBaselineExposureOffset->set_sensitive(true); } if (dcp->getHasHueSatMap()) { - ckbApplyHueSatMap->set_sensitive (true); + ckbApplyHueSatMap->set_sensitive(true); } const DCPProfile::Illuminants illuminants = dcp->getIlluminants(); @@ -428,13 +434,13 @@ void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) sprintf(tempstr1, "%.0fK", illuminants.temperature_1); sprintf(tempstr2, "%.0fK", illuminants.temperature_2); int curr_active = dcpIll->get_active_row_number(); - dcpIll->remove_all (); - dcpIll->append (M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); - dcpIll->append (tempstr1); - dcpIll->append (tempstr2); + dcpIll->remove_all(); + dcpIll->append(M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); + dcpIll->append(tempstr1); + dcpIll->append(tempstr2); dcpTemperatures[0] = illuminants.temperature_1; dcpTemperatures[1] = illuminants.temperature_2; - dcpIll->set_active (curr_active); + dcpIll->set_active(curr_active); } if (dcpIlluminant > 2) { @@ -447,8 +453,8 @@ void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) dcpIll->set_active(dcpIlluminant); } - dcpIll->set_sensitive (true); - dcpIllLabel->set_sensitive (true); + dcpIll->set_sensitive(true); + dcpIllLabel->set_sensitive(true); } else { if (dcpIll->get_active_row_number() != -1) { dcpIll->set_active(-1); @@ -459,269 +465,273 @@ void ICMPanel::updateDCP (int dcpIlluminant, Glib::ustring dcp_name) if (!dcpIllLabel->get_sensitive() && dcpIll->get_active_row_number() != 0) { if (dcpTemperatures[0] != 0 || dcpTemperatures[1] != 0) { int curr_active = dcpIll->get_active_row_number(); - dcpIll->remove_all (); - dcpIll->append (M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); - dcpIll->append (M("TP_ICM_DCPILLUMINANT") + " 1"); - dcpIll->append (M("TP_ICM_DCPILLUMINANT") + " 2"); + dcpIll->remove_all(); + dcpIll->append(M("TP_ICM_DCPILLUMINANT_INTERPOLATED")); + dcpIll->append(M("TP_ICM_DCPILLUMINANT") + " 1"); + dcpIll->append(M("TP_ICM_DCPILLUMINANT") + " 2"); if (isBatchMode) { - dcpIll->append (M("GENERAL_UNCHANGED")); + dcpIll->append(M("GENERAL_UNCHANGED")); } dcpTemperatures[0] = 0; dcpTemperatures[1] = 0; - dcpIll->set_active (curr_active); + dcpIll->set_active(curr_active); } } } -void ICMPanel::read (const ProcParams* pp, const ParamsEdited* pedited) +void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) { - disableListener (); + disableListener(); ConnectionBlocker obpcconn_(obpcconn); ConnectionBlocker ipc_(ipc); - ConnectionBlocker gamcsconn_(gamcsconn); ConnectionBlocker tcurveconn_(tcurveconn); ConnectionBlocker ltableconn_(ltableconn); ConnectionBlocker beoconn_(beoconn); ConnectionBlocker hsmconn_(hsmconn); - ConnectionBlocker wnamesconn_(wnamesconn); - ConnectionBlocker onamesconn_(onamesconn); - ConnectionBlocker ointentconn_(ointentconn); - ConnectionBlocker wgammaconn_(wgammaconn); + ConnectionBlocker wprofnamesconn_(wprofnamesconn); + ConnectionBlocker oprofnamesconn_(oprofnamesconn); + ConnectionBlocker orendintentconn_(orendintentconn); ConnectionBlocker dcpillconn_(dcpillconn); - if(pp->icm.input.substr(0, 5) != "file:" && !ipDialog->get_filename().empty()) { - ipDialog->set_filename(pp->icm.input); + if (pp->icm.inputProfile.substr(0, 5) != "file:" && !ipDialog->get_filename().empty()) { + ipDialog->set_filename(pp->icm.inputProfile); } - if (pp->icm.input == "(none)") { - inone->set_active (true); + if (pp->icm.inputProfile == "(none)") { + inone->set_active(true); updateDCP(pp->icm.dcpIlluminant, ""); - } else if (pp->icm.input == "(embedded)" || ((pp->icm.input == "(camera)" || pp->icm.input == "") && icamera->get_state() == Gtk::STATE_INSENSITIVE)) { - iembedded->set_active (true); + } else if (pp->icm.inputProfile == "(embedded)" || ((pp->icm.inputProfile == "(camera)" || pp->icm.inputProfile == "") && icamera->get_state() == Gtk::STATE_INSENSITIVE)) { + iembedded->set_active(true); updateDCP(pp->icm.dcpIlluminant, ""); - } else if ((pp->icm.input == "(cameraICC)") && icameraICC->get_state() != Gtk::STATE_INSENSITIVE) { - icameraICC->set_active (true); + } else if ((pp->icm.inputProfile == "(cameraICC)") && icameraICC->get_state() != Gtk::STATE_INSENSITIVE) { + icameraICC->set_active(true); updateDCP(pp->icm.dcpIlluminant, "(cameraICC)"); - } else if ((pp->icm.input == "(cameraICC)") && icamera->get_state() != Gtk::STATE_INSENSITIVE && icameraICC->get_state() == Gtk::STATE_INSENSITIVE) { + } else if ((pp->icm.inputProfile == "(cameraICC)") && icamera->get_state() != Gtk::STATE_INSENSITIVE && icameraICC->get_state() == Gtk::STATE_INSENSITIVE) { // this is the case when (cameraICC) is instructed by packaged profiles, but ICC file is not found // therefore falling back UI to explicitly reflect the (camera) option - icamera->set_active (true); + icamera->set_active(true); updateDCP(pp->icm.dcpIlluminant, ""); - } else if ((pp->icm.input == "(cameraICC)") && icamera->get_state() == Gtk::STATE_INSENSITIVE && icameraICC->get_state() == Gtk::STATE_INSENSITIVE) { + } else if ((pp->icm.inputProfile == "(cameraICC)") && icamera->get_state() == Gtk::STATE_INSENSITIVE && icameraICC->get_state() == Gtk::STATE_INSENSITIVE) { // If neither (camera) nor (cameraICC) are available, as is the case when loading a non-raw, activate (embedded). - iembedded->set_active (true); + iembedded->set_active(true); updateDCP(pp->icm.dcpIlluminant, "(cameraICC)"); - } else if ((pp->icm.input == "(camera)" || pp->icm.input == "") && icamera->get_state() != Gtk::STATE_INSENSITIVE) { - icamera->set_active (true); + } else if ((pp->icm.inputProfile == "(camera)" || pp->icm.inputProfile == "") && icamera->get_state() != Gtk::STATE_INSENSITIVE) { + icamera->set_active(true); updateDCP(pp->icm.dcpIlluminant, ""); } else { - ifromfile->set_active (true); - oldip = pp->icm.input.substr(5); // cut of "file:" - ipDialog->set_filename (pp->icm.input.substr(5)); - updateDCP(pp->icm.dcpIlluminant, pp->icm.input.substr(5)); + ifromfile->set_active(true); + oldip = pp->icm.inputProfile.substr(5); // cut of "file:" + ipDialog->set_filename(pp->icm.inputProfile.substr(5)); + updateDCP(pp->icm.dcpIlluminant, pp->icm.inputProfile.substr(5)); } - wnames->set_active_text (pp->icm.working); - wgamma->set_active_text (pp->icm.gamma); + wProfNames->set_active_text(pp->icm.workingProfile); - if (pp->icm.output == ColorManagementParams::NoICMString) { - onames->set_active_text (M("TP_ICM_NOICM")); + if (pp->icm.workingTRC == "none") { + wTRC->set_active(0); + } else if (pp->icm.workingTRC == "Custom") { + wTRC->set_active(1); + } + + wtrcinChanged(); + + if (pp->icm.outputProfile == ColorManagementParams::NoICMString) { + oProfNames->set_active_text(M("TP_ICM_NOICM")); } else { - onames->set_active_text (pp->icm.output); + oProfNames->set_active_text(pp->icm.outputProfile); } - if (onames->get_active_row_number() == -1) { - onames->set_active_text (M("TP_ICM_NOICM")); + if (oProfNames->get_active_row_number() == -1) { + oProfNames->set_active_text(M("TP_ICM_NOICM")); } - ointent->setSelected (pp->icm.outputIntent); - obpc->set_active (pp->icm.outputBPC); - ckbToneCurve->set_active (pp->icm.toneCurve); + oRendIntent->setSelected(pp->icm.outputIntent); + + obpc->set_active(pp->icm.outputBPC); + ckbToneCurve->set_active(pp->icm.toneCurve); lastToneCurve = pp->icm.toneCurve; - ckbApplyLookTable->set_active (pp->icm.applyLookTable); + ckbApplyLookTable->set_active(pp->icm.applyLookTable); lastApplyLookTable = pp->icm.applyLookTable; - ckbApplyBaselineExposureOffset->set_active (pp->icm.applyBaselineExposureOffset); + ckbApplyBaselineExposureOffset->set_active(pp->icm.applyBaselineExposureOffset); lastApplyBaselineExposureOffset = pp->icm.applyBaselineExposureOffset; - ckbApplyHueSatMap->set_active (pp->icm.applyHueSatMap); + ckbApplyHueSatMap->set_active(pp->icm.applyHueSatMap); lastApplyHueSatMap = pp->icm.applyHueSatMap; - freegamma->set_active (pp->icm.freegamma); - lastgamfree = pp->icm.freegamma; - - if (!batchMode) { - onames->set_sensitive(wgamma->get_active_row_number() == 0 && !pp->icm.freegamma); //"default" - wgamma->set_sensitive(!pp->icm.freegamma); - gampos->set_sensitive(pp->icm.freegamma); - slpos->set_sensitive(pp->icm.freegamma); - updateRenderingIntent(pp->icm.output); - } - - gampos->setValue (pp->icm.gampos); - slpos->setValue (pp->icm.slpos); + wGamma->setValue(pp->icm.workingTRCGamma); + wSlope->setValue(pp->icm.workingTRCSlope); if (pedited) { - iunchanged->set_active (!pedited->icm.input); + iunchanged->set_active(!pedited->icm.inputProfile); obpc->set_inconsistent(!pedited->icm.outputBPC); ckbToneCurve->set_inconsistent(!pedited->icm.toneCurve); ckbApplyLookTable->set_inconsistent(!pedited->icm.applyLookTable); ckbApplyBaselineExposureOffset->set_inconsistent(!pedited->icm.applyBaselineExposureOffset); ckbApplyHueSatMap->set_inconsistent(!pedited->icm.applyHueSatMap); - freegamma->set_inconsistent (!pedited->icm.freegamma); - if (!pedited->icm.working) { - wnames->set_active_text(M("GENERAL_UNCHANGED")); + if (!pedited->icm.workingProfile) { + wProfNames->set_active_text(M("GENERAL_UNCHANGED")); } - if (!pedited->icm.output) { - onames->set_active_text(M("GENERAL_UNCHANGED")); + if (!pedited->icm.outputProfile) { + oProfNames->set_active_text(M("GENERAL_UNCHANGED")); } if (!pedited->icm.outputIntent) { - ointent->setSelected (4); + oRendIntent->setSelected(4); } if (!pedited->icm.dcpIlluminant) { dcpIll->set_active_text(M("GENERAL_UNCHANGED")); } - if (!pedited->icm.gamma) { - wgamma->set_active_text(M("GENERAL_UNCHANGED")); - wgamma->set_active_text(M("GENERAL_UNCHANGED")); + if (!pedited->icm.workingTRC) { + wTRC->set_active_text(M("GENERAL_UNCHANGED")); } - gampos->setEditedState (pedited->icm.gampos ? Edited : UnEdited); - slpos->setEditedState (pedited->icm.slpos ? Edited : UnEdited); + wGamma->setEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); + wSlope->setEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); } - enableListener (); + enableListener(); } -void ICMPanel::write (ProcParams* pp, ParamsEdited* pedited) +void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited) { if (inone->get_active()) { - pp->icm.input = "(none)"; - } else if (iembedded->get_active ()) { - pp->icm.input = "(embedded)"; - } else if (icamera->get_active ()) { - pp->icm.input = "(camera)"; - } else if (icameraICC->get_active ()) { - pp->icm.input = "(cameraICC)"; + pp->icm.inputProfile = "(none)"; + } else if (iembedded->get_active()) { + pp->icm.inputProfile = "(embedded)"; + } else if (icamera->get_active()) { + pp->icm.inputProfile = "(camera)"; + } else if (icameraICC->get_active()) { + pp->icm.inputProfile = "(cameraICC)"; } else { - if (Glib::file_test (ipDialog->get_filename (), Glib::FILE_TEST_EXISTS) && !Glib::file_test (ipDialog->get_filename (), Glib::FILE_TEST_IS_DIR)) { - pp->icm.input = "file:" + ipDialog->get_filename (); + if (Glib::file_test(ipDialog->get_filename(), Glib::FILE_TEST_EXISTS) && !Glib::file_test(ipDialog->get_filename(), Glib::FILE_TEST_IS_DIR)) { + pp->icm.inputProfile = "file:" + ipDialog->get_filename(); } else { - pp->icm.input = ""; // just a directory + pp->icm.inputProfile = ""; // just a directory } - Glib::ustring p = Glib::path_get_dirname(ipDialog->get_filename ()); + Glib::ustring p = Glib::path_get_dirname(ipDialog->get_filename()); } - pp->icm.working = wnames->get_active_text (); - pp->icm.gamma = wgamma->get_active_text (); + pp->icm.workingProfile = wProfNames->get_active_text(); pp->icm.dcpIlluminant = rtengine::max(dcpIll->get_active_row_number(), 0); + pp->icm.workingTRC = wTRC->get_active_text(); - if (onames->get_active_text() == M("TP_ICM_NOICM")) { - pp->icm.output = ColorManagementParams::NoICMString; + if (oProfNames->get_active_text() == M("TP_ICM_NOICM")) { + pp->icm.outputProfile = ColorManagementParams::NoICMString; } else { - pp->icm.output = onames->get_active_text(); + pp->icm.outputProfile = oProfNames->get_active_text(); } - int ointentVal = ointent->getSelected (); + int ointentVal = oRendIntent->getSelected(); + if (ointentVal >= 0 && ointentVal < RI__COUNT) { pp->icm.outputIntent = static_cast(ointentVal); } else { pp->icm.outputIntent = rtengine::RI_RELATIVE; } - pp->icm.freegamma = freegamma->get_active(); - pp->icm.toneCurve = ckbToneCurve->get_active (); - pp->icm.applyLookTable = ckbApplyLookTable->get_active (); - pp->icm.applyBaselineExposureOffset = ckbApplyBaselineExposureOffset->get_active (); - pp->icm.applyHueSatMap = ckbApplyHueSatMap->get_active (); - pp->icm.gampos = (double) gampos->getValue(); - pp->icm.slpos = (double) slpos->getValue(); - pp->icm.outputBPC = obpc->get_active (); + if (wTRC->get_active_row_number() == 0) { + pp->icm.workingTRC = "none"; + } else if (wTRC->get_active_row_number() == 1) { + pp->icm.workingTRC = "Custom"; + } + + pp->icm.toneCurve = ckbToneCurve->get_active(); + pp->icm.applyLookTable = ckbApplyLookTable->get_active(); + pp->icm.applyBaselineExposureOffset = ckbApplyBaselineExposureOffset->get_active(); + pp->icm.applyHueSatMap = ckbApplyHueSatMap->get_active(); + pp->icm.outputBPC = obpc->get_active(); + pp->icm.workingTRCGamma = (double) wGamma->getValue(); + pp->icm.workingTRCSlope = (double) wSlope->getValue(); + pp->toneCurve.fromHistMatching = false; if (pedited) { - pedited->icm.input = !iunchanged->get_active (); - pedited->icm.working = wnames->get_active_text() != M("GENERAL_UNCHANGED"); - pedited->icm.output = onames->get_active_text() != M("GENERAL_UNCHANGED"); - pedited->icm.outputIntent = ointent->getSelected () < 4; - pedited->icm.outputBPC = !obpc->get_inconsistent (); + pedited->icm.inputProfile = !iunchanged->get_active(); + pedited->icm.workingProfile = wProfNames->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->icm.outputProfile = oProfNames->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->icm.outputIntent = oRendIntent->getSelected() < 4; + pedited->icm.outputBPC = !obpc->get_inconsistent(); pedited->icm.dcpIlluminant = dcpIll->get_active_text() != M("GENERAL_UNCHANGED"); - pedited->icm.toneCurve = !ckbToneCurve->get_inconsistent (); - pedited->icm.applyLookTable = !ckbApplyLookTable->get_inconsistent (); - pedited->icm.applyBaselineExposureOffset = !ckbApplyBaselineExposureOffset->get_inconsistent (); - pedited->icm.applyHueSatMap = !ckbApplyHueSatMap->get_inconsistent (); - pedited->icm.gamma = wgamma->get_active_text() != M("GENERAL_UNCHANGED"); - pedited->icm.freegamma = !freegamma->get_inconsistent(); - pedited->icm.gampos = gampos->getEditedState (); - pedited->icm.slpos = slpos->getEditedState (); + pedited->icm.toneCurve = !ckbToneCurve->get_inconsistent(); + pedited->icm.applyLookTable = !ckbApplyLookTable->get_inconsistent(); + pedited->icm.applyBaselineExposureOffset = !ckbApplyBaselineExposureOffset->get_inconsistent(); + pedited->icm.applyHueSatMap = !ckbApplyHueSatMap->get_inconsistent(); + pedited->icm.workingTRCGamma = wGamma->getEditedState(); + pedited->icm.workingTRCSlope = wSlope->getEditedState(); + pedited->icm.workingTRC = wTRC->get_active_text() != M("GENERAL_UNCHANGED"); } } -void ICMPanel::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +void ICMPanel::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { - gampos->setDefault (defParams->icm.gampos); - slpos->setDefault (defParams->icm.slpos); + wGamma->setDefault(defParams->icm.workingTRCGamma); + wSlope->setDefault(defParams->icm.workingTRCSlope); if (pedited) { - gampos->setDefaultEditedState (pedited->icm.gampos ? Edited : UnEdited); - slpos->setDefaultEditedState (pedited->icm.slpos ? Edited : UnEdited); + wGamma->setDefaultEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); + wSlope->setDefaultEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); + } else { - gampos->setDefaultEditedState (Irrelevant); - slpos->setDefaultEditedState (Irrelevant); + wGamma->setDefaultEditedState(Irrelevant); + wSlope->setDefaultEditedState(Irrelevant); + } } -void ICMPanel::setAdjusterBehavior (bool gammaadd, bool slopeadd) +void ICMPanel::adjusterChanged(Adjuster* a, double newval) { - gampos->setAddMode (gammaadd); - slpos->setAddMode (slopeadd); -} + if (listener) { + Glib::ustring costr2 = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), newval); -void ICMPanel::adjusterChanged (Adjuster* a, double newval) -{ - - if (listener && (freegamma->get_active() || batchMode)) { - - Glib::ustring costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), newval); - - if (a == gampos) { - listener->panelChanged (EvGAMPOS, costr); - } else if (a == slpos) { - listener->panelChanged (EvSLPOS, costr); + if (a == wGamma) { + listener->panelChanged(EvICMgamm, costr2); + } else if (a == wSlope) { + listener->panelChanged(EvICMslop, costr2); } + } } -void ICMPanel::wpChanged () +void ICMPanel::adjusterAutoToggled(Adjuster* a, bool newval) { +} +void ICMPanel::wpChanged() +{ if (listener) { - listener->panelChanged (EvWProfile, wnames->get_active_text ()); + listener->panelChanged(EvWProfile, wProfNames->get_active_text()); } } -void ICMPanel::gpChanged () +void ICMPanel::wtrcinChanged() { + if (wTRC->get_active_row_number() == 0) { + wGamma->set_sensitive(false); + wSlope->set_sensitive(false); + + } else { + wGamma->set_sensitive(true); + wSlope->set_sensitive(true); + } if (listener) { - listener->panelChanged (EvGAMMA, wgamma->get_active_text ()); - onames->set_sensitive(wgamma->get_active_row_number() == 0); //"default" + listener->panelChanged(EvICMtrcinMethod, wTRC->get_active_text()); } } void ICMPanel::dcpIlluminantChanged() { if (listener) { - listener->panelChanged (EvDCPIlluminant, dcpIll->get_active_text ()); + listener->panelChanged(EvDCPIlluminant, dcpIll->get_active_text()); } } @@ -729,24 +739,24 @@ void ICMPanel::toneCurveChanged() { if (multiImage) { if (ckbToneCurve->get_inconsistent()) { - ckbToneCurve->set_inconsistent (false); - tcurveconn.block (true); - ckbToneCurve->set_active (false); - tcurveconn.block (false); + ckbToneCurve->set_inconsistent(false); + tcurveconn.block(true); + ckbToneCurve->set_active(false); + tcurveconn.block(false); } else if (lastToneCurve) { - ckbToneCurve->set_inconsistent (true); + ckbToneCurve->set_inconsistent(true); } - lastToneCurve = ckbToneCurve->get_active (); + lastToneCurve = ckbToneCurve->get_active(); } if (listener) { if (ckbToneCurve->get_inconsistent()) { - listener->panelChanged (EvDCPToneCurve, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvDCPToneCurve, M("GENERAL_UNCHANGED")); } else if (ckbToneCurve->get_active()) { - listener->panelChanged (EvDCPToneCurve, M("GENERAL_ENABLED")); + listener->panelChanged(EvDCPToneCurve, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvDCPToneCurve, M("GENERAL_DISABLED")); + listener->panelChanged(EvDCPToneCurve, M("GENERAL_DISABLED")); } } } @@ -755,24 +765,24 @@ void ICMPanel::applyLookTableChanged() { if (multiImage) { if (ckbApplyLookTable->get_inconsistent()) { - ckbApplyLookTable->set_inconsistent (false); - ltableconn.block (true); - ckbApplyLookTable->set_active (false); - ltableconn.block (false); + ckbApplyLookTable->set_inconsistent(false); + ltableconn.block(true); + ckbApplyLookTable->set_active(false); + ltableconn.block(false); } else if (lastApplyLookTable) { - ckbApplyLookTable->set_inconsistent (true); + ckbApplyLookTable->set_inconsistent(true); } - lastApplyLookTable = ckbApplyLookTable->get_active (); + lastApplyLookTable = ckbApplyLookTable->get_active(); } if (listener) { if (ckbApplyLookTable->get_inconsistent()) { - listener->panelChanged (EvDCPApplyLookTable, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvDCPApplyLookTable, M("GENERAL_UNCHANGED")); } else if (ckbApplyLookTable->get_active()) { - listener->panelChanged (EvDCPApplyLookTable, M("GENERAL_ENABLED")); + listener->panelChanged(EvDCPApplyLookTable, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvDCPApplyLookTable, M("GENERAL_DISABLED")); + listener->panelChanged(EvDCPApplyLookTable, M("GENERAL_DISABLED")); } } } @@ -781,24 +791,24 @@ void ICMPanel::applyBaselineExposureOffsetChanged() { if (multiImage) { if (ckbApplyBaselineExposureOffset->get_inconsistent()) { - ckbApplyBaselineExposureOffset->set_inconsistent (false); - beoconn.block (true); - ckbApplyBaselineExposureOffset->set_active (false); - beoconn.block (false); + ckbApplyBaselineExposureOffset->set_inconsistent(false); + beoconn.block(true); + ckbApplyBaselineExposureOffset->set_active(false); + beoconn.block(false); } else if (lastApplyBaselineExposureOffset) { - ckbApplyBaselineExposureOffset->set_inconsistent (true); + ckbApplyBaselineExposureOffset->set_inconsistent(true); } - lastApplyBaselineExposureOffset = ckbApplyBaselineExposureOffset->get_active (); + lastApplyBaselineExposureOffset = ckbApplyBaselineExposureOffset->get_active(); } if (listener) { if (ckbApplyBaselineExposureOffset->get_inconsistent()) { - listener->panelChanged (EvDCPApplyBaselineExposureOffset, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvDCPApplyBaselineExposureOffset, M("GENERAL_UNCHANGED")); } else if (ckbApplyBaselineExposureOffset->get_active()) { - listener->panelChanged (EvDCPApplyBaselineExposureOffset, M("GENERAL_ENABLED")); + listener->panelChanged(EvDCPApplyBaselineExposureOffset, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvDCPApplyBaselineExposureOffset, M("GENERAL_DISABLED")); + listener->panelChanged(EvDCPApplyBaselineExposureOffset, M("GENERAL_DISABLED")); } } } @@ -807,170 +817,137 @@ void ICMPanel::applyHueSatMapChanged() { if (multiImage) { if (ckbApplyHueSatMap->get_inconsistent()) { - ckbApplyHueSatMap->set_inconsistent (false); - hsmconn.block (true); - ckbApplyHueSatMap->set_active (false); - hsmconn.block (false); + ckbApplyHueSatMap->set_inconsistent(false); + hsmconn.block(true); + ckbApplyHueSatMap->set_active(false); + hsmconn.block(false); } else if (lastApplyHueSatMap) { - ckbApplyHueSatMap->set_inconsistent (true); + ckbApplyHueSatMap->set_inconsistent(true); } - lastApplyHueSatMap = ckbApplyHueSatMap->get_active (); + lastApplyHueSatMap = ckbApplyHueSatMap->get_active(); } if (listener) { if (ckbApplyHueSatMap->get_inconsistent()) { - listener->panelChanged (EvDCPApplyHueSatMap, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvDCPApplyHueSatMap, M("GENERAL_UNCHANGED")); } else if (ckbApplyHueSatMap->get_active()) { - listener->panelChanged (EvDCPApplyHueSatMap, M("GENERAL_ENABLED")); + listener->panelChanged(EvDCPApplyHueSatMap, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvDCPApplyHueSatMap, M("GENERAL_DISABLED")); + listener->panelChanged(EvDCPApplyHueSatMap, M("GENERAL_DISABLED")); } } } -void ICMPanel::ipChanged () +void ICMPanel::ipChanged() { Glib::ustring profname; if (inone->get_active()) { profname = "(none)"; - } else if (iembedded->get_active ()) { + } else if (iembedded->get_active()) { profname = "(embedded)"; - } else if (icamera->get_active ()) { + } else if (icamera->get_active()) { profname = "(camera)"; - } else if (icameraICC->get_active ()) { + } else if (icameraICC->get_active()) { profname = "(cameraICC)"; } else { - profname = ipDialog->get_filename (); + profname = ipDialog->get_filename(); } updateDCP(-1, profname); if (listener && profname != oldip) { - listener->panelChanged (EvIProfile, profname); + listener->panelChanged(EvIProfile, profname); } oldip = profname; } -void ICMPanel::GamChanged() -{ - if (multiImage) { - if (freegamma->get_inconsistent()) { - freegamma->set_inconsistent (false); - gamcsconn.block (true); - freegamma->set_active (false); - gamcsconn.block (false); - } else if (lastgamfree) { - freegamma->set_inconsistent (true); - } - - lastgamfree = freegamma->get_active (); - } - - if (listener) { - if (freegamma->get_inconsistent()) { - listener->panelChanged (EvGAMFREE, M("GENERAL_UNCHANGED")); - } - else if (freegamma->get_active()) { - listener->panelChanged (EvGAMFREE, M("GENERAL_ENABLED")); - if (!batchMode) { - onames->set_sensitive(false);//disabled choice - wgamma->set_sensitive(false); - gampos->set_sensitive(true); - slpos->set_sensitive(true); - } - } else { - listener->panelChanged (EvGAMFREE, M("GENERAL_DISABLED")); - if (!batchMode) { - onames->set_sensitive(wgamma->get_active_row_number() == 0); - wgamma->set_sensitive(true); - gampos->set_sensitive(false); - slpos->set_sensitive(false); - } - } - } -} - -void ICMPanel::opChanged () +void ICMPanel::opChanged() { if (!batchMode) { - updateRenderingIntent(onames->get_active_text()); + updateRenderingIntent(oProfNames->get_active_text()); } if (listener) { - listener->panelChanged (EvOProfile, onames->get_active_text()); + listener->panelChanged(EvOProfile, oProfNames->get_active_text()); } } -void ICMPanel::oiChanged (int n) +void ICMPanel::oiChanged(int n) { if (listener) { Glib::ustring str; + switch (n) { - case 0: - str = M("PREFERENCES_INTENT_PERCEPTUAL"); - break; - case 1: - str = M("PREFERENCES_INTENT_RELATIVE"); - break; - case 2: - str = M("PREFERENCES_INTENT_SATURATION"); - break; - case 3: - str = M("PREFERENCES_INTENT_ABSOLUTE"); - break; - case 4: - default: - str = M("GENERAL_UNCHANGED"); - break; + case 0: + str = M("PREFERENCES_INTENT_PERCEPTUAL"); + break; + + case 1: + str = M("PREFERENCES_INTENT_RELATIVE"); + break; + + case 2: + str = M("PREFERENCES_INTENT_SATURATION"); + break; + + case 3: + str = M("PREFERENCES_INTENT_ABSOLUTE"); + break; + + case 4: + default: + str = M("GENERAL_UNCHANGED"); + break; } - listener->panelChanged (EvOIntent, str); + + listener->panelChanged(EvOIntent, str); } } -void ICMPanel::oBPCChanged () +void ICMPanel::oBPCChanged() { if (multiImage) { if (obpc->get_inconsistent()) { - obpc->set_inconsistent (false); - obpcconn.block (true); - obpc->set_active (false); - obpcconn.block (false); + obpc->set_inconsistent(false); + obpcconn.block(true); + obpc->set_active(false); + obpcconn.block(false); } else if (lastobpc) { - obpc->set_inconsistent (true); + obpc->set_inconsistent(true); } - lastobpc = obpc->get_active (); + lastobpc = obpc->get_active(); } if (listener) { if (obpc->get_inconsistent()) { - listener->panelChanged (EvOBPCompens, M("GENERAL_UNCHANGED")); + listener->panelChanged(EvOBPCompens, M("GENERAL_UNCHANGED")); } else if (obpc->get_active()) { - listener->panelChanged (EvOBPCompens, M("GENERAL_ENABLED")); + listener->panelChanged(EvOBPCompens, M("GENERAL_ENABLED")); } else { - listener->panelChanged (EvOBPCompens, M("GENERAL_DISABLED")); + listener->panelChanged(EvOBPCompens, M("GENERAL_DISABLED")); } } } -void ICMPanel::setRawMeta (bool raw, const rtengine::FramesData* pMeta) +void ICMPanel::setRawMeta(bool raw, const rtengine::FramesData* pMeta) { - disableListener (); + disableListener(); - icamera->set_active (raw); - iembedded->set_active (!raw); - icamera->set_sensitive (raw); + icamera->set_active(raw); + iembedded->set_active(!raw); + icamera->set_sensitive(raw); camName = pMeta->getCamera(); - icameraICC->set_sensitive (raw && (ICCStore::getInstance()->getStdProfile(pMeta->getCamera()) != nullptr || DCPStore::getInstance()->getStdProfile(pMeta->getCamera()) != nullptr)); - iembedded->set_sensitive (!raw); + icameraICC->set_sensitive(raw && (ICCStore::getInstance()->getStdProfile(pMeta->getCamera()) != nullptr || DCPStore::getInstance()->getStdProfile(pMeta->getCamera()) != nullptr)); + iembedded->set_sensitive(!raw); - enableListener (); + enableListener(); } void ICMPanel::ipSelectionChanged() @@ -983,23 +960,23 @@ void ICMPanel::ipSelectionChanged() ipChanged(); } -void ICMPanel::saveReferencePressed () +void ICMPanel::saveReferencePressed() { if (!icmplistener) { return; } - Gtk::FileChooserDialog dialog (getToplevelWindow (this), M("TP_ICM_SAVEREFERENCE"), Gtk::FILE_CHOOSER_ACTION_SAVE); - bindCurrentFolder (dialog, options.lastProfilingReferenceDir); - dialog.set_current_name (lastRefFilename); + Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("TP_ICM_SAVEREFERENCE"), Gtk::FILE_CHOOSER_ACTION_SAVE); + bindCurrentFolder(dialog, options.lastProfilingReferenceDir); + dialog.set_current_name(lastRefFilename); dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); Gtk::CheckButton applyWB(M("TP_ICM_SAVEREFERENCE_APPLYWB")); - applyWB.set_tooltip_text (M("TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP")); - Gtk::HBox* hbox = Gtk::manage( new Gtk::HBox() ); + applyWB.set_tooltip_text(M("TP_ICM_SAVEREFERENCE_APPLYWB_TOOLTIP")); + Gtk::HBox* hbox = Gtk::manage(new Gtk::HBox()); hbox->pack_end(applyWB, Gtk::PACK_SHRINK, 2); Gtk::Box *box = dialog.get_content_area(); box->pack_end(*hbox, Gtk::PACK_SHRINK, 2); @@ -1034,8 +1011,8 @@ void ICMPanel::saveReferencePressed () } if (confirmOverwrite(dialog, fname)) { - icmplistener->saveInputICCReference (fname, applyWB.get_active()); - lastRefFilename = Glib::path_get_basename (fname); + icmplistener->saveInputICCReference(fname, applyWB.get_active()); + lastRefFilename = Glib::path_get_basename(fname); done = true; } } @@ -1044,23 +1021,23 @@ void ICMPanel::saveReferencePressed () return; } -void ICMPanel::setBatchMode (bool batchMode) +void ICMPanel::setBatchMode(bool batchMode) { isBatchMode = true; - ToolPanel::setBatchMode (batchMode); - iunchanged = Gtk::manage (new Gtk::RadioButton (M("GENERAL_UNCHANGED"))); - iunchanged->set_group (opts); - iVBox->pack_start (*iunchanged, Gtk::PACK_SHRINK, 4); - iVBox->reorder_child (*iunchanged, 5); - removeIfThere (this, saveRef); - onames->append (M("GENERAL_UNCHANGED")); - ointent->addEntry("unchanged-22.png", M("GENERAL_UNCHANGED")); - ointent->show(); - wnames->append (M("GENERAL_UNCHANGED")); - wgamma->append (M("GENERAL_UNCHANGED")); - dcpIll->append (M("GENERAL_UNCHANGED")); - gampos->showEditedCB (); - slpos->showEditedCB (); + ToolPanel::setBatchMode(batchMode); + iunchanged = Gtk::manage(new Gtk::RadioButton(M("GENERAL_UNCHANGED"))); + iunchanged->set_group(opts); + iVBox->pack_start(*iunchanged, Gtk::PACK_SHRINK, 4); + iVBox->reorder_child(*iunchanged, 5); + removeIfThere(this, saveRef); + oProfNames->append(M("GENERAL_UNCHANGED")); + oRendIntent->addEntry("template-24.png", M("GENERAL_UNCHANGED")); + oRendIntent->show(); + wProfNames->append(M("GENERAL_UNCHANGED")); + wTRC->append(M("GENERAL_UNCHANGED")); + dcpIll->append(M("GENERAL_UNCHANGED")); + wGamma->showEditedCB(); + wSlope->showEditedCB(); } diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index f8c762b0e..b1106b6e1 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -30,21 +30,28 @@ class ICMPanelListener { - public: - virtual ~ICMPanelListener() {} - virtual void saveInputICCReference (Glib::ustring fname, bool apply_wb) {} + virtual ~ICMPanelListener() = default; + virtual void saveInputICCReference(const Glib::ustring& fname, bool apply_wb) = 0; }; -class ICMPanel : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class ICMPanel : + public ToolParamBlock, + public AdjusterListener, + public FoldableToolPanel { protected: - Gtk::Frame* dcpFrame; - Adjuster* gampos; - Adjuster* slpos; - bool lastgamfree; - sigc::connection gamcsconn; + Gtk::Frame* dcpFrame; + Gtk::Frame* coipFrame; + + Adjuster* wGamma; + Adjuster* wSlope; + + Gtk::Label* labmga; + Gtk::HBox* gabox; + + //bool freegamma; bool lastToneCurve; sigc::connection tcurveconn; @@ -59,73 +66,85 @@ protected: bool isBatchMode; private: - Gtk::VBox * iVBox; + rtengine::ProcEvent EvICMprimariMethod; + rtengine::ProcEvent EvICMprofileMethod; + rtengine::ProcEvent EvICMtempMethod; + rtengine::ProcEvent EvICMpredx; + rtengine::ProcEvent EvICMpredy; + rtengine::ProcEvent EvICMpgrex; + rtengine::ProcEvent EvICMpgrey; + rtengine::ProcEvent EvICMpblux; + rtengine::ProcEvent EvICMpbluy; + rtengine::ProcEvent EvICMgamm; + rtengine::ProcEvent EvICMslop; + rtengine::ProcEvent EvICMtrcinMethod; - Gtk::CheckButton* obpc; - Gtk::CheckButton* freegamma; - Gtk::RadioButton* inone; + Gtk::VBox* iVBox; + Gtk::HBox* wTRCHBox; - Gtk::RadioButton* iembedded; - Gtk::RadioButton* icamera; - Gtk::RadioButton* icameraICC; - Gtk::RadioButton* ifromfile; - Gtk::Label* dcpIllLabel; - MyComboBoxText* dcpIll; - sigc::connection dcpillconn; - Gtk::CheckButton* ckbToneCurve; - Gtk::CheckButton* ckbApplyLookTable; - Gtk::CheckButton* ckbApplyBaselineExposureOffset; - Gtk::CheckButton* ckbApplyHueSatMap; - MyComboBoxText* wnames; - sigc::connection wnamesconn; - MyComboBoxText* wgamma; - sigc::connection wgammaconn; + Gtk::CheckButton* obpc; + Gtk::RadioButton* inone; - MyComboBoxText* onames; - sigc::connection onamesconn; - std::unique_ptr ointent; - sigc::connection ointentconn; - Gtk::RadioButton* iunchanged; + Gtk::RadioButton* iembedded; + Gtk::RadioButton* icamera; + Gtk::RadioButton* icameraICC; + Gtk::RadioButton* ifromfile; + Gtk::Label* dcpIllLabel; + MyComboBoxText* dcpIll; + sigc::connection dcpillconn; + Gtk::CheckButton* ckbToneCurve; + Gtk::CheckButton* ckbApplyLookTable; + Gtk::CheckButton* ckbApplyBaselineExposureOffset; + Gtk::CheckButton* ckbApplyHueSatMap; + MyComboBoxText* wProfNames; + sigc::connection wprofnamesconn; + MyComboBoxText* wTRC; + sigc::connection wtrcconn; + + MyComboBoxText* oProfNames; + sigc::connection oprofnamesconn; + std::unique_ptr oRendIntent; + sigc::connection orendintentconn; + Gtk::RadioButton* iunchanged; MyFileChooserButton* ipDialog; Gtk::RadioButton::Group opts; - Gtk::Button* saveRef; - sigc::connection ipc; - Glib::ustring oldip; - ICMPanelListener* icmplistener; + Gtk::Button* saveRef; + sigc::connection ipc; + Glib::ustring oldip; + ICMPanelListener* icmplistener; double dcpTemperatures[2]; Glib::ustring lastRefFilename; Glib::ustring camName; void updateDCP(int dcpIlluminant, Glib::ustring dcp_name); - void updateRenderingIntent (const Glib::ustring &profile); + void updateRenderingIntent(const Glib::ustring &profile); public: - ICMPanel (); + ICMPanel(); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void adjusterChanged (Adjuster* a, double newval); - void setAdjusterBehavior (bool gammaadd, bool slopeadd); + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode(bool batchMode) override; + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; - void wpChanged (); - void opChanged (); - void oiChanged (int n); - void oBPCChanged (); - void ipChanged (); - void gpChanged (); - void GamChanged (); - void ipSelectionChanged (); + void wpChanged(); + void wtrcinChanged(); + void opChanged(); + void oiChanged(int n); + void oBPCChanged(); + void ipChanged(); + void ipSelectionChanged(); void dcpIlluminantChanged(); void toneCurveChanged(); void applyLookTableChanged(); void applyBaselineExposureOffsetChanged(); void applyHueSatMapChanged(); - void setRawMeta (bool raw, const rtengine::FramesData* pMeta); - void saveReferencePressed (); + void setRawMeta(bool raw, const rtengine::FramesData* pMeta); + void saveReferencePressed(); - void setICMPanelListener (ICMPanelListener* ipl) + void setICMPanelListener(ICMPanelListener* ipl) { icmplistener = ipl; } diff --git a/rtgui/ilabel.h b/rtgui/ilabel.h index 26b29061f..1f5340fa2 100644 --- a/rtgui/ilabel.h +++ b/rtgui/ilabel.h @@ -28,9 +28,9 @@ class ILabel : public Gtk::DrawingArea public: explicit ILabel (const Glib::ustring &lab); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - void on_realize(); - void on_style_updated (); + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + void on_realize() override; + void on_style_updated () override; }; #endif diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index 4c4f78a38..40a8c2ca8 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -23,9 +23,10 @@ #include "multilangmgr.h" #include "cropwindow.h" #include "../rtengine/refreshmap.h" +#include "../rtengine/procparams.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 = ""; @@ -43,6 +44,7 @@ ImageArea::ImageArea (ImageAreaPanel* p) : parent(p), firstOpen(true), fullImage zoomPanel = Gtk::manage (new ZoomPanel (this)); indClippedPanel = Gtk::manage (new IndicateClippedPanel (this)); previewModePanel = Gtk::manage (new PreviewModePanel (this)); + previewModePanel->get_style_context()->add_class("narrowbuttonbox"); add_events(Gdk::LEAVE_NOTIFY_MASK); @@ -76,7 +78,7 @@ void ImageArea::on_realize() // This workaround should be removed when bug is fixed in GTK2 or when migrating to GTK3 add_events(Gdk::EXPOSURE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK); #else - add_events(Gdk::EXPOSURE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK); + add_events(Gdk::EXPOSURE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK); #endif Cairo::FontOptions cfo; @@ -241,13 +243,14 @@ bool ImageArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) mainCropWindow->expose (cr); } + for (std::list::reverse_iterator i = cropWins.rbegin(); i != cropWins.rend(); ++i) { + (*i)->expose (cr); + } + if (options.showInfo && infotext != "") { iBackBuffer.copySurface(cr); } - for (std::list::reverse_iterator i = cropWins.rbegin(); i != cropWins.rend(); ++i) { - (*i)->expose (cr); - } return true; } @@ -300,9 +303,12 @@ bool ImageArea::on_button_press_event (GdkEventButton* event) bool ImageArea::on_scroll_event (GdkEventScroll* event) { +// printf("ImageArea::on_scroll_event / delta_x=%.5f, delta_y=%.5f, direction=%d, type=%d, send_event=%d\n", +// event->delta_x, event->delta_y, (int)event->direction, (int)event->type, event->send_event); + CropWindow* cw = getCropWindow (event->x, event->y); if (cw) { - cw->scroll (event->state, event->direction, event->x, event->y); + cw->scroll (event->state, event->direction, event->x, event->y, event->delta_x, event->delta_y); } return true; @@ -426,7 +432,7 @@ void ImageArea::addCropWindow () } CropWindow* cw = new CropWindow (this, true, true); - cw->zoom11(); + cw->zoom11(false); cw->setCropGUIListener (cropgl); cw->setPointerMotionListener (pmlistener); cw->setPointerMotionHListener (pmhlistener); @@ -505,8 +511,9 @@ void ImageArea::addCropWindow () 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(); } } @@ -559,6 +566,14 @@ void ImageArea::spotWBSelected (int x, int y) } } +void ImageArea::sharpMaskSelected (bool sharpMask) +{ + + if (listener) { + listener->sharpMaskSelected (sharpMask); + } +} + void ImageArea::getScrollImageSize (int& w, int& h) { @@ -633,33 +648,23 @@ void ImageArea::setZoom (double zoom) zoomPanel->refreshZoomLabel (); } -void ImageArea::initialImageArrived (CropWindow* cw) +void ImageArea::initialImageArrived () { if (mainCropWindow) { - if(firstOpen || options.prevdemo != PD_Sidecar || (!options.rememberZoomAndPan) ) { + 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(); } - firstOpen = false; - mainCropWindow->cropHandler.getFullImageSize(fullImageWidth, fullImageHeight); - } else { - int w, h; - mainCropWindow->cropHandler.getFullImageSize(w, h); - - if(w != fullImageWidth || h != fullImageHeight) { - if (options.cropAutoFit) { - 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 --git a/rtgui/imagearea.h b/rtgui/imagearea.h index 91820beb1..f95045532 100644 --- a/rtgui/imagearea.h +++ b/rtgui/imagearea.h @@ -59,13 +59,12 @@ protected: ImageAreaToolListener* listener; CropWindow* getCropWindow (int x, int y); - 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; - 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; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int &minimum_height, int &natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; - bool firstOpen; int fullImageWidth, fullImageHeight; public: CropWindow* mainCropWindow; @@ -76,7 +75,7 @@ public: ImageArea* iLinkedImageArea; // used to set a reference to the Before image area, which is set when before/after view is enabled explicit ImageArea (ImageAreaPanel* p); - ~ImageArea (); + ~ImageArea () override; rtengine::StagedImageProcessor* getImProcCoordinator() const; void setImProcCoordinator(rtengine::StagedImageProcessor* ipc_); @@ -98,15 +97,15 @@ public: void infoEnabled (bool e); // widget base events - void on_realize (); - bool on_draw (const ::Cairo::RefPtr< Cairo::Context> &cr); - bool on_motion_notify_event (GdkEventMotion* event); - bool on_button_press_event (GdkEventButton* event); - bool on_button_release_event (GdkEventButton* event); - bool on_scroll_event (GdkEventScroll* event); - bool on_leave_notify_event (GdkEventCrossing* event); + void on_realize () override; + bool on_draw (const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool on_motion_notify_event (GdkEventMotion* event) override; + bool on_button_press_event (GdkEventButton* event) override; + bool on_button_release_event (GdkEventButton* event) override; + bool on_scroll_event (GdkEventScroll* event) override; + bool on_leave_notify_event (GdkEventCrossing* event) override; void on_resized (Gtk::Allocation& req); - void on_style_updated (); + void on_style_updated () override; void syncBeforeAfterViews (); void setCropGUIListener (CropGUIListener* l); @@ -132,6 +131,7 @@ public: void setToolHand (); void straightenReady (double rotDeg); void spotWBSelected (int x, int y); + void sharpMaskSelected (bool sharpMask); int getSpotWBRectSize (); void redraw (); @@ -140,18 +140,18 @@ public: void setZoom (double zoom); // EditDataProvider interface - void subscribe(EditSubscriber *subscriber); - void unsubscribe(); - void getImageSize (int &w, int&h); + void subscribe(EditSubscriber *subscriber) override; + void unsubscribe() override; + void getImageSize (int &w, int&h) override; // CropWindowListener interface - void cropPositionChanged (CropWindow* cw); - void cropWindowSizeChanged (CropWindow* cw); - void cropZoomChanged (CropWindow* cw); - void initialImageArrived (CropWindow* cw) ; + void cropPositionChanged (CropWindow* cw) override; + void cropWindowSizeChanged (CropWindow* cw) override; + void cropZoomChanged (CropWindow* cw) override; + void initialImageArrived () override; // LockablePickerToolListener interface - void switchPickerVisibility (bool isVisible); + void switchPickerVisibility (bool isVisible) override; CropWindow* getMainCropWindow () { diff --git a/rtgui/imageareapanel.h b/rtgui/imageareapanel.h index a0c5c8df2..13fd6650b 100644 --- a/rtgui/imageareapanel.h +++ b/rtgui/imageareapanel.h @@ -35,7 +35,7 @@ public: ImageArea* imageArea; ImageAreaPanel (); - ~ImageAreaPanel (); + ~ImageAreaPanel () override; void zoomChanged (); diff --git a/rtgui/imageareatoollistener.h b/rtgui/imageareatoollistener.h index b7d5cec94..705888676 100644 --- a/rtgui/imageareatoollistener.h +++ b/rtgui/imageareatoollistener.h @@ -27,22 +27,14 @@ class ImageAreaToolListener { public: - virtual ~ImageAreaToolListener() {} - virtual void spotWBselected (int x, int y, Thumbnail* thm = nullptr) {} - virtual int getSpotWBRectSize () - { - return 8; - } - virtual void cropSelectionReady () {} - virtual void rotateSelectionReady (double rotate_deg, Thumbnail* thm = nullptr) {} - virtual ToolBar* getToolBar () - { - return nullptr; - } - virtual CropGUIListener* startCropEditing (Thumbnail* thm = nullptr) - { - return nullptr; - } + virtual ~ImageAreaToolListener() = default; + virtual void spotWBselected(int x, int y, Thumbnail* thm = nullptr) = 0; + virtual void sharpMaskSelected(bool sharpMask) = 0; + virtual int getSpotWBRectSize() const = 0; + virtual void cropSelectionReady() = 0; + virtual void rotateSelectionReady(double rotate_deg, Thumbnail* thm = nullptr) = 0; + virtual ToolBar* getToolBar() const = 0; + virtual CropGUIListener* startCropEditing(Thumbnail* thm = nullptr) = 0; }; #endif diff --git a/rtgui/impulsedenoise.cc b/rtgui/impulsedenoise.cc index 5aba32d77..9203ce8a7 100644 --- a/rtgui/impulsedenoise.cc +++ b/rtgui/impulsedenoise.cc @@ -16,11 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "impulsedenoise.h" #include #include + +#include "impulsedenoise.h" + #include "guiutils.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -77,15 +81,17 @@ void ImpulseDenoise::setDefaults (const ProcParams* defParams, const ParamsEdite } } -void ImpulseDenoise::adjusterChanged (Adjuster* a, double newval) +void ImpulseDenoise::adjusterChanged(Adjuster* a, double newval) { - if (listener && getEnabled()) { - listener->panelChanged (EvIDNThresh, Glib::ustring::format (std::setw(2), std::fixed, std::setprecision(1), a->getValue())); } } +void ImpulseDenoise::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void ImpulseDenoise::enabledChanged () { if (listener) { diff --git a/rtgui/impulsedenoise.h b/rtgui/impulsedenoise.h index cd8de582b..79484dc65 100644 --- a/rtgui/impulsedenoise.h +++ b/rtgui/impulsedenoise.h @@ -34,16 +34,17 @@ public: ImpulseDenoise (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void setAdjusterBehavior (bool threshadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/indclippedpanel.cc b/rtgui/indclippedpanel.cc index ae7cff644..aff5035fe 100644 --- a/rtgui/indclippedpanel.cc +++ b/rtgui/indclippedpanel.cc @@ -24,19 +24,28 @@ IndicateClippedPanel::IndicateClippedPanel (ImageArea* ia) : imageArea(ia) { - iFon = new RTImage ("previewmodeF-focusScreen-on.png"); - iFoff = new RTImage ("previewmodeF-focusScreen-off.png"); + iFon = new RTImage ("focusscreen-on.png"); + iFoff = new RTImage ("focusscreen-off.png"); + + // for previewSharpMask, needs to be replaced with different icons + iSon = new RTImage ("contrastmask-on.png"); + iSoff = new RTImage ("contrastmask-off.png"); previewFocusMask = Gtk::manage (new Gtk::ToggleButton ()); previewFocusMask->set_relief(Gtk::RELIEF_NONE); previewFocusMask->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWFOCUSMASK")); previewFocusMask->set_image(*iFoff); + previewSharpMask = Gtk::manage (new Gtk::ToggleButton ()); + previewSharpMask->set_relief(Gtk::RELIEF_NONE); + previewSharpMask->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWSHARPMASK")); + previewSharpMask->set_image(*iSoff); + Glib::ustring tt; indClippedH = Gtk::manage (new Gtk::ToggleButton ()); indClippedH->set_relief(Gtk::RELIEF_NONE); - indClippedH->add (*Gtk::manage (new RTImage ("warnhl.png"))); + indClippedH->add (*Gtk::manage (new RTImage ("warning-highlights.png"))); tt = Glib::ustring::compose("%1\n%2 = %3", M("MAIN_TOOLTIP_INDCLIPPEDH"), M("MAIN_TOOLTIP_THRESHOLD"), options.highlightThreshold); if (tt.find("<") == Glib::ustring::npos && tt.find(">") == Glib::ustring::npos) { @@ -47,7 +56,7 @@ IndicateClippedPanel::IndicateClippedPanel (ImageArea* ia) : imageArea(ia) indClippedS = Gtk::manage (new Gtk::ToggleButton ()); indClippedS->set_relief(Gtk::RELIEF_NONE); - indClippedS->add (*Gtk::manage (new RTImage ("warnsh.png"))); + indClippedS->add (*Gtk::manage (new RTImage ("warning-shadows.png"))); tt = Glib::ustring::compose("%1\n%2 = %3", M("MAIN_TOOLTIP_INDCLIPPEDS"), M("MAIN_TOOLTIP_THRESHOLD"), options.shadowThreshold); if (tt.find("<") == Glib::ustring::npos && tt.find(">") == Glib::ustring::npos) { @@ -57,13 +66,16 @@ IndicateClippedPanel::IndicateClippedPanel (ImageArea* ia) : imageArea(ia) } previewFocusMask->set_active (false); + previewSharpMask->set_active (false); indClippedH->set_active (options.showClippedHighlights); indClippedS->set_active (options.showClippedShadows); pack_start (*previewFocusMask, Gtk::PACK_SHRINK, 0); + pack_start (*previewSharpMask, Gtk::PACK_SHRINK, 0); pack_start (*indClippedS, Gtk::PACK_SHRINK, 0); pack_start (*indClippedH, Gtk::PACK_SHRINK, 0); + connSharpMask = previewSharpMask->signal_toggled().connect( sigc::bind(sigc::mem_fun(*this, &IndicateClippedPanel::buttonToggled), previewSharpMask) ); connFocusMask = previewFocusMask->signal_toggled().connect( sigc::bind(sigc::mem_fun(*this, &IndicateClippedPanel::buttonToggled), previewFocusMask) ); connClippedS = indClippedS->signal_toggled().connect( sigc::bind(sigc::mem_fun(*this, &IndicateClippedPanel::buttonToggled), indClippedS) ); connClippedH = indClippedH->signal_toggled().connect( sigc::bind(sigc::mem_fun(*this, &IndicateClippedPanel::buttonToggled), indClippedH) ); @@ -86,27 +98,54 @@ void IndicateClippedPanel::toggleFocusMask () previewFocusMask->set_active(!previewFocusMask->get_active()); } +void IndicateClippedPanel::silentlyDisableSharpMask () +{ + ConnectionBlocker conBlocker(connSharpMask); + previewSharpMask->set_active(false); + previewSharpMask->set_image(*iSoff); + +} + +void IndicateClippedPanel::toggleSharpMask () +{ + previewSharpMask->set_active(!previewSharpMask->get_active()); +} + void IndicateClippedPanel::buttonToggled (Gtk::ToggleButton* tb) { connFocusMask.block(true); + connSharpMask.block(true); connClippedS.block(true); connClippedH.block(true); - if (tb != previewFocusMask) { - previewFocusMask->set_active(false); - } else { + if (tb == previewFocusMask) { if (indClippedS->get_active()) { indClippedS->set_active(false); } if (indClippedH->get_active()) { indClippedH->set_active(false); } + previewSharpMask->set_active(false); + } else if (tb == previewSharpMask) { + if (indClippedS->get_active()) { + indClippedS->set_active(false); + } + if (indClippedH->get_active()) { + indClippedH->set_active(false); + } + previewFocusMask->set_active(false); + } else { + previewFocusMask->set_active(false); + previewSharpMask->set_active(false); } + imageArea->sharpMaskSelected(previewSharpMask->get_active()); previewFocusMask->set_image(previewFocusMask->get_active() ? *iFon : *iFoff); + previewSharpMask->set_image(previewSharpMask->get_active() ? *iSon : *iSoff); connFocusMask.block(false); + connSharpMask.block(false); connClippedS.block(false); connClippedH.block(false); @@ -123,4 +162,6 @@ IndicateClippedPanel::~IndicateClippedPanel () { delete iFon; delete iFoff; + delete iSon; + delete iSoff; } diff --git a/rtgui/indclippedpanel.h b/rtgui/indclippedpanel.h index 1da4b61de..c026d4611 100644 --- a/rtgui/indclippedpanel.h +++ b/rtgui/indclippedpanel.h @@ -19,13 +19,15 @@ #define _INDCLIPPEDPANEL_ #include +#include class ImageArea; class IndicateClippedPanel : public Gtk::HBox { protected: - Gtk::Image* iFon, *iFoff; + Gtk::Image* iFon, *iFoff, *iSon, *iSoff; + Gtk::ToggleButton* previewSharpMask; Gtk::ToggleButton* previewFocusMask; Gtk::ToggleButton* indClippedH; Gtk::ToggleButton* indClippedS; @@ -33,13 +35,15 @@ protected: public: explicit IndicateClippedPanel(ImageArea* ia); - ~IndicateClippedPanel(); + ~IndicateClippedPanel() override; void buttonToggled(Gtk::ToggleButton* tb); void toggleClipped(bool highlights); // inverts a toggle programmatically void toggleFocusMask(); + void silentlyDisableSharpMask(); // toggle the button off without throwing a toggle event + void toggleSharpMask(); - sigc::connection connFocusMask, connClippedS, connClippedH; + sigc::connection connFocusMask, connSharpMask, connClippedS, connClippedH; bool showFocusMask () diff --git a/rtgui/inspector.cc b/rtgui/inspector.cc index 4084e300f..6da62cd3b 100644 --- a/rtgui/inspector.cc +++ b/rtgui/inspector.cc @@ -210,6 +210,23 @@ void Inspector::switchImage (const Glib::ustring &fullPath) return; } + if (delayconn.connected()) { + delayconn.disconnect(); + } + + next_image_path = fullPath; + if (!options.inspectorDelay) { + doSwitchImage(); + } else { + delayconn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &Inspector::doSwitchImage), options.inspectorDelay); + } +} + + +bool Inspector::doSwitchImage() +{ + Glib::ustring fullPath = next_image_path; + // we first check the size of the list, it may have been changed in Preference if (images.size() > size_t(options.maxInspectorBuffers)) { // deleting the last entries @@ -225,7 +242,6 @@ void Inspector::switchImage (const Glib::ustring &fullPath) if (fullPath.empty()) { currImage = nullptr; queue_draw(); - return; } else { bool found = false; @@ -264,6 +280,8 @@ void Inspector::switchImage (const Glib::ustring &fullPath) } } } + + return true; } void Inspector::deleteBuffers () diff --git a/rtgui/inspector.h b/rtgui/inspector.h index f68912dc1..d5ed327b8 100644 --- a/rtgui/inspector.h +++ b/rtgui/inspector.h @@ -48,12 +48,17 @@ private: double zoom; bool active; - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); + sigc::connection delayconn; + Glib::ustring next_image_path; + + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; void deleteBuffers(); + bool doSwitchImage(); + public: Inspector(); - ~Inspector(); + ~Inspector() override; /** @brief Mouse movement to a new position * @param pos Location of the mouse, in percentage (i.e. [0;1] range) relative to the full size image ; -1,-1 == out of the image @@ -87,11 +92,11 @@ public: return active; }; - 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; - 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; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; }; diff --git a/rtgui/iptcpanel.cc b/rtgui/iptcpanel.cc index cd0fe4050..7347927a0 100644 --- a/rtgui/iptcpanel.cc +++ b/rtgui/iptcpanel.cc @@ -20,10 +20,15 @@ #include "clipboard.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; -IPTCPanel::IPTCPanel () +IPTCPanel::IPTCPanel () : + changeList(new rtengine::procparams::IPTCPairs), + defChangeList(new rtengine::procparams::IPTCPairs), + embeddedData(new rtengine::procparams::IPTCPairs) { set_spacing (4); @@ -112,9 +117,9 @@ IPTCPanel::IPTCPanel () setExpandAlignProperties(addKW, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); delKW = Gtk::manage( new Gtk::Button () ); setExpandAlignProperties(delKW, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image* addKWImg = Gtk::manage( new RTImage ("list-add-small.png") ); + Gtk::Image* addKWImg = Gtk::manage( new RTImage ("add-small.png") ); setExpandAlignProperties(addKWImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - Gtk::Image* delKWImg = Gtk::manage( new RTImage ("list-remove-red-small.png") ); + Gtk::Image* delKWImg = Gtk::manage( new RTImage ("remove-small.png") ); setExpandAlignProperties(delKWImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); addKW->add (*addKWImg); delKW->add (*delKWImg); @@ -162,9 +167,9 @@ IPTCPanel::IPTCPanel () setExpandAlignProperties(addSC, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); delSC = Gtk::manage( new Gtk::Button () ); setExpandAlignProperties(delSC, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - Gtk::Image* addSCImg = Gtk::manage( new RTImage ("list-add-small.png") ); + Gtk::Image* addSCImg = Gtk::manage( new RTImage ("add-small.png") ); setExpandAlignProperties(addSCImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - Gtk::Image* delSCImg = Gtk::manage( new RTImage ("list-remove-red-small.png") ); + Gtk::Image* delSCImg = Gtk::manage( new RTImage ("remove-small.png") ); setExpandAlignProperties(delSCImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); addSC->add (*addSCImg); delSC->add (*delSCImg); @@ -328,25 +333,25 @@ IPTCPanel::IPTCPanel () reset = Gtk::manage( new Gtk::Button () ); // M("IPTCPANEL_RESET") reset->get_style_context()->add_class("Left"); - reset->set_image (*Gtk::manage(new RTImage ("gtk-undo-ltr.png", "gtk-undo-rtl.png"))); + reset->set_image (*Gtk::manage(new RTImage ("undo.png", "redo.png"))); setExpandAlignProperties(reset, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to (*reset, Gtk::POS_LEFT, 1, 1); file = Gtk::manage( new Gtk::Button () ); // M("IPTCPANEL_EMBEDDED") file->get_style_context()->add_class("MiddleH"); - file->set_image (*Gtk::manage(new RTImage ("gtk-open.png"))); + file->set_image (*Gtk::manage(new RTImage ("folder-open.png"))); setExpandAlignProperties(file, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to (*file, Gtk::POS_RIGHT, 1, 1); copy = Gtk::manage( new Gtk::Button () ); copy->get_style_context()->add_class("MiddleH"); - copy->set_image (*Gtk::manage(new RTImage ("edit-copy.png"))); + copy->set_image (*Gtk::manage(new RTImage ("copy.png"))); setExpandAlignProperties(copy, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to (*copy, Gtk::POS_RIGHT, 1, 1); paste = Gtk::manage( new Gtk::Button () ); paste->get_style_context()->add_class("Right"); - paste->set_image (*Gtk::manage(new RTImage ("edit-paste.png"))); + paste->set_image (*Gtk::manage(new RTImage ("paste.png"))); setExpandAlignProperties(paste, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); bbox->attach_next_to (*paste, Gtk::POS_RIGHT, 1, 1); @@ -410,12 +415,12 @@ void IPTCPanel::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); - changeList.clear(); + changeList->clear(); if (!pp->iptc.empty()) { - changeList = pp->iptc; + *changeList = pp->iptc; } else { - changeList = embeddedData; + *changeList = *embeddedData; } applyChangeList (); @@ -425,25 +430,25 @@ void IPTCPanel::read (const ProcParams* pp, const ParamsEdited* pedited) void IPTCPanel::write (ProcParams* pp, ParamsEdited* pedited) { - pp->iptc = changeList; + pp->iptc = *changeList; } void IPTCPanel::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { - defChangeList = defParams->iptc; + *defChangeList = defParams->iptc; } void IPTCPanel::setImageData (const FramesMetaData* id) { if (id) { - embeddedData = id->getIPTCData (); + *embeddedData = id->getIPTCData (); } else { - embeddedData.clear (); + embeddedData->clear (); } - file->set_sensitive (!embeddedData.empty()); + file->set_sensitive (!embeddedData->empty()); } void IPTCPanel::notifyListener () @@ -564,33 +569,33 @@ void IPTCPanel::delSuppCategory () void IPTCPanel::updateChangeList () { - changeList.clear (); - changeList["Caption" ].push_back (captionText->get_text ()); - changeList["CaptionWriter" ].push_back (captionWriter->get_text ()); - changeList["Headline" ].push_back (headline->get_text ()); - changeList["Instructions" ].push_back (instructions->get_text ()); + changeList->clear (); + (*changeList)["Caption" ].push_back (captionText->get_text ()); + (*changeList)["CaptionWriter" ].push_back (captionWriter->get_text ()); + (*changeList)["Headline" ].push_back (headline->get_text ()); + (*changeList)["Instructions" ].push_back (instructions->get_text ()); for (unsigned int i = 0; i < keywords->size(); i++) { - changeList["Keywords" ].push_back (keywords->get_text (i)); + (*changeList)["Keywords" ].push_back (keywords->get_text (i)); } - changeList["Category" ].push_back (category->get_entry()->get_text ()); + (*changeList)["Category" ].push_back (category->get_entry()->get_text ()); for (unsigned int i = 0; i < suppCategories->size(); i++) { - changeList["SupplementalCategories"].push_back (suppCategories->get_text (i)); + (*changeList)["SupplementalCategories"].push_back (suppCategories->get_text (i)); } - changeList["Creator" ].push_back (creator->get_text ()); - changeList["CreatorJobTitle"].push_back (creatorJobTitle->get_text ()); - changeList["Credit" ].push_back (credit->get_text ()); - changeList["Source" ].push_back (source->get_text ()); - changeList["Copyright" ].push_back (copyright->get_text ()); - changeList["City" ].push_back (city->get_text ()); - changeList["Province" ].push_back (province->get_text ()); - changeList["Country" ].push_back (country->get_text ()); - changeList["Title" ].push_back (title->get_text ()); - changeList["DateCreated" ].push_back (dateCreated->get_text ()); - changeList["TransReference" ].push_back (transReference->get_text ()); + (*changeList)["Creator" ].push_back (creator->get_text ()); + (*changeList)["CreatorJobTitle"].push_back (creatorJobTitle->get_text ()); + (*changeList)["Credit" ].push_back (credit->get_text ()); + (*changeList)["Source" ].push_back (source->get_text ()); + (*changeList)["Copyright" ].push_back (copyright->get_text ()); + (*changeList)["City" ].push_back (city->get_text ()); + (*changeList)["Province" ].push_back (province->get_text ()); + (*changeList)["Country" ].push_back (country->get_text ()); + (*changeList)["Title" ].push_back (title->get_text ()); + (*changeList)["DateCreated" ].push_back (dateCreated->get_text ()); + (*changeList)["TransReference" ].push_back (transReference->get_text ()); notifyListener (); } @@ -623,7 +628,7 @@ void IPTCPanel::applyChangeList () keyword->get_entry()->set_text (""); suppCategory->get_entry()->set_text (""); - for (rtengine::procparams::IPTCPairs::iterator i = changeList.begin(); i != changeList.end(); ++i) { + for (rtengine::procparams::IPTCPairs::const_iterator i = changeList->begin(); i != changeList->end(); ++i) { if (i->first == "Caption" && !i->second.empty()) { captionText->set_text (i->second.at(0)); } else if (i->first == "CaptionWriter" && !i->second.empty()) { @@ -676,7 +681,7 @@ void IPTCPanel::resetClicked () { disableListener (); - changeList = defChangeList; + *changeList = *defChangeList; applyChangeList (); enableListener (); notifyListener (); @@ -686,7 +691,7 @@ void IPTCPanel::fileClicked () { disableListener (); - changeList = embeddedData; + *changeList = *embeddedData; applyChangeList (); enableListener (); notifyListener (); @@ -695,14 +700,14 @@ void IPTCPanel::fileClicked () void IPTCPanel::copyClicked () { - clipboard.setIPTC (changeList); + clipboard.setIPTC (*changeList); } void IPTCPanel::pasteClicked () { disableListener (); - changeList = clipboard.getIPTC (); + *changeList = clipboard.getIPTC (); applyChangeList (); enableListener (); notifyListener (); diff --git a/rtgui/iptcpanel.h b/rtgui/iptcpanel.h index b216cf638..25683ccec 100644 --- a/rtgui/iptcpanel.h +++ b/rtgui/iptcpanel.h @@ -19,17 +19,20 @@ #ifndef _IPTCPANEL_ #define _IPTCPANEL_ +#include + #include -#include "toolpanel.h" + #include "guiutils.h" +#include "toolpanel.h" class IPTCPanel : public Gtk::VBox, public ToolPanel { private: - rtengine::procparams::IPTCPairs changeList; - rtengine::procparams::IPTCPairs defChangeList; - rtengine::procparams::IPTCPairs embeddedData; + const std::unique_ptr changeList; + const std::unique_ptr defChangeList; + const std::unique_ptr embeddedData; Gtk::TextView* captionView; Glib::RefPtr captionText; @@ -71,9 +74,9 @@ private: public: IPTCPanel (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setImageData (const rtengine::FramesMetaData* id); diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index 1cde4262d..e73fa31e0 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -16,11 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "labcurve.h" #include -#include "../rtengine/improcfun.h" + +#include "labcurve.h" + #include "edit.h" +#include "../rtengine/improcfun.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -47,6 +51,10 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"), contrast->setAdjusterListener (this); chromaticity->setAdjusterListener (this); + brightness->setLogScale(2, 0, true); + contrast->setLogScale(2, 0, true); + chromaticity->setLogScale(2, 0, true); + //%%%%%%%%%%%%%%%%%% Gtk::HSeparator *hsep2 = Gtk::manage (new Gtk::HSeparator()); hsep2->show (); @@ -517,9 +525,8 @@ void LCurve::curveChanged (CurveEditor* ce) } } -void LCurve::adjusterChanged (Adjuster* a, double newval) +void LCurve::adjusterChanged(Adjuster* a, double newval) { - Glib::ustring costr; if (a == brightness) { @@ -561,6 +568,10 @@ void LCurve::adjusterChanged (Adjuster* a, double newval) } } +void LCurve::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void LCurve::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) { @@ -638,14 +649,21 @@ void LCurve::setBatchMode (bool batchMode) } -void LCurve::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 LCurve::updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI +) { - lshape->updateBackgroundHistogram (histLCurve); ccshape->updateBackgroundHistogram (histCCurve); -// clshape->updateBackgroundHistogram (histCLurve); -// lcshape->updateBackgroundHistogram (histLLCurve); - } void LCurve::setAdjusterBehavior (bool bradd, bool contradd, bool satadd) diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index e0b912559..eb582035a 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -62,27 +62,39 @@ protected: public: LCurve (); - ~LCurve (); + ~LCurve () override; - 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 autoOpenCurve (); - void setEditProvider (EditDataProvider *provider); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void autoOpenCurve () override; + void setEditProvider (EditDataProvider *provider) override; void setAdjusterBehavior (bool bradd, bool contradd, bool satadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; - void curveChanged (CurveEditor* ce); - void adjusterChanged (Adjuster* a, double newval); + void curveChanged (CurveEditor* ce) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; void avoidcolorshift_toggled (); void lcredsk_toggled(); - 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 updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI + ); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; - void enabledChanged(); + void enabledChanged() override; }; #endif diff --git a/rtgui/labgrid.cc b/rtgui/labgrid.cc index 945073221..f680c7322 100644 --- a/rtgui/labgrid.cc +++ b/rtgui/labgrid.cc @@ -41,29 +41,40 @@ using rtengine::Color; -bool LabGrid::notifyListener() +//----------------------------------------------------------------------------- +// LabGridArea +//----------------------------------------------------------------------------- + +bool LabGridArea::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))); + const auto round = + [](float v) -> float + { + return int(v * 1000) / 1000.f; + }; + listener->panelChanged(evt, Glib::ustring::compose(evtMsg, round(high_a), round(high_b), round(low_a), round(low_b))); } return false; } -LabGrid::LabGrid(rtengine::ProcEvent evt): +LabGridArea::LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): Gtk::DrawingArea(), - evt(evt), litPoint(NONE), + evt(evt), evtMsg(msg), + 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) + isDragged(false), + low_enabled(enable_low) { 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 +void LabGridArea::getParams(double &la, double &lb, double &ha, double &hb) const { la = low_a; ha = high_a; @@ -72,19 +83,21 @@ void LabGrid::getParams(double &la, double &lb, double &ha, double &hb) const } -void LabGrid::setParams(double la, double lb, double ha, double hb, bool notify) +void LabGridArea::setParams(double la, double lb, double ha, double hb, bool notify) { - low_a = la; - low_b = lb; - high_a = ha; - high_b = hb; + const double lo = -1.0; + const double hi = 1.0; + low_a = rtengine::LIM(la, lo, hi); + low_b = rtengine::LIM(lb, lo, hi); + high_a = rtengine::LIM(ha, lo, hi); + high_b = rtengine::LIM(hb, lo, hi); queue_draw(); if (notify) { notifyListener(); } } -void LabGrid::setDefault (double la, double lb, double ha, double hb) +void LabGridArea::setDefault (double la, double lb, double ha, double hb) { defaultLow_a = la; defaultLow_b = lb; @@ -93,7 +106,7 @@ void LabGrid::setDefault (double la, double lb, double ha, double hb) } -void LabGrid::reset(bool toInitial) +void LabGridArea::reset(bool toInitial) { if (toInitial) { setParams(defaultLow_a, defaultLow_b, defaultHigh_a, defaultHigh_b, true); @@ -103,32 +116,32 @@ void LabGrid::reset(bool toInitial) } -void LabGrid::setEdited(bool yes) +void LabGridArea::setEdited(bool yes) { edited = yes; } -bool LabGrid::getEdited() const +bool LabGridArea::getEdited() const { return edited; } -void LabGrid::setListener(ToolPanelListener *l) +void LabGridArea::setListener(ToolPanelListener *l) { listener = l; } -void LabGrid::on_style_updated () +void LabGridArea::on_style_updated () { setDirty(true); queue_draw (); } -bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) +bool LabGridArea::on_draw(const ::Cairo::RefPtr &crf) { Gtk::Allocation allocation = get_allocation(); allocation.set_x(0); @@ -168,7 +181,7 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) cr->translate(0, height); cr->scale(1., -1.); const int cells = 8; - float step = rtengine::ColorToningParams::LABGRID_CORR_MAX / float(cells/2); + float step = 12000.f / float(cells/2); for (int j = 0; j < cells; j++) { for (int i = 0; i < cells; i++) { float R, G, B; @@ -188,10 +201,10 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) // 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); + loa = .5f * (width + width * low_a); + hia = .5f * (width + width * high_a); + lob = .5f * (height + height * low_b); + hib = .5f * (height + height * high_b); cr->set_line_width(2.); cr->set_source_rgb(0.6, 0.6, 0.6); cr->move_to(loa, lob); @@ -199,13 +212,15 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) 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); + if (low_enabled) { + 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->fill(); cr->set_source_rgb(0.9, 0.9, 0.9); if (litPoint == HIGH) { @@ -221,7 +236,7 @@ bool LabGrid::on_draw(const ::Cairo::RefPtr &crf) } -bool LabGrid::on_button_press_event(GdkEventButton *event) +bool LabGridArea::on_button_press_event(GdkEventButton *event) { if (event->button == 1) { if (event->type == GDK_2BUTTON_PRESS) { @@ -248,7 +263,7 @@ bool LabGrid::on_button_press_event(GdkEventButton *event) } -bool LabGrid::on_button_release_event(GdkEventButton *event) +bool LabGridArea::on_button_release_event(GdkEventButton *event) { if (event->button == 1) { isDragged = false; @@ -258,7 +273,7 @@ bool LabGrid::on_button_release_event(GdkEventButton *event) } -bool LabGrid::on_motion_notify_event(GdkEventMotion *event) +bool LabGridArea::on_motion_notify_event(GdkEventMotion *event) { if (isDragged && delayconn.connected()) { delayconn.disconnect(); @@ -273,30 +288,30 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) 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; + low_a = ma; + low_b = mb; } else if (litPoint == HIGH) { - high_a = ma * rtengine::ColorToningParams::LABGRID_CORR_MAX; - high_b = mb * rtengine::ColorToningParams::LABGRID_CORR_MAX; + high_a = ma; + high_b = mb; } edited = true; grab_focus(); if (options.adjusterMinDelay == 0) { notifyListener(); } else { - delayconn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGrid::notifyListener), options.adjusterMinDelay); + delayconn = Glib::signal_timeout().connect(sigc::mem_fun(*this, &LabGridArea::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; + float la = low_a; + float lb = low_b; + float ha = high_a; + float hb = high_b; 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) { + if (low_enabled && distlo < thrs * thrs && distlo < disthi) { litPoint = LOW; } else if (disthi < thrs * thrs && disthi <= distlo) { litPoint = HIGH; @@ -309,20 +324,66 @@ bool LabGrid::on_motion_notify_event(GdkEventMotion *event) } -Gtk::SizeRequestMode LabGrid::get_request_mode_vfunc() const +Gtk::SizeRequestMode LabGridArea::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 +void LabGridArea::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 +void LabGridArea::get_preferred_height_for_width_vfunc(int width, int &minimum_height, int &natural_height) const { minimum_height = natural_height = width; } + + +bool LabGridArea::lowEnabled() const +{ + return low_enabled; +} + + +void LabGridArea::setLowEnabled(bool yes) +{ + if (low_enabled != yes) { + low_enabled = yes; + queue_draw(); + } +} + + +//----------------------------------------------------------------------------- +// LabGrid +//----------------------------------------------------------------------------- + +LabGrid::LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low): + grid(evt, msg, enable_low) +{ + Gtk::Button *reset = Gtk::manage(new Gtk::Button()); + reset->set_tooltip_markup(M("ADJUSTER_RESET_TO_DEFAULT")); + reset->add(*Gtk::manage(new RTImage("undo-small.png", "redo-small.png"))); + reset->signal_button_release_event().connect(sigc::mem_fun(*this, &LabGrid::resetPressed)); + + setExpandAlignProperties(reset, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_START); + reset->set_relief(Gtk::RELIEF_NONE); + reset->get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + reset->set_can_focus(false); + reset->set_size_request(-1, 20); + + pack_start(grid, true, true); + pack_start(*reset, false, false); + show_all_children(); +} + + +bool LabGrid::resetPressed(GdkEventButton *event) +{ + grid.reset(event->state & GDK_CONTROL_MASK); + return false; +} diff --git a/rtgui/labgrid.h b/rtgui/labgrid.h index 348ab2398..00266c91b 100644 --- a/rtgui/labgrid.h +++ b/rtgui/labgrid.h @@ -43,9 +43,11 @@ #include "toolpanel.h" -class LabGrid: public Gtk::DrawingArea, public BackBuffer { +class LabGridArea: public Gtk::DrawingArea, public BackBuffer { private: rtengine::ProcEvent evt; + Glib::ustring evtMsg; + enum State { NONE, HIGH, LOW }; State litPoint; float low_a; @@ -64,11 +66,13 @@ private: sigc::connection delayconn; static const int inset = 2; + bool low_enabled; + bool notifyListener(); void getLitPoint(); public: - LabGrid(rtengine::ProcEvent evt); + LabGridArea(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); void getParams(double &la, double &lb, double &ha, double &hb) const; void setParams(double la, double lb, double ha, double hb, bool notify); @@ -78,13 +82,37 @@ public: 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; + bool lowEnabled() const; + void setLowEnabled(bool yes); + + bool on_draw(const ::Cairo::RefPtr &crf) override; + void on_style_updated () override; + bool on_button_press_event(GdkEventButton *event) override; + bool on_button_release_event(GdkEventButton *event) override; + bool on_motion_notify_event(GdkEventMotion *event) override; + Gtk::SizeRequestMode get_request_mode_vfunc() const override; + void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; +}; + + +class LabGrid: public Gtk::HBox { +private: + LabGridArea grid; + + bool resetPressed(GdkEventButton *event); + +public: + LabGrid(rtengine::ProcEvent evt, const Glib::ustring &msg, bool enable_low=true); + + void getParams(double &la, double &lb, double &ha, double &hb) const { return grid.getParams(la, lb, ha, hb); } + void setParams(double la, double lb, double ha, double hb, bool notify) { grid.setParams(la, lb, ha, hb, notify); } + void setDefault (double la, double lb, double ha, double hb) { grid.setDefault(la, lb, ha, hb); } + void setEdited(bool yes) { grid.setEdited(yes); } + bool getEdited() const { return grid.getEdited(); } + void reset(bool toInitial) { grid.reset(toInitial); } + void setListener(ToolPanelListener *l) { grid.setListener(l); } + bool lowEnabled() const { return grid.lowEnabled(); } + void setLowEnabled(bool yes) { grid.setLowEnabled(yes); } }; diff --git a/rtgui/lensgeom.cc b/rtgui/lensgeom.cc index 7cae75d87..baf816c8b 100644 --- a/rtgui/lensgeom.cc +++ b/rtgui/lensgeom.cc @@ -20,6 +20,8 @@ #include "guiutils.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -30,7 +32,8 @@ LensGeometry::LensGeometry () : FoldableToolPanel(this, "lensgeom", M("TP_LENSGE pack_start (*fill); autoCrop = Gtk::manage (new Gtk::Button (M("TP_LENSGEOM_AUTOCROP"))); - autoCrop->set_image (*Gtk::manage (new RTImage ("crop-auto.png"))); + autoCrop->set_image (*Gtk::manage (new RTImage ("crop-auto-small.png"))); + autoCrop->get_style_context()->add_class("independent"); pack_start (*autoCrop, Gtk::PACK_SHRINK, 2); packBox = Gtk::manage (new ToolParamBlock ()); diff --git a/rtgui/lensgeom.h b/rtgui/lensgeom.h index 29b0c7f20..20bb4b7eb 100644 --- a/rtgui/lensgeom.h +++ b/rtgui/lensgeom.h @@ -37,16 +37,16 @@ protected: public: LensGeometry (); - ~LensGeometry (); + ~LensGeometry () override; Gtk::Box* getPackBox () { return packBox; } - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void fillPressed (); void autoCropPressed (); diff --git a/rtgui/lensgeomlistener.h b/rtgui/lensgeomlistener.h index 3f9866e95..c6ba966b1 100644 --- a/rtgui/lensgeomlistener.h +++ b/rtgui/lensgeomlistener.h @@ -21,8 +21,8 @@ class LensGeomListener { - public: + virtual ~LensGeomListener() = default; virtual void straightenRequested () = 0; virtual void autoCropRequested () = 0; virtual double autoDistorRequested () = 0; diff --git a/rtgui/lensprofile.cc b/rtgui/lensprofile.cc index 052cb1455..85dcb992a 100644 --- a/rtgui/lensprofile.cc +++ b/rtgui/lensprofile.cc @@ -16,288 +16,304 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include -#include "lensprofile.h" -#include "guiutils.h" -#include "../rtengine/lcp.h" -#include -#include "rtimage.h" -#include "../rtengine/rtlensfun.h" #include #include +#include + +#include + +#include "lensprofile.h" + +#include "guiutils.h" +#include "rtimage.h" + +#include "../rtengine/lcp.h" +#include "../rtengine/procparams.h" +#include "../rtengine/rtlensfun.h" using namespace rtengine; using namespace rtengine::procparams; -LensProfilePanel::LFDbHelper *LensProfilePanel::lf(nullptr); - -LensProfilePanel::LensProfilePanel () : +LensProfilePanel::LensProfilePanel() : FoldableToolPanel(this, "lensprof", M("TP_LENSPROFILE_LABEL")), lcModeChanged(false), lcpFileChanged(false), useDistChanged(false), useVignChanged(false), useCAChanged(false), - isRaw(true), - metadata(nullptr), useLensfunChanged(false), lensfunAutoChanged(false), lensfunCameraChanged(false), - lensfunLensChanged(false) + lensfunLensChanged(false), + allowFocusDep(true), + isRaw(true), + metadata(nullptr), + modesGrid(Gtk::manage(new Gtk::Grid())), + distGrid(Gtk::manage((new Gtk::Grid()))), + corrUnchangedRB(Gtk::manage((new Gtk::RadioButton(M("GENERAL_UNCHANGED"))))), + corrOffRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("GENERAL_NONE"))))), + corrLensfunAutoRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_AUTOMATCH"))))), + corrLensfunManualRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_MANUAL"))))), + corrLcpFileRB(Gtk::manage((new Gtk::RadioButton(corrGroup, M("TP_LENSPROFILE_CORRECTION_LCPFILE"))))), + corrLcpFileChooser(Gtk::manage((new MyFileChooserButton(M("TP_LENSPROFILE_LABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)))), + lensfunCamerasLbl(Gtk::manage((new Gtk::Label(M("EXIFFILTER_CAMERA"))))), + lensfunCameras(Gtk::manage((new MyComboBox()))), + lensfunLensesLbl(Gtk::manage((new Gtk::Label(M("EXIFFILTER_LENS"))))), + lensfunLenses(Gtk::manage((new MyComboBox()))), + warning(Gtk::manage(new RTImage("warning.png"))), + ckbUseDist(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_GEOMETRIC"))))), + ckbUseVign(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_VIGNETTING"))))), + ckbUseCA(Gtk::manage((new Gtk::CheckButton(M("TP_LENSPROFILE_USE_CA"))))) { if (!lf) { lf = new LFDbHelper(); } - corrUnchanged = Gtk::manage(new Gtk::RadioButton(M("GENERAL_UNCHANGED"))); - pack_start(*corrUnchanged); + // Main containers: - corrGroup = corrUnchanged->get_group(); + Gtk::Frame *nodesFrame = Gtk::manage(new Gtk::Frame(M("TP_LENSPROFILE_MODE_HEADER"))); - corrOff = Gtk::manage(new Gtk::RadioButton(corrGroup, M("GENERAL_NONE"))); - pack_start(*corrOff); - - corrLensfunAuto = Gtk::manage(new Gtk::RadioButton(corrGroup, M("LENSPROFILE_CORRECTION_AUTOMATCH"))); - pack_start(*corrLensfunAuto); - - corrLensfunManual = Gtk::manage(new Gtk::RadioButton(corrGroup, M("LENSPROFILE_CORRECTION_MANUAL"))); - pack_start(*corrLensfunManual); + modesGrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(modesGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + Gtk::Frame *distFrame = Gtk::manage(new Gtk::Frame(M("TP_LENSPROFILE_USE_HEADER"))); + + distGrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(distGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + // Mode choice widgets: + + setExpandAlignProperties(corrLcpFileChooser, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + // Manually-selected profile widgets: + + setExpandAlignProperties(lensfunCamerasLbl, false, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); - lensfunCameras = Gtk::manage(new MyComboBox()); lensfunCameras->set_model(lf->lensfunCameraModel); lensfunCameras->pack_start(lf->lensfunModelCam.model); - Gtk::CellRendererText* cellRenderer = dynamic_cast(lensfunCameras->get_first_cell()); - cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; - cellRenderer->property_ellipsize_set() = true; lensfunCameras->setPreferredWidth(50, 120); + setExpandAlignProperties(lensfunCameras, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + Gtk::CellRendererText* const camerasCellRenderer = static_cast(lensfunCameras->get_first_cell()); + camerasCellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; + camerasCellRenderer->property_ellipsize_set() = true; + + setExpandAlignProperties(lensfunLensesLbl, false, false, Gtk::ALIGN_END, Gtk::ALIGN_CENTER); - lensfunLenses = Gtk::manage(new MyComboBox()); lensfunLenses->set_model(lf->lensfunLensModel); lensfunLenses->pack_start(lf->lensfunModelLens.prettylens); - cellRenderer = dynamic_cast(lensfunLenses->get_first_cell()); - cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; - cellRenderer->property_ellipsize_set() = true; lensfunLenses->setPreferredWidth(50, 120); - - Gtk::HBox *hb = Gtk::manage(new Gtk::HBox()); - hb->pack_start(*Gtk::manage(new Gtk::Label(M("EXIFFILTER_CAMERA"))), Gtk::PACK_SHRINK, 4); - hb->pack_start(*lensfunCameras); - pack_start(*hb); + setExpandAlignProperties(lensfunLenses, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - hb = Gtk::manage(new Gtk::HBox()); - hb->pack_start(*Gtk::manage(new Gtk::Label(M("EXIFFILTER_LENS"))), Gtk::PACK_SHRINK, 4); - hb->pack_start(*lensfunLenses); - warning = Gtk::manage(new Gtk::Image()); - warning->set_from_icon_name("dialog-warning", Gtk::ICON_SIZE_LARGE_TOOLBAR); - warning->set_tooltip_text(M("LENSPROFILE_LENS_WARNING")); + Gtk::CellRendererText* const lensesCellRenderer = static_cast(lensfunLenses->get_first_cell()); + lensesCellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; + lensesCellRenderer->property_ellipsize_set() = true; + + warning->set_tooltip_text(M("TP_LENSPROFILE_LENS_WARNING")); warning->hide(); - hb->pack_start(*warning, Gtk::PACK_SHRINK, 4); - pack_start(*hb); - corrLcpFile = Gtk::manage(new Gtk::RadioButton(corrGroup)); - hbLCPFile = Gtk::manage(new Gtk::HBox()); - hbLCPFile->pack_start(*corrLcpFile, Gtk::PACK_SHRINK); + // LCP file filter config: - lLCPFileHead = Gtk::manage(new Gtk::Label(M("LENSPROFILE_CORRECTION_LCPFILE"))); - hbLCPFile->pack_start(*lLCPFileHead, Gtk::PACK_SHRINK, 4); - - fcbLCPFile = Gtk::manage(new MyFileChooserButton(M("TP_LENSPROFILE_LABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)); - - Glib::RefPtr filterLCP = Gtk::FileFilter::create(); + const Glib::RefPtr filterLCP = Gtk::FileFilter::create(); filterLCP->set_name(M("FILECHOOSER_FILTER_LCP")); filterLCP->add_pattern("*.lcp"); filterLCP->add_pattern("*.LCP"); - fcbLCPFile->add_filter(filterLCP); + corrLcpFileChooser->add_filter(filterLCP); - Glib::ustring defDir = LCPStore::getInstance()->getDefaultCommonDirectory(); + const Glib::ustring defDir = LCPStore::getInstance()->getDefaultCommonDirectory(); if (!defDir.empty()) { #ifdef WIN32 - fcbLCPFile->set_show_hidden(true); // ProgramData is hidden on Windows + corrLcpFileChooser->set_show_hidden(true); // ProgramData is hidden on Windows #endif - fcbLCPFile->set_current_folder(defDir); + corrLcpFileChooser->set_current_folder(defDir); } else if (!options.lastLensProfileDir.empty()) { - fcbLCPFile->set_current_folder(options.lastLensProfileDir); + corrLcpFileChooser->set_current_folder(options.lastLensProfileDir); } - bindCurrentFolder(*fcbLCPFile, options.lastLensProfileDir); - hbLCPFile->pack_start(*fcbLCPFile); + bindCurrentFolder(*corrLcpFileChooser, options.lastLensProfileDir); - pack_start(*hbLCPFile, Gtk::PACK_SHRINK, 4); + // Choice of properties to correct, applicable to all modes: - ckbUseDist = Gtk::manage (new Gtk::CheckButton (M("TP_LENSPROFILE_USEDIST"))); - pack_start (*ckbUseDist, Gtk::PACK_SHRINK, 4); - ckbUseVign = Gtk::manage (new Gtk::CheckButton (M("TP_LENSPROFILE_USEVIGN"))); - pack_start (*ckbUseVign, Gtk::PACK_SHRINK, 4); - ckbUseCA = Gtk::manage (new Gtk::CheckButton (M("TP_LENSPROFILE_USECA"))); - pack_start (*ckbUseCA, Gtk::PACK_SHRINK, 4); + // Populate modes grid: - 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) ); + modesGrid->attach(*corrOffRB, 0, 0, 3, 1); + modesGrid->attach(*corrLensfunAutoRB, 0, 1, 3, 1); + modesGrid->attach(*corrLensfunManualRB, 0, 2, 3, 1); + + modesGrid->attach(*lensfunCamerasLbl, 0, 3, 1, 1); + modesGrid->attach(*lensfunCameras, 1, 3, 1, 1); + modesGrid->attach(*lensfunLensesLbl, 0, 4, 1, 1); + modesGrid->attach(*lensfunLenses, 1, 4, 1, 1); + modesGrid->attach(*warning, 2, 3, 1, 2); + + modesGrid->attach(*corrLcpFileRB, 0, 5, 1, 1); + modesGrid->attach(*corrLcpFileChooser, 1, 5, 1, 1); + + // Populate distortions grid: + + distGrid->attach(*ckbUseDist, 0, 0, 1, 1); + distGrid->attach(*ckbUseVign, 0, 1, 1, 1); + distGrid->attach(*ckbUseCA, 0, 2, 1, 1); + + // Attach grids: + nodesFrame->add(*modesGrid); + distFrame->add(*distGrid); + + pack_start(*nodesFrame, Gtk::PACK_EXPAND_WIDGET); + pack_start(*distFrame, Gtk::PACK_EXPAND_WIDGET); + + // Signals: + + conLCPFile = corrLcpFileChooser->signal_file_set().connect(sigc::mem_fun(*this, &LensProfilePanel::onLCPFileChanged)); + 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)); lensfunCameras->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunCameraChanged)); lensfunLenses->signal_changed().connect(sigc::mem_fun(*this, &LensProfilePanel::onLensfunLensChanged)); - corrOff->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLensfunAuto->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLensfunManual->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - corrLcpFile->signal_toggled().connect(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged)); - - corrUnchanged->hide(); - - allowFocusDep = true; + corrOffRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrOffRB)); + corrLensfunAutoRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunAutoRB)); + corrLensfunManualRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLensfunManualRB)); + corrLcpFileRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrLcpFileRB)); } void LensProfilePanel::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { - disableListener (); + disableListener(); conUseDist.block(true); - if (!batchMode) { - corrUnchanged->hide(); - } + // corrLensfunAutoRB->set_sensitive(true); - corrLensfunAuto->set_sensitive(true); + switch (pp->lensProf.lcMode) { + case procparams::LensProfParams::LcMode::LCP: { + corrLcpFileRB->set_active(true); + setManualParamsVisibility(false); + break; + } - switch(pp->lensProf.lcMode) { - case procparams::LensProfParams::LcMode::LCP : - corrLcpFile->set_active(true); + case procparams::LensProfParams::LcMode::LENSFUNAUTOMATCH: { + corrLensfunAutoRB->set_active(true); + if (batchMode) { + setManualParamsVisibility(false); + } break; - case procparams::LensProfParams::LcMode::LENSFUNAUTOMATCH : - corrLensfunAuto->set_active(true); + } + + case procparams::LensProfParams::LcMode::LENSFUNMANUAL: { + corrLensfunManualRB->set_active(true); break; - case procparams::LensProfParams::LcMode::LENSFUNMANUAL : - corrLensfunManual->set_active(true); + } + + case procparams::LensProfParams::LcMode::NONE: { + corrOffRB->set_active(true); + setManualParamsVisibility(false); break; - case procparams::LensProfParams::LcMode::NONE : - corrOff->set_active(true); + } } if (pp->lensProf.lcpFile.empty()) { - Glib::ustring lastFolder = fcbLCPFile->get_current_folder(); - fcbLCPFile->set_current_folder(lastFolder); - fcbLCPFile->unselect_all(); - bindCurrentFolder(*fcbLCPFile, options.lastLensProfileDir); + const Glib::ustring lastFolder = corrLcpFileChooser->get_current_folder(); + corrLcpFileChooser->set_current_folder(lastFolder); + corrLcpFileChooser->unselect_all(); + bindCurrentFolder(*corrLcpFileChooser, options.lastLensProfileDir); updateDisabled(false); - } else if (LCPStore::getInstance()->isValidLCPFileName(pp->lensProf.lcpFile)) { - fcbLCPFile->set_filename (pp->lensProf.lcpFile); - if(corrLcpFile->get_active()) { + } + else if (LCPStore::getInstance()->isValidLCPFileName(pp->lensProf.lcpFile)) { + corrLcpFileChooser->set_filename(pp->lensProf.lcpFile); + + if (corrLcpFileRB->get_active()) { updateDisabled(true); } - } else { - fcbLCPFile->unselect_filename(fcbLCPFile->get_filename()); + } + else { + corrLcpFileChooser->unselect_filename(corrLcpFileChooser->get_filename()); updateDisabled(false); } - const LFDatabase *db = LFDatabase::getInstance(); + const LFDatabase* const db = LFDatabase::getInstance(); LFCamera c; - - if (!setLensfunCamera(pp->lensProf.lfCameraMake, pp->lensProf.lfCameraModel) && !pp->lensProf.lfManual()) { + + if (pp->lensProf.lfAutoMatch()) { if (metadata) { c = db->findCamera(metadata->getMake(), metadata->getModel()); setLensfunCamera(c.getMake(), c.getModel()); } + } else if (pp->lensProf.lfManual()) { + setLensfunCamera(pp->lensProf.lfCameraMake, pp->lensProf.lfCameraModel); } - if (!setLensfunLens(pp->lensProf.lfLens) && !pp->lensProf.lfManual()) { + + if (pp->lensProf.lfAutoMatch()) { if (metadata) { - LFLens l = db->findLens(c, metadata->getLens()); + const LFLens l = db->findLens(c, metadata->getLens()); setLensfunLens(l.getLens()); } + } else if (pp->lensProf.lfManual()) { + setLensfunLens(pp->lensProf.lfLens); } + + + /* + if (!batchMode && !checkLensfunCanCorrect(true)) { + if (corrLensfunAutoRB->get_active()) { + corrOffRB->set_active(true); + } + + corrLensfunAutoRB->set_sensitive(false); + } + + if (!batchMode && corrLensfunManualRB->get_active() && !checkLensfunCanCorrect(false)) { + corrOffRB->set_active(true); + } + */ + ckbUseDist->set_active(pp->lensProf.useDist); + ckbUseVign->set_active(pp->lensProf.useVign); + ckbUseCA->set_active(pp->lensProf.useCA); + + if (pedited) { + corrUnchangedRB->set_active(!pedited->lensProf.lcMode); + ckbUseDist->set_inconsistent(!pedited->lensProf.useDist); + ckbUseVign->set_inconsistent(!pedited->lensProf.useVign); + ckbUseCA->set_inconsistent(!pedited->lensProf.useCA); + + if (!pedited->lensProf.lfCameraMake || !pedited->lensProf.lfCameraModel) { + setLensfunCamera("", ""); + } + if (!pedited->lensProf.lfLens) { + setLensfunLens(""); + } + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(true); + } + lcModeChanged = lcpFileChanged = useDistChanged = useVignChanged = useCAChanged = false; useLensfunChanged = lensfunAutoChanged = lensfunCameraChanged = lensfunLensChanged = false; - - if (!batchMode && !checkLensfunCanCorrect(true)) { - if (corrLensfunAuto->get_active()) { - corrOff->set_active(true); - } - corrLensfunAuto->set_sensitive(false); - } - - if (corrLensfunManual->get_active() && !checkLensfunCanCorrect(false)) { - corrOff->set_active(true); - } - - 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 (); + updateLensfunWarning(); + enableListener(); conUseDist.block(false); } - -void LensProfilePanel::updateLensfunWarning() +void LensProfilePanel::write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) { - warning->hide(); - if (corrLensfunManual->get_active() || corrLensfunAuto->get_active()) { - const LFDatabase *db = LFDatabase::getInstance(); - - auto itc = lensfunCameras->get_active(); - if (!itc) { - return; - } - LFCamera c = db->findCamera((*itc)[lf->lensfunModelCam.make], (*itc)[lf->lensfunModelCam.model]); - auto itl = lensfunLenses->get_active(); - if (!itl) { - return; - } - LFLens l = db->findLens(LFCamera(), (*itl)[lf->lensfunModelLens.lens]); - float lenscrop = l.getCropFactor(); - float camcrop = c.getCropFactor(); - if (lenscrop <= 0 || camcrop <= 0 || lenscrop / camcrop >= 1.01f) { - warning->show(); - } - 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::FramesMetaData* pMeta) -{ - if (!raw || pMeta->getFocusDist() <= 0) { - disableListener(); - - // CA is very focus layer dependend, otherwise it might even worsen things - allowFocusDep = false; - ckbUseCA->set_active(false); - ckbUseCA->set_sensitive(false); - - enableListener(); - } - - isRaw = raw; - metadata = pMeta; -} - -void LensProfilePanel::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) -{ - if (corrLcpFile->get_active()) { + if (corrLcpFileRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::LCP; - } else if(corrLensfunManual->get_active()) { + } + else if (corrLensfunManualRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::LENSFUNMANUAL; - } else if(corrLensfunAuto->get_active()) { + } + else if (corrLensfunAutoRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::LENSFUNAUTOMATCH; - } else if(corrOff->get_active()) { + } + else if (corrOffRB->get_active()) { pp->lensProf.lcMode = procparams::LensProfParams::LcMode::NONE; } - if (LCPStore::getInstance()->isValidLCPFileName(fcbLCPFile->get_filename())) { - pp->lensProf.lcpFile = fcbLCPFile->get_filename(); + if (LCPStore::getInstance()->isValidLCPFileName(corrLcpFileChooser->get_filename())) { + pp->lensProf.lcpFile = corrLcpFileChooser->get_filename(); } else { pp->lensProf.lcpFile = ""; } @@ -306,16 +322,19 @@ void LensProfilePanel::write( rtengine::procparams::ProcParams* pp, ParamsEdited pp->lensProf.useVign = ckbUseVign->get_active(); pp->lensProf.useCA = ckbUseCA->get_active(); - auto itc = lensfunCameras->get_active(); - if (itc) { + const auto itc = lensfunCameras->get_active(); + + if (itc && !corrLensfunAutoRB->get_active()) { pp->lensProf.lfCameraMake = (*itc)[lf->lensfunModelCam.make]; pp->lensProf.lfCameraModel = (*itc)[lf->lensfunModelCam.model]; } else { pp->lensProf.lfCameraMake = ""; pp->lensProf.lfCameraModel = ""; } - auto itl = lensfunLenses->get_active(); - if (itl) { + + const auto itl = lensfunLenses->get_active(); + + if (itl && !corrLensfunAutoRB->get_active()) { pp->lensProf.lfLens = (*itl)[lf->lensfunModelLens.lens]; } else { pp->lensProf.lfLens = ""; @@ -335,113 +354,389 @@ void LensProfilePanel::write( rtengine::procparams::ProcParams* pp, ParamsEdited } } +void LensProfilePanel::setRawMeta(bool raw, const rtengine::FramesMetaData* pMeta) +{ + if ((!raw || pMeta->getFocusDist() <= 0) && !batchMode) { + disableListener(); + + // CA is very focus layer dependent, otherwise it might even worsen things + allowFocusDep = false; + ckbUseCA->set_active(false); + ckbUseCA->set_sensitive(false); + + enableListener(); + } + + isRaw = raw; + metadata = pMeta; +} + void LensProfilePanel::onLCPFileChanged() { lcpFileChanged = true; - bool valid = LCPStore::getInstance()->isValidLCPFileName(fcbLCPFile->get_filename()); + const bool valid = LCPStore::getInstance()->isValidLCPFileName(corrLcpFileChooser->get_filename()); updateDisabled(valid); if (listener) { if (valid) { disableListener(); - corrLcpFile->set_active(true); + corrLcpFileRB->set_active(true); enableListener(); } - listener->panelChanged (EvLCPFile, Glib::path_get_basename(fcbLCPFile->get_filename())); + + listener->panelChanged(EvLCPFile, Glib::path_get_basename(corrLcpFileChooser->get_filename())); } } void LensProfilePanel::onUseDistChanged() { useDistChanged = true; + if (ckbUseDist->get_inconsistent()) { + ckbUseDist->set_inconsistent(false); + ckbUseDist->set_active(false); + } if (listener) { - listener->panelChanged (EvLCPUseDist, ckbUseDist->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + listener->panelChanged(EvLCPUseDist, ckbUseDist->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); } } + void LensProfilePanel::onUseVignChanged() { useVignChanged = true; + if (ckbUseVign->get_inconsistent()) { + ckbUseVign->set_inconsistent(false); + ckbUseVign->set_active(false); + } if (listener) { - listener->panelChanged (EvLCPUseVign, ckbUseVign->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + listener->panelChanged(EvLCPUseVign, ckbUseVign->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); } } + void LensProfilePanel::onUseCAChanged() { useCAChanged = true; + if (ckbUseCA->get_inconsistent()) { + ckbUseCA->set_inconsistent(false); + ckbUseCA->set_active(false); + } if (listener) { - listener->panelChanged (EvLCPUseCA, ckbUseCA->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + listener->panelChanged(EvLCPUseCA, ckbUseCA->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); } } -void LensProfilePanel::updateDisabled(bool enable) -{ - ckbUseDist->set_sensitive(enable); - ckbUseVign->set_sensitive(enable && isRaw); - ckbUseCA->set_sensitive(enable && allowFocusDep); -} - void LensProfilePanel::setBatchMode(bool yes) { FoldableToolPanel::setBatchMode(yes); - if (yes) { - corrUnchanged->show(); - corrUnchanged->set_active(true); - } else { - corrUnchanged->hide(); + + corrUnchangedRB->set_group(corrGroup); + modesGrid->attach_next_to(*corrUnchangedRB, Gtk::POS_TOP, 3, 1); + corrUnchangedRB->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &LensProfilePanel::onCorrModeChanged), corrUnchangedRB)); + corrUnchangedRB->set_active(true); +} + +void LensProfilePanel::onLensfunCameraChanged() +{ + const auto iter = lensfunCameras->get_active(); + + if (iter) { + lensfunCameraChanged = true; + + if (listener) { + disableListener(); + corrLensfunManualRB->set_active(true); + enableListener(); + + const Glib::ustring name = (*iter)[lf->lensfunModelCam.model]; + listener->panelChanged(EvLensCorrLensfunCamera, name); + } + } + + updateLensfunWarning(); +} + +void LensProfilePanel::onLensfunLensChanged() +{ + const auto iter = lensfunLenses->get_active(); + + if (iter) { + lensfunLensChanged = true; + + if (listener) { + disableListener(); + corrLensfunManualRB->set_active(true); + enableListener(); + + const Glib::ustring name = (*iter)[lf->lensfunModelLens.prettylens]; + listener->panelChanged(EvLensCorrLensfunLens, name); + } + } + + updateLensfunWarning(); +} + +void LensProfilePanel::onCorrModeChanged(const Gtk::RadioButton* rbChanged) +{ + if (rbChanged->get_active()) { + // because the method gets called for the enabled AND the disabled RadioButton, we do the processing only for the enabled one + Glib::ustring mode; + + if (rbChanged == corrOffRB) { + lcModeChanged = true; + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = false; + + ckbUseDist->set_sensitive(false); + ckbUseVign->set_sensitive(false); + ckbUseCA->set_sensitive(false); + + mode = M("GENERAL_NONE"); + + } else if (rbChanged == corrLensfunAutoRB) { + lcModeChanged = true; + useLensfunChanged = true; + lensfunAutoChanged = true; + lensfunCameraChanged = true; + lensfunLensChanged = true; + lcpFileChanged = false; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(true); + + + const bool disabled = disableListener(); + if (batchMode) { + setLensfunCamera("", ""); + setLensfunLens(""); + } else if (metadata) { + const LFDatabase* const db = LFDatabase::getInstance(); + const LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel()); + const LFLens l = db->findLens(c, metadata->getLens()); + setLensfunCamera(c.getMake(), c.getModel()); + setLensfunLens(l.getLens()); + } + if (disabled) { + enableListener(); + } + + mode = M("TP_LENSPROFILE_CORRECTION_AUTOMATCH"); + + } else if (rbChanged == corrLensfunManualRB) { + lcModeChanged = true; + useLensfunChanged = true; + lensfunAutoChanged = true; + lensfunCameraChanged = true; + lensfunLensChanged = true; + lcpFileChanged = false; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(false); + + mode = M("TP_LENSPROFILE_CORRECTION_MANUAL"); + + } else if (rbChanged == corrLcpFileRB) { + lcModeChanged = true; + useLensfunChanged = true; + lensfunAutoChanged = true; + lcpFileChanged = true; + + updateDisabled(true); + + mode = M("TP_LENSPROFILE_CORRECTION_LCPFILE"); + + } else if (rbChanged == corrUnchangedRB) { + lcModeChanged = false; + useLensfunChanged = false; + lensfunAutoChanged = false; + lcpFileChanged = false; + lensfunCameraChanged = false; + lensfunLensChanged = false; + + ckbUseDist->set_sensitive(true); + ckbUseVign->set_sensitive(true); + ckbUseCA->set_sensitive(true); + + mode = M("GENERAL_UNCHANGED"); + } + + updateLensfunWarning(); + + if (rbChanged == corrLensfunManualRB || (!batchMode && rbChanged == corrLensfunAutoRB)) { + setManualParamsVisibility(true); + } else { + setManualParamsVisibility(false); + } + + if (listener) { + listener->panelChanged(EvLensCorrMode, mode); + } } } +//----------------------------------------------------------------------------- +// LFDbHelper +//----------------------------------------------------------------------------- -bool LensProfilePanel::setLensfunCamera(const Glib::ustring &make, const Glib::ustring &model) +LensProfilePanel::LFDbHelper::LFDbHelper() +{ +#ifdef _OPENMP +#pragma omp parallel sections if (!options.rtSettings.verbose) +#endif + { +#ifdef _OPENMP +#pragma omp section +#endif + { + lensfunCameraModel = Gtk::TreeStore::create(lensfunModelCam); + fillLensfunCameras(); + } +#ifdef _OPENMP +#pragma omp section +#endif + { + lensfunLensModel = Gtk::TreeStore::create(lensfunModelLens); + fillLensfunLenses(); + } + } +} + +void LensProfilePanel::LFDbHelper::fillLensfunCameras() +{ + if (options.rtSettings.verbose) { + std::cout << "LENSFUN, scanning cameras:" << std::endl; + } + + std::map> camnames; + const auto camlist = LFDatabase::getInstance()->getCameras(); + + for (const auto& c : camlist) { + camnames[c.getMake()].insert(c.getModel()); + + if (options.rtSettings.verbose) { + std::cout << " found: " << c.getDisplayString().c_str() << std::endl; + } + } + + for (const auto& p : camnames) { + Gtk::TreeModel::Row row = *(lensfunCameraModel->append()); + row[lensfunModelCam.make] = p.first; + row[lensfunModelCam.model] = p.first; + + for (const auto& c : p.second) { + Gtk::TreeModel::Row child = *(lensfunCameraModel->append(row.children())); + child[lensfunModelCam.make] = p.first; + child[lensfunModelCam.model] = c; + } + } +} + +void LensProfilePanel::LFDbHelper::fillLensfunLenses() +{ + if (options.rtSettings.verbose) { + std::cout << "LENSFUN, scanning lenses:" << std::endl; + } + + std::map> lenses; + const auto lenslist = LFDatabase::getInstance()->getLenses(); + + for (const auto& l : lenslist) { + const auto& name = l.getLens(); + const auto& make = l.getMake(); + lenses[make].insert(name); + + if (options.rtSettings.verbose) { + std::cout << " found: " << l.getDisplayString().c_str() << std::endl; + } + } + + for (const auto& p : lenses) { + Gtk::TreeModel::Row row = *(lensfunLensModel->append()); + row[lensfunModelLens.lens] = p.first; + row[lensfunModelLens.prettylens] = p.first; + + for (auto &c : p.second) { + Gtk::TreeModel::Row child = *(lensfunLensModel->append(row.children())); + child[lensfunModelLens.lens] = c; + + if (c.find(p.first, p.first.size() + 1) == p.first.size() + 1) { + child[lensfunModelLens.prettylens] = c.substr(p.first.size() + 1); + } else { + child[lensfunModelLens.prettylens] = c; + } + } + } +} + +void LensProfilePanel::updateDisabled(bool enable) +{ + if (!batchMode) { + ckbUseDist->set_sensitive(enable); + ckbUseVign->set_sensitive(enable && isRaw); + ckbUseCA->set_sensitive(enable && allowFocusDep); + } +} + +bool LensProfilePanel::setLensfunCamera(const Glib::ustring& make, const Glib::ustring& model) { if (!make.empty() && !model.empty()) { - auto it = lensfunCameras->get_active(); - if (it && (*it)[lf->lensfunModelCam.make] == make && (*it)[lf->lensfunModelCam.model] == model) { + const auto camera_it = lensfunCameras->get_active(); + + if (camera_it && (*camera_it)[lf->lensfunModelCam.make] == make && (*camera_it)[lf->lensfunModelCam.model] == model) { return true; } - + // search for the active row - for (auto row : lf->lensfunCameraModel->children()) { + for (const auto& row : lf->lensfunCameraModel->children()) { if (row[lf->lensfunModelCam.make] == make) { - auto &c = row.children(); - for (auto it = c.begin(), end = c.end(); it != end; ++it) { - auto &childrow = *it; + const auto& c = row.children(); + + for (auto model_it = c.begin(), end = c.end(); model_it != end; ++model_it) { + const auto& childrow = *model_it; + if (childrow[lf->lensfunModelCam.model] == model) { - lensfunCameras->set_active(it); + lensfunCameras->set_active(model_it); return true; } } + break; } } } + lensfunCameras->set_active(-1); return false; } - -bool LensProfilePanel::setLensfunLens(const Glib::ustring &lens) +bool LensProfilePanel::setLensfunLens(const Glib::ustring& lens) { if (!lens.empty()) { - auto it = lensfunLenses->get_active(); - if (it && (*it)[lf->lensfunModelLens.lens] == lens) { + const auto lens_it = lensfunLenses->get_active(); + + if (lens_it && (*lens_it)[lf->lensfunModelLens.lens] == lens) { return true; } bool first_maker_found = false; - for (auto row : lf->lensfunLensModel->children()) { + + for (const auto& row : lf->lensfunLensModel->children()) { if (lens.find(row[lf->lensfunModelLens.lens]) == 0) { - auto &c = row.children(); - for (auto it = c.begin(), end = c.end(); it != end; ++it) { - auto &childrow = *it; + const auto& c = row.children(); + + for (auto model_it = c.begin(), end = c.end(); model_it != end; ++model_it) { + const auto& childrow = *model_it; + if (childrow[lf->lensfunModelLens.lens] == lens) { - lensfunLenses->set_active(it); + lensfunLenses->set_active(model_it); 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 @@ -451,230 +746,84 @@ bool LensProfilePanel::setLensfunLens(const Glib::ustring &lens) } } } + lensfunLenses->set_active(-1); return false; } - - -void LensProfilePanel::onLensfunCameraChanged() -{ - auto iter = lensfunCameras->get_active(); - - if (iter) { - lensfunCameraChanged = true; - - if (listener) { - disableListener(); - corrLensfunManual->set_active(true); - enableListener(); - - Glib::ustring name = (*iter)[lf->lensfunModelCam.model]; - listener->panelChanged(EvLensCorrLensfunCamera, name); - } - } - - updateLensfunWarning(); -} - - -void LensProfilePanel::onLensfunLensChanged() -{ - auto iter = lensfunLenses->get_active(); - - if (iter) { - lensfunLensChanged = true; - - if (listener) { - disableListener(); - corrLensfunManual->set_active(true); - enableListener(); - - Glib::ustring name = (*iter)[lf->lensfunModelLens.prettylens]; - listener->panelChanged(EvLensCorrLensfunLens, name); - } - } - - updateLensfunWarning(); -} - - -void LensProfilePanel::onCorrModeChanged() -{ - Glib::ustring mode; - - if (corrOff->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - - ckbUseDist->set_sensitive(false); - ckbUseVign->set_sensitive(false); - ckbUseCA->set_sensitive(false); - - mode = M("GENERAL_NONE"); - } else if (corrLensfunAuto->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; - - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(false); - - if (metadata) { - bool b = disableListener(); - const LFDatabase *db = LFDatabase::getInstance(); - LFCamera c = db->findCamera(metadata->getMake(), metadata->getModel()); - LFLens l = db->findLens(c, metadata->getLens()); - setLensfunCamera(c.getMake(), c.getModel()); - setLensfunLens(l.getLens()); - if (b) { - enableListener(); - } - } - - mode = M("LENSPROFILE_CORRECTION_AUTOMATCH"); - } else if (corrLensfunManual->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; - - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(false); - - mode = M("LENSPROFILE_CORRECTION_MANUAL"); - } else if (corrLcpFile->get_active()) { - useLensfunChanged = true; - lensfunAutoChanged = true; - lcpFileChanged = true; - useDistChanged = true; - useVignChanged = true; - - updateDisabled(true); - - mode = M("LENSPROFILE_CORRECTION_LCPFILE"); - } else if (corrUnchanged->get_active()) { - useLensfunChanged = false; - lensfunAutoChanged = false; - lcpFileChanged = false; - lensfunCameraChanged = false; - lensfunLensChanged = false; - - ckbUseDist->set_sensitive(true); - ckbUseVign->set_sensitive(true); - ckbUseCA->set_sensitive(true); - - mode = M("GENERAL_UNCHANGED"); - } - lcModeChanged = true; - updateLensfunWarning(); - - if (listener) { - listener->panelChanged(EvLensCorrMode, mode); - } -} - - bool LensProfilePanel::checkLensfunCanCorrect(bool automatch) { if (!metadata) { return false; } + rtengine::procparams::ProcParams lpp; write(&lpp); - std::unique_ptr mod(LFDatabase::findModifier(lpp.lensProf, metadata, 100, 100, lpp.coarse, -1)); - return mod.get() != nullptr; + const std::unique_ptr mod(LFDatabase::findModifier(lpp.lensProf, metadata, 100, 100, lpp.coarse, -1)); + return static_cast(mod); } - -//----------------------------------------------------------------------------- -// LFDbHelper -//----------------------------------------------------------------------------- - -LensProfilePanel::LFDbHelper::LFDbHelper() +void LensProfilePanel::setManualParamsVisibility(bool setVisible) { -#ifdef _OPENMP -#pragma omp parallel sections -#endif -{ -#ifdef _OPENMP -#pragma omp section -#endif -{ - lensfunCameraModel = Gtk::TreeStore::create(lensfunModelCam); - fillLensfunCameras(); -} -#ifdef _OPENMP -#pragma omp section -#endif -{ - lensfunLensModel = Gtk::TreeStore::create(lensfunModelLens); - fillLensfunLenses(); -} -} -} - -void LensProfilePanel::LFDbHelper::fillLensfunCameras() -{ - if (options.rtSettings.verbose) { - std::cout << "LENSFUN, scanning cameras:" << std::endl; + if (setVisible) { + lensfunCamerasLbl->show(); + lensfunCameras->show(); + lensfunLensesLbl->show(); + lensfunLenses->show(); + updateLensfunWarning(); + } else { + lensfunCamerasLbl->hide(); + lensfunCameras->hide(); + lensfunLensesLbl->hide(); + lensfunLenses->hide(); + warning->hide(); } - std::map> camnames; - auto camlist = LFDatabase::getInstance()->getCameras(); - for (auto &c : camlist) { - camnames[c.getMake()].insert(c.getModel()); +} - if (options.rtSettings.verbose) { - std::cout << " found: " << c.getDisplayString().c_str() << std::endl; - } - } - for (auto &p : camnames) { - Gtk::TreeModel::Row row = *(lensfunCameraModel->append()); - row[lensfunModelCam.make] = p.first; - row[lensfunModelCam.model] = p.first; - for (auto &c : p.second) { - Gtk::TreeModel::Row child = *(lensfunCameraModel->append(row.children())); - child[lensfunModelCam.make] = p.first; - child[lensfunModelCam.model] = c; +void LensProfilePanel::updateLensfunWarning() +{ + warning->hide(); + + if (corrLensfunManualRB->get_active() || corrLensfunAutoRB->get_active()) { + const LFDatabase* const db = LFDatabase::getInstance(); + + const auto itc = lensfunCameras->get_active(); + + if (!itc) { + return; + } + + const LFCamera c = db->findCamera((*itc)[lf->lensfunModelCam.make], (*itc)[lf->lensfunModelCam.model]); + const auto itl = lensfunLenses->get_active(); + + if (!itl) { + return; + } + + const LFLens l = db->findLens(LFCamera(), (*itl)[lf->lensfunModelLens.lens]); + const float lenscrop = l.getCropFactor(); + const float camcrop = c.getCropFactor(); + + if (lenscrop <= 0 || camcrop <= 0 || lenscrop / camcrop >= 1.01f) { + warning->show(); + } + + 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::LFDbHelper::fillLensfunLenses() -{ - if (options.rtSettings.verbose) { - std::cout << "LENSFUN, scanning lenses:" << std::endl; - } - std::map> lenses; - auto lenslist = LFDatabase::getInstance()->getLenses(); - for (auto &l : lenslist) { - auto name = l.getLens(); - auto make = l.getMake(); - lenses[make].insert(name); - - if (options.rtSettings.verbose) { - std::cout << " found: " << l.getDisplayString().c_str() << std::endl; - } - } - for (auto &p : lenses) { - Gtk::TreeModel::Row row = *(lensfunLensModel->append()); - row[lensfunModelLens.lens] = p.first; - row[lensfunModelLens.prettylens] = p.first; - for (auto &c : p.second) { - Gtk::TreeModel::Row child = *(lensfunLensModel->append(row.children())); - child[lensfunModelLens.lens] = c; - if (c.find(p.first, p.first.size()+1) == p.first.size()+1) { - child[lensfunModelLens.prettylens] = c.substr(p.first.size()+1); - } else { - child[lensfunModelLens.prettylens] = c; - } - } - } -} +LensProfilePanel::LFDbHelper* LensProfilePanel::lf(nullptr); diff --git a/rtgui/lensprofile.h b/rtgui/lensprofile.h index e70515470..76c15aa9a 100644 --- a/rtgui/lensprofile.h +++ b/rtgui/lensprofile.h @@ -16,96 +16,120 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _LENSPROFILE_H_ -#define _LENSPROFILE_H_ +#pragma once #include -#include "toolpanel.h" + #include "guiutils.h" #include "lensgeom.h" +#include "toolpanel.h" -class LensProfilePanel : public ToolParamBlock, public FoldableToolPanel +class LensProfilePanel final : + public ToolParamBlock, + public FoldableToolPanel { +public: + LensProfilePanel(); -protected: + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setRawMeta(bool raw, const rtengine::FramesMetaData* pMeta); - MyFileChooserButton *fcbLCPFile; - Gtk::CheckButton *ckbUseDist, *ckbUseVign, *ckbUseCA; - Gtk::HBox *hbLCPFile; - Gtk::Label *lLCPFileHead; - bool lcModeChanged, lcpFileChanged, useDistChanged, useVignChanged, useCAChanged; - sigc::connection conLCPFile, conUseDist, conUseVign, conUseCA; - void updateDisabled(bool enable); - bool allowFocusDep; - bool isRaw; - const rtengine::FramesMetaData* metadata; + void onLCPFileChanged(); + void onUseDistChanged(); + void onUseVignChanged(); + void onUseCAChanged(); - Gtk::RadioButton::Group corrGroup; - Gtk::RadioButton *corrOff; - Gtk::RadioButton *corrLensfunAuto; - Gtk::RadioButton *corrLensfunManual; - Gtk::RadioButton *corrLcpFile; - Gtk::RadioButton *corrUnchanged; - MyComboBox *lensfunCameras; - MyComboBox *lensfunLenses; - Gtk::Image *warning; + void setBatchMode(bool yes) override; - class LFDbHelper { + void onLensfunCameraChanged(); + void onLensfunLensChanged(); + void onCorrModeChanged(const Gtk::RadioButton* rbChanged); + +private: + class LFDbHelper final + { public: - class LFModelCam: public Gtk::TreeModel::ColumnRecord { + class LFModelCam final : + public Gtk::TreeModel::ColumnRecord + { public: - LFModelCam() { add(make); add(model); } + LFModelCam() + { + add(make); + add(model); + } Gtk::TreeModelColumn make; Gtk::TreeModelColumn model; }; - class LFModelLens: public Gtk::TreeModel::ColumnRecord { + class LFModelLens final : + public Gtk::TreeModel::ColumnRecord + { public: - LFModelLens() { add(lens); add(prettylens); } + LFModelLens() + { + add(lens); + add(prettylens); + } Gtk::TreeModelColumn lens; Gtk::TreeModelColumn prettylens; }; LFModelCam lensfunModelCam; LFModelLens lensfunModelLens; - + Glib::RefPtr lensfunCameraModel; Glib::RefPtr lensfunLensModel; LFDbHelper(); + void fillLensfunCameras(); void fillLensfunLenses(); }; - static LFDbHelper *lf; + void updateDisabled(bool enable); + + bool setLensfunCamera(const Glib::ustring& make, const Glib::ustring& model); + bool setLensfunLens(const Glib::ustring& lens); + bool checkLensfunCanCorrect(bool automatch); + void setManualParamsVisibility(bool setVisible); + void updateLensfunWarning(); + + bool lcModeChanged; + bool lcpFileChanged; + bool useDistChanged; + bool useVignChanged; + bool useCAChanged; bool useLensfunChanged; bool lensfunAutoChanged; bool lensfunCameraChanged; bool lensfunLensChanged; + sigc::connection conLCPFile; + sigc::connection conUseDist; + sigc::connection conUseVign; + sigc::connection conUseCA; + bool allowFocusDep; + bool isRaw; + const rtengine::FramesMetaData* metadata; - bool setLensfunCamera(const Glib::ustring &make, const Glib::ustring &model); - bool setLensfunLens(const Glib::ustring &lens); - bool checkLensfunCanCorrect(bool automatch); - void updateLensfunWarning(); - -public: + Gtk::Grid* const modesGrid; + Gtk::Grid* const distGrid; + Gtk::RadioButton* const corrUnchangedRB; + Gtk::RadioButton::Group corrGroup; + Gtk::RadioButton* const corrOffRB; + Gtk::RadioButton* const corrLensfunAutoRB; + Gtk::RadioButton* const corrLensfunManualRB; + Gtk::RadioButton* const corrLcpFileRB; + MyFileChooserButton* const corrLcpFileChooser; + Gtk::Label* const lensfunCamerasLbl; + MyComboBox* const lensfunCameras; + Gtk::Label* const lensfunLensesLbl; + MyComboBox* const lensfunLenses; + Gtk::Image* const warning; + Gtk::CheckButton* const ckbUseDist; + Gtk::CheckButton* const ckbUseVign; + Gtk::CheckButton* const ckbUseCA; - LensProfilePanel (); - - 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::FramesMetaData* pMeta); - - void onLCPFileChanged (); - void onUseDistChanged(); - void onUseVignChanged(); - void onUseCAChanged(); - - void setBatchMode(bool yes); - - void onLensfunCameraChanged(); - void onLensfunLensChanged(); - void onCorrModeChanged(); + static LFDbHelper* lf; }; - -#endif diff --git a/rtgui/localcontrast.cc b/rtgui/localcontrast.cc index 727479c34..93b67657d 100644 --- a/rtgui/localcontrast.cc +++ b/rtgui/localcontrast.cc @@ -17,10 +17,14 @@ * 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 +#include + +#include "localcontrast.h" + +#include "eventmapper.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -115,7 +119,6 @@ void LocalContrast::setDefaults(const ProcParams *defParams, const ParamsEdited } } - void LocalContrast::adjusterChanged(Adjuster* a, double newval) { if (listener && getEnabled()) { @@ -131,6 +134,9 @@ void LocalContrast::adjusterChanged(Adjuster* a, double newval) } } +void LocalContrast::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} void LocalContrast::enabledChanged () { diff --git a/rtgui/localcontrast.h b/rtgui/localcontrast.h index 4f6f872af..efe7a18f0 100644 --- a/rtgui/localcontrast.h +++ b/rtgui/localcontrast.h @@ -41,13 +41,14 @@ 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 read(const rtengine::procparams::ProcParams *pp, const ParamsEdited *pedited=nullptr) override; + void write(rtengine::procparams::ProcParams *pp, ParamsEdited *pedited=nullptr) override; + void setDefaults(const rtengine::procparams::ProcParams *defParams, const ParamsEdited *pedited=nullptr) override; + void setBatchMode(bool batchMode) override; - void adjusterChanged(Adjuster *a, double newval); - void enabledChanged(); + void adjusterChanged(Adjuster *a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged() override; void setAdjusterBehavior(bool radiusAdd, bool amountAdd, bool darknessAdd, bool lightnessAdd); }; diff --git a/rtgui/lockablecolorpicker.cc b/rtgui/lockablecolorpicker.cc index d10dfb438..859057e2c 100644 --- a/rtgui/lockablecolorpicker.cc +++ b/rtgui/lockablecolorpicker.cc @@ -277,8 +277,8 @@ void LockableColorPicker::setRGB (const float R, const float G, const float B, c 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 --git a/rtgui/lockablecolorpicker.h b/rtgui/lockablecolorpicker.h index 308f5d6d5..211f8de4d 100644 --- a/rtgui/lockablecolorpicker.h +++ b/rtgui/lockablecolorpicker.h @@ -27,12 +27,13 @@ class CropWindow; -class LockablePickerToolListener { +class LockablePickerToolListener +{ public: - virtual ~LockablePickerToolListener () {} + virtual ~LockablePickerToolListener () = default; /// Callback on Color Picker's visibility switch - virtual void switchPickerVisibility (bool isVisible) {} + virtual void switchPickerVisibility(bool isVisible) = 0; }; class LockableColorPicker : BackBuffer diff --git a/rtgui/lwbutton.cc b/rtgui/lwbutton.cc index acc0cd734..4998a302e 100644 --- a/rtgui/lwbutton.cc +++ b/rtgui/lwbutton.cc @@ -178,7 +178,7 @@ bool LWButton::releaseNotify (int x, int y) 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 --git a/rtgui/lwbutton.h b/rtgui/lwbutton.h index 2053911be..cccf59b11 100644 --- a/rtgui/lwbutton.h +++ b/rtgui/lwbutton.h @@ -22,13 +22,13 @@ #include class LWButton; + class LWButtonListener { - public: - virtual ~LWButtonListener () {} - virtual void buttonPressed (LWButton* button, int actionCode, void* actionData) {} - virtual void redrawNeeded (LWButton* button) {} + virtual ~LWButtonListener() = default; + virtual void buttonPressed(LWButton* button, int actionCode, void* actionData) = 0; + virtual void redrawNeeded(LWButton* button) = 0; }; class LWButton diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index fdfee64ab..be225378e 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -158,11 +158,43 @@ int main (int argc, char **argv) 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; } + 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 @@ -171,75 +203,8 @@ int main (int argc, char **argv) // Move the old path to the new one if the new does not exist if (Glib::file_test (Glib::build_filename (options.rtdir, "cache"), Glib::FILE_TEST_IS_DIR) && !Glib::file_test (options.cacheBaseDir, Glib::FILE_TEST_IS_DIR)) { - g_rename (Glib::build_filename (options.rtdir, "cache").c_str (), options.cacheBaseDir.c_str ()); - } - -#endif - -#ifdef WIN32 - bool consoleOpened = false; - - // suppression of annoying error boxes - SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); - - if (argc > 1 || options.rtSettings.verbose) { - Glib::ustring fname (fname_to_utf8 (argv[1])); -#if ECLIPSE_ARGS - fname = fname.substr (1, fname.length() - 2); -#endif - - if (options.rtSettings.verbose || ( !Glib::file_test (fname, Glib::FILE_TEST_EXISTS ) && !Glib::file_test (fname, Glib::FILE_TEST_IS_DIR))) { - bool stdoutRedirectedtoFile = (GetFileType (GetStdHandle (STD_OUTPUT_HANDLE)) == 0x0001); - bool stderrRedirectedtoFile = (GetFileType (GetStdHandle (STD_ERROR_HANDLE)) == 0x0001); - - // no console, if stdout and stderr both are redirected to file - if ( ! (stdoutRedirectedtoFile && stderrRedirectedtoFile)) { - // check if parameter -w was passed. - // We have to do that in this step, because it controls whether to open a console to show the output of following steps - bool Console = true; - - for (int i = 1; i < argc; i++) - if (!strcmp (argv[i], "-w")) { - Console = false; - break; - } - - if (Console && AllocConsole()) { - AttachConsole ( GetCurrentProcessId() ) ; - // Don't allow CTRL-C in console to terminate RT - SetConsoleCtrlHandler ( NULL, true ); - // Set title of console - char consoletitle[128]; - sprintf (consoletitle, "RawTherapee %s Console", RTVERSION); - SetConsoleTitle (consoletitle); - // increase size of screen buffer - COORD c; - c.X = 200; - c.Y = 1000; - SetConsoleScreenBufferSize ( GetStdHandle ( STD_OUTPUT_HANDLE ), c ); - // Disable console-Cursor - CONSOLE_CURSOR_INFO cursorInfo; - cursorInfo.dwSize = 100; - cursorInfo.bVisible = false; - SetConsoleCursorInfo ( GetStdHandle ( STD_OUTPUT_HANDLE ), &cursorInfo ); - - if (!stdoutRedirectedtoFile) { - freopen ( "CON", "w", stdout ) ; - } - - if (!stderrRedirectedtoFile) { - freopen ( "CON", "w", stderr ) ; - } - - freopen ( "CON", "r", stdin ) ; - - consoleOpened = true; - - // printing RT's version in every case, particularly useful for the 'verbose' mode, but also for the batch processing - std::cout << "RawTherapee, version " << RTVERSION << ", command line" << std::endl; - std::cout << "WARNING: closing this window will close RawTherapee!" << std::endl << std::endl; - } - } + if (g_rename (Glib::build_filename (options.rtdir, "cache").c_str (), options.cacheBaseDir.c_str ()) == -1) { + std::cout << "g_rename " << Glib::build_filename (options.rtdir, "cache").c_str () << " => " << options.cacheBaseDir.c_str () << " failed." << std::endl; } } @@ -248,7 +213,7 @@ int main (int argc, char **argv) int ret = 0; // printing RT's version in all case, particularly useful for the 'verbose' mode, but also for the batch processing - std::cout << "RawTherapee, version " << RTVERSION << ", command line" << std::endl; + std::cout << "RawTherapee, version " << RTVERSION << ", command line." << std::endl; if (argc > 1) { ret = processLineParams (argc, argv); @@ -256,16 +221,6 @@ int main (int argc, char **argv) std::cout << "Terminating without anything to do." << std::endl; } -#ifdef WIN32 - - if (consoleOpened) { - printf ("Press any key to exit RawTherapee\n"); - FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE)); - getch(); - } - -#endif - return ret; } @@ -314,6 +269,7 @@ int processLineParams ( int argc, char **argv ) int compression = 92; int subsampling = 3; int bits = -1; + bool isFloat = false; std::string outputType = ""; unsigned errors = 0; @@ -326,7 +282,7 @@ int processLineParams ( int argc, char **argv ) currParam = currParam.substr (1, currParam.length() - 2); #endif - if ( currParam.at (0) == '-' ) { + if ( currParam.at (0) == '-' && currParam.size() > 1) { switch ( currParam.at (1) ) { case 'O': copyParamsFile = true; @@ -361,7 +317,7 @@ int processLineParams ( int argc, char **argv ) #endif if (fname.at (0) == '-') { - std::cerr << "Error: filename missing next to the -p switch" << std::endl; + std::cerr << "Error: filename missing next to the -p switch." << std::endl; deleteProcParams (processingParams); return -3; } @@ -371,7 +327,7 @@ int processLineParams ( int argc, char **argv ) if (! (currentParams->load ( fname ))) { processingParams.push_back (currentParams); } else { - std::cerr << "Error: \"" << fname << "\" not found" << std::endl; + std::cerr << "Error: \"" << fname << "\" not found." << std::endl; deleteProcParams (processingParams); return -3; } @@ -438,8 +394,20 @@ int processLineParams ( int argc, char **argv ) case 'b': bits = atoi (currParam.substr (2).c_str()); - if (bits != 8 && bits != 16) { - std::cerr << "Error: specify -b8 for 8-bit or -b16 for 16-bit output." << std::endl; + if (currParam.length() >= 3 && currParam.at(2) == '8') { // -b8 + bits = 8; + } else if (currParam.length() >= 4 && currParam.length() <= 5 && currParam.at(2) == '1' && currParam.at(3) == '6') { // -b16, -b16f + bits = 16; + if (currParam.length() == 5 && currParam.at(4) == 'f') { + isFloat = true; + } + } else if (currParam.length() >= 4 && currParam.length() <= 5 && currParam.at(2) == '3' && currParam.at(3) == '2') { // -b32 == -b32f + bits = 32; + isFloat = true; + } + + if (bits != 8 && bits != 16 && bits != 32) { + std::cerr << "Error: specify output bit depth per channel as -b8 for 8-bit integer, -b16 for 16-bit integer, -b16f for 16-bit float or -b32 for 32-bit float." << std::endl; deleteProcParams (processingParams); return -3; } @@ -469,7 +437,7 @@ int processLineParams ( int argc, char **argv ) #endif if (!Glib::file_test (argument, Glib::FILE_TEST_EXISTS)) { - std::cout << "\"" << argument << "\" doesn't exist !" << std::endl; + std::cout << "\"" << argument << "\" doesn't exist!" << std::endl; continue; } @@ -479,9 +447,9 @@ int processLineParams ( int argc, char **argv ) if (notAll || notRetained) { if (notAll) { - std::cout << "\"" << argument << "\" is not one of the file format to process: skipped" << std::endl; + std::cout << "\"" << argument << "\" is not one of the parsed extensions. Image skipped." << std::endl; } else if (notRetained) { - std::cout << "\"" << argument << "\" is not one of the retained file format to process: skipped" << std::endl; + std::cout << "\"" << argument << "\" is not one of the selected parsed extensions. Image skipped." << std::endl; } } else { inputFiles.emplace_back (argument); @@ -512,11 +480,11 @@ int processLineParams ( int argc, char **argv ) if (isDir || notAll || notRetained) { if (isDir) { - std::cout << "\"" << fileName << "\" is a directory: skipped" << std::endl; + std::cout << "\"" << fileName << "\" is a folder. Folder skipped" << std::endl; } else if (notAll) { - std::cout << "\"" << fileName << "\" is not one of the file format to process: skipped" << std::endl; + std::cout << "\"" << fileName << "\" is not one of the parsed extensions. Image skipped." << std::endl; } else if (notRetained) { - std::cout << "\"" << fileName << "\" is not one of the retained file format to process: skipped" << std::endl; + std::cout << "\"" << fileName << "\" is not one of the selected parsed extensions. Image skipped." << std::endl; } continue; @@ -526,7 +494,7 @@ int processLineParams ( int argc, char **argv ) if (sideProcParams && skipIfNoSidecar) { // look for the sidecar proc params if (!Glib::file_test (fileName + paramFileExtension, Glib::FILE_TEST_EXISTS)) { - std::cout << "\"" << fileName << "\" has no side-car file: image skipped" << std::endl; + std::cout << "\"" << fileName << "\" has no side-car file. Image skipped." << std::endl; continue; } } @@ -543,11 +511,6 @@ int processLineParams ( int argc, char **argv ) } break; -#ifdef WIN32 - - case 'w': // This case is handled outside this function - break; -#endif case 'h': case '?': @@ -570,16 +533,12 @@ int processLineParams ( int argc, char **argv ) std::cout << " " << Glib::path_get_basename (argv[0]) << " -c

| Convert files in batch with default parameters." << std::endl; std::cout << " " << Glib::path_get_basename (argv[0]) << " -c | Convert files in batch with your own settings." << std::endl; std::cout << std::endl; -#ifdef WIN32 - std::cout << " -w Do not open the Windows console" << std::endl; - std::cout << std::endl; -#endif std::cout << "Options:" << std::endl; - std::cout << " " << Glib::path_get_basename (argv[0]) << "[-o |-O ] [-q] [-a] [-s|-S] [-p [-p ...] ] [-d] [ -j[1-100] [-js<1-3>] | [-b<8|16>] [-t[z] | [-n]] ] [-Y] [-f] -c " << std::endl; + std::cout << " " << Glib::path_get_basename (argv[0]) << "[-o |-O ] [-q] [-a] [-s|-S] [-p [-p ...] ] [-d] [ -j[1-100] -js<1-3> | -t[z] -b<8|16|16f|32> | -n -b<8|16> ] [-Y] [-f] -c " << std::endl; std::cout << std::endl; - std::cout << " -c Specify one or more input files or directory." << std::endl; - std::cout << " When specifying directories, Rawtherapee will look for images files that comply with the" << std::endl; - std::cout << " selected extensions (see also '-a')." << std::endl; + std::cout << " -c Specify one or more input files or folders." << std::endl; + std::cout << " When specifying folders, Rawtherapee will look for image file types which comply" << std::endl; + std::cout << " with the selected extensions (see also '-a')." << std::endl; std::cout << " -c must be the last option." << std::endl; std::cout << " -o | Set output file or folder." << std::endl; std::cout << " Saves output file alongside input file if -o is not specified." << std::endl; @@ -606,12 +565,15 @@ int processLineParams ( int argc, char **argv ) std::cout << " Chroma halved horizontally." << std::endl; std::cout << " 3 = Best quality: 1x1, 1x1, 1x1 (4:4:4)" << std::endl; std::cout << " No chroma subsampling." << std::endl; - std::cout << " -b<8|16> Specify bit depth per channel (default value: 16 for TIFF, 8 for PNG)." << std::endl; - std::cout << " Only applies to TIFF and PNG output, JPEG is always 8." << std::endl; + std::cout << " -b<8|16|16f|32> Specify bit depth per channel." << std::endl; + std::cout << " 8 = 8-bit integer. Applies to JPEG, PNG and TIFF. Default for JPEG and PNG." << std::endl; + std::cout << " 16 = 16-bit integer. Applies to TIFF and PNG. Default for TIFF." << std::endl; + std::cout << " 16f = 16-bit float. Applies to TIFF." << std::endl; + std::cout << " 32 = 32-bit float. Applies to TIFF." << std::endl; 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 PNG_FILTER_PAETH, Z_RLE" << 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; @@ -660,6 +622,18 @@ int processLineParams ( int argc, char **argv ) } } + if (bits == -1) { + if (outputType == "jpg") { + bits = 8; + } else if (outputType == "png") { + bits = 8; + } else if (outputType == "tif") { + bits = 16; + } else { + bits = 8; + } + } + if ( !argv1.empty() ) { return 1; } @@ -673,7 +647,7 @@ int processLineParams ( int argc, char **argv ) Glib::ustring profPath = options.findProfilePath (options.defProfRaw); if (options.is_defProfRawMissing() || profPath.empty() || (profPath != DEFPROFILE_DYNAMIC && rawParams->load (profPath == DEFPROFILE_INTERNAL ? DEFPROFILE_INTERNAL : Glib::build_filename (profPath, Glib::path_get_basename (options.defProfRaw) + paramFileExtension)))) { - std::cerr << "Error: default raw processing profile not found" << std::endl; + std::cerr << "Error: default raw processing profile not found." << std::endl; rawParams->deleteInstance(); delete rawParams; deleteProcParams (processingParams); @@ -684,7 +658,7 @@ int processLineParams ( int argc, char **argv ) profPath = options.findProfilePath (options.defProfImg); if (options.is_defProfImgMissing() || profPath.empty() || (profPath != DEFPROFILE_DYNAMIC && imgParams->load (profPath == DEFPROFILE_INTERNAL ? DEFPROFILE_INTERNAL : Glib::build_filename (profPath, Glib::path_get_basename (options.defProfImg) + paramFileExtension)))) { - std::cerr << "Error: default non-raw processing profile not found" << std::endl; + std::cerr << "Error: default non-raw processing profile not found." << std::endl; imgParams->deleteInstance(); delete imgParams; rawParams->deleteInstance(); @@ -700,6 +674,7 @@ int processLineParams ( int argc, char **argv ) rtengine::procparams::ProcParams currentParams; Glib::ustring inputFile = inputFiles[iFile]; + std::cout << "Output is " << bits << "-bit " << (isFloat ? "floating-point" : "integer") << "." << std::endl; std::cout << "Processing: " << inputFile << std::endl; rtengine::InitialImage* ii = nullptr; @@ -765,7 +740,7 @@ int processLineParams ( int argc, char **argv ) rawParams = ProfileStore::getInstance()->loadDynamicProfile (ii->getMetaData()); } - std::cout << " Merging default raw processing profile" << std::endl; + std::cout << " Merging default raw processing profile." << std::endl; rawParams->applyTo (¤tParams); } else { if (options.defProfImg == DEFPROFILE_DYNAMIC) { @@ -774,7 +749,7 @@ int processLineParams ( int argc, char **argv ) imgParams = ProfileStore::getInstance()->loadDynamicProfile (ii->getMetaData()); } - std::cout << " Merging default non-raw processing profile" << std::endl; + std::cout << " Merging default non-raw processing profile." << std::endl; imgParams->applyTo (¤tParams); } } @@ -793,7 +768,7 @@ int processLineParams ( int argc, char **argv ) std::cerr << "Warning: sidecar file requested but not found for: " << sideProcessingParams << std::endl; } else { sideCarFound = true; - std::cout << " Merging sidecar procparams" << std::endl; + std::cout << " Merging sidecar procparams." << std::endl; } } @@ -835,7 +810,7 @@ int processLineParams ( int argc, char **argv ) if ( outputType == "jpg" ) { errorCode = resultImage->saveAsJPEG ( outputFile, compression, subsampling ); } else if ( outputType == "tif" ) { - errorCode = resultImage->saveAsTIFF ( outputFile, bits, compression == 0 ); + errorCode = resultImage->saveAsTIFF ( outputFile, bits, isFloat, compression == 0 ); } else if ( outputType == "png" ) { errorCode = resultImage->saveAsPNG ( outputFile, bits ); } else { diff --git a/rtgui/main.cc b/rtgui/main.cc index bd8f381c4..b75fc0ec8 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -100,7 +100,7 @@ static void myGdkLockEnter() } static void myGdkLockLeave() { - // Automatic gdk_flush for non main tread + // Automatic gdk_flush for non main thread #if AUTO_GDK_FLUSH //if (Glib::Thread::self() != mainThread) { // gdk_flush(); @@ -121,6 +121,7 @@ static void myGdkLockLeave() * -3 if at least one required procparam file was not found */ int processLineParams ( int argc, char **argv ) { + int ret = 1; for ( int iArg = 1; iArg < argc; iArg++) { Glib::ustring currParam (argv[iArg]); if ( currParam.empty() ) { @@ -130,7 +131,7 @@ int processLineParams ( int argc, char **argv ) currParam = currParam.substr (1, currParam.length() - 2); #endif - if ( currParam.at (0) == '-' ) { + if ( currParam.at (0) == '-' && currParam.size() > 1 ) { switch ( currParam.at (1) ) { #ifdef WIN32 @@ -139,8 +140,9 @@ int processLineParams ( int argc, char **argv ) #endif case 'v': - std::cout << "Using lensfun " << LF_VERSION_MAJOR << "." << LF_VERSION_MINOR << "." << LF_VERSION_MICRO << "." << LF_VERSION_BUGFIX << std::endl; - return 0; + printf("RawTherapee, version %s\n", RTVERSION); + ret = 0; + break; #ifndef __APPLE__ // TODO agriggio - there seems to be already some "single instance app" support for OSX in rtwindow. Disabling it here until I understand how to merge the two @@ -165,34 +167,29 @@ int processLineParams ( int argc, char **argv ) case 'h': case '?': default: { - Glib::ustring pparamsExt = paramFileExtension.substr (1); - std::cout << " An advanced, cross-platform program for developing raw photos." << std::endl; + printf(" An advanced, cross-platform program for developing raw photos.\n\n"); + printf(" Website: http://www.rawtherapee.com/\n"); + printf(" Documentation: http://rawpedia.rawtherapee.com/\n"); + printf(" Forum: https://discuss.pixls.us/c/software/rawtherapee\n"); + printf(" Code and bug reports: https://github.com/Beep6581/RawTherapee\n\n"); + printf("Symbols:\n"); + printf(" indicate parameters you can change.\n\n"); + printf("Usage:\n"); + printf(" %s Start File Browser inside folder.\n",Glib::path_get_basename (argv[0]).c_str()); + printf(" %s Start Image Editor with file.\n\n",Glib::path_get_basename (argv[0]).c_str()); std::cout << std::endl; - std::cout << " Website: http://www.rawtherapee.com/" << std::endl; - std::cout << " Documentation: http://rawpedia.rawtherapee.com/" << std::endl; - std::cout << " Forum: https://discuss.pixls.us/c/software/rawtherapee" << std::endl; - std::cout << " Code and bug reports: https://github.com/Beep6581/RawTherapee" << std::endl; - std::cout << std::endl; - std::cout << "Symbols:" << std::endl; - std::cout << " indicate parameters you can change." << std::endl; - //std::cout << " [Square brackets] mean the parameter is optional." << std::endl; - //std::cout << " The pipe symbol | indicates a choice of one or the other." << std::endl; - //std::cout << " The dash symbol - denotes a range of possible values from one to the other." << std::endl; - std::cout << std::endl; - std::cout << "Usage:" << std::endl; - std::cout << " " << Glib::path_get_basename (argv[0]) << " Start File Browser inside folder." << std::endl; - std::cout << " " << Glib::path_get_basename (argv[0]) << " Start Image Editor with file." << std::endl; - std::cout << std::endl; - std::cout << "Options:" << std::endl; + printf("Options:\n"); #ifdef WIN32 - std::cout << " -w Do not open the Windows console" << std::endl; + printf(" -w Do not open the Windows console\n"); #endif - std::cout << " -v Print RawTherapee version number and exit" << std::endl; + printf(" -v Print RawTherapee version number and exit\n"); #ifndef __APPLE__ - std::cout << " -R Raise an already running RawTherapee instance (if available)" << std::endl; + printf(" -R Raise an already running RawTherapee instance (if available)\n"); #endif - std::cout << " -h -? Display this help message" << std::endl; - return -1; + printf(" -h -? Display this help message\n"); + + ret = -1; + break; } } } else { @@ -212,19 +209,12 @@ int processLineParams ( int argc, char **argv ) } } - return 1; + return ret; } bool init_rt() { - try { - Options::load(); - } catch (Options::Error &e) { - std::cout << "ERROR: " << e.get_msg() << std::endl; - return false; - } - extProgStore->init(); SoundManager::init(); @@ -354,17 +344,6 @@ RTWindow *create_rt_window() //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; } @@ -379,7 +358,7 @@ public: { } - ~RTApplication() + ~RTApplication() override { if (rtWindow) { delete rtWindow; @@ -487,11 +466,14 @@ int main (int argc, char **argv) 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 (); +#ifdef WIN32 + if (GetFileType (GetStdHandle (STD_OUTPUT_HANDLE)) == 0x0003) { + // started from msys2 console => do not buffer stdout + setbuf(stdout, NULL); + } +#endif #ifdef BUILD_BUNDLE char exname[512] = {0}; @@ -530,7 +512,7 @@ int main (int argc, char **argv) } options.rtSettings.lensfunDbDirectory = LENSFUN_DB_PATH; - + #else argv0 = DATA_SEARCH_PATH; creditsPath = CREDITS_SEARCH_PATH; @@ -538,7 +520,6 @@ int main (int argc, char **argv) options.rtSettings.lensfunDbDirectory = LENSFUN_DB_PATH; #endif - #ifdef WIN32 bool consoleOpened = false; @@ -546,20 +527,16 @@ int main (int argc, char **argv) SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); if (argc > 1) { - int ret = processLineParams ( argc, argv); - - if (options.rtSettings.verbose || (!remote && !Glib::file_test (argv1, Glib::FILE_TEST_EXISTS ) && !Glib::file_test (argv1, Glib::FILE_TEST_IS_DIR))) { - bool stdoutRedirectedtoFile = (GetFileType (GetStdHandle (STD_OUTPUT_HANDLE)) == 0x0001); - bool stderrRedirectedtoFile = (GetFileType (GetStdHandle (STD_ERROR_HANDLE)) == 0x0001); - - // no console, if stdout and stderr both are redirected to file - if ( ! (stdoutRedirectedtoFile && stderrRedirectedtoFile)) { + if (!remote && !Glib::file_test (argv1, Glib::FILE_TEST_EXISTS ) && !Glib::file_test (argv1, Glib::FILE_TEST_IS_DIR)) { + bool stdoutRedirecttoConsole = (GetFileType (GetStdHandle (STD_OUTPUT_HANDLE)) == 0x0000); + // open console, if stdout is invalid + if (stdoutRedirecttoConsole) { // check if parameter -w was passed. // We have to do that in this step, because it controls whether to open a console to show the output of following steps bool Console = true; for (int i = 1; i < argc; i++) - if (!strcmp (argv[i], "-w")) { + if (!strcmp (argv[i], "-w") || !strcmp (argv[i], "-R") || !strcmp (argv[i], "-gimp")) { Console = false; break; } @@ -583,26 +560,21 @@ int main (int argc, char **argv) cursorInfo.bVisible = false; SetConsoleCursorInfo ( GetStdHandle ( STD_OUTPUT_HANDLE ), &cursorInfo ); - if (!stdoutRedirectedtoFile) { + if (stdoutRedirecttoConsole) { // if stdout is Redirect to console, we also redirect stderr to console freopen ( "CON", "w", stdout ) ; - } - - if (!stderrRedirectedtoFile) { freopen ( "CON", "w", stderr ) ; } freopen ( "CON", "r", stdin ) ; consoleOpened = true; - - // printing RT's version in every case, particularly useful for the 'verbose' mode, but also for the batch processing - std::cout << "RawTherapee, version " << RTVERSION << std::endl; - std::cout << "WARNING: closing this window will close RawTherapee!" << std::endl << std::endl; } } } + int ret = processLineParams ( argc, argv); if ( ret <= 0 ) { + fflush(stdout); if (consoleOpened) { printf ("Press any key to exit RawTherapee\n"); FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE)); @@ -615,24 +587,24 @@ int main (int argc, char **argv) #else - if (argc > 1 || options.rtSettings.verbose) { - // printing RT's version in all case, particularly useful for the 'verbose' mode, but also for the batch processing - std::cout << "RawTherapee, version " << RTVERSION << std::endl; -#ifdef WIN32 - std::cout << "WARNING: closing this window will close RawTherapee!" << std::endl << std::endl; -#endif + if (argc > 1) { + int ret = processLineParams ( argc, argv); - if (argc > 1) { - int ret = processLineParams ( argc, argv); - - if ( ret <= 0 ) { - return ret; - } + if ( ret <= 0 ) { + return ret; } } #endif + Glib::ustring fatalError; + + try { + Options::load(); + } catch (Options::Error &e) { + fatalError = e.get_msg(); + } + if (gimpPlugin) { if (!Glib::file_test (argv1, Glib::FILE_TEST_EXISTS) || Glib::file_test (argv1, Glib::FILE_TEST_IS_DIR)) { printf ("Error: argv1 doesn't exist\n"); @@ -649,7 +621,11 @@ int main (int argc, char **argv) int ret = 0; - if (remote) { + 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 +637,7 @@ int main (int argc, char **argv) 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()); @@ -671,15 +647,8 @@ int main (int argc, char **argv) m.run (*rtWindow); gdk_threads_leave(); - if (gimpPlugin && - rtWindow->epanel && rtWindow->epanel->isRealized()) { - SaveFormat sf; - sf.format = "tif"; - sf.tiffBits = 16; - sf.tiffUncompressed = true; - sf.saveParams = true; - - if (!rtWindow->epanel->saveImmediately (argv2, sf)) { + if (gimpPlugin && rtWindow->epanel && rtWindow->epanel->isRealized()) { + if (!rtWindow->epanel->saveImmediately(argv2, SaveFormat())) { ret = -2; } } @@ -687,7 +656,7 @@ int main (int argc, char **argv) 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; } @@ -697,6 +666,7 @@ int main (int argc, char **argv) if (consoleOpened) { printf ("Press any key to exit RawTherapee\n"); + fflush(stdout); FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE)); getch(); } diff --git a/rtgui/metadatapanel.h b/rtgui/metadatapanel.h index a2c1f43ac..d34a04585 100644 --- a/rtgui/metadatapanel.h +++ b/rtgui/metadatapanel.h @@ -36,14 +36,14 @@ private: public: MetaDataPanel(); - ~MetaDataPanel(); + ~MetaDataPanel() override; - 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 setBatchMode(bool batchMode) override; + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setImageData(const rtengine::FramesMetaData* id); - void setListener(ToolPanelListener *tpl); + void setListener(ToolPanelListener *tpl) override; }; diff --git a/rtgui/mountselectionlistener.h b/rtgui/mountselectionlistener.h deleted file mode 100644 index 73728dfd9..000000000 --- a/rtgui/mountselectionlistener.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 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 . - */ -#ifndef _MOUNTSELECTIONLISTENER_ -#define _MOUNTSELECTIONLISTENER_ - -#include - -class MountSelectionListener -{ - -public: - virtual void mountSelectionChanged (Glib::ustring mountRoot) {} -}; - -#endif diff --git a/rtgui/multilangmgr.cc b/rtgui/multilangmgr.cc index b4896d69a..8d2985436 100644 --- a/rtgui/multilangmgr.cc +++ b/rtgui/multilangmgr.cc @@ -19,7 +19,7 @@ #include "multilangmgr.h" #include - +#include #ifdef WIN32 #include #include @@ -38,30 +38,36 @@ struct LocaleToLang : private std::map, 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)"); } @@ -86,7 +92,7 @@ struct LocaleToLang : private std::map, } // Look for matching language only. - iterator = find (key (major)); + iterator = find (key (major, major.uppercase())); if (iterator != end ()) { return iterator->second; @@ -114,12 +120,21 @@ const LocaleToLang localeToLang; void setGtkLanguage(const Glib::ustring &language) { - auto l = localeToLang.getLocale(language); -#ifdef WIN32 - putenv(("LANG=" + l).c_str()); -#else - setenv("LANG", l.c_str(), true); -#endif + 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); + } } } diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index 8521b5748..f555ab7ef 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -109,7 +109,7 @@ protected: public: MyCurve (); - ~MyCurve (); + ~MyCurve () override; void setCurveListener (CurveListener* cl) { @@ -126,10 +126,10 @@ public: { curveIsDirty = true; } - void on_style_updated (); + void on_style_updated () override; virtual std::vector getPoints () = 0; virtual void setPoints (const std::vector& p) = 0; - virtual bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) = 0; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override = 0; virtual bool handleEvents (GdkEvent* event) = 0; virtual void reset (const std::vector &resetCurve, double identityValue = 0.5) = 0; @@ -138,11 +138,11 @@ public: virtual void pipetteButton1Released(EditDataProvider *provider) = 0; virtual void pipetteDrag(EditDataProvider *provider, int modifierKey) = 0; - 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; - 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; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; }; class MyCurveIdleHelper diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index d249d4439..4980f9bd9 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -545,7 +545,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) double minDistanceY = double(MIN_DISTANCE) / double(graphH - 1); switch (event->type) { - case Gdk::BUTTON_PRESS: + case GDK_BUTTON_PRESS: snapToElmt = -100; if (curve.type != DCT_Parametric) { @@ -559,7 +559,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) getCursorPosition(Gdk::EventType(event->type), event->motion.is_hint != 0, int(event->button.x), int(event->button.y), Gdk::ModifierType(event->button.state)); findClosestPoint(); - new_type = CSMove; + new_type = CSMove2D; // Shown when dragging a node. if (distanceX > minDistanceX) { if (mod_type & GDK_CONTROL_MASK) { @@ -694,7 +694,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) break; - case Gdk::BUTTON_RELEASE: + case GDK_BUTTON_RELEASE: snapToElmt = -100; if (curve.type != DCT_Parametric && edited_point == -1) { @@ -735,7 +735,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) } if (distanceX <= minDistanceX) { - new_type = CSMove; + new_type = CSMove2D; // Shown on node release. lit_point = closest_point; } else { new_type = CSPlus; @@ -755,7 +755,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) break; - case Gdk::LEAVE_NOTIFY: + case GDK_LEAVE_NOTIFY: // Pointer can LEAVE even when dragging the point, so we don't modify the cursor in this case // The cursor will have to LEAVE another time after the drag... @@ -772,10 +772,10 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) retval = true; break; - case Gdk::MOTION_NOTIFY: + case GDK_MOTION_NOTIFY: snapToElmt = -100; - if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS) { + if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS || curve.type == DCT_CatumullRom) { snapToMinDistY = snapToMinDistX = 10.; snapToValY = snapToValX = 0.; @@ -799,7 +799,7 @@ bool MyDiagonalCurve::handleEvents (GdkEvent* event) lit_point = -1; } else if (distanceX <= minDistanceX) { // the cursor is close to an existing point - new_type = CSMove; + new_type = CSPlus; // Shown when hovering over node snapping distance (not necessarily over node). lit_point = closest_point; } else { // the cursor is inside the graph but away from existing points @@ -1026,7 +1026,7 @@ void MyDiagonalCurve::pipetteMouseOver (CurveEditor *ce, EditDataProvider *provi double minDistanceX = double(MIN_DISTANCE) / double(graphW - 1); - if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS) { + if (curve.type == DCT_Linear || curve.type == DCT_Spline || curve.type == DCT_NURBS || curve.type == DCT_CatumullRom) { // get the pointer position getCursorPositionFromCurve(pipetteVal); @@ -1280,7 +1280,7 @@ void MyDiagonalCurve::pipetteDrag(EditDataProvider *provider, int modifierKey) 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(float x) 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); @@ -1415,6 +1415,8 @@ std::vector MyDiagonalCurve::getPoints () result.push_back (double(DCT_Spline)); } else if (curve.type == DCT_NURBS) { result.push_back (double(DCT_NURBS)); + } else if (curve.type == DCT_CatumullRom) { + result.push_back (double(DCT_CatumullRom)); } // then we push all the points coordinate @@ -1516,28 +1518,27 @@ void MyDiagonalCurve::updateBackgroundHistogram (LUTu & hist) mcih->pending++; - const auto func = [](gpointer data) -> gboolean { - MyCurveIdleHelper* const mcih = static_cast(data); + idle_register.add( + [this]() -> bool + { + if (mcih->destroyed) { + if (mcih->pending == 1) { + delete mcih; + } else { + --mcih->pending; + } - if (mcih->destroyed) { - if (mcih->pending == 1) { - delete mcih; - } else { - mcih->pending--; + return false; } - return 0; + mcih->clearPixmap(); + mcih->myCurve->queue_draw(); + + --mcih->pending; + + return false; } - - mcih->clearPixmap (); - mcih->myCurve->queue_draw (); - - mcih->pending--; - - return FALSE; - }; - - idle_register.add(func, mcih); + ); } void MyDiagonalCurve::reset(const std::vector &resetCurve, double identityValue) @@ -1552,6 +1553,7 @@ void MyDiagonalCurve::reset(const std::vector &resetCurve, double identi switch (curve.type) { case DCT_Spline : case DCT_NURBS : + case DCT_CatumullRom: curve.x.resize(2); curve.y.resize(2); curve.x.at(0) = 0.; diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index abb8d3dc6..5b0f6f01e 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -34,6 +34,7 @@ enum DiagonalCurveType { DCT_Spline, // 1 DCT_Parametric, // 2 DCT_NURBS, // 3 + DCT_CatumullRom, // 4 // Insert new curve type above this line DCT_Unchanged // Must remain the last of the enum }; @@ -72,7 +73,7 @@ protected: void interpolate (); void findClosestPoint(); CursorShape motionNotify(CursorShape type, double minDistanceX, double minDistanceY, int num); - std::vector get_vector (int veclen); + std::vector get_vector (int veclen) override; void get_LUT (LUTf &lut); // Get the cursor position and unclamped position from the curve given an X value ; BEWARE: can be time consuming, use with care void getCursorPositionFromCurve(float x); @@ -82,23 +83,23 @@ protected: public: MyDiagonalCurve (); - ~MyDiagonalCurve (); - std::vector getPoints (); - void setPoints (const std::vector& p); + ~MyDiagonalCurve () override; + std::vector getPoints () override; + void setPoints (const std::vector& p) override; void setType (DiagonalCurveType t); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - bool handleEvents (GdkEvent* event); + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool handleEvents (GdkEvent* event) override; void setActiveParam (int ac); - void reset (const std::vector &resetCurve, double identityValue = 0.5); + void reset (const std::vector &resetCurve, double identityValue = 0.5) override; void updateBackgroundHistogram (LUTu & hist); - void pipetteMouseOver (CurveEditor *ce, EditDataProvider *provider, int modifierKey); - bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey); - void pipetteButton1Released(EditDataProvider *provider); - void pipetteDrag(EditDataProvider *provider, int modifierKey); + void pipetteMouseOver (CurveEditor *ce, EditDataProvider *provider, int modifierKey) override; + bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey) override; + void pipetteButton1Released(EditDataProvider *provider) override; + void pipetteDrag(EditDataProvider *provider, int modifierKey) override; - virtual void setPos(double pos, int chanIdx); - virtual void stopNumericalAdjustment(); + void setPos(double pos, int chanIdx) override; + void stopNumericalAdjustment() override; }; #endif diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index 4da683b0c..9b64ee516 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -613,7 +613,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) switch (event->type) { - case Gdk::BUTTON_PRESS: + case GDK_BUTTON_PRESS: if (edited_point == -1) { //curve.type!=FCT_Parametric) { if (event->button.button == 1) { buttonPressed = true; @@ -630,7 +630,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) switch (area) { case (FCT_Area_Insertion): - new_type = CSMove; + new_type = CSMove2D; // Shown when adding a new node in a blank area, both click and drag. /* insert a new control point */ if (num > 0) { @@ -681,7 +681,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) break; case (FCT_Area_Point): - new_type = CSMove; + new_type = CSMove2D; // Shown when node clicked and dragged. editedHandle = FCT_EditedHandle_CPoint; ugpX = curve.x.at(lit_point); ugpY = curve.y.at(lit_point); @@ -689,7 +689,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) case (FCT_Area_H): case (FCT_Area_V): - new_type = CSMove; + new_type = CSMove2D; // Shown when vertical line clicked, not dragged. editedHandle = FCT_EditedHandle_CPointUD; ugpX = curve.x.at(lit_point); ugpY = curve.y.at(lit_point); @@ -816,7 +816,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) break; - case Gdk::BUTTON_RELEASE: + case GDK_BUTTON_RELEASE: if (edited_point == -1) { //curve.type!=FCT_Parametric) { if (buttonPressed && event->button.button == 1) { buttonPressed = false; @@ -876,7 +876,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) break; case (FCT_Area_Point): - new_type = CSMove; + new_type = CSMove2D; // Shown when node released. break; case (FCT_Area_H): @@ -884,7 +884,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) break; case (FCT_Area_V): - new_type = CSMove; + new_type = CSMove2D; // Shown when line released. break; case (FCT_Area_LeftTan): @@ -908,7 +908,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) break; - case Gdk::MOTION_NOTIFY: + case GDK_MOTION_NOTIFY: if (curve.type == FCT_Linear || curve.type == FCT_MinMaxCPoints) { int previous_lit_point = lit_point; @@ -1008,7 +1008,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) //new_type = CSMove; //break; case (FCT_Area_V): - new_type = CSMove; + new_type = CSPlus; // Shown when hovering over vertical line. break; case (FCT_Area_H): @@ -1178,7 +1178,7 @@ bool MyFlatCurve::handleEvents (GdkEvent* event) retval = true; break; - case Gdk::LEAVE_NOTIFY: + case GDK_LEAVE_NOTIFY: // Pointer can LEAVE even when dragging the point, so we don't modify the cursor in this case // The cursor will have to LEAVE another time after the drag... diff --git a/rtgui/myflatcurve.h b/rtgui/myflatcurve.h index 65a1e2230..c0223bfcf 100644 --- a/rtgui/myflatcurve.h +++ b/rtgui/myflatcurve.h @@ -112,31 +112,31 @@ protected: void getMouseOverArea (); bool getHandles(int n); CursorShape motionNotify(CursorShape type, double minDistanceX, double minDistanceY, int num); - std::vector get_vector (int veclen); + std::vector get_vector (int veclen) override; void get_LUT (LUTf &lut); public: MyFlatCurve (); //~MyFlatCurve (); - std::vector getPoints (); + std::vector getPoints () override; void setPeriodicity (bool isPeriodic) { periodic = isPeriodic; }; - void setPoints (const std::vector& p); + void setPoints (const std::vector& p) override; void setType (FlatCurveType t); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - bool handleEvents (GdkEvent* event); - void reset (const std::vector &resetCurve, double identityValue = 0.5); + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool handleEvents (GdkEvent* event) override; + void reset (const std::vector &resetCurve, double identityValue = 0.5) override; //void updateBackgroundHistogram (unsigned int* hist); - void pipetteMouseOver (CurveEditor *ce, EditDataProvider *provider, int modifierKey); - bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey); - void pipetteButton1Released(EditDataProvider *provider); - void pipetteDrag(EditDataProvider *provider, int modifierKey); + void pipetteMouseOver (CurveEditor *ce, EditDataProvider *provider, int modifierKey) override; + bool pipetteButton1Pressed(EditDataProvider *provider, int modifierKey) override; + void pipetteButton1Released(EditDataProvider *provider) override; + void pipetteDrag(EditDataProvider *provider, int modifierKey) override; - void setPos(double pos, int chanIdx); - virtual void stopNumericalAdjustment(); + void setPos(double pos, int chanIdx) override; + void stopNumericalAdjustment() override; }; #endif diff --git a/rtgui/myicon.rc b/rtgui/myicon.rc index b5f390783..88f5f79fa 100644 --- a/rtgui/myicon.rc +++ b/rtgui/myicon.rc @@ -1 +1 @@ -1 ICON "../rtdata/icons/RT.ico" +1 ICON "../rtdata/images/non-themed/rawtherapee.ico" diff --git a/rtgui/navigator.cc b/rtgui/navigator.cc index 7222436b6..732b9f323 100644 --- a/rtgui/navigator.cc +++ b/rtgui/navigator.cc @@ -38,6 +38,8 @@ Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(opt 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 @@ Navigator::Navigator () : currentRGBUnit(options.navRGBUnit), currentHSVUnit(opt 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")); @@ -223,24 +224,30 @@ void Navigator::setInvalid (int fullWidth, int fullHeight) LAB_L->set_text (M("NAVIGATOR_NA")); } -void Navigator::getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB) +void Navigator::getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw) { - switch (currentRGBUnit) { - case (Options::NavigatorUnit::R0_1): - sR = Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f); - sG = Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f); - sB = Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f); - break; - case (Options::NavigatorUnit::R0_255): + if (isRaw) { sR = Glib::ustring::format(std::fixed, std::setprecision(0), r); sG = Glib::ustring::format(std::fixed, std::setprecision(0), g); sB = Glib::ustring::format(std::fixed, std::setprecision(0), b); - break; - case (Options::NavigatorUnit::PERCENT): - default: - sR = Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%"); - sG = Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%"); - sB = Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%"); + } else { + switch (currentRGBUnit) { + case (Options::NavigatorUnit::R0_1): + sR = Glib::ustring::format(std::fixed, std::setprecision(4), r / 255.f); + sG = Glib::ustring::format(std::fixed, std::setprecision(4), g / 255.f); + sB = Glib::ustring::format(std::fixed, std::setprecision(4), b / 255.f); + break; + case (Options::NavigatorUnit::R0_255): + sR = Glib::ustring::format(std::fixed, std::setprecision(0), r); + sG = Glib::ustring::format(std::fixed, std::setprecision(0), g); + sB = Glib::ustring::format(std::fixed, std::setprecision(0), b); + break; + case (Options::NavigatorUnit::PERCENT): + default: + sR = Glib::ustring::format(std::fixed, std::setprecision(1), r * 100.f / 255.f) + Glib::ustring("%"); + sG = Glib::ustring::format(std::fixed, std::setprecision(1), g * 100.f / 255.f) + Glib::ustring("%"); + sB = Glib::ustring::format(std::fixed, std::setprecision(1), b * 100.f / 255.f) + Glib::ustring("%"); + } } } @@ -273,34 +280,42 @@ void Navigator::getLABText (float l, float a, float b, Glib::ustring &sL, Glib:: } // if !validPos then x/y contain the full image size -void Navigator::pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b) +void Navigator::pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw) { if (!validPos) { setInvalid (x, y); } else { Glib::ustring s1, s2, s3; - float h, s, v; - float LAB_a, LAB_b, LAB_l; position->set_text (Glib::ustring::compose ("x: %1, y: %2", x, y)); - getRGBText (r, g, b, s1, s2, s3); + getRGBText (r, g, b, s1, s2, s3, isRaw); R->set_text (s1); G->set_text (s2); B->set_text (s3); + if (isRaw) { + H->set_text ("--"); + S->set_text ("--"); + V->set_text ("--"); + LAB_L->set_text ("--"); + LAB_A->set_text ("--"); + LAB_B->set_text ("--"); + } else { + float h, s, v; + float LAB_a, LAB_b, LAB_l; + 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::rgb2hsv (r * 0xffff / 0xff, g * 0xffff / 0xff, b * 0xffff / 0xff, 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? - getLABText (LAB_l, LAB_a, LAB_b, s1, s2, s3); - LAB_L->set_text (s1); - LAB_A->set_text (s2); - LAB_B->set_text (s3); + 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); + LAB_B->set_text (s3); + } } } diff --git a/rtgui/navigator.h b/rtgui/navigator.h index 647df7a34..1b898f895 100644 --- a/rtgui/navigator.h +++ b/rtgui/navigator.h @@ -37,6 +37,7 @@ private: 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 @@ protected: Gtk::Label *lH, *lS, *lV; Gtk::Label *lLAB_A, *lLAB_B, *lLAB_L; - void setInvalid (int fullWidth = -1, int fullHeight = -1); public: PreviewWindow* previewWindow; @@ -55,11 +55,12 @@ public: // 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 pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool raw = false) override; + 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); - void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB); + void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw = false) override; + void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV) override; + void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB) override; }; diff --git a/rtgui/options.cc b/rtgui/options.cc index 90b7378a6..0df70a4fd 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -25,6 +25,8 @@ #include "guiutils.h" #include "version.h" +#include "../rtengine/procparams.h" + #ifdef _OPENMP #include #endif @@ -49,17 +51,16 @@ Options options; Glib::ustring versionString = RTVERSION; Glib::ustring paramFileExtension = ".pp3"; -Options::Options () +Options::Options() { - defProfRawMissing = false; - defProfImgMissing = false; - setDefaults (); + defProfError = 0; + setDefaults(); } const char *DefaultLanguage = "English (US)"; -inline bool Options::checkProfilePath (Glib::ustring &path) +inline bool Options::checkProfilePath(Glib::ustring &path) { if (path.empty()) { return false; @@ -67,22 +68,22 @@ inline bool Options::checkProfilePath (Glib::ustring &path) Glib::ustring p = getUserProfilePath(); - if (!p.empty() && Glib::file_test (path + paramFileExtension, Glib::FILE_TEST_EXISTS)) { + if (!p.empty() && Glib::file_test(path + paramFileExtension, Glib::FILE_TEST_EXISTS)) { return true; } p = getGlobalProfilePath(); - return !p.empty() && Glib::file_test (path + paramFileExtension, Glib::FILE_TEST_EXISTS); + return !p.empty() && Glib::file_test(path + paramFileExtension, Glib::FILE_TEST_EXISTS); } -bool Options::checkDirPath (Glib::ustring &path, Glib::ustring errString) +bool Options::checkDirPath(Glib::ustring &path, Glib::ustring errString) { - if (Glib::file_test (path, Glib::FILE_TEST_EXISTS) && Glib::file_test (path, Glib::FILE_TEST_IS_DIR)) { + if (Glib::file_test(path, Glib::FILE_TEST_EXISTS) && Glib::file_test(path, Glib::FILE_TEST_IS_DIR)) { return true; } else { if (!errString.empty()) { - printf ("%s\n", errString.c_str()); + std::cerr << errString << std::endl; } return false; @@ -97,120 +98,111 @@ void Options::updatePaths() userProfilePath = ""; globalProfilePath = ""; - if (Glib::path_is_absolute (profilePath)) { + if (Glib::path_is_absolute(profilePath)) { // absolute path - if (!checkDirPath (profilePath, "")) { - g_mkdir_with_parents (profilePath.c_str (), 511); + if (!checkDirPath(profilePath, "")) { + 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()); + if (!checkDirPath(profilePath, "")) { // had problems with mkdir_with_parents return value on OS X, just check dir again + 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"); + 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, "")) { + 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, "")) { + Glib::ustring msg = Glib::ustring::compose("Creation of the user's processing profile directory \"%1\" failed!\n", tmpPath.c_str()); + throw Error(msg); } + } - if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory!\n")) { - userProfilePath = tmpPath; - } + if (checkDirPath(tmpPath, "Error: the user's processing profile path doesn't point to a directory!\n")) { + userProfilePath = tmpPath; + } - tmpPath = Glib::build_filename (argv0, "profiles"); + tmpPath = Glib::build_filename(argv0, "profiles"); - 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"); - - 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; } } Glib::ustring preferredPath = getPreferredProfilePath(); // Paths are updated only if the user or global profile path is set - if (lastRgbCurvesDir.empty() || !Glib::file_test (lastRgbCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastRgbCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastRgbCurvesDir.empty() || !Glib::file_test(lastRgbCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastRgbCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastRgbCurvesDir = preferredPath; } - if (lastLabCurvesDir.empty() || !Glib::file_test (lastLabCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastLabCurvesDir.empty() || !Glib::file_test(lastLabCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastLabCurvesDir = preferredPath; } - if (lastRetinexDir.empty() || !Glib::file_test (lastRetinexDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastRetinexDir.empty() || !Glib::file_test(lastRetinexDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastRetinexDir = preferredPath; } - if (lastDenoiseCurvesDir.empty() || !Glib::file_test (lastDenoiseCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastDenoiseCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastDenoiseCurvesDir.empty() || !Glib::file_test(lastDenoiseCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastDenoiseCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastDenoiseCurvesDir = preferredPath; } - if (lastWaveletCurvesDir.empty() || !Glib::file_test (lastWaveletCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastWaveletCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastWaveletCurvesDir.empty() || !Glib::file_test(lastWaveletCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastWaveletCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastWaveletCurvesDir = preferredPath; } - if (lastPFCurvesDir.empty() || !Glib::file_test (lastPFCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastPFCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastPFCurvesDir.empty() || !Glib::file_test(lastPFCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastPFCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastPFCurvesDir = preferredPath; } - if (lastHsvCurvesDir.empty() || !Glib::file_test (lastHsvCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastHsvCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastHsvCurvesDir.empty() || !Glib::file_test(lastHsvCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastHsvCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastHsvCurvesDir = preferredPath; } - if (lastToneCurvesDir.empty() || !Glib::file_test (lastToneCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastToneCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastToneCurvesDir.empty() || !Glib::file_test(lastToneCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastToneCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastToneCurvesDir = preferredPath; } - if (lastProfilingReferenceDir.empty() || !Glib::file_test (lastProfilingReferenceDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastProfilingReferenceDir, Glib::FILE_TEST_IS_DIR)) { + if (lastProfilingReferenceDir.empty() || !Glib::file_test(lastProfilingReferenceDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastProfilingReferenceDir, Glib::FILE_TEST_IS_DIR)) { lastProfilingReferenceDir = preferredPath; } - if (lastVibranceCurvesDir.empty() || !Glib::file_test (lastVibranceCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastVibranceCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastVibranceCurvesDir.empty() || !Glib::file_test(lastVibranceCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastVibranceCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastVibranceCurvesDir = preferredPath; } - if (loadSaveProfilePath.empty() || !Glib::file_test (loadSaveProfilePath, Glib::FILE_TEST_EXISTS) || !Glib::file_test (loadSaveProfilePath, Glib::FILE_TEST_IS_DIR)) { + if (loadSaveProfilePath.empty() || !Glib::file_test(loadSaveProfilePath, Glib::FILE_TEST_EXISTS) || !Glib::file_test(loadSaveProfilePath, Glib::FILE_TEST_IS_DIR)) { loadSaveProfilePath = preferredPath; } - if (lastBWCurvesDir.empty() || !Glib::file_test (lastBWCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test (lastBWCurvesDir, Glib::FILE_TEST_IS_DIR)) { + if (lastBWCurvesDir.empty() || !Glib::file_test(lastBWCurvesDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastBWCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastBWCurvesDir = preferredPath; } + if (lastICCProfCreatorDir.empty() || !Glib::file_test(lastICCProfCreatorDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastICCProfCreatorDir, Glib::FILE_TEST_IS_DIR)) { + lastICCProfCreatorDir = preferredPath; + } } Glib::ustring Options::getPreferredProfilePath() @@ -231,7 +223,7 @@ Glib::ustring Options::getPreferredProfilePath() *@return Send back the absolute path of the given filename or "Neutral" if "Neutral" has been set to profName. Implementor will have * to test for this particular value. If the absolute path is invalid (e.g. the file doesn't exist), it will return an empty string. */ -Glib::ustring Options::findProfilePath (Glib::ustring &profName) +Glib::ustring Options::findProfilePath(Glib::ustring &profName) { if (profName.empty()) { return ""; @@ -245,41 +237,41 @@ Glib::ustring Options::findProfilePath (Glib::ustring &profName) return profName; } - Glib::ustring p = profName.substr (0, 4); + Glib::ustring p = profName.substr(0, 4); if (p == "${U}") { // the path starts by the User virtual path p = getUserProfilePath(); - Glib::ustring fullPath = Glib::build_filename (p, profName.substr (5) + paramFileExtension); + Glib::ustring fullPath = Glib::build_filename(p, profName.substr(5) + paramFileExtension); - if (!p.empty() && Glib::file_test (fullPath, Glib::FILE_TEST_EXISTS)) { - return Glib::path_get_dirname (fullPath); + if (!p.empty() && Glib::file_test(fullPath, Glib::FILE_TEST_EXISTS)) { + return Glib::path_get_dirname(fullPath); } } else if (p == "${G}") { // the path starts by the User virtual path p = getGlobalProfilePath(); - Glib::ustring fullPath = Glib::build_filename (p, profName.substr (5) + paramFileExtension); + Glib::ustring fullPath = Glib::build_filename(p, profName.substr(5) + paramFileExtension); - if (!p.empty() && Glib::file_test (fullPath, Glib::FILE_TEST_EXISTS)) { - return Glib::path_get_dirname (fullPath); + if (!p.empty() && Glib::file_test(fullPath, Glib::FILE_TEST_EXISTS)) { + return Glib::path_get_dirname(fullPath); } } else { // compatibility case -> convert the path to the new format p = getUserProfilePath(); - Glib::ustring fullPath = Glib::build_filename (p, profName + paramFileExtension); + Glib::ustring fullPath = Glib::build_filename(p, profName + paramFileExtension); - if (!p.empty() && Glib::file_test (fullPath, Glib::FILE_TEST_EXISTS)) { + if (!p.empty() && Glib::file_test(fullPath, Glib::FILE_TEST_EXISTS)) { // update the profile path - profName = Glib::build_filename ("${U}", profName); - return Glib::path_get_dirname (fullPath); + profName = Glib::build_filename("${U}", profName); + return Glib::path_get_dirname(fullPath); } p = getGlobalProfilePath(); - fullPath = Glib::build_filename (p, profName + paramFileExtension); + fullPath = Glib::build_filename(p, profName + paramFileExtension); - if (!p.empty() && Glib::file_test (fullPath, Glib::FILE_TEST_EXISTS)) { - profName = Glib::build_filename ("${G}", profName); - return Glib::path_get_dirname (fullPath); + if (!p.empty() && Glib::file_test(fullPath, Glib::FILE_TEST_EXISTS)) { + profName = Glib::build_filename("${G}", profName); + return Glib::path_get_dirname(fullPath); } } @@ -287,7 +279,7 @@ Glib::ustring Options::findProfilePath (Glib::ustring &profName) } -void Options::setDefaults () +void Options::setDefaults() { windowWidth = 1200; @@ -311,6 +303,7 @@ void Options::setDefaults () saveFormat.jpegSubSamp = 2; saveFormat.pngBits = 8; saveFormat.tiffBits = 16; + saveFormat.tiffFloat = false; saveFormat.tiffUncompressed = true; saveFormat.saveParams = true; @@ -319,6 +312,7 @@ void Options::setDefaults () saveFormatBatch.jpegSubSamp = 2; saveFormatBatch.pngBits = 8; saveFormatBatch.tiffBits = 16; + saveFormatBatch.tiffFloat = false; saveFormatBatch.tiffUncompressed = true; saveFormatBatch.saveParams = true; @@ -339,7 +333,7 @@ void Options::setDefaults () dirBrowserHeight = 350; dirBrowserSortType = Gtk::SORT_ASCENDING; preferencesWidth = 800; - preferencesHeight = 0; + preferencesHeight = 600; toolPanelWidth = 400; browserToolPanelWidth = 465; browserToolPanelHeight = 600; @@ -360,7 +354,14 @@ void Options::setDefaults () fbShowDateTime = true; fbShowBasicExif = true; fbShowExpComp = false; +#ifdef WIN32 + // use windows setting for visibility of hidden files/folders + SHELLFLAGSTATE sft = { 0 }; + SHGetSettings(&sft, SSF_SHOWALLOBJECTS); + fbShowHidden = sft.fShowAllObjects; +#else fbShowHidden = false; +#endif fbArrangement = 2; // was 0 navRGBUnit = NavigatorUnit::PERCENT; navHSVUnit = NavigatorUnit::PERCENT; @@ -403,21 +404,22 @@ void Options::setDefaults () CPBKeys = CPBKT_TID; editorToSendTo = 1; favoriteDirs.clear(); - tpOpen.clear (); + tpOpen.clear(); autoSaveTpOpen = true; //crvOpen.clear (); - parseExtensions.clear (); - parseExtensionsEnabled.clear (); - parsedExtensions.clear (); + parseExtensions.clear(); + favorites.clear(); + parseExtensionsEnabled.clear(); + parsedExtensions.clear(); renameUseTemplates = false; - renameTemplates.clear (); - thumbnailZoomRatios.clear (); - thumbnailZoomRatios.push_back (0.2); - thumbnailZoomRatios.push_back (0.3); - thumbnailZoomRatios.push_back (0.45); - thumbnailZoomRatios.push_back (0.6); - thumbnailZoomRatios.push_back (0.8); - thumbnailZoomRatios.push_back (1.0); + renameTemplates.clear(); + thumbnailZoomRatios.clear(); + thumbnailZoomRatios.push_back(0.2); + thumbnailZoomRatios.push_back(0.3); + thumbnailZoomRatios.push_back(0.45); + thumbnailZoomRatios.push_back(0.6); + thumbnailZoomRatios.push_back(0.8); + thumbnailZoomRatios.push_back(1.0); overlayedFileNames = false; filmStripOverlayedFileNames = false; internalThumbIfUntouched = true; // if TRUE, only fast, internal preview images are taken if the image is not edited yet @@ -427,8 +429,15 @@ void Options::setDefaults () mainNBVertical = true; multiDisplayMode = 0; histogramPosition = 1; + histogramRed = true; + histogramGreen = true; + histogramBlue = true; + histogramLuma = false; + histogramChroma = false; + histogramRAW = false; histogramBar = true; - histogramFullMode = false; + histogramHeight = 200; + histogramDrawMode = 0; curvebboxpos = 1; prevdemo = PD_Sidecar; rgbDenoiseThreadLimit = 0; @@ -439,11 +448,16 @@ void Options::setDefaults () #endif filledProfile = false; maxInspectorBuffers = 2; // a rather conservative value for low specced systems... + inspectorDelay = 0; serializeTiffRead = true; - + measure = false; + chunkSizeAMAZE = 2; + chunkSizeCA = 2; + chunkSizeRCD = 2; + chunkSizeRGB = 2; + chunkSizeXT = 2; FileBrowserToolbarSingleRow = false; hideTPVScrollbar = false; - UseIconNoText = true; whiteBalanceSpotSize = 8; showFilmStripToolBar = false; menuGroupRank = true; @@ -452,6 +466,22 @@ void Options::setDefaults () menuGroupProfileOperations = true; menuGroupExtProg = true; + ICCPC_primariesPreset = "sRGB", + ICCPC_redPrimaryX = 0.6400; + ICCPC_redPrimaryY = 0.3300; + ICCPC_greenPrimaryX = 0.3000; + ICCPC_greenPrimaryY = 0.6000; + ICCPC_bluePrimaryX = 0.1500; + ICCPC_bluePrimaryY = 0.0600; + ICCPC_gammaPreset = "Custom"; + ICCPC_gamma = 2.4; + ICCPC_slope = 12.92; + ICCPC_profileVersion = "v4"; + ICCPC_illuminant = "DEF"; + ICCPC_description = ""; + ICCPC_copyright = Options::getICCProfileCopyright(); + ICCPC_appendParamsToDesc = false; + fastexport_bypass_sharpening = true; fastexport_bypass_sharpenEdge = true; fastexport_bypass_sharpenMicro = true; @@ -459,7 +489,6 @@ void Options::setDefaults () //fastexport_bypass_colorDenoise = true; fastexport_bypass_defringe = true; fastexport_bypass_dirpyrDenoise = true; - fastexport_bypass_sh_hq = true; fastexport_bypass_dirpyrequalizer = true; fastexport_bypass_wavelet = true; fastexport_raw_bayer_method = "fast"; @@ -474,12 +503,11 @@ void Options::setDefaults () fastexport_bypass_raw_ca = true; fastexport_bypass_raw_df = true; fastexport_bypass_raw_ff = true; - fastexport_icm_input = "(camera)"; - fastexport_icm_working = "ProPhoto"; - fastexport_icm_output = "RT_sRGB"; + fastexport_icm_input_profile = "(camera)"; + fastexport_icm_working_profile = "ProPhoto"; + fastexport_icm_output_profile = options.rtSettings.srgb; fastexport_icm_outputIntent = rtengine::RI_RELATIVE; fastexport_icm_outputBPC = true; - fastexport_icm_gamma = "default"; fastexport_resize_enabled = true; fastexport_resize_scale = 1; fastexport_resize_appliesTo = "Cropped area"; @@ -514,10 +542,10 @@ void Options::setDefaults () rtSettings.darkFramesPath = ""; rtSettings.flatFieldsPath = ""; #ifdef WIN32 - const gchar* sysRoot = g_getenv ("SystemRoot"); // Returns e.g. "c:\Windows" + const gchar* sysRoot = g_getenv("SystemRoot"); // Returns e.g. "c:\Windows" if (sysRoot != NULL) { - rtSettings.iccDirectory = Glib::ustring (sysRoot) + Glib::ustring ("\\System32\\spool\\drivers\\color"); + rtSettings.iccDirectory = Glib::ustring(sysRoot) + Glib::ustring("\\System32\\spool\\drivers\\color"); } else { rtSettings.iccDirectory = "C:\\WINDOWS\\System32\\spool\\drivers\\color"; } @@ -530,11 +558,6 @@ void Options::setDefaults () // rtSettings.viewingdevice = 0; // rtSettings.viewingdevicegrey = 3; // rtSettings.viewinggreySc = 1; - rtSettings.leveldnv = 2; - rtSettings.leveldnti = 0; - rtSettings.leveldnaut = 0; - rtSettings.leveldnliss = 0; - rtSettings.leveldnautsimpl = 0; rtSettings.printerProfile = Glib::ustring(); rtSettings.printerIntent = rtengine::RI_RELATIVE; @@ -543,25 +566,23 @@ void Options::setDefaults () rtSettings.monitorIntent = rtengine::RI_RELATIVE; rtSettings.monitorBPC = true; rtSettings.autoMonitorProfile = false; - rtSettings.adobe = "RT_Medium_gsRGB"; // put the name of yours profiles (here windows) - rtSettings.prophoto = "RT_Large_gBT709"; // these names appear in the menu "output profile" - rtSettings.prophoto10 = "RT_Large_g10"; // these names appear in the menu "output profile" - rtSettings.srgb10 = "RT_sRGB_g10"; - rtSettings.widegamut = "WideGamutRGB"; - rtSettings.srgb = "RT_sRGB"; - rtSettings.bruce = "Bruce"; - rtSettings.beta = "BetaRGB"; - rtSettings.best = "BestRGB"; - rtSettings.rec2020 = "Rec2020"; + rtSettings.adobe = "RTv2_Medium"; // put the name of yours profiles (here windows) + rtSettings.prophoto = "RTv2_Large"; // these names appear in the menu "output profile" + rtSettings.widegamut = "RTv2_Wide"; + rtSettings.srgb = "RTv4_sRGB"; + rtSettings.bruce = "RTv2_Bruce"; + rtSettings.beta = "RTv2_Beta"; + rtSettings.best = "RTv2_Best"; + rtSettings.rec2020 = "RTv2_Rec2020"; + rtSettings.ACESp0 = "RTv2_ACES-AP0"; + rtSettings.ACESp1 = "RTv2_ACES-AP1"; 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.artifact_cbdl = 4.; + rtSettings.amchroma = 40;//between 20 and 140 low values increase effect..and also artifacts, high values reduces rtSettings.level0_cbdl = 0; rtSettings.level123_cbdl = 30; - rtSettings.ciecamfloat = true; rtSettings.protectred = 60; rtSettings.protectredh = 0.3; rtSettings.CRI_color = 0; @@ -571,10 +592,16 @@ void Options::setDefaults () rtSettings.daubech = false; - rtSettings.nrauto = 10;//between 2 and 20 - rtSettings.nrautomax = 40;//between 5 and 100 - rtSettings.nrhigh = 0.45;//between 0.1 and 0.9 - rtSettings.nrwavlevel = 1;//integer between 0 and 2 + // #4327 - Noise Reduction settings removed from Preferences + rtSettings.nrauto = 10; // between 2 and 20 + rtSettings.nrautomax = 40; // between 5 and 100 + rtSettings.nrhigh = 0.45; // between 0.1 and 0.9 + rtSettings.nrwavlevel = 1; // integer between 0 and 2 + rtSettings.leveldnv = 2; + rtSettings.leveldnti = 0; + rtSettings.leveldnaut = 0; + rtSettings.leveldnliss = 0; + rtSettings.leveldnautsimpl = 0; // rtSettings.colortoningab =0.7; //rtSettings.decaction =0.3; @@ -601,800 +628,833 @@ void Options::setDefaults () lastProfilingReferenceDir = ""; lastBWCurvesDir = ""; lastLensProfileDir = ""; + lastICCProfCreatorDir = ""; gimpPluginShowInfoDialog = true; maxRecentFolders = 15; rtSettings.lensfunDbDirectory = ""; // set also in main.cc and main-cli.cc cropGuides = CROP_GUIDE_FULL; cropAutoFit = false; + + rtSettings.thumbnail_inspector_mode = rtengine::Settings::ThumbnailInspectorMode::JPEG; } -Options* Options::copyFrom (Options* other) +Options* Options::copyFrom(Options* other) { *this = *other; return this; } -void Options::filterOutParsedExtensions () +void Options::filterOutParsedExtensions() { parsedExtensions.clear(); for (unsigned int i = 0; i < parseExtensions.size(); i++) if (parseExtensionsEnabled[i]) { - parsedExtensions.push_back (parseExtensions[i].lowercase()); + parsedExtensions.push_back(parseExtensions[i].lowercase()); } } -void Options::readFromFile (Glib::ustring fname) +void Options::readFromFile(Glib::ustring fname) { - setlocale (LC_NUMERIC, "C"); // to set decimal point to "." + setlocale(LC_NUMERIC, "C"); // to set decimal point to "." Glib::KeyFile keyFile; - if ( !Glib::file_test (fname, Glib::FILE_TEST_EXISTS)) { - Glib::ustring msg = Glib::ustring::compose ("Options file %1 does not exist", fname); - throw Error (msg); + if (!Glib::file_test(fname, Glib::FILE_TEST_EXISTS)) { + Glib::ustring msg = Glib::ustring::compose("Options file %1 does not exist", fname); + throw Error(msg); } try { - if (keyFile.load_from_file (fname)) { + if (keyFile.load_from_file(fname)) { // -------------------------------------------------------------------------------------------------------- - if (keyFile.has_group ("General")) { - if (keyFile.has_key ("General", "TabbedEditor")) { - tabbedUI = keyFile.get_boolean ("General", "TabbedEditor"); + if (keyFile.has_group("General")) { + if (keyFile.has_key("General", "TabbedEditor")) { + tabbedUI = keyFile.get_boolean("General", "TabbedEditor"); } - if (keyFile.has_key ("General", "StartupDirectory")) { - if ( keyFile.get_string ("General", "StartupDirectory") == "home") { + if (keyFile.has_key("General", "StartupDirectory")) { + if (keyFile.get_string("General", "StartupDirectory") == "home") { startupDir = STARTUPDIR_HOME; - } else if ( keyFile.get_string ("General", "StartupDirectory") == "current") { + } else if (keyFile.get_string("General", "StartupDirectory") == "current") { startupDir = STARTUPDIR_CURRENT; - } else if ( keyFile.get_string ("General", "StartupDirectory") == "last") { + } else if (keyFile.get_string("General", "StartupDirectory") == "last") { startupDir = STARTUPDIR_LAST; - } else if ( keyFile.get_string ("General", "StartupDirectory") == "custom") { + } else if (keyFile.get_string("General", "StartupDirectory") == "custom") { startupDir = STARTUPDIR_CUSTOM; } } - if (keyFile.has_key ("General", "StartupPath")) { - startupPath = keyFile.get_string ("General", "StartupPath"); + if (keyFile.has_key("General", "StartupPath")) { + startupPath = keyFile.get_string("General", "StartupPath"); } - if (keyFile.has_key ("General", "DateFormat")) { - dateFormat = keyFile.get_string ("General", "DateFormat"); + if (keyFile.has_key("General", "DateFormat")) { + dateFormat = keyFile.get_string("General", "DateFormat"); } - if (keyFile.has_key ("General", "AdjusterMinDelay")) { - adjusterMinDelay = keyFile.get_integer ("General", "AdjusterMinDelay"); + if (keyFile.has_key("General", "AdjusterMinDelay")) { + adjusterMinDelay = keyFile.get_integer("General", "AdjusterMinDelay"); } - if (keyFile.has_key ("General", "AdjusterMaxDelay")) { - adjusterMaxDelay = keyFile.get_integer ("General", "AdjusterMaxDelay"); + if (keyFile.has_key("General", "AdjusterMaxDelay")) { + adjusterMaxDelay = keyFile.get_integer("General", "AdjusterMaxDelay"); } - if (keyFile.has_key ("General", "StoreLastProfile")) { - savesParamsAtExit = keyFile.get_boolean ("General", "StoreLastProfile"); + if (keyFile.has_key("General", "StoreLastProfile")) { + savesParamsAtExit = keyFile.get_boolean("General", "StoreLastProfile"); } - if (keyFile.has_key ("General", "MultiUser")) { - multiUser = keyFile.get_boolean ("General", "MultiUser"); + if (keyFile.has_key("General", "MultiUser")) { + multiUser = keyFile.get_boolean("General", "MultiUser"); } - if (keyFile.has_key ("General", "Version")) { - version = keyFile.get_string ("General", "Version"); + if (keyFile.has_key("General", "Version")) { + version = keyFile.get_string("General", "Version"); } - if (keyFile.has_key ("General", "Language")) { - language = keyFile.get_string ("General", "Language"); + if (keyFile.has_key("General", "Language")) { + language = keyFile.get_string("General", "Language"); } - if (keyFile.has_key ("General", "LanguageAutoDetect")) { - languageAutoDetect = keyFile.get_boolean ("General", "LanguageAutoDetect"); + if (keyFile.has_key("General", "LanguageAutoDetect")) { + languageAutoDetect = keyFile.get_boolean("General", "LanguageAutoDetect"); } - if (keyFile.has_key ("General", "Theme")) { - theme = keyFile.get_string ("General", "Theme"); + if (keyFile.has_key("General", "Theme")) { + theme = keyFile.get_string("General", "Theme"); } - if ( keyFile.has_key ("General", "DarkFramesPath")) { - rtSettings.darkFramesPath = keyFile.get_string ("General", "DarkFramesPath"); + if (keyFile.has_key("General", "DarkFramesPath")) { + rtSettings.darkFramesPath = keyFile.get_string("General", "DarkFramesPath"); } - if ( keyFile.has_key ("General", "FlatFieldsPath")) { - rtSettings.flatFieldsPath = keyFile.get_string ("General", "FlatFieldsPath"); + if (keyFile.has_key("General", "FlatFieldsPath")) { + rtSettings.flatFieldsPath = keyFile.get_string("General", "FlatFieldsPath"); } - if ( keyFile.has_key ("General", "Verbose")) { - rtSettings.verbose = keyFile.get_boolean ( "General", "Verbose"); + if (keyFile.has_key("General", "Verbose")) { + rtSettings.verbose = keyFile.get_boolean("General", "Verbose"); } } - if (keyFile.has_group ("External Editor")) { - if (keyFile.has_key ("External Editor", "EditorKind")) { - editorToSendTo = keyFile.get_integer ("External Editor", "EditorKind"); + if (keyFile.has_group("External Editor")) { + if (keyFile.has_key("External Editor", "EditorKind")) { + editorToSendTo = keyFile.get_integer("External Editor", "EditorKind"); } - if (keyFile.has_key ("External Editor", "GimpDir")) { - gimpDir = keyFile.get_string ("External Editor", "GimpDir"); + if (keyFile.has_key("External Editor", "GimpDir")) { + gimpDir = keyFile.get_string("External Editor", "GimpDir"); } - if (keyFile.has_key ("External Editor", "PhotoshopDir")) { - psDir = keyFile.get_string ("External Editor", "PhotoshopDir"); + if (keyFile.has_key("External Editor", "PhotoshopDir")) { + psDir = keyFile.get_string("External Editor", "PhotoshopDir"); } - if (keyFile.has_key ("External Editor", "CustomEditor")) { - customEditorProg = keyFile.get_string ("External Editor", "CustomEditor"); + if (keyFile.has_key("External Editor", "CustomEditor")) { + customEditorProg = keyFile.get_string("External Editor", "CustomEditor"); } } - if (keyFile.has_group ("Output")) { - if (keyFile.has_key ("Output", "Format")) { - saveFormat.format = keyFile.get_string ("Output", "Format"); + if (keyFile.has_group("Output")) { + if (keyFile.has_key("Output", "Format")) { + saveFormat.format = keyFile.get_string("Output", "Format"); } - if (keyFile.has_key ("Output", "JpegQuality")) { - saveFormat.jpegQuality = keyFile.get_integer ("Output", "JpegQuality"); + if (keyFile.has_key("Output", "JpegQuality")) { + saveFormat.jpegQuality = keyFile.get_integer("Output", "JpegQuality"); } - if (keyFile.has_key ("Output", "JpegSubSamp")) { - saveFormat.jpegSubSamp = keyFile.get_integer ("Output", "JpegSubSamp"); + if (keyFile.has_key("Output", "JpegSubSamp")) { + saveFormat.jpegSubSamp = keyFile.get_integer("Output", "JpegSubSamp"); } - if (keyFile.has_key ("Output", "PngBps")) { - saveFormat.pngBits = keyFile.get_integer ("Output", "PngBps"); + if (keyFile.has_key("Output", "PngBps")) { + saveFormat.pngBits = keyFile.get_integer("Output", "PngBps"); } - if (keyFile.has_key ("Output", "TiffBps")) { - saveFormat.tiffBits = keyFile.get_integer ("Output", "TiffBps"); + if (keyFile.has_key("Output", "TiffBps")) { + saveFormat.tiffBits = keyFile.get_integer("Output", "TiffBps"); } - if (keyFile.has_key ("Output", "TiffUncompressed")) { - saveFormat.tiffUncompressed = keyFile.get_boolean ("Output", "TiffUncompressed"); + if (keyFile.has_key ("Output", "TiffFloat")) { + saveFormat.tiffFloat = keyFile.get_boolean ("Output", "TiffFloat"); } - if (keyFile.has_key ("Output", "SaveProcParams")) { - saveFormat.saveParams = keyFile.get_boolean ("Output", "SaveProcParams"); + if (keyFile.has_key("Output", "TiffUncompressed")) { + saveFormat.tiffUncompressed = keyFile.get_boolean("Output", "TiffUncompressed"); + } + + if (keyFile.has_key("Output", "SaveProcParams")) { + saveFormat.saveParams = keyFile.get_boolean("Output", "SaveProcParams"); } - if (keyFile.has_key ("Output", "FormatBatch")) { - saveFormatBatch.format = keyFile.get_string ("Output", "FormatBatch"); + if (keyFile.has_key("Output", "FormatBatch")) { + saveFormatBatch.format = keyFile.get_string("Output", "FormatBatch"); } - if (keyFile.has_key ("Output", "JpegQualityBatch")) { - saveFormatBatch.jpegQuality = keyFile.get_integer ("Output", "JpegQualityBatch"); + if (keyFile.has_key("Output", "JpegQualityBatch")) { + saveFormatBatch.jpegQuality = keyFile.get_integer("Output", "JpegQualityBatch"); } - if (keyFile.has_key ("Output", "JpegSubSampBatch")) { - saveFormatBatch.jpegSubSamp = keyFile.get_integer ("Output", "JpegSubSampBatch"); + if (keyFile.has_key("Output", "JpegSubSampBatch")) { + saveFormatBatch.jpegSubSamp = keyFile.get_integer("Output", "JpegSubSampBatch"); } - if (keyFile.has_key ("Output", "PngBpsBatch")) { - saveFormatBatch.pngBits = keyFile.get_integer ("Output", "PngBpsBatch"); + if (keyFile.has_key("Output", "PngBpsBatch")) { + saveFormatBatch.pngBits = keyFile.get_integer("Output", "PngBpsBatch"); } - if (keyFile.has_key ("Output", "TiffBpsBatch")) { - saveFormatBatch.tiffBits = keyFile.get_integer ("Output", "TiffBpsBatch"); + if (keyFile.has_key("Output", "TiffBpsBatch")) { + saveFormatBatch.tiffBits = keyFile.get_integer("Output", "TiffBpsBatch"); } - if (keyFile.has_key ("Output", "TiffUncompressedBatch")) { - saveFormatBatch.tiffUncompressed = keyFile.get_boolean ("Output", "TiffUncompressedBatch"); + if (keyFile.has_key ("Output", "TiffFloatBatch")) { + saveFormatBatch.tiffFloat = keyFile.get_boolean ("Output", "TiffFloatBatch"); } - if (keyFile.has_key ("Output", "SaveProcParamsBatch")) { - saveFormatBatch.saveParams = keyFile.get_boolean ("Output", "SaveProcParamsBatch"); + if (keyFile.has_key("Output", "TiffUncompressedBatch")) { + saveFormatBatch.tiffUncompressed = keyFile.get_boolean("Output", "TiffUncompressedBatch"); } - if (keyFile.has_key ("Output", "Path")) { - savePathTemplate = keyFile.get_string ("Output", "Path"); + if (keyFile.has_key("Output", "SaveProcParamsBatch")) { + saveFormatBatch.saveParams = keyFile.get_boolean("Output", "SaveProcParamsBatch"); } - if (keyFile.has_key ("Output", "PathTemplate")) { - savePathTemplate = keyFile.get_string ("Output", "PathTemplate"); + if (keyFile.has_key("Output", "Path")) { + savePathTemplate = keyFile.get_string("Output", "Path"); } - if (keyFile.has_key ("Output", "PathFolder")) { - savePathFolder = keyFile.get_string ("Output", "PathFolder"); + if (keyFile.has_key("Output", "PathTemplate")) { + savePathTemplate = keyFile.get_string("Output", "PathTemplate"); } - if (keyFile.has_key ("Output", "AutoSuffix")) { - autoSuffix = keyFile.get_boolean ("Output", "AutoSuffix"); + if (keyFile.has_key("Output", "PathFolder")) { + savePathFolder = keyFile.get_string("Output", "PathFolder"); } - if (keyFile.has_key ("Output", "ForceFormatOpts")) { - forceFormatOpts = keyFile.get_boolean ("Output", "ForceFormatOpts"); + if (keyFile.has_key("Output", "AutoSuffix")) { + autoSuffix = keyFile.get_boolean("Output", "AutoSuffix"); } - if (keyFile.has_key ("Output", "SaveMethodNum")) { - saveMethodNum = keyFile.get_integer ("Output", "SaveMethodNum"); + if (keyFile.has_key("Output", "ForceFormatOpts")) { + forceFormatOpts = keyFile.get_boolean("Output", "ForceFormatOpts"); } - if (keyFile.has_key ("Output", "UsePathTemplate")) { - saveUsePathTemplate = keyFile.get_boolean ("Output", "UsePathTemplate"); + if (keyFile.has_key("Output", "SaveMethodNum")) { + saveMethodNum = keyFile.get_integer("Output", "SaveMethodNum"); } - if (keyFile.has_key ("Output", "LastSaveAsPath")) { - lastSaveAsPath = keyFile.get_string ("Output", "LastSaveAsPath"); + if (keyFile.has_key("Output", "UsePathTemplate")) { + saveUsePathTemplate = keyFile.get_boolean("Output", "UsePathTemplate"); } - if (keyFile.has_key ("Output", "OverwriteOutputFile")) { - overwriteOutputFile = keyFile.get_boolean ("Output", "OverwriteOutputFile"); + if (keyFile.has_key("Output", "LastSaveAsPath")) { + lastSaveAsPath = keyFile.get_string("Output", "LastSaveAsPath"); + } + + if (keyFile.has_key("Output", "OverwriteOutputFile")) { + overwriteOutputFile = keyFile.get_boolean("Output", "OverwriteOutputFile"); } } - if (keyFile.has_group ("Profiles")) { - if (keyFile.has_key ("Profiles", "Directory")) { - profilePath = keyFile.get_string ("Profiles", "Directory"); + if (keyFile.has_group("Profiles")) { + if (keyFile.has_key("Profiles", "Directory")) { + profilePath = keyFile.get_string("Profiles", "Directory"); } - if (keyFile.has_key ("Profiles", "UseBundledProfiles")) { - useBundledProfiles = keyFile.get_boolean ("Profiles", "UseBundledProfiles"); + if (keyFile.has_key("Profiles", "UseBundledProfiles")) { + useBundledProfiles = keyFile.get_boolean("Profiles", "UseBundledProfiles"); } - if (keyFile.has_key ("Profiles", "LoadSaveProfilePath")) { - loadSaveProfilePath = keyFile.get_string ("Profiles", "LoadSaveProfilePath"); + if (keyFile.has_key("Profiles", "LoadSaveProfilePath")) { + loadSaveProfilePath = keyFile.get_string("Profiles", "LoadSaveProfilePath"); } - if (keyFile.has_key ("Profiles", "RawDefault")) { - defProfRaw = keyFile.get_string ("Profiles", "RawDefault"); + if (keyFile.has_key("Profiles", "RawDefault")) { + defProfRaw = keyFile.get_string("Profiles", "RawDefault"); } - if (keyFile.has_key ("Profiles", "ImgDefault")) { - defProfImg = keyFile.get_string ("Profiles", "ImgDefault"); + if (keyFile.has_key("Profiles", "ImgDefault")) { + defProfImg = keyFile.get_string("Profiles", "ImgDefault"); } - if (keyFile.has_key ("Profiles", "FilledProfile")) { - filledProfile = keyFile.get_boolean ("Profiles", "FilledProfile"); + if (keyFile.has_key("Profiles", "FilledProfile")) { + filledProfile = keyFile.get_boolean("Profiles", "FilledProfile"); } - if (keyFile.has_key ("Profiles", "SaveParamsWithFile")) { - saveParamsFile = keyFile.get_boolean ("Profiles", "SaveParamsWithFile"); + if (keyFile.has_key("Profiles", "SaveParamsWithFile")) { + saveParamsFile = keyFile.get_boolean("Profiles", "SaveParamsWithFile"); } - if (keyFile.has_key ("Profiles", "SaveParamsToCache")) { - saveParamsCache = keyFile.get_boolean ("Profiles", "SaveParamsToCache"); + if (keyFile.has_key("Profiles", "SaveParamsToCache")) { + saveParamsCache = keyFile.get_boolean("Profiles", "SaveParamsToCache"); } - if (keyFile.has_key ("Profiles", "LoadParamsFromLocation")) { - paramsLoadLocation = (PPLoadLocation)keyFile.get_integer ("Profiles", "LoadParamsFromLocation"); + if (keyFile.has_key("Profiles", "LoadParamsFromLocation")) { + paramsLoadLocation = (PPLoadLocation)keyFile.get_integer("Profiles", "LoadParamsFromLocation"); } - if (keyFile.has_key ("Profiles", "CustomProfileBuilder")) { - CPBPath = keyFile.get_string ("Profiles", "CustomProfileBuilder"); // for backward compatibility only + if (keyFile.has_key("Profiles", "CustomProfileBuilder")) { + CPBPath = keyFile.get_string("Profiles", "CustomProfileBuilder"); // for backward compatibility only } - if (keyFile.has_key ("Profiles", "CustomProfileBuilderPath")) { - CPBPath = keyFile.get_string ("Profiles", "CustomProfileBuilderPath"); + if (keyFile.has_key("Profiles", "CustomProfileBuilderPath")) { + CPBPath = keyFile.get_string("Profiles", "CustomProfileBuilderPath"); } - if (keyFile.has_key ("Profiles", "CustomProfileBuilderKeys")) { - CPBKeys = (CPBKeyType)keyFile.get_integer ("Profiles", "CustomProfileBuilderKeys"); + if (keyFile.has_key("Profiles", "CustomProfileBuilderKeys")) { + CPBKeys = (CPBKeyType)keyFile.get_integer("Profiles", "CustomProfileBuilderKeys"); } } - if (keyFile.has_group ("File Browser")) { - if (keyFile.has_key ("File Browser", "ThumbnailSize")) { - thumbSize = keyFile.get_integer ("File Browser", "ThumbnailSize"); + if (keyFile.has_group("File Browser")) { + if (keyFile.has_key("File Browser", "ThumbnailSize")) { + thumbSize = keyFile.get_integer("File Browser", "ThumbnailSize"); } - if (keyFile.has_key ("File Browser", "ThumbnailSizeTab")) { - thumbSizeTab = keyFile.get_integer ("File Browser", "ThumbnailSizeTab"); + if (keyFile.has_key("File Browser", "ThumbnailSizeTab")) { + thumbSizeTab = keyFile.get_integer("File Browser", "ThumbnailSizeTab"); } - if (keyFile.has_key ("File Browser", "ThumbnailSizeQueue")) { - thumbSizeQueue = keyFile.get_integer ("File Browser", "ThumbnailSizeQueue"); + if (keyFile.has_key("File Browser", "ThumbnailSizeQueue")) { + thumbSizeQueue = keyFile.get_integer("File Browser", "ThumbnailSizeQueue"); } - if (keyFile.has_key ("File Browser", "SameThumbSize")) { - sameThumbSize = keyFile.get_integer ("File Browser", "SameThumbSize"); + if (keyFile.has_key("File Browser", "SameThumbSize")) { + sameThumbSize = keyFile.get_integer("File Browser", "SameThumbSize"); } - if (keyFile.has_key ("File Browser", "BrowseOnlyRaw")) { - fbOnlyRaw = keyFile.get_boolean ("File Browser", "BrowseOnlyRaw"); + if (keyFile.has_key("File Browser", "BrowseOnlyRaw")) { + fbOnlyRaw = keyFile.get_boolean("File Browser", "BrowseOnlyRaw"); } - if (keyFile.has_key ("File Browser", "BrowserShowsDate")) { - fbShowDateTime = keyFile.get_boolean ("File Browser", "BrowserShowsDate"); + if (keyFile.has_key("File Browser", "BrowserShowsDate")) { + fbShowDateTime = keyFile.get_boolean("File Browser", "BrowserShowsDate"); } - if (keyFile.has_key ("File Browser", "BrowserShowsExif")) { - fbShowBasicExif = keyFile.get_boolean ("File Browser", "BrowserShowsExif"); + if (keyFile.has_key("File Browser", "BrowserShowsExif")) { + fbShowBasicExif = keyFile.get_boolean("File Browser", "BrowserShowsExif"); } - if (keyFile.has_key ("File Browser", "BrowserShowsExpComp")) { - fbShowExpComp = keyFile.get_boolean ("File Browser", "BrowserShowsExpComp"); + if (keyFile.has_key("File Browser", "BrowserShowsExpComp")) { + fbShowExpComp = keyFile.get_boolean("File Browser", "BrowserShowsExpComp"); } - if (keyFile.has_key ("File Browser", "BrowserShowsHidden")) { - fbShowHidden = keyFile.get_boolean ("File Browser", "BrowserShowsHidden"); +#ifndef WIN32 + if (keyFile.has_key("File Browser", "BrowserShowsHidden")) { + fbShowHidden = keyFile.get_boolean("File Browser", "BrowserShowsHidden"); + } +#endif + + if (keyFile.has_key("File Browser", "MaxPreviewHeight")) { + maxThumbnailHeight = keyFile.get_integer("File Browser", "MaxPreviewHeight"); } - if (keyFile.has_key ("File Browser", "MaxPreviewHeight")) { - maxThumbnailHeight = keyFile.get_integer ("File Browser", "MaxPreviewHeight"); + if (keyFile.has_key("File Browser", "MaxCacheEntries")) { + maxCacheEntries = keyFile.get_integer("File Browser", "MaxCacheEntries"); } - if (keyFile.has_key ("File Browser", "MaxCacheEntries")) { - maxCacheEntries = keyFile.get_integer ("File Browser", "MaxCacheEntries"); + if (keyFile.has_key("File Browser", "ParseExtensions")) { + auto l = keyFile.get_string_list("File Browser", "ParseExtensions"); + if (!l.empty()) { + parseExtensions = l; + } } - if (keyFile.has_key ("File Browser", "ParseExtensions")) { - parseExtensions = keyFile.get_string_list ("File Browser", "ParseExtensions"); + if (keyFile.has_key("File Browser", "ParseExtensionsEnabled")) { + auto l = keyFile.get_integer_list("File Browser", "ParseExtensionsEnabled"); + if (!l.empty()) { + parseExtensionsEnabled = l; + } } - if (keyFile.has_key ("File Browser", "ParseExtensionsEnabled")) { - parseExtensionsEnabled = keyFile.get_integer_list ("File Browser", "ParseExtensionsEnabled"); + if (keyFile.has_key("File Browser", "ThumbnailArrangement")) { + fbArrangement = keyFile.get_integer("File Browser", "ThumbnailArrangement"); } - if (keyFile.has_key ("File Browser", "ThumbnailArrangement")) { - fbArrangement = keyFile.get_integer ("File Browser", "ThumbnailArrangement"); + if (keyFile.has_key("File Browser", "ThumbnailInterpolation")) { + thumbInterp = keyFile.get_integer("File Browser", "ThumbnailInterpolation"); } - if (keyFile.has_key ("File Browser", "ThumbnailInterpolation")) { - thumbInterp = keyFile.get_integer ("File Browser", "ThumbnailInterpolation"); + if (keyFile.has_key("File Browser", "FavoriteDirs")) { + favoriteDirs = keyFile.get_string_list("File Browser", "FavoriteDirs"); } - if (keyFile.has_key ("File Browser", "FavoriteDirs")) { - favoriteDirs = keyFile.get_string_list ("File Browser", "FavoriteDirs"); + if (keyFile.has_key("File Browser", "RenameTemplates")) { + renameTemplates = keyFile.get_string_list("File Browser", "RenameTemplates"); } - if (keyFile.has_key ("File Browser", "RenameTemplates")) { - renameTemplates = keyFile.get_string_list ("File Browser", "RenameTemplates"); + if (keyFile.has_key("File Browser", "RenameUseTemplates")) { + renameUseTemplates = keyFile.get_boolean("File Browser", "RenameUseTemplates"); } - if (keyFile.has_key ("File Browser", "RenameUseTemplates")) { - renameUseTemplates = keyFile.get_boolean ("File Browser", "RenameUseTemplates"); + if (keyFile.has_key("File Browser", "ThumbnailZoomRatios")) { + thumbnailZoomRatios = keyFile.get_double_list("File Browser", "ThumbnailZoomRatios"); } - if (keyFile.has_key ("File Browser", "ThumbnailZoomRatios")) { - thumbnailZoomRatios = keyFile.get_double_list ("File Browser", "ThumbnailZoomRatios"); + if (keyFile.has_key("File Browser", "OverlayedFileNames")) { + overlayedFileNames = keyFile.get_boolean("File Browser", "OverlayedFileNames"); } - if (keyFile.has_key ("File Browser", "OverlayedFileNames")) { - overlayedFileNames = keyFile.get_boolean ("File Browser", "OverlayedFileNames"); + if (keyFile.has_key("File Browser", "FilmStripOverlayedFileNames")) { + filmStripOverlayedFileNames = keyFile.get_boolean("File Browser", "FilmStripOverlayedFileNames"); } - if (keyFile.has_key ("File Browser", "FilmStripOverlayedFileNames")) { - filmStripOverlayedFileNames = keyFile.get_boolean ("File Browser", "FilmStripOverlayedFileNames"); + if (keyFile.has_key("File Browser", "ShowFileNames")) { + showFileNames = keyFile.get_boolean("File Browser", "ShowFileNames"); } - if (keyFile.has_key ("File Browser", "ShowFileNames")) { - showFileNames = keyFile.get_boolean ("File Browser", "ShowFileNames"); + if (keyFile.has_key("File Browser", "FilmStripShowFileNames")) { + filmStripShowFileNames = keyFile.get_boolean("File Browser", "FilmStripShowFileNames"); } - if (keyFile.has_key ("File Browser", "FilmStripShowFileNames")) { - filmStripShowFileNames = keyFile.get_boolean ("File Browser", "FilmStripShowFileNames"); + if (keyFile.has_key("File Browser", "InternalThumbIfUntouched")) { + internalThumbIfUntouched = keyFile.get_boolean("File Browser", "InternalThumbIfUntouched"); } - if (keyFile.has_key ("File Browser", "InternalThumbIfUntouched")) { - internalThumbIfUntouched = keyFile.get_boolean ("File Browser", "InternalThumbIfUntouched"); + if (keyFile.has_key("File Browser", "menuGroupRank")) { + menuGroupRank = keyFile.get_boolean("File Browser", "menuGroupRank"); } - if (keyFile.has_key ("File Browser", "menuGroupRank")) { - menuGroupRank = keyFile.get_boolean ("File Browser", "menuGroupRank"); + if (keyFile.has_key("File Browser", "menuGroupLabel")) { + menuGroupLabel = keyFile.get_boolean("File Browser", "menuGroupLabel"); } - if (keyFile.has_key ("File Browser", "menuGroupLabel")) { - menuGroupLabel = keyFile.get_boolean ("File Browser", "menuGroupLabel"); + if (keyFile.has_key("File Browser", "menuGroupFileOperations")) { + menuGroupFileOperations = keyFile.get_boolean("File Browser", "menuGroupFileOperations"); } - if (keyFile.has_key ("File Browser", "menuGroupFileOperations")) { - menuGroupFileOperations = keyFile.get_boolean ("File Browser", "menuGroupFileOperations"); + if (keyFile.has_key("File Browser", "menuGroupProfileOperations")) { + menuGroupProfileOperations = keyFile.get_boolean("File Browser", "menuGroupProfileOperations"); } - if (keyFile.has_key ("File Browser", "menuGroupProfileOperations")) { - menuGroupProfileOperations = keyFile.get_boolean ("File Browser", "menuGroupProfileOperations"); + if (keyFile.has_key("File Browser", "menuGroupExtProg")) { + menuGroupExtProg = keyFile.get_boolean("File Browser", "menuGroupExtProg"); } - if (keyFile.has_key ("File Browser", "menuGroupExtProg")) { - menuGroupExtProg = keyFile.get_boolean ("File Browser", "menuGroupExtProg"); + if (keyFile.has_key("File Browser", "MaxRecentFolders")) { + maxRecentFolders = keyFile.get_integer("File Browser", "MaxRecentFolders"); } - if (keyFile.has_key ("File Browser", "MaxRecentFolders")) { - maxRecentFolders = keyFile.get_integer ("File Browser", "MaxRecentFolders"); - } + recentFolders.reserve(maxRecentFolders + 10); // reserve some more than maxRecentFolders, because at runtime it stores more than that - recentFolders.reserve (maxRecentFolders + 10); // reserve some more than maxRecentFolders, because at runtime it stores more than that - - if (keyFile.has_key ("File Browser", "RecentFolders")) { - recentFolders = keyFile.get_string_list ("File Browser", "RecentFolders"); + if (keyFile.has_key("File Browser", "RecentFolders")) { + recentFolders = keyFile.get_string_list("File Browser", "RecentFolders"); } } - if (keyFile.has_group ("Clipping Indication")) { - if (keyFile.has_key ("Clipping Indication", "HighlightThreshold")) { - highlightThreshold = keyFile.get_integer ("Clipping Indication", "HighlightThreshold"); + if (keyFile.has_group("Clipping Indication")) { + if (keyFile.has_key("Clipping Indication", "HighlightThreshold")) { + highlightThreshold = keyFile.get_integer("Clipping Indication", "HighlightThreshold"); } - if (keyFile.has_key ("Clipping Indication", "ShadowThreshold")) { - shadowThreshold = keyFile.get_integer ("Clipping Indication", "ShadowThreshold"); + if (keyFile.has_key("Clipping Indication", "ShadowThreshold")) { + shadowThreshold = keyFile.get_integer("Clipping Indication", "ShadowThreshold"); } - if (keyFile.has_key ("Clipping Indication", "BlinkClipped")) { - blinkClipped = keyFile.get_boolean ("Clipping Indication", "BlinkClipped"); + if (keyFile.has_key("Clipping Indication", "BlinkClipped")) { + blinkClipped = keyFile.get_boolean("Clipping Indication", "BlinkClipped"); } } - if (keyFile.has_group ("Performance")) { - if (keyFile.has_key ("Performance", "RgbDenoiseThreadLimit")) { - rgbDenoiseThreadLimit = keyFile.get_integer ("Performance", "RgbDenoiseThreadLimit"); + if (keyFile.has_group("Performance")) { + if (keyFile.has_key("Performance", "RgbDenoiseThreadLimit")) { + rgbDenoiseThreadLimit = keyFile.get_integer("Performance", "RgbDenoiseThreadLimit"); } - if ( keyFile.has_key ("Performance", "NRauto")) { - rtSettings.nrauto = keyFile.get_double ("Performance", "NRauto"); + if (keyFile.has_key("Performance", "ClutCacheSize")) { + clutCacheSize = keyFile.get_integer("Performance", "ClutCacheSize"); } - if ( keyFile.has_key ("Performance", "NRautomax")) { - rtSettings.nrautomax = keyFile.get_double ("Performance", "NRautomax"); + if (keyFile.has_key("Performance", "MaxInspectorBuffers")) { + maxInspectorBuffers = keyFile.get_integer("Performance", "MaxInspectorBuffers"); } - if ( keyFile.has_key ("Performance", "NRhigh")) { - rtSettings.nrhigh = keyFile.get_double ("Performance", "NRhigh"); + if (keyFile.has_key("Performance", "InspectorDelay")) { + inspectorDelay = keyFile.get_integer("Performance", "InspectorDelay"); } - if (rtSettings.nrhigh == 0.0) { //avoid crash by division by zero in noise reduction - rtSettings.nrhigh = 0.45; + if (keyFile.has_key("Performance", "PreviewDemosaicFromSidecar")) { + prevdemo = (prevdemo_t)keyFile.get_integer("Performance", "PreviewDemosaicFromSidecar"); } - if ( keyFile.has_key ("Performance", "NRWavlevel")) { - rtSettings.nrwavlevel = keyFile.get_integer ("Performance", "NRWavlevel"); + if (keyFile.has_key("Performance", "SerializeTiffRead")) { + serializeTiffRead = keyFile.get_boolean("Performance", "SerializeTiffRead"); } - if (keyFile.has_key ("Performance", "LevNR")) { - rtSettings.leveldnv = keyFile.get_integer ("Performance", "LevNR"); + if (keyFile.has_key("Performance", "Measure")) { + measure = keyFile.get_boolean("Performance", "Measure"); } - if (keyFile.has_key ("Performance", "LevNRTI")) { - rtSettings.leveldnti = keyFile.get_integer ("Performance", "LevNRTI"); + if (keyFile.has_key("Performance", "ChunkSizeAMAZE")) { + chunkSizeAMAZE = std::min(16, std::max(1, keyFile.get_integer("Performance", "ChunkSizeAMAZE"))); } - if (keyFile.has_key ("Performance", "LevNRAUT")) { - rtSettings.leveldnaut = keyFile.get_integer ("Performance", "LevNRAUT"); + if (keyFile.has_key("Performance", "ChunkSizeCA")) { + chunkSizeCA = std::min(16, std::max(1, keyFile.get_integer("Performance", "ChunkSizeCA"))); } - if (keyFile.has_key ("Performance", "LevNRLISS")) { - rtSettings.leveldnliss = keyFile.get_integer ("Performance", "LevNRLISS"); + if (keyFile.has_key("Performance", "ChunkSizeRCD")) { + chunkSizeRCD = std::min(16, std::max(1, keyFile.get_integer("Performance", "ChunkSizeRCD"))); } - if (keyFile.has_key ("Performance", "SIMPLNRAUT")) { - rtSettings.leveldnautsimpl = keyFile.get_integer ("Performance", "SIMPLNRAUT"); + if (keyFile.has_key("Performance", "ChunkSizeRGB")) { + chunkSizeRGB = std::min(16, std::max(1, keyFile.get_integer("Performance", "ChunkSizeRGB"))); } - if (keyFile.has_key ("Performance", "ClutCacheSize")) { - clutCacheSize = keyFile.get_integer ("Performance", "ClutCacheSize"); + if (keyFile.has_key("Performance", "ChunkSizeXT")) { + chunkSizeXT = std::min(16, std::max(1, keyFile.get_integer("Performance", "ChunkSizeXT"))); } - if (keyFile.has_key ("Performance", "MaxInspectorBuffers")) { - maxInspectorBuffers = keyFile.get_integer ("Performance", "MaxInspectorBuffers"); - } - - if (keyFile.has_key ("Performance", "PreviewDemosaicFromSidecar")) { - prevdemo = (prevdemo_t)keyFile.get_integer ("Performance", "PreviewDemosaicFromSidecar"); - } - - if (keyFile.has_key ("Performance", "Daubechies")) { - rtSettings.daubech = keyFile.get_boolean ("Performance", "Daubechies"); - } - - if (keyFile.has_key ("Performance", "SerializeTiffRead")) { - serializeTiffRead = keyFile.get_boolean ("Performance", "SerializeTiffRead"); + if (keyFile.has_key("Performance", "ThumbnailInspectorMode")) { + rtSettings.thumbnail_inspector_mode = static_cast(keyFile.get_integer("Performance", "ThumbnailInspectorMode")); } } - if (keyFile.has_group ("GUI")) { - if (keyFile.has_key ("GUI", "WindowWidth")) { - windowWidth = keyFile.get_integer ("GUI", "WindowWidth"); + if (keyFile.has_group("GUI")) { + if (keyFile.has_key("GUI", "Favorites")) { + favorites = keyFile.get_string_list("GUI", "Favorites"); } - if (keyFile.has_key ("GUI", "WindowHeight")) { - windowHeight = keyFile.get_integer ("GUI", "WindowHeight"); + if (keyFile.has_key("GUI", "WindowWidth")) { + windowWidth = keyFile.get_integer("GUI", "WindowWidth"); } - if (keyFile.has_key ("GUI", "WindowX")) { - windowX = keyFile.get_integer ("GUI", "WindowX"); + if (keyFile.has_key("GUI", "WindowHeight")) { + windowHeight = keyFile.get_integer("GUI", "WindowHeight"); } - if (keyFile.has_key ("GUI", "WindowY")) { - windowY = keyFile.get_integer ("GUI", "WindowY"); + if (keyFile.has_key("GUI", "WindowX")) { + windowX = keyFile.get_integer("GUI", "WindowX"); } - if (keyFile.has_key ("GUI", "WindowMonitor")) { - windowMonitor = keyFile.get_integer ("GUI", "WindowMonitor"); + if (keyFile.has_key("GUI", "WindowY")) { + windowY = keyFile.get_integer("GUI", "WindowY"); } - if (keyFile.has_key ("GUI", "MeowMonitor")) { - meowMonitor = keyFile.get_integer ("GUI", "MeowMonitor"); + if (keyFile.has_key("GUI", "WindowMonitor")) { + windowMonitor = keyFile.get_integer("GUI", "WindowMonitor"); } - if (keyFile.has_key ("GUI", "MeowFullScreen")) { - meowFullScreen = keyFile.get_boolean ("GUI", "MeowFullScreen"); + if (keyFile.has_key("GUI", "MeowMonitor")) { + meowMonitor = keyFile.get_integer("GUI", "MeowMonitor"); } - if (keyFile.has_key ("GUI", "MeowMaximized")) { - meowMaximized = keyFile.get_boolean ("GUI", "MeowMaximized"); + if (keyFile.has_key("GUI", "MeowFullScreen")) { + meowFullScreen = keyFile.get_boolean("GUI", "MeowFullScreen"); } - if (keyFile.has_key ("GUI", "MeowWidth")) { - meowWidth = keyFile.get_integer ("GUI", "MeowWidth"); + if (keyFile.has_key("GUI", "MeowMaximized")) { + meowMaximized = keyFile.get_boolean("GUI", "MeowMaximized"); } - if (keyFile.has_key ("GUI", "MeowHeight")) { - meowHeight = keyFile.get_integer ("GUI", "MeowHeight"); + if (keyFile.has_key("GUI", "MeowWidth")) { + meowWidth = keyFile.get_integer("GUI", "MeowWidth"); } - if (keyFile.has_key ("GUI", "MeowX")) { - meowX = keyFile.get_integer ("GUI", "MeowX"); + if (keyFile.has_key("GUI", "MeowHeight")) { + meowHeight = keyFile.get_integer("GUI", "MeowHeight"); } - if (keyFile.has_key ("GUI", "MeowY")) { - meowY = keyFile.get_integer ("GUI", "MeowY"); + if (keyFile.has_key("GUI", "MeowX")) { + meowX = keyFile.get_integer("GUI", "MeowX"); } - if (keyFile.has_key ("GUI", "WindowMaximized")) { - windowMaximized = keyFile.get_boolean ("GUI", "WindowMaximized"); + if (keyFile.has_key("GUI", "MeowY")) { + meowY = keyFile.get_integer("GUI", "MeowY"); } - if (keyFile.has_key ("GUI", "DetailWindowWidth")) { - detailWindowWidth = keyFile.get_integer ("GUI", "DetailWindowWidth"); + if (keyFile.has_key("GUI", "WindowMaximized")) { + windowMaximized = keyFile.get_boolean("GUI", "WindowMaximized"); } - if (keyFile.has_key ("GUI", "DetailWindowHeight")) { - detailWindowHeight = keyFile.get_integer ("GUI", "DetailWindowHeight"); + if (keyFile.has_key("GUI", "DetailWindowWidth")) { + detailWindowWidth = keyFile.get_integer("GUI", "DetailWindowWidth"); } - if (keyFile.has_key ("GUI", "DirBrowserWidth")) { - dirBrowserWidth = keyFile.get_integer ("GUI", "DirBrowserWidth"); + if (keyFile.has_key("GUI", "DetailWindowHeight")) { + detailWindowHeight = keyFile.get_integer("GUI", "DetailWindowHeight"); } - if (keyFile.has_key ("GUI", "DirBrowserHeight")) { - dirBrowserHeight = keyFile.get_integer ("GUI", "DirBrowserHeight"); + if (keyFile.has_key("GUI", "DirBrowserWidth")) { + dirBrowserWidth = keyFile.get_integer("GUI", "DirBrowserWidth"); } - if (keyFile.has_key ("GUI", "SortType")) { - dirBrowserSortType = static_cast (keyFile.get_integer ("GUI", "SortType")); + if (keyFile.has_key("GUI", "DirBrowserHeight")) { + dirBrowserHeight = keyFile.get_integer("GUI", "DirBrowserHeight"); } - if (keyFile.has_key ("GUI", "PreferencesWidth")) { - preferencesWidth = keyFile.get_integer ("GUI", "PreferencesWidth"); + if (keyFile.has_key("GUI", "SortType")) { + dirBrowserSortType = static_cast(keyFile.get_integer("GUI", "SortType")); } - if (keyFile.has_key ("GUI", "PreferencesHeight")) { - preferencesHeight = keyFile.get_integer ("GUI", "PreferencesHeight"); + if (keyFile.has_key("GUI", "PreferencesWidth")) { + preferencesWidth = keyFile.get_integer("GUI", "PreferencesWidth"); } - if (keyFile.has_key ("GUI", "SaveAsDialogWidth")) { - saveAsDialogWidth = keyFile.get_integer ("GUI", "SaveAsDialogWidth"); + if (keyFile.has_key("GUI", "PreferencesHeight")) { + preferencesHeight = keyFile.get_integer("GUI", "PreferencesHeight"); } - if (keyFile.has_key ("GUI", "SaveAsDialogHeight")) { - saveAsDialogHeight = keyFile.get_integer ("GUI", "SaveAsDialogHeight"); + if (keyFile.has_key("GUI", "SaveAsDialogWidth")) { + saveAsDialogWidth = keyFile.get_integer("GUI", "SaveAsDialogWidth"); } - if (keyFile.has_key ("GUI", "ToolPanelWidth")) { - toolPanelWidth = keyFile.get_integer ("GUI", "ToolPanelWidth"); + if (keyFile.has_key("GUI", "SaveAsDialogHeight")) { + saveAsDialogHeight = keyFile.get_integer("GUI", "SaveAsDialogHeight"); } - if (keyFile.has_key ("GUI", "BrowserToolPanelWidth")) { - browserToolPanelWidth = keyFile.get_integer ("GUI", "BrowserToolPanelWidth"); + if (keyFile.has_key("GUI", "ToolPanelWidth")) { + toolPanelWidth = keyFile.get_integer("GUI", "ToolPanelWidth"); } - if (keyFile.has_key ("GUI", "BrowserToolPanelHeight")) { - browserToolPanelHeight = keyFile.get_integer ("GUI", "BrowserToolPanelHeight"); + if (keyFile.has_key("GUI", "BrowserToolPanelWidth")) { + browserToolPanelWidth = keyFile.get_integer("GUI", "BrowserToolPanelWidth"); } - if (keyFile.has_key ("GUI", "BrowserToolPanelOpened")) { - browserToolPanelOpened = keyFile.get_boolean ("GUI", "BrowserToolPanelOpened"); + if (keyFile.has_key("GUI", "BrowserToolPanelHeight")) { + browserToolPanelHeight = keyFile.get_integer("GUI", "BrowserToolPanelHeight"); } - if (keyFile.has_key ("GUI", "BrowserDirPanelOpened")) { - browserDirPanelOpened = keyFile.get_boolean ("GUI", "BrowserDirPanelOpened"); + if (keyFile.has_key("GUI", "BrowserToolPanelOpened")) { + browserToolPanelOpened = keyFile.get_boolean("GUI", "BrowserToolPanelOpened"); } - if (keyFile.has_key ("GUI", "EditorFilmStripOpened")) { - editorFilmStripOpened = keyFile.get_boolean ("GUI", "EditorFilmStripOpened"); + if (keyFile.has_key("GUI", "BrowserDirPanelOpened")) { + browserDirPanelOpened = keyFile.get_boolean("GUI", "BrowserDirPanelOpened"); } - if (keyFile.has_key ("GUI", "HistoryPanelWidth")) { - historyPanelWidth = keyFile.get_integer ("GUI", "HistoryPanelWidth"); + if (keyFile.has_key("GUI", "EditorFilmStripOpened")) { + editorFilmStripOpened = keyFile.get_boolean("GUI", "EditorFilmStripOpened"); } - if (keyFile.has_key ("GUI", "FontFamily")) { - fontFamily = keyFile.get_string ("GUI", "FontFamily"); + if (keyFile.has_key("GUI", "HistoryPanelWidth")) { + historyPanelWidth = keyFile.get_integer("GUI", "HistoryPanelWidth"); } - if (keyFile.has_key ("GUI", "FontSize")) { - fontSize = keyFile.get_integer ("GUI", "FontSize"); + if (keyFile.has_key("GUI", "FontFamily")) { + fontFamily = keyFile.get_string("GUI", "FontFamily"); } - if (keyFile.has_key ("GUI", "CPFontFamily")) { - CPFontFamily = keyFile.get_string ("GUI", "CPFontFamily"); + if (keyFile.has_key("GUI", "FontSize")) { + fontSize = keyFile.get_integer("GUI", "FontSize"); } - if (keyFile.has_key ("GUI", "CPFontSize")) { - CPFontSize = keyFile.get_integer ("GUI", "CPFontSize"); + if (keyFile.has_key("GUI", "CPFontFamily")) { + CPFontFamily = keyFile.get_string("GUI", "CPFontFamily"); } - if (keyFile.has_key ("GUI", "LastPreviewScale")) { - lastScale = keyFile.get_integer ("GUI", "LastPreviewScale"); + if (keyFile.has_key("GUI", "CPFontSize")) { + CPFontSize = keyFile.get_integer("GUI", "CPFontSize"); } - if (keyFile.has_key ("GUI", "LastShowAllExif")) { - lastShowAllExif = keyFile.get_boolean ("GUI", "LastShowAllExif"); + if (keyFile.has_key("GUI", "LastPreviewScale")) { + lastScale = keyFile.get_integer("GUI", "LastPreviewScale"); } - if (keyFile.has_key ("GUI", "PanAccelFactor")) { - panAccelFactor = keyFile.get_integer ("GUI", "PanAccelFactor"); + if (keyFile.has_key("GUI", "LastShowAllExif")) { + lastShowAllExif = keyFile.get_boolean("GUI", "LastShowAllExif"); } - if (keyFile.has_key ("GUI", "RememberZoomAndPan")) { - rememberZoomAndPan = keyFile.get_boolean ("GUI", "RememberZoomAndPan"); + if (keyFile.has_key("GUI", "PanAccelFactor")) { + panAccelFactor = keyFile.get_integer("GUI", "PanAccelFactor"); } - if (keyFile.has_key ("GUI", "LastCropSize")) { - lastCropSize = keyFile.get_integer ("GUI", "LastCropSize"); + if (keyFile.has_key("GUI", "RememberZoomAndPan")) { + rememberZoomAndPan = keyFile.get_boolean("GUI", "RememberZoomAndPan"); } - if (keyFile.has_key ("GUI", "ShowHistory")) { - showHistory = keyFile.get_boolean ("GUI", "ShowHistory"); + if (keyFile.has_key("GUI", "LastCropSize")) { + lastCropSize = keyFile.get_integer("GUI", "LastCropSize"); } - if (keyFile.has_key ("GUI", "ShowFilePanelState")) { - showFilePanelState = keyFile.get_integer ("GUI", "ShowFilePanelState"); + if (keyFile.has_key("GUI", "ShowHistory")) { + showHistory = keyFile.get_boolean("GUI", "ShowHistory"); } - if (keyFile.has_key ("GUI", "ShowInfo")) { - showInfo = keyFile.get_boolean ("GUI", "ShowInfo"); + if (keyFile.has_key("GUI", "ShowFilePanelState")) { + showFilePanelState = keyFile.get_integer("GUI", "ShowFilePanelState"); } - if (keyFile.has_key ("GUI", "MainNBVertical")) { - mainNBVertical = keyFile.get_boolean ("GUI", "MainNBVertical"); + if (keyFile.has_key("GUI", "ShowInfo")) { + showInfo = keyFile.get_boolean("GUI", "ShowInfo"); } - if (keyFile.has_key ("GUI", "ShowClippedHighlights")) { - showClippedHighlights = keyFile.get_boolean ("GUI", "ShowClippedHighlights"); + if (keyFile.has_key("GUI", "MainNBVertical")) { + mainNBVertical = keyFile.get_boolean("GUI", "MainNBVertical"); } - if (keyFile.has_key ("GUI", "ShowClippedShadows")) { - showClippedShadows = keyFile.get_boolean ("GUI", "ShowClippedShadows"); + if (keyFile.has_key("GUI", "ShowClippedHighlights")) { + showClippedHighlights = keyFile.get_boolean("GUI", "ShowClippedHighlights"); } - if (keyFile.has_key ("GUI", "FrameColor")) { - bgcolor = keyFile.get_integer ("GUI", "FrameColor"); + if (keyFile.has_key("GUI", "ShowClippedShadows")) { + showClippedShadows = keyFile.get_boolean("GUI", "ShowClippedShadows"); } - if (keyFile.has_key ("GUI", "ProcessingQueueEnbled")) { - procQueueEnabled = keyFile.get_boolean ("GUI", "ProcessingQueueEnbled"); + if (keyFile.has_key("GUI", "FrameColor")) { + bgcolor = keyFile.get_integer("GUI", "FrameColor"); } - if (keyFile.has_key ("GUI", "ToolPanelsExpanded")) { - tpOpen = keyFile.get_integer_list ("GUI", "ToolPanelsExpanded"); + if (keyFile.has_key("GUI", "ProcessingQueueEnbled")) { + procQueueEnabled = keyFile.get_boolean("GUI", "ProcessingQueueEnbled"); } - if (keyFile.has_key ("GUI", "ToolPanelsExpandedAutoSave")) { - autoSaveTpOpen = keyFile.get_boolean ("GUI", "ToolPanelsExpandedAutoSave"); + if (keyFile.has_key("GUI", "ToolPanelsExpanded")) { + tpOpen = keyFile.get_integer_list("GUI", "ToolPanelsExpanded"); } - if (keyFile.has_key ("GUI", "MultiDisplayMode")) { - multiDisplayMode = keyFile.get_integer ("GUI", "MultiDisplayMode"); + if (keyFile.has_key("GUI", "ToolPanelsExpandedAutoSave")) { + autoSaveTpOpen = keyFile.get_boolean("GUI", "ToolPanelsExpandedAutoSave"); + } + + if (keyFile.has_key("GUI", "MultiDisplayMode")) { + multiDisplayMode = keyFile.get_integer("GUI", "MultiDisplayMode"); } //if (keyFile.has_key ("GUI", "CurvePanelsExpanded")) crvOpen = keyFile.get_integer_list ("GUI", "CurvePanelsExpanded"); - if (keyFile.has_key ("GUI", "CutOverlayBrush")) { - cutOverlayBrush = keyFile.get_double_list ("GUI", "CutOverlayBrush"); + if (keyFile.has_key("GUI", "CutOverlayBrush")) { + cutOverlayBrush = keyFile.get_double_list("GUI", "CutOverlayBrush"); } - if (keyFile.has_key ("GUI", "NavGuideBrush")) { - navGuideBrush = keyFile.get_double_list ("GUI", "NavGuideBrush"); + if (keyFile.has_key("GUI", "NavGuideBrush")) { + navGuideBrush = keyFile.get_double_list("GUI", "NavGuideBrush"); } - if (keyFile.has_key ("GUI", "HistogramPosition")) { - histogramPosition = keyFile.get_integer ("GUI", "HistogramPosition"); + if (keyFile.has_key("GUI", "HistogramPosition")) { + histogramPosition = keyFile.get_integer("GUI", "HistogramPosition"); } - if (keyFile.has_key ("GUI", "HistogramBar")) { - histogramBar = keyFile.get_boolean ("GUI", "HistogramBar"); + if (keyFile.has_key("GUI", "HistogramRed")) { + histogramRed = keyFile.get_boolean("GUI", "HistogramRed"); } - if (keyFile.has_key ("GUI", "HistogramFullMode")) { - histogramFullMode = keyFile.get_boolean ("GUI", "HistogramFullMode"); + if (keyFile.has_key("GUI", "HistogramGreen")) { + histogramGreen = keyFile.get_boolean("GUI", "HistogramGreen"); } - if (keyFile.has_key ("GUI", "NavigatorRGBUnit")) { - navRGBUnit = (NavigatorUnit)keyFile.get_integer ("GUI", "NavigatorRGBUnit"); + if (keyFile.has_key("GUI", "HistogramBlue")) { + histogramBlue = keyFile.get_boolean("GUI", "HistogramBlue"); } - if (keyFile.has_key ("GUI", "NavigatorHSVUnit")) { - navHSVUnit = (NavigatorUnit)keyFile.get_integer ("GUI", "NavigatorHSVUnit"); + if (keyFile.has_key("GUI", "HistogramLuma")) { + histogramLuma = keyFile.get_boolean("GUI", "HistogramLuma"); } - if (keyFile.has_key ("GUI", "ShowFilmStripToolBar")) { - showFilmStripToolBar = keyFile.get_boolean ("GUI", "ShowFilmStripToolBar"); + if (keyFile.has_key("GUI", "HistogramChroma")) { + histogramChroma = keyFile.get_boolean("GUI", "HistogramChroma"); } - if (keyFile.has_key ("GUI", "FileBrowserToolbarSingleRow")) { - FileBrowserToolbarSingleRow = keyFile.get_boolean ("GUI", "FileBrowserToolbarSingleRow"); + if (keyFile.has_key("GUI", "HistogramRAW")) { + histogramRAW = keyFile.get_boolean("GUI", "HistogramRAW"); } -#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"); + if (keyFile.has_key("GUI", "HistogramBar")) { + histogramBar = keyFile.get_boolean("GUI", "HistogramBar"); } - if (keyFile.has_key ("GUI", "HistogramWorking")) { - rtSettings.HistogramWorking = keyFile.get_boolean ("GUI", "HistogramWorking"); + if (keyFile.has_key ("GUI", "HistogramHeight")) { + histogramHeight = keyFile.get_integer ("GUI", "HistogramHeight"); } - if (keyFile.has_key ("GUI", "CurveBBoxPosition")) { - curvebboxpos = keyFile.get_integer ("GUI", "CurveBBoxPosition"); + if (keyFile.has_key ("GUI", "HistogramDrawMode")) { + histogramDrawMode = keyFile.get_integer ("GUI", "HistogramDrawMode"); + } + + if (keyFile.has_key("GUI", "NavigatorRGBUnit")) { + navRGBUnit = (NavigatorUnit)keyFile.get_integer("GUI", "NavigatorRGBUnit"); + } + + if (keyFile.has_key("GUI", "NavigatorHSVUnit")) { + navHSVUnit = (NavigatorUnit)keyFile.get_integer("GUI", "NavigatorHSVUnit"); + } + + if (keyFile.has_key("GUI", "ShowFilmStripToolBar")) { + showFilmStripToolBar = keyFile.get_boolean("GUI", "ShowFilmStripToolBar"); + } + + if (keyFile.has_key("GUI", "FileBrowserToolbarSingleRow")) { + FileBrowserToolbarSingleRow = keyFile.get_boolean("GUI", "FileBrowserToolbarSingleRow"); + } + + if (keyFile.has_key("GUI", "HideTPVScrollbar")) { + hideTPVScrollbar = keyFile.get_boolean("GUI", "HideTPVScrollbar"); + } + + if (keyFile.has_key("GUI", "HistogramWorking")) { + rtSettings.HistogramWorking = keyFile.get_boolean("GUI", "HistogramWorking"); + } + + if (keyFile.has_key("GUI", "CurveBBoxPosition")) { + curvebboxpos = keyFile.get_integer("GUI", "CurveBBoxPosition"); } } - if (keyFile.has_group ("Crop Settings")) { - if (keyFile.has_key ("Crop Settings", "PPI")) { - cropPPI = keyFile.get_integer ("Crop Settings", "PPI"); + if (keyFile.has_group("Crop Settings")) { + 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")) { - if (keyFile.has_key ("Color Management", "ICCDirectory")) { - rtSettings.iccDirectory = keyFile.get_string ("Color Management", "ICCDirectory"); + if (keyFile.has_group("Color Management")) { + if (keyFile.has_key("Color Management", "ICCDirectory")) { + rtSettings.iccDirectory = keyFile.get_string("Color Management", "ICCDirectory"); } - if (keyFile.has_key ("Color Management", "PrinterIntent")) { - rtSettings.printerIntent = static_cast (keyFile.get_integer ("Color Management", "PrinterIntent")); + if (keyFile.has_key("Color Management", "PrinterIntent")) { + rtSettings.printerIntent = static_cast(keyFile.get_integer("Color Management", "PrinterIntent")); } - if (keyFile.has_key ("Color Management", "PrinterBPC")) { - rtSettings.printerBPC = keyFile.get_boolean ("Color Management", "PrinterBPC"); + if (keyFile.has_key("Color Management", "PrinterBPC")) { + rtSettings.printerBPC = keyFile.get_boolean("Color Management", "PrinterBPC"); } - if (keyFile.has_key ("Color Management", "PrinterProfile")) { - rtSettings.printerProfile = keyFile.get_string ("Color Management", "PrinterProfile"); + if (keyFile.has_key("Color Management", "PrinterProfile")) { + rtSettings.printerProfile = keyFile.get_string("Color Management", "PrinterProfile"); } - if (keyFile.has_key ("Color Management", "MonitorProfile")) { - rtSettings.monitorProfile = keyFile.get_string ("Color Management", "MonitorProfile"); + if (keyFile.has_key("Color Management", "MonitorProfile")) { + rtSettings.monitorProfile = keyFile.get_string("Color Management", "MonitorProfile"); } - if (keyFile.has_key ("Color Management", "AutoMonitorProfile")) { - rtSettings.autoMonitorProfile = keyFile.get_boolean ("Color Management", "AutoMonitorProfile"); + if (keyFile.has_key("Color Management", "AutoMonitorProfile")) { + rtSettings.autoMonitorProfile = keyFile.get_boolean("Color Management", "AutoMonitorProfile"); } - if (keyFile.has_key ("Color Management", "Autocielab")) { - rtSettings.autocielab = keyFile.get_boolean ("Color Management", "Autocielab"); + if (keyFile.has_key("Color Management", "Autocielab")) { + rtSettings.autocielab = keyFile.get_boolean("Color Management", "Autocielab"); } - if (keyFile.has_key ("Color Management", "RGBcurvesLumamode_Gamut")) { - rtSettings.rgbcurveslumamode_gamut = keyFile.get_boolean ("Color Management", "RGBcurvesLumamode_Gamut"); + if (keyFile.has_key("Color Management", "RGBcurvesLumamode_Gamut")) { + rtSettings.rgbcurveslumamode_gamut = keyFile.get_boolean("Color Management", "RGBcurvesLumamode_Gamut"); } - if (keyFile.has_key ("Color Management", "Intent")) { - rtSettings.monitorIntent = static_cast (keyFile.get_integer ("Color Management", "Intent")); + if (keyFile.has_key("Color Management", "Intent")) { + rtSettings.monitorIntent = static_cast(keyFile.get_integer("Color Management", "Intent")); } - if (keyFile.has_key ("Color Management", "MonitorBPC")) { - rtSettings.monitorBPC = keyFile.get_boolean ("Color Management", "MonitorBPC"); + if (keyFile.has_key("Color Management", "MonitorBPC")) { + rtSettings.monitorBPC = keyFile.get_boolean("Color Management", "MonitorBPC"); } - if (keyFile.has_key ("Color Management", "CRI")) { - rtSettings.CRI_color = keyFile.get_integer ("Color Management", "CRI"); + if (keyFile.has_key("Color Management", "CRI")) { + rtSettings.CRI_color = keyFile.get_integer("Color Management", "CRI"); } - if (keyFile.has_key ("Color Management", "DenoiseLabgamma")) { - rtSettings.denoiselabgamma = keyFile.get_integer ("Color Management", "DenoiseLabgamma"); + if (keyFile.has_key("Color Management", "DenoiseLabgamma")) { + rtSettings.denoiselabgamma = keyFile.get_integer("Color Management", "DenoiseLabgamma"); } /* @@ -1411,345 +1471,411 @@ void Options::readFromFile (Glib::ustring fname) rtSettings.viewinggreySc = keyFile.get_integer ("Color Management", "greySc"); } */ - if (keyFile.has_key ("Color Management", "CBDLArtif")) { - rtSettings.artifact_cbdl = keyFile.get_double ("Color Management", "CBDLArtif"); + + if (keyFile.has_key("Color Management", "CBDLlevel0")) { + rtSettings.level0_cbdl = keyFile.get_double("Color Management", "CBDLlevel0"); } - if (keyFile.has_key ("Color Management", "CBDLlevel0")) { - rtSettings.level0_cbdl = keyFile.get_double ("Color Management", "CBDLlevel0"); - } - - if (keyFile.has_key ("Color Management", "CBDLlevel123")) { - rtSettings.level123_cbdl = keyFile.get_double ("Color Management", "CBDLlevel123"); + if (keyFile.has_key("Color Management", "CBDLlevel123")) { + rtSettings.level123_cbdl = keyFile.get_double("Color Management", "CBDLlevel123"); } //if (keyFile.has_key ("Color Management", "Colortoningab")) rtSettings.colortoningab = keyFile.get_double("Color Management", "Colortoningab"); //if (keyFile.has_key ("Color Management", "Decaction")) rtSettings.decaction = keyFile.get_double("Color Management", "Decaction"); - if (keyFile.has_key ("Color Management", "WhiteBalanceSpotSize")) { - whiteBalanceSpotSize = keyFile.get_integer ("Color Management", "WhiteBalanceSpotSize"); + if (keyFile.has_key("Color Management", "WhiteBalanceSpotSize")) { + whiteBalanceSpotSize = keyFile.get_integer("Color Management", "WhiteBalanceSpotSize"); } - if ( keyFile.has_key ("Color Management", "GamutICC")) { - rtSettings.gamutICC = keyFile.get_boolean ("Color Management", "GamutICC"); + if (keyFile.has_key("Color Management", "GamutICC")) { + rtSettings.gamutICC = keyFile.get_boolean("Color Management", "GamutICC"); } - //if ( keyFile.has_key ("Color Management", "BWcomplement")) rtSettings.bw_complementary = keyFile.get_boolean("Color Management", "BWcomplement"); - if ( keyFile.has_key ("Color Management", "Ciecamfloat")) { - rtSettings.ciecamfloat = keyFile.get_boolean ("Color Management", "Ciecamfloat"); + if (keyFile.has_key("Color Management", "AdobeRGB")) { + rtSettings.adobe = keyFile.get_string("Color Management", "AdobeRGB"); + if (rtSettings.adobe == "RT_Medium_gsRGB" || rtSettings.adobe == "RTv4_Medium") { + rtSettings.adobe = "RTv2_Medium"; + } } - if ( keyFile.has_key ("Color Management", "AdobeRGB")) { - rtSettings.adobe = keyFile.get_string ("Color Management", "AdobeRGB"); + if (keyFile.has_key("Color Management", "ProPhoto")) { + rtSettings.prophoto = keyFile.get_string("Color Management", "ProPhoto"); + if (rtSettings.prophoto == "RT_Large_gBT709" || rtSettings.prophoto == "RTv4_Large") { + rtSettings.prophoto = "RTv2_Large"; + } } - if ( keyFile.has_key ("Color Management", "ProPhoto")) { - rtSettings.prophoto = keyFile.get_string ("Color Management", "ProPhoto"); + if (keyFile.has_key("Color Management", "WideGamut")) { + rtSettings.widegamut = keyFile.get_string("Color Management", "WideGamut"); + if (rtSettings.widegamut == "WideGamutRGB" || rtSettings.widegamut == "RTv4_Wide") { + rtSettings.widegamut = "RTv2_Wide"; + } } - if ( keyFile.has_key ("Color Management", "ProPhoto10")) { - rtSettings.prophoto10 = keyFile.get_string ("Color Management", "ProPhoto10"); + if (keyFile.has_key("Color Management", "sRGB")) { + rtSettings.srgb = keyFile.get_string("Color Management", "sRGB"); + if (rtSettings.srgb == "RT_sRGB" || rtSettings.srgb == "RTv2_sRGB") { + rtSettings.srgb = "RTv4_sRGB"; + } } - if ( keyFile.has_key ("Color Management", "WideGamut")) { - rtSettings.widegamut = keyFile.get_string ("Color Management", "WideGamut"); + if (keyFile.has_key("Color Management", "Beta")) { + rtSettings.beta = keyFile.get_string("Color Management", "Beta"); + if (rtSettings.beta == "BetaRGB" || rtSettings.beta == "RTv4_Beta") { + rtSettings.beta = "RTv2_Beta"; + } } - if ( keyFile.has_key ("Color Management", "sRGB")) { - rtSettings.srgb = keyFile.get_string ("Color Management", "sRGB"); + if (keyFile.has_key("Color Management", "Best")) { + rtSettings.best = keyFile.get_string("Color Management", "Best"); + if (rtSettings.best == "BestRGB" || rtSettings.best == "RTv4_Best") { + rtSettings.best = "RTv2_Best"; + } } - if ( keyFile.has_key ("Color Management", "sRGB10")) { - rtSettings.srgb10 = keyFile.get_string ("Color Management", "sRGB10"); + if (keyFile.has_key("Color Management", "Rec2020")) { + rtSettings.rec2020 = keyFile.get_string("Color Management", "Rec2020"); + if (rtSettings.rec2020 == "Rec2020" || rtSettings.rec2020 == "RTv4_Rec2020") { + rtSettings.rec2020 = "RTv2_Rec2020"; + } } - if ( keyFile.has_key ("Color Management", "Beta")) { - rtSettings.beta = keyFile.get_string ("Color Management", "Beta"); + if (keyFile.has_key("Color Management", "Bruce")) { + rtSettings.bruce = keyFile.get_string("Color Management", "Bruce"); + if (rtSettings.bruce == "Bruce" || rtSettings.bruce == "RTv4_Bruce") { + rtSettings.bruce = "RTv2_Bruce"; + } } - if ( keyFile.has_key ("Color Management", "Best")) { - rtSettings.best = keyFile.get_string ("Color Management", "Best"); + if (keyFile.has_key("Color Management", "ACES-AP0")) { + rtSettings.ACESp0 = keyFile.get_string("Color Management", "ACES-AP0"); + if (rtSettings.ACESp0 == "RTv4_ACES-AP0") { + rtSettings.ACESp0 = "RTv2_ACES-AP0"; + } + } - if ( keyFile.has_key ("Color Management", "Rec2020")) { - rtSettings.rec2020 = keyFile.get_string ("Color Management", "Rec2020"); + if (keyFile.has_key("Color Management", "ACES-AP1")) { + rtSettings.ACESp1 = keyFile.get_string("Color Management", "ACES-AP1"); + if (rtSettings.ACESp1 == "RTv4_ACES-AP1") { + rtSettings.ACESp1 = "RTv2_ACES-AP1"; + } + } - if ( keyFile.has_key ("Color Management", "Bruce")) { - rtSettings.bruce = keyFile.get_string ("Color Management", "Bruce"); + if (keyFile.has_key("Color Management", "GamutLch")) { + rtSettings.gamutLch = keyFile.get_boolean("Color Management", "GamutLch"); } - if ( keyFile.has_key ("Color Management", "GamutLch")) { - rtSettings.gamutLch = keyFile.get_boolean ("Color Management", "GamutLch"); + if (keyFile.has_key("Color Management", "ProtectRed")) { + rtSettings.protectred = keyFile.get_integer("Color Management", "ProtectRed"); } - if ( keyFile.has_key ("Color Management", "ProtectRed")) { - rtSettings.protectred = keyFile.get_integer ("Color Management", "ProtectRed"); + if (keyFile.has_key("Color Management", "ProtectRedH")) { + rtSettings.protectredh = keyFile.get_double("Color Management", "ProtectRedH"); } - if ( keyFile.has_key ("Color Management", "ProtectRedH")) { - rtSettings.protectredh = keyFile.get_double ("Color Management", "ProtectRedH"); + if (keyFile.has_key("Color Management", "Amountchroma")) { + rtSettings.amchroma = keyFile.get_integer("Color Management", "Amountchroma"); } - if ( keyFile.has_key ("Color Management", "Amountchroma")) { - rtSettings.amchroma = keyFile.get_integer ("Color Management", "Amountchroma"); - } - - if ( keyFile.has_key ("Color Management", "ClutsDirectory")) { - clutsDir = keyFile.get_string ("Color Management", "ClutsDirectory"); + if (keyFile.has_key("Color Management", "ClutsDirectory")) { + clutsDir = keyFile.get_string("Color Management", "ClutsDirectory"); } //if( keyFile.has_key ("Color Management", "Ciebadpixgauss")) rtSettings.ciebadpixgauss = keyFile.get_boolean("Color Management", "Ciebadpixgauss"); } - if (keyFile.has_group ("Batch Processing")) { - if (keyFile.has_key ("Batch Processing", "AdjusterBehavior")) { - baBehav = keyFile.get_integer_list ("Batch Processing", "AdjusterBehavior"); + if (keyFile.has_group("ICC Profile Creator")) { + if (keyFile.has_key("ICC Profile Creator", "PimariesPreset")) { + ICCPC_primariesPreset = keyFile.get_string("ICC Profile Creator", "PimariesPreset"); + } + if (keyFile.has_key("ICC Profile Creator", "RedPrimaryX")) { + ICCPC_redPrimaryX = keyFile.get_double("ICC Profile Creator", "RedPrimaryX"); + } + if (keyFile.has_key("ICC Profile Creator", "RedPrimaryY")) { + ICCPC_redPrimaryY = keyFile.get_double("ICC Profile Creator", "RedPrimaryY"); + } + if (keyFile.has_key("ICC Profile Creator", "GreenPrimaryX")) { + ICCPC_greenPrimaryX = keyFile.get_double("ICC Profile Creator", "GreenPrimaryX"); + } + if (keyFile.has_key("ICC Profile Creator", "GreenPrimaryY")) { + ICCPC_greenPrimaryY = keyFile.get_double("ICC Profile Creator", "GreenPrimaryY"); + } + if (keyFile.has_key("ICC Profile Creator", "BluePrimaryX")) { + ICCPC_bluePrimaryX = keyFile.get_double("ICC Profile Creator", "BluePrimaryX"); + } + if (keyFile.has_key("ICC Profile Creator", "BluePrimaryY")) { + ICCPC_bluePrimaryY = keyFile.get_double("ICC Profile Creator", "BluePrimaryY"); + } + if (keyFile.has_key("ICC Profile Creator", "GammaPreset")) { + ICCPC_gammaPreset = keyFile.get_string("ICC Profile Creator", "GammaPreset"); + } + if (keyFile.has_key("ICC Profile Creator", "Gamma")) { + ICCPC_gamma = keyFile.get_double("ICC Profile Creator", "Gamma"); + } + if (keyFile.has_key("ICC Profile Creator", "Slope")) { + ICCPC_slope = keyFile.get_double("ICC Profile Creator", "Slope"); + } + if (keyFile.has_key("ICC Profile Creator", "ProfileVersion")) { + ICCPC_profileVersion = keyFile.get_string("ICC Profile Creator", "ProfileVersion"); + } + if (keyFile.has_key("ICC Profile Creator", "Illuminant")) { + ICCPC_illuminant = keyFile.get_string("ICC Profile Creator", "Illuminant"); + } + if (keyFile.has_key("ICC Profile Creator", "Description")) { + ICCPC_description = keyFile.get_string("ICC Profile Creator", "Description"); + } + if (keyFile.has_key("ICC Profile Creator", "Copyright")) { + ICCPC_copyright = keyFile.get_string("ICC Profile Creator", "Copyright"); + } + if (keyFile.has_key("ICC Profile Creator", "AppendParamsToDesc")) { + ICCPC_appendParamsToDesc = keyFile.get_boolean("ICC Profile Creator", "AppendParamsToDesc"); } } - if (keyFile.has_group ("Sounds")) { - if (keyFile.has_key ("Sounds", "Enable")) { - sndEnable = keyFile.get_boolean ("Sounds", "Enable"); - } - - if (keyFile.has_key ("Sounds", "BatchQueueDone")) { - sndBatchQueueDone = keyFile.get_string ("Sounds", "BatchQueueDone"); - } - - if (keyFile.has_key ("Sounds", "LngEditProcDone")) { - sndLngEditProcDone = keyFile.get_string ("Sounds", "LngEditProcDone"); - } - - if (keyFile.has_key ("Sounds", "LngEditProcDoneSecs")) { - sndLngEditProcDoneSecs = keyFile.get_double ("Sounds", "LngEditProcDoneSecs"); + if (keyFile.has_group("Batch Processing")) { + if (keyFile.has_key("Batch Processing", "AdjusterBehavior")) { + baBehav = keyFile.get_integer_list("Batch Processing", "AdjusterBehavior"); + baBehav.resize(ADDSET_PARAM_NUM); } } - if (keyFile.has_group ("Fast Export")) { - if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpening" )) { - fastexport_bypass_sharpening = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpening" ); + if (keyFile.has_group("Sounds")) { + if (keyFile.has_key("Sounds", "Enable")) { + sndEnable = keyFile.get_boolean("Sounds", "Enable"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpenEdge" )) { - fastexport_bypass_sharpenEdge = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpenEdge" ); + if (keyFile.has_key("Sounds", "BatchQueueDone")) { + sndBatchQueueDone = keyFile.get_string("Sounds", "BatchQueueDone"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_sharpenMicro" )) { - fastexport_bypass_sharpenMicro = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sharpenMicro" ); + if (keyFile.has_key("Sounds", "LngEditProcDone")) { + sndLngEditProcDone = keyFile.get_string("Sounds", "LngEditProcDone"); + } + + if (keyFile.has_key("Sounds", "LngEditProcDoneSecs")) { + sndLngEditProcDoneSecs = keyFile.get_double("Sounds", "LngEditProcDoneSecs"); + } + } + + if (keyFile.has_group("Fast Export")) { + if (keyFile.has_key("Fast Export", "fastexport_bypass_sharpening")) { + fastexport_bypass_sharpening = keyFile.get_boolean("Fast Export", "fastexport_bypass_sharpening"); + } + + if (keyFile.has_key("Fast Export", "fastexport_bypass_sharpenEdge")) { + fastexport_bypass_sharpenEdge = keyFile.get_boolean("Fast Export", "fastexport_bypass_sharpenEdge"); + } + + if (keyFile.has_key("Fast Export", "fastexport_bypass_sharpenMicro")) { + fastexport_bypass_sharpenMicro = keyFile.get_boolean("Fast Export", "fastexport_bypass_sharpenMicro"); } //if (keyFile.has_key ("Fast Export", "fastexport_bypass_lumaDenoise" )) fastexport_bypass_lumaDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" ); //if (keyFile.has_key ("Fast Export", "fastexport_bypass_colorDenoise" )) fastexport_bypass_colorDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_colorDenoise" ); - if (keyFile.has_key ("Fast Export", "fastexport_bypass_defringe" )) { - fastexport_bypass_defringe = keyFile.get_boolean ("Fast Export", "fastexport_bypass_defringe" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_defringe")) { + fastexport_bypass_defringe = keyFile.get_boolean("Fast Export", "fastexport_bypass_defringe"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_dirpyrDenoise" )) { - fastexport_bypass_dirpyrDenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_dirpyrDenoise")) { + fastexport_bypass_dirpyrDenoise = keyFile.get_boolean("Fast Export", "fastexport_bypass_dirpyrDenoise"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_sh_hq" )) { - fastexport_bypass_sh_hq = keyFile.get_boolean ("Fast Export", "fastexport_bypass_sh_hq" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_dirpyrequalizer")) { + fastexport_bypass_dirpyrequalizer = keyFile.get_boolean("Fast Export", "fastexport_bypass_dirpyrequalizer"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_dirpyrequalizer" )) { - fastexport_bypass_dirpyrequalizer = keyFile.get_boolean ("Fast Export", "fastexport_bypass_dirpyrequalizer" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_wavelet")) { + fastexport_bypass_wavelet = keyFile.get_boolean("Fast Export", "fastexport_bypass_wavelet"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_wavelet" )) { - fastexport_bypass_wavelet = keyFile.get_boolean ("Fast Export", "fastexport_bypass_wavelet" ); + if (keyFile.has_key("Fast Export", "fastexport_raw_dmethod")) { + fastexport_raw_bayer_method = keyFile.get_string("Fast Export", "fastexport_raw_dmethod"); } - if (keyFile.has_key ("Fast Export", "fastexport_raw_dmethod" )) { - fastexport_raw_bayer_method = keyFile.get_string ("Fast Export", "fastexport_raw_dmethod" ); - } - - if (keyFile.has_key ("Fast Export", "fastexport_raw_bayer_method" )) { - fastexport_raw_bayer_method = keyFile.get_string ("Fast Export", "fastexport_raw_bayer_method" ); + if (keyFile.has_key("Fast Export", "fastexport_raw_bayer_method")) { + fastexport_raw_bayer_method = keyFile.get_string("Fast Export", "fastexport_raw_bayer_method"); } //if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_bayer_all_enhance" )) fastexport_bypass_raw_bayer_all_enhance = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_all_enhance" ); - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_dcb_iterations" )) { - fastexport_bypass_raw_bayer_dcb_iterations = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_dcb_iterations" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_dcb_iterations")) { + fastexport_bypass_raw_bayer_dcb_iterations = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_dcb_iterations"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations" )) { - fastexport_bypass_raw_bayer_dcb_iterations = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations")) { + fastexport_bypass_raw_bayer_dcb_iterations = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_dcb_enhance" )) { - fastexport_bypass_raw_bayer_dcb_enhance = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_dcb_enhance" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_dcb_enhance")) { + fastexport_bypass_raw_bayer_dcb_enhance = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_dcb_enhance"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance" )) { - fastexport_bypass_raw_bayer_dcb_enhance = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance")) { + fastexport_bypass_raw_bayer_dcb_enhance = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_lmmse_iterations" )) { - fastexport_bypass_raw_bayer_lmmse_iterations = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_lmmse_iterations" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_lmmse_iterations")) { + fastexport_bypass_raw_bayer_lmmse_iterations = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_lmmse_iterations"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations")) { - fastexport_bypass_raw_bayer_lmmse_iterations = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations"); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations")) { + fastexport_bypass_raw_bayer_lmmse_iterations = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_linenoise" )) { - fastexport_bypass_raw_bayer_linenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_linenoise" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_linenoise")) { + fastexport_bypass_raw_bayer_linenoise = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_linenoise"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_bayer_linenoise" )) { - fastexport_bypass_raw_bayer_linenoise = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_bayer_linenoise" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_bayer_linenoise")) { + fastexport_bypass_raw_bayer_linenoise = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_bayer_linenoise"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_greenthresh" )) { - fastexport_bypass_raw_bayer_greenthresh = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_greenthresh" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_greenthresh")) { + fastexport_bypass_raw_bayer_greenthresh = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_greenthresh"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_bayer_greenthresh" )) { - fastexport_bypass_raw_bayer_greenthresh = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_bayer_greenthresh" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_bayer_greenthresh")) { + fastexport_bypass_raw_bayer_greenthresh = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_bayer_greenthresh"); } - if (keyFile.has_key ("Fast Export", "fastexport_raw_xtrans_method" )) { - fastexport_raw_xtrans_method = keyFile.get_string ("Fast Export", "fastexport_raw_xtrans_method" ); + if (keyFile.has_key("Fast Export", "fastexport_raw_xtrans_method")) { + fastexport_raw_xtrans_method = keyFile.get_string("Fast Export", "fastexport_raw_xtrans_method"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_ccSteps" )) { - fastexport_bypass_raw_ccSteps = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_ccSteps" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_ccSteps")) { + fastexport_bypass_raw_ccSteps = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_ccSteps"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_ca" )) { - fastexport_bypass_raw_ca = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_ca" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_ca")) { + fastexport_bypass_raw_ca = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_ca"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_df" )) { - fastexport_bypass_raw_df = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_df" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_df")) { + fastexport_bypass_raw_df = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_df"); } - if (keyFile.has_key ("Fast Export", "fastexport_bypass_raw_ff" )) { - fastexport_bypass_raw_ff = keyFile.get_boolean ("Fast Export", "fastexport_bypass_raw_ff" ); + if (keyFile.has_key("Fast Export", "fastexport_bypass_raw_ff")) { + fastexport_bypass_raw_ff = keyFile.get_boolean("Fast Export", "fastexport_bypass_raw_ff"); } - if (keyFile.has_key ("Fast Export", "fastexport_icm_input" )) { - fastexport_icm_input = keyFile.get_string ("Fast Export", "fastexport_icm_input" ); + if (keyFile.has_key("Fast Export", "fastexport_icm_input")) { + fastexport_icm_input_profile = keyFile.get_string("Fast Export", "fastexport_icm_input"); } - if (keyFile.has_key ("Fast Export", "fastexport_icm_working" )) { - fastexport_icm_working = keyFile.get_string ("Fast Export", "fastexport_icm_working" ); + if (keyFile.has_key("Fast Export", "fastexport_icm_working")) { + fastexport_icm_working_profile = keyFile.get_string("Fast Export", "fastexport_icm_working"); } - if (keyFile.has_key ("Fast Export", "fastexport_icm_output" )) { - fastexport_icm_output = keyFile.get_string ("Fast Export", "fastexport_icm_output" ); + if (keyFile.has_key("Fast Export", "fastexport_icm_output")) { + fastexport_icm_output_profile = keyFile.get_string("Fast Export", "fastexport_icm_output"); } - if (keyFile.has_key ("Fast Export", "fastexport_icm_output_intent" )) { - fastexport_icm_outputIntent = static_cast (keyFile.get_integer ("Fast Export", "fastexport_icm_output_intent" )); + if (keyFile.has_key("Fast Export", "fastexport_icm_output_intent")) { + fastexport_icm_outputIntent = static_cast(keyFile.get_integer("Fast Export", "fastexport_icm_output_intent")); } - if (keyFile.has_key ("Fast Export", "fastexport_icm_output_bpc" )) { - fastexport_icm_outputBPC = keyFile.get_boolean ("Fast Export", "fastexport_icm_output_bpc" ); + if (keyFile.has_key("Fast Export", "fastexport_icm_output_bpc")) { + fastexport_icm_outputBPC = keyFile.get_boolean("Fast Export", "fastexport_icm_output_bpc"); } - if (keyFile.has_key ("Fast Export", "fastexport_icm_gamma" )) { - fastexport_icm_gamma = keyFile.get_string ("Fast Export", "fastexport_icm_gamma" ); + if (keyFile.has_key("Fast Export", "fastexport_resize_enabled")) { + fastexport_resize_enabled = keyFile.get_boolean("Fast Export", "fastexport_resize_enabled"); } - if (keyFile.has_key ("Fast Export", "fastexport_resize_enabled" )) { - fastexport_resize_enabled = keyFile.get_boolean ("Fast Export", "fastexport_resize_enabled" ); + if (keyFile.has_key("Fast Export", "fastexport_resize_scale")) { + fastexport_resize_scale = keyFile.get_double("Fast Export", "fastexport_resize_scale"); } - if (keyFile.has_key ("Fast Export", "fastexport_resize_scale" )) { - fastexport_resize_scale = keyFile.get_double ("Fast Export", "fastexport_resize_scale" ); + if (keyFile.has_key("Fast Export", "fastexport_resize_appliesTo")) { + fastexport_resize_appliesTo = keyFile.get_string("Fast Export", "fastexport_resize_appliesTo"); } - if (keyFile.has_key ("Fast Export", "fastexport_resize_appliesTo" )) { - fastexport_resize_appliesTo = keyFile.get_string ("Fast Export", "fastexport_resize_appliesTo" ); + if (keyFile.has_key("Fast Export", "fastexport_resize_method")) { + fastexport_resize_method = keyFile.get_string("Fast Export", "fastexport_resize_method"); } - if (keyFile.has_key ("Fast Export", "fastexport_resize_method" )) { - fastexport_resize_method = keyFile.get_string ("Fast Export", "fastexport_resize_method" ); + if (keyFile.has_key("Fast Export", "fastexport_resize_dataspec")) { + fastexport_resize_dataspec = keyFile.get_integer("Fast Export", "fastexport_resize_dataspec"); } - if (keyFile.has_key ("Fast Export", "fastexport_resize_dataspec" )) { - fastexport_resize_dataspec = keyFile.get_integer ("Fast Export", "fastexport_resize_dataspec" ); + if (keyFile.has_key("Fast Export", "fastexport_resize_width")) { + fastexport_resize_width = keyFile.get_integer("Fast Export", "fastexport_resize_width"); } - if (keyFile.has_key ("Fast Export", "fastexport_resize_width" )) { - fastexport_resize_width = keyFile.get_integer ("Fast Export", "fastexport_resize_width" ); + if (keyFile.has_key("Fast Export", "fastexport_resize_height")) { + fastexport_resize_height = keyFile.get_integer("Fast Export", "fastexport_resize_height"); } - if (keyFile.has_key ("Fast Export", "fastexport_resize_height" )) { - fastexport_resize_height = keyFile.get_integer ("Fast Export", "fastexport_resize_height" ); - } - - if (keyFile.has_key ("Fast Export", "fastexport_use_fast_pipeline" )) { - fastexport_use_fast_pipeline = keyFile.get_integer ("Fast Export", "fastexport_use_fast_pipeline" ); + if (keyFile.has_key("Fast Export", "fastexport_use_fast_pipeline")) { + fastexport_use_fast_pipeline = keyFile.get_integer("Fast Export", "fastexport_use_fast_pipeline"); } } - if (keyFile.has_group ("Dialogs")) { - safeDirGet (keyFile, "Dialogs", "LastIccDir", lastIccDir); - safeDirGet (keyFile, "Dialogs", "LastDarkframeDir", lastDarkframeDir); - safeDirGet (keyFile, "Dialogs", "LastFlatfieldDir", lastFlatfieldDir); - safeDirGet (keyFile, "Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastLabCurvesDir", lastLabCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastRetinexDir", lastRetinexDir); - safeDirGet (keyFile, "Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastPFCurvesDir", lastPFCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastBWCurvesDir", lastBWCurvesDir); + if (keyFile.has_group("Dialogs")) { + safeDirGet(keyFile, "Dialogs", "LastIccDir", lastIccDir); + safeDirGet(keyFile, "Dialogs", "LastDarkframeDir", lastDarkframeDir); + safeDirGet(keyFile, "Dialogs", "LastFlatfieldDir", lastFlatfieldDir); + safeDirGet(keyFile, "Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastLabCurvesDir", lastLabCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastRetinexDir", lastRetinexDir); + safeDirGet(keyFile, "Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastPFCurvesDir", lastPFCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastBWCurvesDir", lastBWCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastToneCurvesDir", lastToneCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); - safeDirGet (keyFile, "Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); - safeDirGet (keyFile, "Dialogs", "LastLensProfileDir", lastLensProfileDir); + safeDirGet(keyFile, "Dialogs", "LastToneCurvesDir", lastToneCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); + safeDirGet(keyFile, "Dialogs", "LastLensProfileDir", lastLensProfileDir); + safeDirGet(keyFile, "Dialogs", "LastICCProfCreatorDir", lastICCProfCreatorDir); - if (keyFile.has_key ("Dialogs", "GimpPluginShowInfoDialog")) { - gimpPluginShowInfoDialog = keyFile.get_boolean ("Dialogs", "GimpPluginShowInfoDialog"); + if (keyFile.has_key("Dialogs", "GimpPluginShowInfoDialog")) { + gimpPluginShowInfoDialog = keyFile.get_boolean("Dialogs", "GimpPluginShowInfoDialog"); } } - if (keyFile.has_group ("Lensfun")) { - if (keyFile.has_key ("Lensfun", "DBDirectory")) { - rtSettings.lensfunDbDirectory = keyFile.get_string ("Lensfun", "DBDirectory"); + if (keyFile.has_group("Lensfun")) { + if (keyFile.has_key("Lensfun", "DBDirectory")) { + rtSettings.lensfunDbDirectory = keyFile.get_string("Lensfun", "DBDirectory"); } } // -------------------------------------------------------------------------------------------------------- - filterOutParsedExtensions (); + filterOutParsedExtensions(); return; } } catch (Glib::Error &err) { - Glib::ustring msg = Glib::ustring::compose ("Options::readFromFile / Error code %1 while reading values from \"%2\":\n%3", err.code(), fname, err.what()); + Glib::ustring msg = Glib::ustring::compose("Options::readFromFile / Error code %1 while reading values from \"%2\":\n%3", err.code(), fname, err.what()); if (options.rtSettings.verbose) { - printf ("%s\n", msg.c_str()); + printf("%s\n", msg.c_str()); } - throw Error (msg); + throw Error(msg); } catch (...) { - Glib::ustring msg = Glib::ustring::compose ("Options::readFromFile / Unknown exception while trying to load \"%1\"!", fname); + Glib::ustring msg = Glib::ustring::compose("Options::readFromFile / Unknown exception while trying to load \"%1\"!", fname); if (options.rtSettings.verbose) { - printf ("%s\n", msg.c_str()); + printf("%s\n", msg.c_str()); } - throw Error (msg); + throw Error(msg); } } -bool Options::safeDirGet (const Glib::KeyFile& keyFile, const Glib::ustring& section, - const Glib::ustring& entryName, Glib::ustring& destination) +bool Options::safeDirGet(const Glib::KeyFile& keyFile, const Glib::ustring& section, + const Glib::ustring& entryName, Glib::ustring& destination) { try { - if (keyFile.has_key (section, entryName) && !keyFile.get_string (section, entryName).empty ()) { - destination = keyFile.get_string (section, entryName); + if (keyFile.has_key(section, entryName) && !keyFile.get_string(section, entryName).empty()) { + destination = keyFile.get_string(section, entryName); return true; } @@ -1758,7 +1884,7 @@ bool Options::safeDirGet (const Glib::KeyFile& keyFile, const Glib::ustring& sec return false; } -void Options::saveToFile (Glib::ustring fname) +void Options::saveToFile(Glib::ustring fname) { Glib::ustring keyData; @@ -1767,184 +1893,188 @@ void Options::saveToFile (Glib::ustring fname) Glib::KeyFile keyFile; - keyFile.set_boolean ("General", "TabbedEditor", tabbedUI); - keyFile.set_boolean ("General", "StoreLastProfile", savesParamsAtExit); + keyFile.set_boolean("General", "TabbedEditor", tabbedUI); + keyFile.set_boolean("General", "StoreLastProfile", savesParamsAtExit); if (startupDir == STARTUPDIR_HOME) { - keyFile.set_string ("General", "StartupDirectory", "home"); + keyFile.set_string("General", "StartupDirectory", "home"); } else if (startupDir == STARTUPDIR_CURRENT) { - keyFile.set_string ("General", "StartupDirectory", "current"); + keyFile.set_string("General", "StartupDirectory", "current"); } else if (startupDir == STARTUPDIR_CUSTOM) { - keyFile.set_string ("General", "StartupDirectory", "custom"); + keyFile.set_string("General", "StartupDirectory", "custom"); } else if (startupDir == STARTUPDIR_LAST) { - keyFile.set_string ("General", "StartupDirectory", "last"); + keyFile.set_string("General", "StartupDirectory", "last"); } - keyFile.set_string ("General", "StartupPath", startupPath); - keyFile.set_string ("General", "DateFormat", dateFormat); - keyFile.set_integer ("General", "AdjusterMinDelay", adjusterMinDelay); - keyFile.set_integer ("General", "AdjusterMaxDelay", adjusterMaxDelay); - keyFile.set_boolean ("General", "MultiUser", multiUser); - keyFile.set_string ("General", "Language", language); - keyFile.set_boolean ("General", "LanguageAutoDetect", languageAutoDetect); - keyFile.set_string ("General", "Theme", theme); - keyFile.set_string ("General", "Version", RTVERSION); - keyFile.set_string ("General", "DarkFramesPath", rtSettings.darkFramesPath); - keyFile.set_string ("General", "FlatFieldsPath", rtSettings.flatFieldsPath); - keyFile.set_boolean ("General", "Verbose", rtSettings.verbose); - keyFile.set_integer ("External Editor", "EditorKind", editorToSendTo); - keyFile.set_string ("External Editor", "GimpDir", gimpDir); - keyFile.set_string ("External Editor", "PhotoshopDir", psDir); - keyFile.set_string ("External Editor", "CustomEditor", customEditorProg); + keyFile.set_string("General", "StartupPath", startupPath); + keyFile.set_string("General", "DateFormat", dateFormat); + keyFile.set_integer("General", "AdjusterMinDelay", adjusterMinDelay); + keyFile.set_integer("General", "AdjusterMaxDelay", adjusterMaxDelay); + keyFile.set_boolean("General", "MultiUser", multiUser); + keyFile.set_string("General", "Language", language); + keyFile.set_boolean("General", "LanguageAutoDetect", languageAutoDetect); + keyFile.set_string("General", "Theme", theme); + keyFile.set_string("General", "Version", RTVERSION); + keyFile.set_string("General", "DarkFramesPath", rtSettings.darkFramesPath); + keyFile.set_string("General", "FlatFieldsPath", rtSettings.flatFieldsPath); + keyFile.set_boolean("General", "Verbose", rtSettings.verbose); + keyFile.set_integer("External Editor", "EditorKind", editorToSendTo); + keyFile.set_string("External Editor", "GimpDir", gimpDir); + keyFile.set_string("External Editor", "PhotoshopDir", psDir); + keyFile.set_string("External Editor", "CustomEditor", customEditorProg); - keyFile.set_boolean ("File Browser", "BrowseOnlyRaw", fbOnlyRaw); - keyFile.set_boolean ("File Browser", "BrowserShowsDate", fbShowDateTime); - keyFile.set_boolean ("File Browser", "BrowserShowsExif", fbShowBasicExif); - keyFile.set_boolean ("File Browser", "BrowserShowsExpComp", fbShowExpComp); - keyFile.set_boolean ("File Browser", "BrowserShowsHidden", fbShowHidden); - keyFile.set_integer ("File Browser", "ThumbnailSize", thumbSize); - keyFile.set_integer ("File Browser", "ThumbnailSizeTab", thumbSizeTab); - keyFile.set_integer ("File Browser", "ThumbnailSizeQueue", thumbSizeQueue); - keyFile.set_integer ("File Browser", "SameThumbSize", sameThumbSize); - keyFile.set_integer ("File Browser", "MaxPreviewHeight", maxThumbnailHeight); - keyFile.set_integer ("File Browser", "MaxCacheEntries", maxCacheEntries); + keyFile.set_boolean("File Browser", "BrowseOnlyRaw", fbOnlyRaw); + keyFile.set_boolean("File Browser", "BrowserShowsDate", fbShowDateTime); + keyFile.set_boolean("File Browser", "BrowserShowsExif", fbShowBasicExif); + keyFile.set_boolean("File Browser", "BrowserShowsExpComp", fbShowExpComp); +#ifndef WIN32 + keyFile.set_boolean("File Browser", "BrowserShowsHidden", fbShowHidden); +#endif + keyFile.set_integer("File Browser", "ThumbnailSize", thumbSize); + keyFile.set_integer("File Browser", "ThumbnailSizeTab", thumbSizeTab); + keyFile.set_integer("File Browser", "ThumbnailSizeQueue", thumbSizeQueue); + keyFile.set_integer("File Browser", "SameThumbSize", sameThumbSize); + keyFile.set_integer("File Browser", "MaxPreviewHeight", maxThumbnailHeight); + keyFile.set_integer("File Browser", "MaxCacheEntries", maxCacheEntries); Glib::ArrayHandle pext = parseExtensions; - keyFile.set_string_list ("File Browser", "ParseExtensions", pext); + keyFile.set_string_list("File Browser", "ParseExtensions", pext); Glib::ArrayHandle pextena = parseExtensionsEnabled; - keyFile.set_integer_list ("File Browser", "ParseExtensionsEnabled", pextena); - keyFile.set_integer ("File Browser", "ThumbnailArrangement", fbArrangement); - keyFile.set_integer ("File Browser", "ThumbnailInterpolation", thumbInterp); + keyFile.set_integer_list("File Browser", "ParseExtensionsEnabled", pextena); + keyFile.set_integer("File Browser", "ThumbnailArrangement", fbArrangement); + keyFile.set_integer("File Browser", "ThumbnailInterpolation", thumbInterp); Glib::ArrayHandle pfav = favoriteDirs; - keyFile.set_string_list ("File Browser", "FavoriteDirs", pfav); + keyFile.set_string_list("File Browser", "FavoriteDirs", pfav); Glib::ArrayHandle pren = renameTemplates; - keyFile.set_string_list ("File Browser", "RenameTemplates", pren); - keyFile.set_boolean ("File Browser", "RenameUseTemplates", renameUseTemplates); + keyFile.set_string_list("File Browser", "RenameTemplates", pren); + keyFile.set_boolean("File Browser", "RenameUseTemplates", renameUseTemplates); Glib::ArrayHandle ptzoom = thumbnailZoomRatios; - keyFile.set_double_list ("File Browser", "ThumbnailZoomRatios", ptzoom); - keyFile.set_boolean ("File Browser", "OverlayedFileNames", overlayedFileNames); - keyFile.set_boolean ("File Browser", "FilmStripOverlayedFileNames", filmStripOverlayedFileNames); - keyFile.set_boolean ("File Browser", "ShowFileNames", showFileNames ); - keyFile.set_boolean ("File Browser", "FilmStripShowFileNames", filmStripShowFileNames ); - keyFile.set_boolean ("File Browser", "InternalThumbIfUntouched", internalThumbIfUntouched ); - keyFile.set_boolean ("File Browser", "menuGroupRank", menuGroupRank); - keyFile.set_boolean ("File Browser", "menuGroupLabel", menuGroupLabel); - keyFile.set_boolean ("File Browser", "menuGroupFileOperations", menuGroupFileOperations); - keyFile.set_boolean ("File Browser", "menuGroupProfileOperations", menuGroupProfileOperations); - keyFile.set_boolean ("File Browser", "menuGroupExtProg", menuGroupExtProg); - keyFile.set_integer ("File Browser", "MaxRecentFolders", maxRecentFolders); + keyFile.set_double_list("File Browser", "ThumbnailZoomRatios", ptzoom); + keyFile.set_boolean("File Browser", "OverlayedFileNames", overlayedFileNames); + keyFile.set_boolean("File Browser", "FilmStripOverlayedFileNames", filmStripOverlayedFileNames); + keyFile.set_boolean("File Browser", "ShowFileNames", showFileNames); + keyFile.set_boolean("File Browser", "FilmStripShowFileNames", filmStripShowFileNames); + keyFile.set_boolean("File Browser", "InternalThumbIfUntouched", internalThumbIfUntouched); + keyFile.set_boolean("File Browser", "menuGroupRank", menuGroupRank); + keyFile.set_boolean("File Browser", "menuGroupLabel", menuGroupLabel); + keyFile.set_boolean("File Browser", "menuGroupFileOperations", menuGroupFileOperations); + keyFile.set_boolean("File Browser", "menuGroupProfileOperations", menuGroupProfileOperations); + keyFile.set_boolean("File Browser", "menuGroupExtProg", menuGroupExtProg); + keyFile.set_integer("File Browser", "MaxRecentFolders", maxRecentFolders); { std::vector temp; - temp.reserve (maxRecentFolders); + temp.reserve(maxRecentFolders); - for (unsigned int i = 0; i < std::min (recentFolders.size(), maxRecentFolders); i++) { - temp.push_back (recentFolders[i]); + for (unsigned int i = 0; i < std::min(recentFolders.size(), maxRecentFolders); i++) { + temp.push_back(recentFolders[i]); } - keyFile.set_string_list ("File Browser", "RecentFolders", temp); + keyFile.set_string_list("File Browser", "RecentFolders", temp); } - keyFile.set_integer ("Clipping Indication", "HighlightThreshold", highlightThreshold); - keyFile.set_integer ("Clipping Indication", "ShadowThreshold", shadowThreshold); - keyFile.set_boolean ("Clipping Indication", "BlinkClipped", blinkClipped); + keyFile.set_integer("Clipping Indication", "HighlightThreshold", highlightThreshold); + keyFile.set_integer("Clipping Indication", "ShadowThreshold", shadowThreshold); + keyFile.set_boolean("Clipping Indication", "BlinkClipped", blinkClipped); - keyFile.set_integer ("Performance", "RgbDenoiseThreadLimit", rgbDenoiseThreadLimit); - keyFile.set_double ("Performance", "NRauto", rtSettings.nrauto); - keyFile.set_double ("Performance", "NRautomax", rtSettings.nrautomax); - keyFile.set_double ("Performance", "NRhigh", rtSettings.nrhigh); - keyFile.set_integer ("Performance", "NRWavlevel", rtSettings.nrwavlevel); - keyFile.set_integer ("Performance", "LevNR", rtSettings.leveldnv); - keyFile.set_integer ("Performance", "LevNRTI", rtSettings.leveldnti); - keyFile.set_integer ("Performance", "LevNRAUT", rtSettings.leveldnaut); - keyFile.set_integer ("Performance", "LevNRLISS", rtSettings.leveldnliss); - keyFile.set_integer ("Performance", "SIMPLNRAUT", rtSettings.leveldnautsimpl); - keyFile.set_integer ("Performance", "ClutCacheSize", clutCacheSize); - keyFile.set_integer ("Performance", "MaxInspectorBuffers", maxInspectorBuffers); - keyFile.set_integer ("Performance", "PreviewDemosaicFromSidecar", prevdemo); - keyFile.set_boolean ("Performance", "Daubechies", rtSettings.daubech); - keyFile.set_boolean ("Performance", "SerializeTiffRead", serializeTiffRead); + keyFile.set_integer("Performance", "RgbDenoiseThreadLimit", rgbDenoiseThreadLimit); + keyFile.set_integer("Performance", "ClutCacheSize", clutCacheSize); + keyFile.set_integer("Performance", "MaxInspectorBuffers", maxInspectorBuffers); + keyFile.set_integer("Performance", "InspectorDelay", inspectorDelay); + keyFile.set_integer("Performance", "PreviewDemosaicFromSidecar", prevdemo); + keyFile.set_boolean("Performance", "SerializeTiffRead", serializeTiffRead); + keyFile.set_integer("Performance", "Measure", measure); + keyFile.set_integer("Performance", "ChunkSizeAMAZE", chunkSizeAMAZE); + keyFile.set_integer("Performance", "ChunkSizeRCD", chunkSizeRCD); + keyFile.set_integer("Performance", "ChunkSizeRGB", chunkSizeRGB); + keyFile.set_integer("Performance", "ChunkSizeXT", chunkSizeXT); + keyFile.set_integer("Performance", "ChunkSizeCA", chunkSizeCA); + keyFile.set_integer("Performance", "ThumbnailInspectorMode", int(rtSettings.thumbnail_inspector_mode)); - 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", "PngBps", saveFormat.pngBits); - keyFile.set_integer ("Output", "TiffBps", saveFormat.tiffBits); - keyFile.set_boolean ("Output", "TiffUncompressed", saveFormat.tiffUncompressed); - keyFile.set_boolean ("Output", "SaveProcParams", saveFormat.saveParams); + 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", "PngBps", saveFormat.pngBits); + keyFile.set_integer("Output", "TiffBps", saveFormat.tiffBits); + keyFile.set_boolean("Output", "TiffFloat", saveFormat.tiffFloat); + keyFile.set_boolean("Output", "TiffUncompressed", saveFormat.tiffUncompressed); + keyFile.set_boolean("Output", "SaveProcParams", saveFormat.saveParams); - 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", "PngBpsBatch", saveFormatBatch.pngBits); - keyFile.set_integer ("Output", "TiffBpsBatch", saveFormatBatch.tiffBits); - keyFile.set_boolean ("Output", "TiffUncompressedBatch", saveFormatBatch.tiffUncompressed); - keyFile.set_boolean ("Output", "SaveProcParamsBatch", saveFormatBatch.saveParams); + 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", "PngBpsBatch", saveFormatBatch.pngBits); + keyFile.set_integer("Output", "TiffBpsBatch", saveFormatBatch.tiffBits); + keyFile.set_boolean("Output", "TiffFloatBatch", saveFormatBatch.tiffFloat); + keyFile.set_boolean("Output", "TiffUncompressedBatch", saveFormatBatch.tiffUncompressed); + keyFile.set_boolean("Output", "SaveProcParamsBatch", saveFormatBatch.saveParams); - keyFile.set_string ("Output", "PathTemplate", savePathTemplate); - keyFile.set_string ("Output", "PathFolder", savePathFolder); - keyFile.set_boolean ("Output", "AutoSuffix", autoSuffix); - keyFile.set_boolean ("Output", "ForceFormatOpts", forceFormatOpts); - keyFile.set_integer ("Output", "SaveMethodNum", saveMethodNum); - keyFile.set_boolean ("Output", "UsePathTemplate", saveUsePathTemplate); - keyFile.set_string ("Output", "LastSaveAsPath", lastSaveAsPath); - keyFile.set_boolean ("Output", "OverwriteOutputFile", overwriteOutputFile); + keyFile.set_string("Output", "PathTemplate", savePathTemplate); + keyFile.set_string("Output", "PathFolder", savePathFolder); + keyFile.set_boolean("Output", "AutoSuffix", autoSuffix); + keyFile.set_boolean("Output", "ForceFormatOpts", forceFormatOpts); + keyFile.set_integer("Output", "SaveMethodNum", saveMethodNum); + keyFile.set_boolean("Output", "UsePathTemplate", saveUsePathTemplate); + keyFile.set_string("Output", "LastSaveAsPath", lastSaveAsPath); + keyFile.set_boolean("Output", "OverwriteOutputFile", overwriteOutputFile); - keyFile.set_string ("Profiles", "Directory", profilePath); - keyFile.set_boolean ("Profiles", "UseBundledProfiles", useBundledProfiles); - keyFile.set_string ("Profiles", "LoadSaveProfilePath", loadSaveProfilePath); - keyFile.set_string ("Profiles", "RawDefault", defProfRaw); - keyFile.set_string ("Profiles", "ImgDefault", defProfImg); - keyFile.set_boolean ("Profiles", "FilledProfile", filledProfile); - keyFile.set_boolean ("Profiles", "SaveParamsWithFile", saveParamsFile); - keyFile.set_boolean ("Profiles", "SaveParamsToCache", saveParamsCache); - keyFile.set_integer ("Profiles", "LoadParamsFromLocation", paramsLoadLocation); - keyFile.set_string ("Profiles", "CustomProfileBuilderPath", CPBPath); - keyFile.set_integer ("Profiles", "CustomProfileBuilderKeys", CPBKeys); + keyFile.set_string("Profiles", "Directory", profilePath); + keyFile.set_boolean("Profiles", "UseBundledProfiles", useBundledProfiles); + keyFile.set_string("Profiles", "LoadSaveProfilePath", loadSaveProfilePath); + keyFile.set_string("Profiles", "RawDefault", defProfRaw); + keyFile.set_string("Profiles", "ImgDefault", defProfImg); + keyFile.set_boolean("Profiles", "FilledProfile", filledProfile); + keyFile.set_boolean("Profiles", "SaveParamsWithFile", saveParamsFile); + keyFile.set_boolean("Profiles", "SaveParamsToCache", saveParamsCache); + keyFile.set_integer("Profiles", "LoadParamsFromLocation", paramsLoadLocation); + keyFile.set_string("Profiles", "CustomProfileBuilderPath", CPBPath); + keyFile.set_integer("Profiles", "CustomProfileBuilderKeys", CPBKeys); - keyFile.set_integer ("GUI", "WindowWidth", windowWidth); - keyFile.set_integer ("GUI", "WindowHeight", windowHeight); - keyFile.set_integer ("GUI", "WindowX", windowX); - keyFile.set_integer ("GUI", "WindowY", windowY); - keyFile.set_integer ("GUI", "WindowMonitor", windowMonitor); - keyFile.set_integer ("GUI", "MeowMonitor", meowMonitor); - keyFile.set_boolean ("GUI", "MeowFullScreen", meowFullScreen); - keyFile.set_boolean ("GUI", "MeowMaximized", meowMaximized); - keyFile.set_integer ("GUI", "MeowWidth", meowWidth); - keyFile.set_integer ("GUI", "MeowHeight", meowHeight); - keyFile.set_integer ("GUI", "MeowX", meowX); - keyFile.set_integer ("GUI", "MeowY", meowY); - keyFile.set_boolean ("GUI", "WindowMaximized", windowMaximized); - keyFile.set_integer ("GUI", "DetailWindowWidth", detailWindowWidth); - keyFile.set_integer ("GUI", "DetailWindowHeight", detailWindowHeight); - keyFile.set_integer ("GUI", "DirBrowserWidth", dirBrowserWidth); - keyFile.set_integer ("GUI", "DirBrowserHeight", dirBrowserHeight); - keyFile.set_integer ("GUI", "SortType", dirBrowserSortType); - keyFile.set_integer ("GUI", "PreferencesWidth", preferencesWidth); - keyFile.set_integer ("GUI", "PreferencesHeight", preferencesHeight); - keyFile.set_integer ("GUI", "SaveAsDialogWidth", saveAsDialogWidth); - keyFile.set_integer ("GUI", "SaveAsDialogHeight", saveAsDialogHeight); - keyFile.set_integer ("GUI", "ToolPanelWidth", toolPanelWidth); - keyFile.set_integer ("GUI", "BrowserToolPanelWidth", browserToolPanelWidth); - keyFile.set_integer ("GUI", "BrowserToolPanelHeight", browserToolPanelHeight); - keyFile.set_boolean ("GUI", "BrowserToolPanelOpened", browserToolPanelOpened); - keyFile.set_boolean ("GUI", "EditorFilmStripOpened", editorFilmStripOpened); - keyFile.set_boolean ("GUI", "BrowserDirPanelOpened", browserDirPanelOpened); - keyFile.set_integer ("GUI", "HistoryPanelWidth", historyPanelWidth); - keyFile.set_string ("GUI", "FontFamily", fontFamily); - keyFile.set_integer ("GUI", "FontSize", fontSize); - 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); - keyFile.set_boolean ("GUI", "ShowHistory", showHistory); - keyFile.set_integer ("GUI", "ShowFilePanelState", showFilePanelState); - keyFile.set_boolean ("GUI", "ShowInfo", showInfo); - keyFile.set_boolean ("GUI", "MainNBVertical", mainNBVertical); - keyFile.set_boolean ("GUI", "ShowClippedHighlights", showClippedHighlights); - keyFile.set_boolean ("GUI", "ShowClippedShadows", showClippedShadows); - keyFile.set_integer ("GUI", "FrameColor", bgcolor); - keyFile.set_boolean ("GUI", "ProcessingQueueEnbled", procQueueEnabled); + Glib::ArrayHandle ahfavorites = favorites; + keyFile.set_string_list("GUI", "Favorites", ahfavorites); + keyFile.set_integer("GUI", "WindowWidth", windowWidth); + keyFile.set_integer("GUI", "WindowHeight", windowHeight); + keyFile.set_integer("GUI", "WindowX", windowX); + keyFile.set_integer("GUI", "WindowY", windowY); + keyFile.set_integer("GUI", "WindowMonitor", windowMonitor); + keyFile.set_integer("GUI", "MeowMonitor", meowMonitor); + keyFile.set_boolean("GUI", "MeowFullScreen", meowFullScreen); + keyFile.set_boolean("GUI", "MeowMaximized", meowMaximized); + keyFile.set_integer("GUI", "MeowWidth", meowWidth); + keyFile.set_integer("GUI", "MeowHeight", meowHeight); + keyFile.set_integer("GUI", "MeowX", meowX); + keyFile.set_integer("GUI", "MeowY", meowY); + keyFile.set_boolean("GUI", "WindowMaximized", windowMaximized); + keyFile.set_integer("GUI", "DetailWindowWidth", detailWindowWidth); + keyFile.set_integer("GUI", "DetailWindowHeight", detailWindowHeight); + keyFile.set_integer("GUI", "DirBrowserWidth", dirBrowserWidth); + keyFile.set_integer("GUI", "DirBrowserHeight", dirBrowserHeight); + keyFile.set_integer("GUI", "SortType", dirBrowserSortType); + keyFile.set_integer("GUI", "PreferencesWidth", preferencesWidth); + keyFile.set_integer("GUI", "PreferencesHeight", preferencesHeight); + keyFile.set_integer("GUI", "SaveAsDialogWidth", saveAsDialogWidth); + keyFile.set_integer("GUI", "SaveAsDialogHeight", saveAsDialogHeight); + keyFile.set_integer("GUI", "ToolPanelWidth", toolPanelWidth); + keyFile.set_integer("GUI", "BrowserToolPanelWidth", browserToolPanelWidth); + keyFile.set_integer("GUI", "BrowserToolPanelHeight", browserToolPanelHeight); + keyFile.set_boolean("GUI", "BrowserToolPanelOpened", browserToolPanelOpened); + keyFile.set_boolean("GUI", "EditorFilmStripOpened", editorFilmStripOpened); + keyFile.set_boolean("GUI", "BrowserDirPanelOpened", browserDirPanelOpened); + keyFile.set_integer("GUI", "HistoryPanelWidth", historyPanelWidth); + keyFile.set_string("GUI", "FontFamily", fontFamily); + keyFile.set_integer("GUI", "FontSize", fontSize); + 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); + keyFile.set_boolean("GUI", "ShowHistory", showHistory); + keyFile.set_integer("GUI", "ShowFilePanelState", showFilePanelState); + keyFile.set_boolean("GUI", "ShowInfo", showInfo); + keyFile.set_boolean("GUI", "MainNBVertical", mainNBVertical); + keyFile.set_boolean("GUI", "ShowClippedHighlights", showClippedHighlights); + keyFile.set_boolean("GUI", "ShowClippedShadows", showClippedShadows); + keyFile.set_integer("GUI", "FrameColor", bgcolor); + keyFile.set_boolean("GUI", "ProcessingQueueEnbled", procQueueEnabled); Glib::ArrayHandle tpopen = tpOpen; keyFile.set_integer_list ("GUI", "ToolPanelsExpanded", tpopen); keyFile.set_boolean ("GUI", "ToolPanelsExpandedAutoSave", autoSaveTpOpen); @@ -1952,152 +2082,170 @@ void Options::saveToFile (Glib::ustring fname) keyFile.set_double_list ("GUI", "CutOverlayBrush", cutOverlayBrush); keyFile.set_double_list ("GUI", "NavGuideBrush", navGuideBrush); keyFile.set_integer ("GUI", "HistogramPosition", histogramPosition); + keyFile.set_boolean ("GUI", "HistogramRed", histogramRed); + keyFile.set_boolean ("GUI", "HistogramGreen", histogramGreen); + keyFile.set_boolean ("GUI", "HistogramBlue", histogramBlue); + keyFile.set_boolean ("GUI", "HistogramLuma", histogramLuma); + keyFile.set_boolean ("GUI", "HistogramChroma", histogramChroma); + keyFile.set_boolean ("GUI", "HistogramRAW", histogramRAW); keyFile.set_boolean ("GUI", "HistogramBar", histogramBar); - keyFile.set_boolean ("GUI", "HistogramFullMode", histogramFullMode); + keyFile.set_integer ("GUI", "HistogramHeight", histogramHeight); + keyFile.set_integer ("GUI", "HistogramDrawMode", histogramDrawMode); keyFile.set_integer ("GUI", "NavigatorRGBUnit", (int)navRGBUnit); keyFile.set_integer ("GUI", "NavigatorHSVUnit", (int)navHSVUnit); keyFile.set_boolean ("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); keyFile.set_boolean ("GUI", "FileBrowserToolbarSingleRow", FileBrowserToolbarSingleRow); keyFile.set_boolean ("GUI", "HideTPVScrollbar", hideTPVScrollbar); - keyFile.set_boolean ("GUI", "UseIconNoText", UseIconNoText); keyFile.set_boolean ("GUI", "HistogramWorking", rtSettings.HistogramWorking); keyFile.set_integer ("GUI", "CurveBBoxPosition", curvebboxpos); //Glib::ArrayHandle crvopen = crvOpen; //keyFile.set_integer_list ("GUI", "CurvePanelsExpanded", crvopen); - keyFile.set_integer ("Crop Settings", "PPI", cropPPI); + 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); - keyFile.set_boolean ("Color Management", "PrinterBPC", rtSettings.printerBPC); + keyFile.set_string("Color Management", "PrinterProfile", rtSettings.printerProfile); + keyFile.set_integer("Color Management", "PrinterIntent", rtSettings.printerIntent); + keyFile.set_boolean("Color Management", "PrinterBPC", rtSettings.printerBPC); - keyFile.set_string ("Color Management", "ICCDirectory", rtSettings.iccDirectory); - keyFile.set_string ("Color Management", "MonitorProfile", rtSettings.monitorProfile); - keyFile.set_boolean ("Color Management", "AutoMonitorProfile", rtSettings.autoMonitorProfile); - keyFile.set_boolean ("Color Management", "Autocielab", rtSettings.autocielab); - keyFile.set_boolean ("Color Management", "RGBcurvesLumamode_Gamut", rtSettings.rgbcurveslumamode_gamut); - keyFile.set_integer ("Color Management", "Intent", rtSettings.monitorIntent); - keyFile.set_boolean ("Color Management", "MonitorBPC", rtSettings.monitorBPC); + keyFile.set_string("Color Management", "ICCDirectory", rtSettings.iccDirectory); + keyFile.set_string("Color Management", "MonitorProfile", rtSettings.monitorProfile); + keyFile.set_boolean("Color Management", "AutoMonitorProfile", rtSettings.autoMonitorProfile); + keyFile.set_boolean("Color Management", "Autocielab", rtSettings.autocielab); + keyFile.set_boolean("Color Management", "RGBcurvesLumamode_Gamut", rtSettings.rgbcurveslumamode_gamut); + keyFile.set_integer("Color Management", "Intent", rtSettings.monitorIntent); + keyFile.set_boolean("Color Management", "MonitorBPC", rtSettings.monitorBPC); //keyFile.set_integer ("Color Management", "view", rtSettings.viewingdevice); //keyFile.set_integer ("Color Management", "grey", rtSettings.viewingdevicegrey); // keyFile.set_integer ("Color Management", "greySc", rtSettings.viewinggreySc); - keyFile.set_string ("Color Management", "AdobeRGB", rtSettings.adobe); - keyFile.set_string ("Color Management", "ProPhoto", rtSettings.prophoto); - keyFile.set_string ("Color Management", "ProPhoto10", rtSettings.prophoto10); - keyFile.set_string ("Color Management", "WideGamut", rtSettings.widegamut); - keyFile.set_string ("Color Management", "sRGB", rtSettings.srgb); - keyFile.set_string ("Color Management", "sRGB10", rtSettings.srgb10); - keyFile.set_string ("Color Management", "Beta", rtSettings.beta); - keyFile.set_string ("Color Management", "Best", rtSettings.best); - keyFile.set_string ("Color Management", "Rec2020", rtSettings.rec2020); - keyFile.set_string ("Color Management", "Bruce", rtSettings.bruce); - keyFile.set_integer ("Color Management", "WhiteBalanceSpotSize", whiteBalanceSpotSize); - keyFile.set_boolean ("Color Management", "GamutICC", rtSettings.gamutICC); - //keyFile.set_boolean ("Color Management", "BWcomplement", rtSettings.bw_complementary); - keyFile.set_boolean ("Color Management", "Ciecamfloat", rtSettings.ciecamfloat); - keyFile.set_boolean ("Color Management", "GamutLch", rtSettings.gamutLch); - keyFile.set_integer ("Color Management", "ProtectRed", rtSettings.protectred); - keyFile.set_integer ("Color Management", "Amountchroma", rtSettings.amchroma); - keyFile.set_double ("Color Management", "ProtectRedH", rtSettings.protectredh); - keyFile.set_integer ("Color Management", "CRI", rtSettings.CRI_color); - keyFile.set_integer ("Color Management", "DenoiseLabgamma", rtSettings.denoiselabgamma); + keyFile.set_string("Color Management", "AdobeRGB", rtSettings.adobe); + keyFile.set_string("Color Management", "ProPhoto", rtSettings.prophoto); + keyFile.set_string("Color Management", "WideGamut", rtSettings.widegamut); + keyFile.set_string("Color Management", "sRGB", rtSettings.srgb); + keyFile.set_string("Color Management", "Beta", rtSettings.beta); + keyFile.set_string("Color Management", "Best", rtSettings.best); + keyFile.set_string("Color Management", "Rec2020", rtSettings.rec2020); + keyFile.set_string("Color Management", "Bruce", rtSettings.bruce); + keyFile.set_string("Color Management", "ACES-AP0", rtSettings.ACESp0); + keyFile.set_string("Color Management", "ACES-AP1", rtSettings.ACESp1); + keyFile.set_integer("Color Management", "WhiteBalanceSpotSize", whiteBalanceSpotSize); + keyFile.set_boolean("Color Management", "GamutICC", rtSettings.gamutICC); + keyFile.set_boolean("Color Management", "GamutLch", rtSettings.gamutLch); + keyFile.set_integer("Color Management", "ProtectRed", rtSettings.protectred); + keyFile.set_integer("Color Management", "Amountchroma", rtSettings.amchroma); + keyFile.set_double("Color Management", "ProtectRedH", rtSettings.protectredh); + keyFile.set_integer("Color Management", "CRI", rtSettings.CRI_color); + keyFile.set_integer("Color Management", "DenoiseLabgamma", rtSettings.denoiselabgamma); //keyFile.set_boolean ("Color Management", "Ciebadpixgauss", rtSettings.ciebadpixgauss); - keyFile.set_double ("Color Management", "CBDLArtif", rtSettings.artifact_cbdl); - keyFile.set_double ("Color Management", "CBDLlevel0", rtSettings.level0_cbdl); - keyFile.set_double ("Color Management", "CBDLlevel123", rtSettings.level123_cbdl); + keyFile.set_double("Color Management", "CBDLlevel0", rtSettings.level0_cbdl); + keyFile.set_double("Color Management", "CBDLlevel123", rtSettings.level123_cbdl); //keyFile.set_double ("Color Management", "Colortoningab", rtSettings.colortoningab); //keyFile.set_double ("Color Management", "Decaction", rtSettings.decaction); - keyFile.set_string ("Color Management", "ClutsDirectory", clutsDir); + keyFile.set_string("Color Management", "ClutsDirectory", clutsDir); + + keyFile.set_string("ICC Profile Creator", "PimariesPreset", ICCPC_primariesPreset); + keyFile.set_double("ICC Profile Creator", "RedPrimaryX", ICCPC_redPrimaryX); + keyFile.set_double("ICC Profile Creator", "RedPrimaryY", ICCPC_redPrimaryY); + keyFile.set_double("ICC Profile Creator", "GreenPrimaryX", ICCPC_greenPrimaryX); + keyFile.set_double("ICC Profile Creator", "GreenPrimaryY", ICCPC_greenPrimaryY); + keyFile.set_double("ICC Profile Creator", "BluePrimaryX", ICCPC_bluePrimaryX); + keyFile.set_double("ICC Profile Creator", "BluePrimaryY", ICCPC_bluePrimaryY); + keyFile.set_string("ICC Profile Creator", "GammaPreset", ICCPC_gammaPreset); + keyFile.set_double("ICC Profile Creator", "Gamma", ICCPC_gamma); + keyFile.set_double("ICC Profile Creator", "Slope", ICCPC_slope); + keyFile.set_string("ICC Profile Creator", "ProfileVersion", ICCPC_profileVersion); + keyFile.set_string("ICC Profile Creator", "Illuminant", ICCPC_illuminant); + keyFile.set_string("ICC Profile Creator", "Description", ICCPC_description); + keyFile.set_string("ICC Profile Creator", "Copyright", ICCPC_copyright); + keyFile.set_boolean("ICC Profile Creator", "AppendParamsToDesc", ICCPC_appendParamsToDesc); Glib::ArrayHandle bab = baBehav; - keyFile.set_integer_list ("Batch Processing", "AdjusterBehavior", bab); + keyFile.set_integer_list("Batch Processing", "AdjusterBehavior", bab); - keyFile.set_boolean ("Sounds", "Enable", sndEnable); - keyFile.set_string ("Sounds", "BatchQueueDone", sndBatchQueueDone); - keyFile.set_string ("Sounds", "LngEditProcDone", sndLngEditProcDone); - keyFile.set_double ("Sounds", "LngEditProcDoneSecs", sndLngEditProcDoneSecs); + keyFile.set_boolean("Sounds", "Enable", sndEnable); + keyFile.set_string("Sounds", "BatchQueueDone", sndBatchQueueDone); + keyFile.set_string("Sounds", "LngEditProcDone", sndLngEditProcDone); + keyFile.set_double("Sounds", "LngEditProcDoneSecs", sndLngEditProcDoneSecs); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpening", fastexport_bypass_sharpening); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenEdge", fastexport_bypass_sharpenEdge); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sharpenMicro", fastexport_bypass_sharpenMicro); + keyFile.set_boolean("Fast Export", "fastexport_bypass_sharpening", fastexport_bypass_sharpening); + keyFile.set_boolean("Fast Export", "fastexport_bypass_sharpenEdge", fastexport_bypass_sharpenEdge); + keyFile.set_boolean("Fast Export", "fastexport_bypass_sharpenMicro", fastexport_bypass_sharpenMicro); //keyFile.set_boolean ("Fast Export", "fastexport_bypass_lumaDenoise" , fastexport_bypass_lumaDenoise); //keyFile.set_boolean ("Fast Export", "fastexport_bypass_colorDenoise" , fastexport_bypass_colorDenoise); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_defringe", fastexport_bypass_defringe); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrDenoise", fastexport_bypass_dirpyrDenoise); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_sh_hq", fastexport_bypass_sh_hq); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_dirpyrequalizer", fastexport_bypass_dirpyrequalizer); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_wavelet", fastexport_bypass_wavelet); - keyFile.set_string ("Fast Export", "fastexport_raw_bayer_method", fastexport_raw_bayer_method); + keyFile.set_boolean("Fast Export", "fastexport_bypass_defringe", fastexport_bypass_defringe); + keyFile.set_boolean("Fast Export", "fastexport_bypass_dirpyrDenoise", fastexport_bypass_dirpyrDenoise); + keyFile.set_boolean("Fast Export", "fastexport_bypass_dirpyrequalizer", fastexport_bypass_dirpyrequalizer); + keyFile.set_boolean("Fast Export", "fastexport_bypass_wavelet", fastexport_bypass_wavelet); + keyFile.set_string("Fast Export", "fastexport_raw_bayer_method", fastexport_raw_bayer_method); //keyFile.set_boolean ("Fast Export", "fastexport_bypass_bayer_raw_all_enhance" , fastexport_bypass_raw_bayer_all_enhance); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations", fastexport_bypass_raw_bayer_dcb_iterations); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance", fastexport_bypass_raw_bayer_dcb_enhance); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations", fastexport_bypass_raw_bayer_lmmse_iterations); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_linenoise", fastexport_bypass_raw_bayer_linenoise); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_bayer_greenthresh", fastexport_bypass_raw_bayer_greenthresh); - keyFile.set_string ("Fast Export", "fastexport_raw_xtrans_method", fastexport_raw_xtrans_method); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ccSteps", fastexport_bypass_raw_ccSteps); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ca", fastexport_bypass_raw_ca); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_df", fastexport_bypass_raw_df); - keyFile.set_boolean ("Fast Export", "fastexport_bypass_raw_ff", fastexport_bypass_raw_ff); - keyFile.set_string ("Fast Export", "fastexport_icm_input", fastexport_icm_input); - keyFile.set_string ("Fast Export", "fastexport_icm_working", fastexport_icm_working); - keyFile.set_string ("Fast Export", "fastexport_icm_output", fastexport_icm_output); - keyFile.set_integer ("Fast Export", "fastexport_icm_output_intent", fastexport_icm_outputIntent); - keyFile.set_boolean ("Fast Export", "fastexport_icm_output_bpc", fastexport_icm_outputBPC); - keyFile.set_string ("Fast Export", "fastexport_icm_gamma", fastexport_icm_gamma); - keyFile.set_boolean ("Fast Export", "fastexport_resize_enabled", fastexport_resize_enabled); - keyFile.set_double ("Fast Export", "fastexport_resize_scale", fastexport_resize_scale); - keyFile.set_string ("Fast Export", "fastexport_resize_appliesTo", fastexport_resize_appliesTo); - keyFile.set_string ("Fast Export", "fastexport_resize_method", fastexport_resize_method); - keyFile.set_integer ("Fast Export", "fastexport_resize_dataspec", fastexport_resize_dataspec); - keyFile.set_integer ("Fast Export", "fastexport_resize_width", fastexport_resize_width); - keyFile.set_integer ("Fast Export", "fastexport_resize_height", fastexport_resize_height); - keyFile.set_integer ("Fast Export", "fastexport_use_fast_pipeline", fastexport_use_fast_pipeline); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_bayer_dcb_iterations", fastexport_bypass_raw_bayer_dcb_iterations); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_bayer_dcb_enhance", fastexport_bypass_raw_bayer_dcb_enhance); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_bayer_lmmse_iterations", fastexport_bypass_raw_bayer_lmmse_iterations); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_bayer_linenoise", fastexport_bypass_raw_bayer_linenoise); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_bayer_greenthresh", fastexport_bypass_raw_bayer_greenthresh); + keyFile.set_string("Fast Export", "fastexport_raw_xtrans_method", fastexport_raw_xtrans_method); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_ccSteps", fastexport_bypass_raw_ccSteps); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_ca", fastexport_bypass_raw_ca); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_df", fastexport_bypass_raw_df); + keyFile.set_boolean("Fast Export", "fastexport_bypass_raw_ff", fastexport_bypass_raw_ff); + keyFile.set_string("Fast Export", "fastexport_icm_input", fastexport_icm_input_profile); + keyFile.set_string("Fast Export", "fastexport_icm_working", fastexport_icm_working_profile); + keyFile.set_string("Fast Export", "fastexport_icm_output", fastexport_icm_output_profile); + keyFile.set_integer("Fast Export", "fastexport_icm_output_intent", fastexport_icm_outputIntent); + keyFile.set_boolean("Fast Export", "fastexport_icm_output_bpc", fastexport_icm_outputBPC); + keyFile.set_boolean("Fast Export", "fastexport_resize_enabled", fastexport_resize_enabled); + keyFile.set_double("Fast Export", "fastexport_resize_scale", fastexport_resize_scale); + keyFile.set_string("Fast Export", "fastexport_resize_appliesTo", fastexport_resize_appliesTo); + keyFile.set_string("Fast Export", "fastexport_resize_method", fastexport_resize_method); + keyFile.set_integer("Fast Export", "fastexport_resize_dataspec", fastexport_resize_dataspec); + keyFile.set_integer("Fast Export", "fastexport_resize_width", fastexport_resize_width); + keyFile.set_integer("Fast Export", "fastexport_resize_height", fastexport_resize_height); + keyFile.set_integer("Fast Export", "fastexport_use_fast_pipeline", fastexport_use_fast_pipeline); - keyFile.set_string ("Dialogs", "LastIccDir", lastIccDir); - keyFile.set_string ("Dialogs", "LastDarkframeDir", lastDarkframeDir); - keyFile.set_string ("Dialogs", "LastFlatfieldDir", lastFlatfieldDir); - keyFile.set_string ("Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); - keyFile.set_string ("Dialogs", "LastLabCurvesDir", lastLabCurvesDir); - keyFile.set_string ("Dialogs", "LastRetinexDir", lastRetinexDir); - keyFile.set_string ("Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); - keyFile.set_string ("Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); - keyFile.set_string ("Dialogs", "LastPFCurvesDir", lastPFCurvesDir); - keyFile.set_string ("Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); - keyFile.set_string ("Dialogs", "LastBWCurvesDir", lastBWCurvesDir); - keyFile.set_string ("Dialogs", "LastToneCurvesDir", lastToneCurvesDir); - keyFile.set_string ("Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); - keyFile.set_string ("Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); - keyFile.set_string ("Dialogs", "LastLensProfileDir", lastLensProfileDir); - keyFile.set_boolean ("Dialogs", "GimpPluginShowInfoDialog", gimpPluginShowInfoDialog); + keyFile.set_string("Dialogs", "LastIccDir", lastIccDir); + keyFile.set_string("Dialogs", "LastDarkframeDir", lastDarkframeDir); + keyFile.set_string("Dialogs", "LastFlatfieldDir", lastFlatfieldDir); + keyFile.set_string("Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); + keyFile.set_string("Dialogs", "LastLabCurvesDir", lastLabCurvesDir); + keyFile.set_string("Dialogs", "LastRetinexDir", lastRetinexDir); + keyFile.set_string("Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); + keyFile.set_string("Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); + keyFile.set_string("Dialogs", "LastPFCurvesDir", lastPFCurvesDir); + keyFile.set_string("Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); + keyFile.set_string("Dialogs", "LastBWCurvesDir", lastBWCurvesDir); + keyFile.set_string("Dialogs", "LastToneCurvesDir", lastToneCurvesDir); + keyFile.set_string("Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); + keyFile.set_string("Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); + keyFile.set_string("Dialogs", "LastLensProfileDir", lastLensProfileDir); + keyFile.set_string("Dialogs", "LastICCProfCreatorDir", lastICCProfCreatorDir); + keyFile.set_boolean("Dialogs", "GimpPluginShowInfoDialog", gimpPluginShowInfoDialog); - keyFile.set_string ("Lensfun", "DBDirectory", rtSettings.lensfunDbDirectory); + keyFile.set_string("Lensfun", "DBDirectory", rtSettings.lensfunDbDirectory); - keyData = keyFile.to_data (); + keyData = keyFile.to_data(); } catch (Glib::KeyFileError &e) { - throw Error (e.what()); + throw Error(e.what()); } - FILE *f = g_fopen (fname.c_str (), "wt"); + FILE *f = g_fopen(fname.c_str(), "wt"); if (f == nullptr) { std::cout << "Warning! Unable to save your preferences to: " << fname << std::endl; - Glib::ustring msg_ = Glib::ustring::compose (M ("MAIN_MSG_WRITEFAILED"), fname.c_str()); - throw Error (msg_); + Glib::ustring msg_ = Glib::ustring::compose(M("MAIN_MSG_WRITEFAILED"), fname.c_str()); + throw Error(msg_); } else { - fprintf (f, "%s", keyData.c_str ()); - fclose (f); + fprintf(f, "%s", keyData.c_str()); + fclose(f); } } -void Options::load (bool lightweight) +void Options::load(bool lightweight) { // Find the application data path @@ -2105,86 +2253,91 @@ void Options::load (bool lightweight) const gchar* path; Glib::ustring dPath; - path = g_getenv ("RT_SETTINGS"); + path = g_getenv("RT_SETTINGS"); if (path != nullptr) { - rtdir = Glib::ustring (path); + rtdir = Glib::ustring(path); - if (!Glib::path_is_absolute (rtdir)) { - Glib::ustring msg = Glib::ustring::compose ("Settings path %1 is not absolute", rtdir); - throw Error (msg); + if (!Glib::path_is_absolute(rtdir)) { + Glib::ustring msg = Glib::ustring::compose("Settings path %1 is not absolute", rtdir); + throw Error(msg); } } else { #ifdef WIN32 WCHAR pathW[MAX_PATH] = {0}; - if (SHGetSpecialFolderPathW (NULL, pathW, CSIDL_LOCAL_APPDATA, false)) { + if (SHGetSpecialFolderPathW(NULL, pathW, CSIDL_LOCAL_APPDATA, false)) { char pathA[MAX_PATH]; - WideCharToMultiByte (CP_UTF8, 0, pathW, -1, pathA, MAX_PATH, 0, 0); - rtdir = Glib::build_filename (Glib::ustring (pathA), Glib::ustring (CACHEFOLDERNAME)); + WideCharToMultiByte(CP_UTF8, 0, pathW, -1, pathA, MAX_PATH, 0, 0); + rtdir = Glib::build_filename(Glib::ustring(pathA), Glib::ustring(CACHEFOLDERNAME)); } #else - rtdir = Glib::build_filename (Glib::ustring (g_get_user_config_dir ()), Glib::ustring (CACHEFOLDERNAME)); + rtdir = Glib::build_filename(Glib::ustring(g_get_user_config_dir()), Glib::ustring(CACHEFOLDERNAME)); #endif } if (options.rtSettings.verbose) { - printf ("Settings directory (rtdir) = %s\n", rtdir.c_str()); + printf("Settings directory (rtdir) = %s\n", rtdir.c_str()); } // 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 { - options.readFromFile (Glib::build_filename (argv0, "options")); + options.readFromFile(Glib::build_filename(argv0, "options")); } catch (Options::Error &) { // 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"); + path = g_getenv("RT_CACHE"); if (path != nullptr) { - cacheBaseDir = Glib::ustring (path); + cacheBaseDir = Glib::ustring(path); - if (!Glib::path_is_absolute (cacheBaseDir)) { - Glib::ustring msg = Glib::ustring::compose ("Cache base dir %1 is not absolute", cacheBaseDir); - throw Error (msg); + if (!Glib::path_is_absolute(cacheBaseDir)) { + Glib::ustring msg = Glib::ustring::compose("Cache base dir %1 is not absolute", cacheBaseDir); + 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"); + cacheBaseDir = Glib::build_filename(rtdir, "cache"); #else - cacheBaseDir = Glib::build_filename (Glib::ustring (g_get_user_cache_dir()), Glib::ustring (CACHEFOLDERNAME)); + cacheBaseDir = Glib::build_filename(Glib::ustring(g_get_user_cache_dir()), Glib::ustring(CACHEFOLDERNAME)); #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 + g_mkdir_with_parents(g_get_user_data_dir(), 511); } +#endif + if (options.rtSettings.verbose) { - printf ("Cache directory (cacheBaseDir) = %s\n", cacheBaseDir.c_str()); + printf("Cache directory (cacheBaseDir) = %s\n", cacheBaseDir.c_str()); } // Update profile's path and recreate it if necessary @@ -2192,48 +2345,54 @@ void Options::load (bool lightweight) // 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 @@ -2244,7 +2403,7 @@ void Options::load (bool lightweight) // out which are the parent translations. Furthermore, there must be a file for each locale () -- you cannot have // 'French (CA)' unless there is a file 'French'. - Glib::ustring defaultTranslation = Glib::build_filename (argv0, "languages", "default"); + Glib::ustring defaultTranslation = Glib::build_filename(argv0, "languages", "default"); Glib::ustring languageTranslation = ""; Glib::ustring localeTranslation = ""; @@ -2253,38 +2412,34 @@ void Options::load (bool lightweight) } if (!options.language.empty()) { - std::vector langPortions = Glib::Regex::split_simple (" ", options.language); + std::vector langPortions = Glib::Regex::split_simple(" ", options.language); if (langPortions.size() >= 1) { - languageTranslation = Glib::build_filename (argv0, "languages", langPortions.at (0)); + languageTranslation = Glib::build_filename(argv0, "languages", langPortions.at(0)); } if (langPortions.size() >= 2) { - localeTranslation = Glib::build_filename (argv0, "languages", options.language); + localeTranslation = Glib::build_filename(argv0, "languages", options.language); } } - langMgr.load (options.language, {localeTranslation, languageTranslation, defaultTranslation}); + langMgr.load(options.language, {localeTranslation, languageTranslation, defaultTranslation}); - rtengine::init (&options.rtSettings, argv0, rtdir, !lightweight); + rtengine::init(&options.rtSettings, argv0, rtdir, !lightweight); } -void Options::save () +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")); } /* * return true if ext is a parsed extension (retained or not) */ -bool Options::is_parse_extention (Glib::ustring fname) +bool Options::is_parse_extention(Glib::ustring fname) { - Glib::ustring ext = getExtension (fname).lowercase(); + Glib::ustring ext = getExtension(fname).lowercase(); if (!ext.empty()) { // there is an extension to the filename @@ -2303,10 +2458,10 @@ bool Options::is_parse_extention (Glib::ustring fname) /* * return true if fname ends with one of the retained image file extensions */ -bool Options::has_retained_extention (Glib::ustring fname) +bool Options::has_retained_extention(Glib::ustring fname) { - Glib::ustring ext = getExtension (fname).lowercase(); + Glib::ustring ext = getExtension(fname).lowercase(); if (!ext.empty()) { // there is an extension to the filename @@ -2325,7 +2480,7 @@ bool Options::has_retained_extention (Glib::ustring fname) /* * return true if ext is an enabled extension */ -bool Options::is_extention_enabled (Glib::ustring ext) +bool Options::is_extention_enabled(Glib::ustring ext) { for (int j = 0; j < (int)parseExtensions.size(); j++) if (parseExtensions[j].casefold() == ext.casefold()) { @@ -2334,3 +2489,68 @@ bool Options::is_extention_enabled (Glib::ustring ext) 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); + } +} +Glib::ustring Options::getICCProfileCopyright() +{ + Glib::Date now; + now.set_time_current(); + return Glib::ustring::compose("Copyright RawTherapee %1, CC0", now.get_year()); +} diff --git a/rtgui/options.h b/rtgui/options.h index 31d17ef9b..c06d9df30 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -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" @@ -44,14 +44,46 @@ #define DEFPROFILE_DYNAMIC "Dynamic" struct SaveFormat { + SaveFormat( + const Glib::ustring& _format, + int _png_bits, + int _jpeg_quality, + int _jpeg_sub_samp, + int _tiff_bits, + bool _tiff_float, + bool _tiff_uncompressed, + bool _save_params + ) : + format(_format), + pngBits(_png_bits), + jpegQuality(_jpeg_quality), + jpegSubSamp(_jpeg_sub_samp), + tiffBits(_tiff_bits), + tiffFloat(_tiff_float), + tiffUncompressed(_tiff_uncompressed), + saveParams(_save_params) + { + } + SaveFormat( + const Glib::ustring& _format, + int _png_bits, + int _tiff_bits, + bool _tiff_float + ) : + SaveFormat( + _format, + _png_bits, + 90, + 2, + _tiff_bits, + _tiff_float, + true, + true + ) + { + } SaveFormat() : - format ("jpg"), - pngBits (8), - jpegQuality (90), - jpegSubSamp (2), - tiffBits (8), - tiffUncompressed (true), - saveParams (true) + SaveFormat("jpg", 8, 8, false) { } @@ -60,6 +92,7 @@ struct SaveFormat { int jpegQuality; int jpegSubSamp; // 1=best compression, 3=best quality int tiffBits; + bool tiffFloat; bool tiffUncompressed; bool saveParams; }; @@ -75,8 +108,8 @@ public: class Error: public std::exception { public: - Error (const Glib::ustring &msg): msg_ (msg) {} - const char *what() const throw() + explicit Error (const Glib::ustring &msg): msg_ (msg) {} + const char *what() const throw() override { return msg_.c_str(); } @@ -90,8 +123,13 @@ public: }; 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); @@ -249,12 +287,13 @@ public: bool sndEnable; int histogramPosition; // 0=disabled, 1=left pane, 2=right pane - //int histogramWorking; // 0=disabled, 1=left pane, 2=right pane + bool histogramRed, histogramGreen, histogramBlue; + bool histogramLuma, histogramChroma, histogramRAW; bool histogramBar; - bool histogramFullMode; + int histogramHeight; + int histogramDrawMode; bool FileBrowserToolbarSingleRow; bool hideTPVScrollbar; - bool UseIconNoText; int whiteBalanceSpotSize; int curvebboxpos; // 0=above, 1=right, 2=below, 3=left @@ -264,23 +303,46 @@ public: int cropPPI; enum CropGuidesMode { CROP_GUIDE_NONE, CROP_GUIDE_FRAME, CROP_GUIDE_FULL }; CropGuidesMode cropGuides; - bool cropAutoFit; + bool cropAutoFit; // Performance options Glib::ustring clutsDir; int rgbDenoiseThreadLimit; // maximum number of threads for the denoising tool ; 0 = use the maximum available int maxInspectorBuffers; // maximum number of buffers (i.e. images) for the Inspector feature + int inspectorDelay; int clutCacheSize; bool filledProfile; // Used as reminder for the ProfilePanel "mode" prevdemo_t prevdemo; // Demosaicing method used for the <100% preview bool serializeTiffRead; - + bool measure; + size_t chunkSizeAMAZE; + size_t chunkSizeCA; + size_t chunkSizeRCD; + size_t chunkSizeRGB; + size_t chunkSizeXT; bool menuGroupRank; bool menuGroupLabel; bool menuGroupFileOperations; bool menuGroupProfileOperations; bool menuGroupExtProg; + // ICC Profile Creator + Glib::ustring ICCPC_primariesPreset; + double ICCPC_redPrimaryX; + double ICCPC_redPrimaryY; + double ICCPC_greenPrimaryX; + double ICCPC_greenPrimaryY; + double ICCPC_bluePrimaryX; + double ICCPC_bluePrimaryY; + Glib::ustring ICCPC_gammaPreset; + double ICCPC_gamma; + double ICCPC_slope; + Glib::ustring ICCPC_profileVersion; + Glib::ustring ICCPC_illuminant; + Glib::ustring ICCPC_description; + Glib::ustring ICCPC_copyright; + bool ICCPC_appendParamsToDesc; + // fast export options bool fastexport_bypass_sharpening; bool fastexport_bypass_sharpenEdge; @@ -289,7 +351,6 @@ public: //bool fastexport_bypass_colorDenoise; bool fastexport_bypass_defringe; bool fastexport_bypass_dirpyrDenoise; - bool fastexport_bypass_sh_hq; bool fastexport_bypass_dirpyrequalizer; bool fastexport_bypass_wavelet; Glib::ustring fastexport_raw_bayer_method; @@ -304,12 +365,12 @@ public: bool fastexport_bypass_raw_ca; bool fastexport_bypass_raw_df; bool fastexport_bypass_raw_ff; - Glib::ustring fastexport_icm_input; - Glib::ustring fastexport_icm_working; - Glib::ustring fastexport_icm_output; - rtengine::RenderingIntent fastexport_icm_outputIntent; + Glib::ustring fastexport_icm_input_profile; + Glib::ustring fastexport_icm_working_profile; + Glib::ustring fastexport_icm_output_profile; + int fastexport_icm_outputIntent; bool fastexport_icm_outputBPC; - Glib::ustring fastexport_icm_gamma; + Glib::ustring fastexport_icm_custom_output_profile; bool fastexport_resize_enabled; double fastexport_resize_scale; Glib::ustring fastexport_resize_appliesTo; @@ -319,6 +380,7 @@ public: int fastexport_resize_height; bool fastexport_use_fast_pipeline; + std::vector favorites; // Dialog settings Glib::ustring lastIccDir; Glib::ustring lastDarkframeDir; @@ -336,6 +398,7 @@ public: Glib::ustring lastProfilingReferenceDir; Glib::ustring lastBWCurvesDir; Glib::ustring lastLensProfileDir; + Glib::ustring lastICCProfCreatorDir; bool gimpPluginShowInfoDialog; size_t maxRecentFolders; // max. number of recent folders stored in options file @@ -344,9 +407,9 @@ public: 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); @@ -354,34 +417,21 @@ public: // 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); + static Glib::ustring getICCProfileCopyright(); }; extern Options options; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 516193c05..f26eb3c90 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -16,18 +16,22 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "paramsedited.h" #include -#include "options.h" -#include "addsetids.h" -ParamsEdited::ParamsEdited (bool value) +#include "paramsedited.h" + +#include "addsetids.h" +#include "options.h" + +#include "../rtengine/procparams.h" + +ParamsEdited::ParamsEdited(bool value) { - set (value); + set(value); } -void ParamsEdited::set (bool v) +void ParamsEdited::set(bool v) { general.rank = v; @@ -50,6 +54,8 @@ void ParamsEdited::set (bool v) toneCurve.hrenabled = v; toneCurve.method = v; toneCurve.histmatching = v; + toneCurve.fromHistMatching = v; + toneCurve.clampOOG = v; retinex.cdcurve = v; retinex.mapcurve = v; retinex.cdHcurve = v; @@ -139,9 +145,13 @@ void ParamsEdited::set (bool v) colorToning.labgridBLow = v; colorToning.labgridAHigh = v; colorToning.labgridBHigh = v; + colorToning.labregions = v; + colorToning.labregionsShowMask = v; sharpening.enabled = v; + sharpening.contrast = v; sharpening.radius = v; + sharpening.blurradius = v; sharpening.amount = v; sharpening.threshold = v; sharpening.edgesonly = v; @@ -155,6 +165,7 @@ void ParamsEdited::set (bool v) sharpening.deconviter = v; sharpening.deconvdamping = v; prsharpening.enabled = v; + prsharpening.contrast = v; prsharpening.radius = v; prsharpening.amount = v; prsharpening.threshold = v; @@ -174,6 +185,7 @@ void ParamsEdited::set (bool v) sharpenEdge.threechannels = v; sharpenMicro.enabled = v; sharpenMicro.matrix = v; + sharpenMicro.contrast = v; sharpenMicro.amount = v; sharpenMicro.uniformity = v; vibrance.enabled = v; @@ -280,13 +292,14 @@ void ParamsEdited::set (bool 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.radius = v; + sh.lab = v; crop.enabled = v; crop.x = v; crop.y = v; @@ -377,21 +390,22 @@ void ParamsEdited::set (bool v) spot.enabled = v; spot.entries = v; - icm.input = v; + resize.allowUpscaling = v; + icm.inputProfile = v; icm.toneCurve = v; icm.applyLookTable = v; icm.applyBaselineExposureOffset = v; icm.applyHueSatMap = v; icm.dcpIlluminant = v; - icm.working = v; - icm.output = v; + icm.workingProfile = v; + icm.outputProfile = v; icm.outputIntent = v; - icm.outputBPC = v; - icm.gamma = v; - icm.freegamma = v; - icm.gampos = v; - icm.slpos = v; + icm.outputBPC = v; + icm.workingTRCGamma = v; + icm.workingTRCSlope = v; + icm.workingTRC = v; raw.bayersensor.method = v; + raw.bayersensor.border = v; raw.bayersensor.imageNum = v; raw.bayersensor.ccSteps = v; raw.bayersensor.exBlack0 = v; @@ -403,45 +417,37 @@ void ParamsEdited::set (bool v) raw.bayersensor.dcbEnhance = v; //raw.bayersensor.allEnhance = v; raw.bayersensor.lmmseIterations = v; - raw.bayersensor.pixelShiftMotion = v; - raw.bayersensor.pixelShiftMotionCorrection = v; + raw.bayersensor.dualDemosaicAutoContrast = v; + raw.bayersensor.dualDemosaicContrast = v; raw.bayersensor.pixelShiftMotionCorrectionMethod = v; - raw.bayersensor.pixelShiftStddevFactorGreen = v; - raw.bayersensor.pixelShiftStddevFactorRed = v; - raw.bayersensor.pixelShiftStddevFactorBlue = v; raw.bayersensor.pixelShiftEperIso = v; - raw.bayersensor.pixelShiftNreadIso = v; - raw.bayersensor.pixelShiftPrnu = v; raw.bayersensor.pixelShiftSigma = v; - raw.bayersensor.pixelShiftSum = v; - raw.bayersensor.pixelShiftRedBlueWeight = v; raw.bayersensor.pixelShiftShowMotion = v; raw.bayersensor.pixelShiftShowMotionMaskOnly = v; - raw.bayersensor.pixelShiftAutomatic = v; - raw.bayersensor.pixelShiftNonGreenHorizontal = v; - raw.bayersensor.pixelShiftNonGreenVertical = v; raw.bayersensor.pixelShiftHoleFill = v; raw.bayersensor.pixelShiftMedian = v; - raw.bayersensor.pixelShiftMedian3 = v; raw.bayersensor.pixelShiftGreen = v; raw.bayersensor.pixelShiftBlur = v; 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; - raw.bayersensor.pixelShiftNonGreenCross2 = v; - raw.bayersensor.pixelShiftNonGreenAmaze = v; + raw.bayersensor.pixelShiftDemosaicMethod = v; raw.bayersensor.greenEq = v; raw.bayersensor.linenoise = v; + raw.bayersensor.linenoiseDirection = v; + raw.bayersensor.pdafLinesFilter = v; raw.xtranssensor.method = v; + raw.xtranssensor.dualDemosaicAutoContrast = v; + raw.xtranssensor.dualDemosaicContrast = v; + raw.xtranssensor.border = v; raw.xtranssensor.ccSteps = v; raw.xtranssensor.exBlackRed = v; raw.xtranssensor.exBlackGreen = v; raw.xtranssensor.exBlackBlue = v; raw.ca_autocorrect = v; + raw.ca_avoidcolourshift = v; + raw.caautoiterations = v; raw.cablue = v; raw.cared = v; raw.hotPixelFilter = v; @@ -456,7 +462,6 @@ void ParamsEdited::set (bool v) raw.ff_AutoClipControl = v; raw.ff_clipControl = v; raw.exPos = v; - raw.exPreser = v; wavelet.enabled = v; wavelet.strength = v; wavelet.balance = v; @@ -572,6 +577,12 @@ void ParamsEdited::set (bool v) filmSimulation.enabled = v; filmSimulation.clutFilename = v; filmSimulation.strength = v; + softlight.enabled = v; + softlight.strength = v; + dehaze.enabled = v; + dehaze.strength = v; + dehaze.showDepthMap = v; + dehaze.depth = v; metadata.mode = v; exif = v; @@ -581,10 +592,10 @@ void ParamsEdited::set (bool v) using namespace rtengine; using namespace rtengine::procparams; -void ParamsEdited::initFrom (const std::vector& src) +void ParamsEdited::initFrom(const std::vector& src) { - set (true); + set(true); if (src.empty()) { return; @@ -611,6 +622,8 @@ void ParamsEdited::initFrom (const std::vector 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; + toneCurve.fromHistMatching = toneCurve.fromHistMatching && p.toneCurve.fromHistMatching == other.toneCurve.fromHistMatching; + toneCurve.clampOOG = toneCurve.clampOOG && p.toneCurve.clampOOG == other.toneCurve.clampOOG; 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; @@ -660,12 +673,12 @@ void ParamsEdited::initFrom (const std::vector 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.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; @@ -701,6 +714,8 @@ void ParamsEdited::initFrom (const std::vector 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; + colorToning.labregions = colorToning.labregions && p.colorToning.labregions == other.colorToning.labregions; + colorToning.labregionsShowMask = colorToning.labregionsShowMask && p.colorToning.labregionsShowMask == other.colorToning.labregionsShowMask; 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; @@ -708,9 +723,12 @@ void ParamsEdited::initFrom (const std::vector sharpenMicro.enabled = sharpenMicro.enabled && p.sharpenMicro.enabled == other.sharpenMicro.enabled; sharpenMicro.matrix = sharpenMicro.matrix && p.sharpenMicro.matrix == other.sharpenMicro.matrix; sharpenMicro.amount = sharpenMicro.amount && p.sharpenMicro.amount == other.sharpenMicro.amount; + sharpenMicro.contrast = sharpenMicro.contrast && p.sharpenMicro.contrast == other.sharpenMicro.contrast; sharpenMicro.uniformity = sharpenMicro.uniformity && p.sharpenMicro.uniformity == other.sharpenMicro.uniformity; sharpening.enabled = sharpening.enabled && p.sharpening.enabled == other.sharpening.enabled; + sharpening.contrast = sharpening.contrast && p.sharpening.contrast == other.sharpening.contrast; sharpening.radius = sharpening.radius && p.sharpening.radius == other.sharpening.radius; + sharpening.blurradius = sharpening.blurradius && p.sharpening.blurradius == other.sharpening.blurradius; sharpening.amount = sharpening.amount && p.sharpening.amount == other.sharpening.amount; sharpening.threshold = sharpening.threshold && p.sharpening.threshold == other.sharpening.threshold; sharpening.edgesonly = sharpening.edgesonly && p.sharpening.edgesonly == other.sharpening.edgesonly; @@ -724,6 +742,7 @@ void ParamsEdited::initFrom (const std::vector sharpening.deconviter = sharpening.deconviter && p.sharpening.deconviter == other.sharpening.deconviter; sharpening.deconvdamping = sharpening.deconvdamping && p.sharpening.deconvdamping == other.sharpening.deconvdamping; prsharpening.enabled = prsharpening.enabled && p.prsharpening.enabled == other.prsharpening.enabled; + prsharpening.contrast = prsharpening.contrast && p.prsharpening.contrast == other.prsharpening.contrast; prsharpening.radius = prsharpening.radius && p.prsharpening.radius == other.prsharpening.radius; prsharpening.amount = prsharpening.amount && p.prsharpening.amount == other.prsharpening.amount; prsharpening.threshold = prsharpening.threshold && p.prsharpening.threshold == other.prsharpening.threshold; @@ -845,14 +864,15 @@ void ParamsEdited::initFrom (const std::vector 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.radius = sh.radius && p.sh.radius == other.sh.radius; + sh.lab = sh.lab && p.sh.lab == other.sh.lab; crop.enabled = crop.enabled && p.crop.enabled == other.crop.enabled; crop.x = crop.x && p.crop.x == other.crop.x; crop.y = crop.y && p.crop.y == other.crop.y; @@ -939,21 +959,22 @@ void ParamsEdited::initFrom (const std::vector resize.enabled = resize.enabled && p.resize.enabled == other.resize.enabled; spot.enabled = spot.enabled && p.spot.enabled == other.spot.enabled; spot.entries = spot.entries && p.spot.entries == other.spot.entries; - icm.input = icm.input && p.icm.input == other.icm.input; + resize.allowUpscaling = resize.allowUpscaling && p.resize.allowUpscaling == other.resize.allowUpscaling; + icm.inputProfile = icm.inputProfile && p.icm.inputProfile == other.icm.inputProfile; icm.toneCurve = icm.toneCurve && p.icm.toneCurve == other.icm.toneCurve; icm.applyLookTable = icm.applyLookTable && p.icm.applyLookTable == other.icm.applyLookTable; icm.applyBaselineExposureOffset = icm.applyBaselineExposureOffset && p.icm.applyBaselineExposureOffset == other.icm.applyBaselineExposureOffset; icm.applyHueSatMap = icm.applyHueSatMap && p.icm.applyHueSatMap == other.icm.applyHueSatMap; icm.dcpIlluminant = icm.dcpIlluminant && p.icm.dcpIlluminant == other.icm.dcpIlluminant; - icm.working = icm.working && p.icm.working == other.icm.working; - icm.output = icm.output && p.icm.output == other.icm.output; + icm.workingProfile = icm.workingProfile && p.icm.workingProfile == other.icm.workingProfile; + icm.outputProfile = icm.outputProfile && p.icm.outputProfile == other.icm.outputProfile; icm.outputIntent = icm.outputIntent && p.icm.outputIntent == other.icm.outputIntent; icm.outputBPC = icm.outputBPC && p.icm.outputBPC == other.icm.outputBPC ; - icm.gamma = icm.gamma && p.icm.gamma == other.icm.gamma; - icm.freegamma = icm.freegamma && p.icm.freegamma == other.icm.freegamma; - icm.gampos = icm.gampos && p.icm.gampos == other.icm.gampos; - icm.slpos = icm.slpos && p.icm.slpos == other.icm.slpos; + icm.workingTRCGamma = icm.workingTRCGamma && p.icm.workingTRCGamma == other.icm.workingTRCGamma; + icm.workingTRCSlope = icm.workingTRCSlope && p.icm.workingTRCSlope == other.icm.workingTRCSlope; + icm.workingTRC = icm.workingTRC && p.icm.workingTRC == other.icm.workingTRC; raw.bayersensor.method = raw.bayersensor.method && p.raw.bayersensor.method == other.raw.bayersensor.method; + raw.bayersensor.border = raw.bayersensor.border && p.raw.bayersensor.border == other.raw.bayersensor.border; raw.bayersensor.imageNum = raw.bayersensor.imageNum && p.raw.bayersensor.imageNum == other.raw.bayersensor.imageNum; raw.bayersensor.ccSteps = raw.bayersensor.ccSteps && p.raw.bayersensor.ccSteps == other.raw.bayersensor.ccSteps; raw.bayersensor.exBlack0 = raw.bayersensor.exBlack0 && p.raw.bayersensor.black0 == other.raw.bayersensor.black0; @@ -965,45 +986,37 @@ void ParamsEdited::initFrom (const std::vector raw.bayersensor.dcbEnhance = raw.bayersensor.dcbEnhance && p.raw.bayersensor.dcb_enhance == other.raw.bayersensor.dcb_enhance; //raw.bayersensor.allEnhance = raw.bayersensor.allEnhance && p.raw.bayersensor.all_enhance == other.raw.bayersensor.all_enhance; raw.bayersensor.lmmseIterations = raw.bayersensor.lmmseIterations && p.raw.bayersensor.lmmse_iterations == other.raw.bayersensor.lmmse_iterations; - raw.bayersensor.pixelShiftMotion = raw.bayersensor.pixelShiftMotion && p.raw.bayersensor.pixelShiftMotion == other.raw.bayersensor.pixelShiftMotion; - raw.bayersensor.pixelShiftMotionCorrection = raw.bayersensor.pixelShiftMotionCorrection && p.raw.bayersensor.pixelShiftMotionCorrection == other.raw.bayersensor.pixelShiftMotionCorrection; + raw.bayersensor.dualDemosaicAutoContrast = raw.bayersensor.dualDemosaicAutoContrast && p.raw.bayersensor.dualDemosaicAutoContrast == other.raw.bayersensor.dualDemosaicAutoContrast; + raw.bayersensor.dualDemosaicContrast = raw.bayersensor.dualDemosaicContrast && p.raw.bayersensor.dualDemosaicContrast == other.raw.bayersensor.dualDemosaicContrast; raw.bayersensor.pixelShiftMotionCorrectionMethod = raw.bayersensor.pixelShiftMotionCorrectionMethod && p.raw.bayersensor.pixelShiftMotionCorrectionMethod == other.raw.bayersensor.pixelShiftMotionCorrectionMethod; - raw.bayersensor.pixelShiftStddevFactorGreen = raw.bayersensor.pixelShiftStddevFactorGreen && p.raw.bayersensor.pixelShiftStddevFactorGreen == other.raw.bayersensor.pixelShiftStddevFactorGreen; - raw.bayersensor.pixelShiftStddevFactorRed = raw.bayersensor.pixelShiftStddevFactorRed && p.raw.bayersensor.pixelShiftStddevFactorRed == other.raw.bayersensor.pixelShiftStddevFactorRed; - raw.bayersensor.pixelShiftStddevFactorBlue = raw.bayersensor.pixelShiftStddevFactorBlue && p.raw.bayersensor.pixelShiftStddevFactorBlue == other.raw.bayersensor.pixelShiftStddevFactorBlue; raw.bayersensor.pixelShiftEperIso = raw.bayersensor.pixelShiftEperIso && p.raw.bayersensor.pixelShiftEperIso == other.raw.bayersensor.pixelShiftEperIso; - raw.bayersensor.pixelShiftNreadIso = raw.bayersensor.pixelShiftNreadIso && p.raw.bayersensor.pixelShiftNreadIso == other.raw.bayersensor.pixelShiftNreadIso; - raw.bayersensor.pixelShiftPrnu = raw.bayersensor.pixelShiftPrnu && p.raw.bayersensor.pixelShiftPrnu == other.raw.bayersensor.pixelShiftPrnu; raw.bayersensor.pixelShiftSigma = raw.bayersensor.pixelShiftSigma && p.raw.bayersensor.pixelShiftSigma == other.raw.bayersensor.pixelShiftSigma; - raw.bayersensor.pixelShiftSum = raw.bayersensor.pixelShiftSum && p.raw.bayersensor.pixelShiftSum == other.raw.bayersensor.pixelShiftSum; - raw.bayersensor.pixelShiftRedBlueWeight = raw.bayersensor.pixelShiftRedBlueWeight && p.raw.bayersensor.pixelShiftRedBlueWeight == other.raw.bayersensor.pixelShiftRedBlueWeight; raw.bayersensor.pixelShiftShowMotion = raw.bayersensor.pixelShiftShowMotion && p.raw.bayersensor.pixelShiftShowMotion == other.raw.bayersensor.pixelShiftShowMotion; raw.bayersensor.pixelShiftShowMotionMaskOnly = raw.bayersensor.pixelShiftShowMotionMaskOnly && p.raw.bayersensor.pixelShiftShowMotionMaskOnly == other.raw.bayersensor.pixelShiftShowMotionMaskOnly; - raw.bayersensor.pixelShiftAutomatic = raw.bayersensor.pixelShiftAutomatic && p.raw.bayersensor.pixelShiftAutomatic == other.raw.bayersensor.pixelShiftAutomatic; - raw.bayersensor.pixelShiftNonGreenHorizontal = raw.bayersensor.pixelShiftNonGreenHorizontal && p.raw.bayersensor.pixelShiftNonGreenHorizontal == other.raw.bayersensor.pixelShiftNonGreenHorizontal; - raw.bayersensor.pixelShiftNonGreenVertical = raw.bayersensor.pixelShiftNonGreenVertical && p.raw.bayersensor.pixelShiftNonGreenVertical == other.raw.bayersensor.pixelShiftNonGreenVertical; raw.bayersensor.pixelShiftHoleFill = raw.bayersensor.pixelShiftHoleFill && p.raw.bayersensor.pixelShiftHoleFill == other.raw.bayersensor.pixelShiftHoleFill; raw.bayersensor.pixelShiftMedian = raw.bayersensor.pixelShiftMedian && p.raw.bayersensor.pixelShiftMedian == other.raw.bayersensor.pixelShiftMedian; - raw.bayersensor.pixelShiftMedian3 = raw.bayersensor.pixelShiftMedian3 && p.raw.bayersensor.pixelShiftMedian3 == other.raw.bayersensor.pixelShiftMedian3; raw.bayersensor.pixelShiftGreen = raw.bayersensor.pixelShiftGreen && p.raw.bayersensor.pixelShiftGreen == other.raw.bayersensor.pixelShiftGreen; raw.bayersensor.pixelShiftBlur = raw.bayersensor.pixelShiftBlur && p.raw.bayersensor.pixelShiftBlur == other.raw.bayersensor.pixelShiftBlur; 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; - raw.bayersensor.pixelShiftNonGreenCross2 = raw.bayersensor.pixelShiftNonGreenCross2 && p.raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2; - raw.bayersensor.pixelShiftNonGreenAmaze = raw.bayersensor.pixelShiftNonGreenAmaze && p.raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze; + raw.bayersensor.pixelShiftDemosaicMethod = raw.bayersensor.pixelShiftDemosaicMethod && p.raw.bayersensor.pixelShiftDemosaicMethod == other.raw.bayersensor.pixelShiftDemosaicMethod; raw.bayersensor.greenEq = raw.bayersensor.greenEq && p.raw.bayersensor.greenthresh == other.raw.bayersensor.greenthresh; raw.bayersensor.linenoise = raw.bayersensor.linenoise && p.raw.bayersensor.linenoise == other.raw.bayersensor.linenoise; + raw.bayersensor.linenoiseDirection = raw.bayersensor.linenoiseDirection && p.raw.bayersensor.linenoiseDirection == other.raw.bayersensor.linenoiseDirection; + raw.bayersensor.pdafLinesFilter = raw.bayersensor.pdafLinesFilter && p.raw.bayersensor.pdafLinesFilter == other.raw.bayersensor.pdafLinesFilter; raw.xtranssensor.method = raw.xtranssensor.method && p.raw.xtranssensor.method == other.raw.xtranssensor.method; + raw.xtranssensor.dualDemosaicAutoContrast = raw.xtranssensor.dualDemosaicAutoContrast && p.raw.xtranssensor.dualDemosaicAutoContrast == other.raw.xtranssensor.dualDemosaicAutoContrast; + raw.xtranssensor.dualDemosaicContrast = raw.xtranssensor.dualDemosaicContrast && p.raw.xtranssensor.dualDemosaicContrast == other.raw.xtranssensor.dualDemosaicContrast; + raw.xtranssensor.border = raw.xtranssensor.border && p.raw.xtranssensor.border == other.raw.xtranssensor.border; raw.xtranssensor.ccSteps = raw.xtranssensor.ccSteps && p.raw.xtranssensor.ccSteps == other.raw.xtranssensor.ccSteps; 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.ca_autocorrect = raw.ca_autocorrect && p.raw.ca_autocorrect == other.raw.ca_autocorrect; + raw.ca_avoidcolourshift = raw.ca_avoidcolourshift && p.raw.ca_avoidcolourshift == other.raw.ca_avoidcolourshift; + raw.caautoiterations = raw.caautoiterations && p.raw.caautoiterations == other.raw.caautoiterations; 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; @@ -1018,7 +1031,6 @@ void ParamsEdited::initFrom (const std::vector raw.ff_AutoClipControl = raw.ff_AutoClipControl && p.raw.ff_AutoClipControl == other.raw.ff_AutoClipControl; raw.ff_clipControl = raw.ff_clipControl && p.raw.ff_clipControl == other.raw.ff_clipControl; raw.exPos = raw.exPos && p.raw.expos == other.raw.expos; - raw.exPreser = raw.exPreser && p.raw.preser == other.raw.preser; wavelet.enabled = wavelet.enabled && p.wavelet.enabled == other.wavelet.enabled; wavelet.strength = wavelet.strength && p.wavelet.strength == other.wavelet.strength; wavelet.balance = wavelet.balance && p.wavelet.balance == other.wavelet.balance; @@ -1122,13 +1134,19 @@ void ParamsEdited::initFrom (const std::vector 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.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; + softlight.enabled = softlight.enabled && p.softlight.enabled == other.softlight.enabled; + softlight.strength = softlight.strength && p.softlight.strength == other.softlight.strength; + dehaze.enabled = dehaze.enabled && p.dehaze.enabled == other.dehaze.enabled; + dehaze.strength = dehaze.strength && p.dehaze.strength == other.dehaze.strength; + dehaze.showDepthMap = dehaze.showDepthMap && p.dehaze.showDepthMap == other.dehaze.showDepthMap; + dehaze.depth = dehaze.depth && p.dehaze.depth == other.dehaze.depth; metadata.mode = metadata.mode && p.metadata.mode == other.metadata.mode; // How the hell can we handle that??? @@ -1137,7 +1155,7 @@ void ParamsEdited::initFrom (const std::vector } } -void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rtengine::procparams::ProcParams& mods, bool forceSet) +void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rtengine::procparams::ProcParams& mods, bool forceSet) { bool dontforceSet = !forceSet; @@ -1210,6 +1228,14 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.toneCurve.histmatching = mods.toneCurve.histmatching; } + if (toneCurve.fromHistMatching) { + toEdit.toneCurve.fromHistMatching = mods.toneCurve.fromHistMatching; + } + + if (toneCurve.clampOOG) { + toEdit.toneCurve.clampOOG = mods.toneCurve.clampOOG; + } + if (retinex.enabled) { toEdit.retinex.enabled = mods.retinex.enabled; } @@ -1343,7 +1369,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (labCurve.enabled) { toEdit.labCurve.enabled = mods.labCurve.enabled; } - + if (labCurve.lcurve) { toEdit.labCurve.lcurve = mods.labCurve.lcurve; } @@ -1407,18 +1433,19 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (localContrast.enabled) { toEdit.localContrast.enabled = mods.localContrast.enabled; } - if (localContrast.radius) { - toEdit.localContrast.radius = mods.localContrast.radius; - } - if (localContrast.amount) { - toEdit.localContrast.amount = mods.localContrast.amount; - } - if (localContrast.darkness) { - toEdit.localContrast.darkness = mods.localContrast.darkness; - } - if (localContrast.lightness) { - toEdit.localContrast.lightness = mods.localContrast.lightness; - } + +#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; @@ -1555,16 +1582,27 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten 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 (colorToning.labregions) { + toEdit.colorToning.labregions = mods.colorToning.labregions; + } + + if (colorToning.labregionsShowMask) { + toEdit.colorToning.labregionsShowMask = mods.colorToning.labregionsShowMask; + } + if (sharpenEdge.enabled) { toEdit.sharpenEdge.enabled = mods.sharpenEdge.enabled; } @@ -1593,6 +1631,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.sharpenMicro.amount = dontforceSet && options.baBehav[ADDSET_SHARPENMICRO_AMOUNT] ? toEdit.sharpenMicro.amount + mods.sharpenMicro.amount : mods.sharpenMicro.amount; } + if (sharpenMicro.contrast) { + toEdit.sharpenMicro.contrast = dontforceSet && options.baBehav[ADDSET_SHARPENMICRO_CONTRAST] ? toEdit.sharpenMicro.contrast + mods.sharpenMicro.contrast : mods.sharpenMicro.contrast; + } + if (sharpenMicro.uniformity) { toEdit.sharpenMicro.uniformity = dontforceSet && options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY] ? toEdit.sharpenMicro.uniformity + mods.sharpenMicro.uniformity : mods.sharpenMicro.uniformity; } @@ -1601,10 +1643,18 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.sharpening.enabled = mods.sharpening.enabled; } + if (sharpening.contrast) { + toEdit.sharpening.contrast = dontforceSet && options.baBehav[ADDSET_SHARP_CONTRAST] ? toEdit.sharpening.contrast + mods.sharpening.contrast : mods.sharpening.contrast; + } + if (sharpening.radius) { toEdit.sharpening.radius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.sharpening.radius + mods.sharpening.radius : mods.sharpening.radius; } + if (sharpening.blurradius) { + toEdit.sharpening.blurradius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.sharpening.blurradius + mods.sharpening.blurradius : mods.sharpening.blurradius; + } + if (sharpening.amount) { toEdit.sharpening.amount = dontforceSet && options.baBehav[ADDSET_SHARP_AMOUNT] ? toEdit.sharpening.amount + mods.sharpening.amount : mods.sharpening.amount; } @@ -1618,7 +1668,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten } if (sharpening.edges_radius) { - toEdit.sharpening.edges_radius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.sharpening.edges_radius + mods.sharpening.edges_radius: mods.sharpening.edges_radius; + toEdit.sharpening.edges_radius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.sharpening.edges_radius + mods.sharpening.edges_radius : mods.sharpening.edges_radius; } if (sharpening.edges_tolerance) { @@ -1657,6 +1707,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.prsharpening.enabled = mods.prsharpening.enabled; } + if (prsharpening.contrast) { + toEdit.prsharpening.contrast = dontforceSet && options.baBehav[ADDSET_SHARP_CONTRAST] ? toEdit.prsharpening.contrast + mods.prsharpening.contrast : mods.prsharpening.contrast; + } + if (prsharpening.radius) { toEdit.prsharpening.radius = dontforceSet && options.baBehav[ADDSET_SHARP_RADIUS] ? toEdit.prsharpening.radius + mods.prsharpening.radius : mods.prsharpening.radius; } @@ -1748,7 +1802,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (wb.enabled) { toEdit.wb.enabled = mods.wb.enabled; } - + if (wb.method) { toEdit.wb.method = mods.wb.method; } @@ -2067,21 +2121,23 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten 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; } - if (sh.hq) { - toEdit.sh.hq = mods.sh.hq; - } - if (sh.highlights) { toEdit.sh.highlights = dontforceSet && options.baBehav[ADDSET_SH_HIGHLIGHTS] ? toEdit.sh.highlights + mods.sh.highlights : mods.sh.highlights; } @@ -2102,6 +2158,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.sh.radius = mods.sh.radius; } + if (sh.lab) { + toEdit.sh.lab = mods.sh.lab; + } + if (crop.enabled) { toEdit.crop.enabled = mods.crop.enabled; } @@ -2273,7 +2333,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten 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]; @@ -2416,8 +2476,12 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.spot.entries = mods.spot.entries; } - if (icm.input) { - toEdit.icm.input = mods.icm.input; + if (resize.allowUpscaling) { + toEdit.resize.allowUpscaling = mods.resize.allowUpscaling; + } + + if (icm.inputProfile) { + toEdit.icm.inputProfile = mods.icm.inputProfile; } if (icm.toneCurve) { @@ -2440,12 +2504,12 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.icm.dcpIlluminant = mods.icm.dcpIlluminant; } - if (icm.working) { - toEdit.icm.working = mods.icm.working; + if (icm.workingProfile) { + toEdit.icm.workingProfile = mods.icm.workingProfile; } - if (icm.output) { - toEdit.icm.output = mods.icm.output; + if (icm.outputProfile) { + toEdit.icm.outputProfile = mods.icm.outputProfile; } if (icm.outputIntent) { @@ -2456,26 +2520,26 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.icm.outputBPC = mods.icm.outputBPC; } - if (icm.gampos) { - toEdit.icm.gampos = dontforceSet && options.baBehav[ADDSET_FREE_OUPUT_GAMMA] ? toEdit.icm.gampos + mods.icm.gampos : mods.icm.gampos; + if (icm.workingTRCGamma) { + toEdit.icm.workingTRCGamma = mods.icm.workingTRCGamma; } - if (icm.slpos) { - toEdit.icm.slpos = dontforceSet && options.baBehav[ADDSET_FREE_OUTPUT_SLOPE] ? toEdit.icm.slpos + mods.icm.slpos : mods.icm.slpos; + if (icm.workingTRCSlope) { + toEdit.icm.workingTRCSlope = mods.icm.workingTRCSlope; } - if (icm.gamma) { - toEdit.icm.gamma = mods.icm.gamma; - } - - if (icm.freegamma) { - toEdit.icm.freegamma = mods.icm.freegamma; + if (icm.workingTRC) { + toEdit.icm.workingTRC = mods.icm.workingTRC; } if (raw.bayersensor.method) { toEdit.raw.bayersensor.method = mods.raw.bayersensor.method; } + if (raw.bayersensor.border) { + toEdit.raw.bayersensor.border = mods.raw.bayersensor.border; + } + if (raw.bayersensor.imageNum) { toEdit.raw.bayersensor.imageNum = mods.raw.bayersensor.imageNum; } @@ -2516,54 +2580,26 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.lmmse_iterations = mods.raw.bayersensor.lmmse_iterations; } - if (raw.bayersensor.pixelShiftMotion) { - toEdit.raw.bayersensor.pixelShiftMotion = mods.raw.bayersensor.pixelShiftMotion; + if (raw.bayersensor.dualDemosaicAutoContrast) { + toEdit.raw.bayersensor.dualDemosaicAutoContrast = mods.raw.bayersensor.dualDemosaicAutoContrast; } - if (raw.bayersensor.pixelShiftMotionCorrection) { - toEdit.raw.bayersensor.pixelShiftMotionCorrection = mods.raw.bayersensor.pixelShiftMotionCorrection; + if (raw.bayersensor.dualDemosaicContrast) { + toEdit.raw.bayersensor.dualDemosaicContrast = mods.raw.bayersensor.dualDemosaicContrast; } if (raw.bayersensor.pixelShiftMotionCorrectionMethod) { toEdit.raw.bayersensor.pixelShiftMotionCorrectionMethod = mods.raw.bayersensor.pixelShiftMotionCorrectionMethod; } - if (raw.bayersensor.pixelShiftStddevFactorGreen) { - toEdit.raw.bayersensor.pixelShiftStddevFactorGreen = mods.raw.bayersensor.pixelShiftStddevFactorGreen; - } - - if (raw.bayersensor.pixelShiftStddevFactorRed) { - toEdit.raw.bayersensor.pixelShiftStddevFactorRed = mods.raw.bayersensor.pixelShiftStddevFactorRed; - } - - if (raw.bayersensor.pixelShiftStddevFactorBlue) { - toEdit.raw.bayersensor.pixelShiftStddevFactorBlue = mods.raw.bayersensor.pixelShiftStddevFactorBlue; - } - if (raw.bayersensor.pixelShiftEperIso) { toEdit.raw.bayersensor.pixelShiftEperIso = mods.raw.bayersensor.pixelShiftEperIso; } - if (raw.bayersensor.pixelShiftNreadIso) { - toEdit.raw.bayersensor.pixelShiftNreadIso = mods.raw.bayersensor.pixelShiftNreadIso; - } - - if (raw.bayersensor.pixelShiftPrnu) { - toEdit.raw.bayersensor.pixelShiftPrnu = mods.raw.bayersensor.pixelShiftPrnu; - } - if (raw.bayersensor.pixelShiftSigma) { toEdit.raw.bayersensor.pixelShiftSigma = mods.raw.bayersensor.pixelShiftSigma; } - if (raw.bayersensor.pixelShiftSum) { - toEdit.raw.bayersensor.pixelShiftSum = mods.raw.bayersensor.pixelShiftSum; - } - - if (raw.bayersensor.pixelShiftRedBlueWeight) { - toEdit.raw.bayersensor.pixelShiftRedBlueWeight = mods.raw.bayersensor.pixelShiftRedBlueWeight; - } - if (raw.bayersensor.pixelShiftShowMotion) { toEdit.raw.bayersensor.pixelShiftShowMotion = mods.raw.bayersensor.pixelShiftShowMotion; } @@ -2572,18 +2608,6 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.pixelShiftShowMotionMaskOnly = mods.raw.bayersensor.pixelShiftShowMotionMaskOnly; } - if (raw.bayersensor.pixelShiftAutomatic) { - toEdit.raw.bayersensor.pixelShiftAutomatic = mods.raw.bayersensor.pixelShiftAutomatic; - } - - if (raw.bayersensor.pixelShiftNonGreenHorizontal) { - toEdit.raw.bayersensor.pixelShiftNonGreenHorizontal = mods.raw.bayersensor.pixelShiftNonGreenHorizontal; - } - - if (raw.bayersensor.pixelShiftNonGreenVertical) { - toEdit.raw.bayersensor.pixelShiftNonGreenVertical = mods.raw.bayersensor.pixelShiftNonGreenVertical; - } - if (raw.bayersensor.pixelShiftHoleFill) { toEdit.raw.bayersensor.pixelShiftHoleFill = mods.raw.bayersensor.pixelShiftHoleFill; } @@ -2592,10 +2616,6 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.pixelShiftMedian = mods.raw.bayersensor.pixelShiftMedian; } - if (raw.bayersensor.pixelShiftMedian3) { - toEdit.raw.bayersensor.pixelShiftMedian3 = mods.raw.bayersensor.pixelShiftMedian3; - } - if (raw.bayersensor.pixelShiftGreen) { toEdit.raw.bayersensor.pixelShiftGreen = mods.raw.bayersensor.pixelShiftGreen; } @@ -2608,18 +2628,6 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.pixelShiftSmoothFactor = mods.raw.bayersensor.pixelShiftSmoothFactor; } - if (raw.bayersensor.pixelShiftExp0) { - toEdit.raw.bayersensor.pixelShiftExp0 = mods.raw.bayersensor.pixelShiftExp0; - } - - if (raw.bayersensor.pixelShiftLmmse) { - 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; } @@ -2632,12 +2640,8 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.pixelShiftNonGreenCross = mods.raw.bayersensor.pixelShiftNonGreenCross; } - if (raw.bayersensor.pixelShiftNonGreenCross2) { - toEdit.raw.bayersensor.pixelShiftNonGreenCross2 = mods.raw.bayersensor.pixelShiftNonGreenCross2; - } - - if (raw.bayersensor.pixelShiftNonGreenAmaze) { - toEdit.raw.bayersensor.pixelShiftNonGreenAmaze = mods.raw.bayersensor.pixelShiftNonGreenAmaze; + if (raw.bayersensor.pixelShiftDemosaicMethod) { + toEdit.raw.bayersensor.pixelShiftDemosaicMethod = mods.raw.bayersensor.pixelShiftDemosaicMethod; } if (raw.bayersensor.greenEq) { @@ -2648,14 +2652,34 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.linenoise = dontforceSet && options.baBehav[ADDSET_PREPROCESS_LINEDENOISE] ? toEdit.raw.bayersensor.linenoise + mods.raw.bayersensor.linenoise : mods.raw.bayersensor.linenoise; } + if (raw.bayersensor.linenoiseDirection) { + toEdit.raw.bayersensor.linenoiseDirection = mods.raw.bayersensor.linenoiseDirection; + } + + if (raw.bayersensor.pdafLinesFilter) { + toEdit.raw.bayersensor.pdafLinesFilter = mods.raw.bayersensor.pdafLinesFilter; + } + if (raw.xtranssensor.method) { toEdit.raw.xtranssensor.method = mods.raw.xtranssensor.method; } + if (raw.xtranssensor.dualDemosaicAutoContrast) { + toEdit.raw.xtranssensor.dualDemosaicAutoContrast = mods.raw.xtranssensor.dualDemosaicAutoContrast; + } + + if (raw.xtranssensor.dualDemosaicContrast) { + toEdit.raw.xtranssensor.dualDemosaicContrast = mods.raw.xtranssensor.dualDemosaicContrast; + } + if (raw.xtranssensor.ccSteps) { toEdit.raw.xtranssensor.ccSteps = mods.raw.xtranssensor.ccSteps; } + if (raw.xtranssensor.border) { + toEdit.raw.xtranssensor.border = mods.raw.xtranssensor.border; + } + if (raw.xtranssensor.exBlackRed) { toEdit.raw.xtranssensor.blackred = dontforceSet && options.baBehav[ADDSET_RAWEXPOS_BLACKS] ? toEdit.raw.xtranssensor.blackred + mods.raw.xtranssensor.blackred : mods.raw.xtranssensor.blackred; } @@ -2672,6 +2696,14 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.ca_autocorrect = mods.raw.ca_autocorrect; } + if (raw.ca_avoidcolourshift) { + toEdit.raw.ca_avoidcolourshift = mods.raw.ca_avoidcolourshift; + } + + if (raw.caautoiterations) { + toEdit.raw.caautoiterations = dontforceSet && options.baBehav[ADDSET_RAWCACORR] ? toEdit.raw.caautoiterations + mods.raw.caautoiterations : mods.raw.caautoiterations; + } + if (raw.cared) { toEdit.raw.cared = dontforceSet && options.baBehav[ADDSET_RAWCACORR] ? toEdit.raw.cared + mods.raw.cared : mods.raw.cared; } @@ -2684,10 +2716,6 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.expos = dontforceSet && options.baBehav[ADDSET_RAWEXPOS_LINEAR] ? toEdit.raw.expos + mods.raw.expos : mods.raw.expos; } - if (raw.exPreser) { - toEdit.raw.preser = dontforceSet && options.baBehav[ADDSET_RAWEXPOS_PRESER] ? toEdit.raw.preser + mods.raw.preser : mods.raw.preser; - } - if (raw.hotPixelFilter) { toEdit.raw.hotPixelFilter = mods.raw.hotPixelFilter; } @@ -3108,7 +3136,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (hsvequalizer.enabled) { toEdit.hsvequalizer.enabled = mods.hsvequalizer.enabled; } - + if (hsvequalizer.hcurve) { toEdit.hsvequalizer.hcurve = mods.hsvequalizer.hcurve; } @@ -3133,6 +3161,30 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.filmSimulation.strength = dontforceSet && options.baBehav[ADDSET_FILMSIMULATION_STRENGTH] ? toEdit.filmSimulation.strength + mods.filmSimulation.strength : mods.filmSimulation.strength; } + if (softlight.enabled) { + toEdit.softlight.enabled = mods.softlight.enabled; + } + + if (softlight.strength) { + toEdit.softlight.strength = dontforceSet && options.baBehav[ADDSET_SOFTLIGHT_STRENGTH] ? toEdit.softlight.strength + mods.softlight.strength : mods.softlight.strength; + } + + if (dehaze.enabled) { + toEdit.dehaze.enabled = mods.dehaze.enabled; + } + + if (dehaze.strength) { + toEdit.dehaze.strength = dontforceSet && options.baBehav[ADDSET_DEHAZE_STRENGTH] ? toEdit.dehaze.strength + mods.dehaze.strength : mods.dehaze.strength; + } + + if (dehaze.depth) { + toEdit.dehaze.depth = mods.dehaze.depth; + } + + if (dehaze.showDepthMap) { + toEdit.dehaze.showDepthMap = mods.dehaze.showDepthMap; + } + if (metadata.mode) { toEdit.metadata.mode = mods.metadata.mode; } @@ -3152,22 +3204,21 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten bool RAWParamsEdited::BayerSensor::isUnchanged() const { - 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 && pixelShiftOneGreen && pixelShiftEqualBright && pixelShiftEqualBrightChannel - && linenoise && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen; + return method && border && imageNum && dcbIterations && dcbEnhance && lmmseIterations && dualDemosaicAutoContrast && dualDemosaicContrast /*&& allEnhance*/ && greenEq + && pixelShiftMotionCorrectionMethod && pixelShiftEperIso && pixelShiftSigma && pixelShiftShowMotion && pixelShiftShowMotionMaskOnly + && pixelShiftHoleFill && pixelShiftMedian && pixelShiftNonGreenCross && pixelShiftDemosaicMethod && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftEqualBright && pixelShiftEqualBrightChannel + && linenoise && linenoiseDirection && pdafLinesFilter && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen; } bool RAWParamsEdited::XTransSensor::isUnchanged() const { - return method && exBlackRed && exBlackGreen && exBlackBlue; + return method && border && exBlackRed && exBlackGreen && exBlackBlue && dualDemosaicAutoContrast && dualDemosaicContrast; } bool RAWParamsEdited::isUnchanged() const { - 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; + return bayersensor.isUnchanged() && xtranssensor.isUnchanged() && ca_autocorrect && ca_avoidcolourshift && caautoiterations && cared && cablue && hotPixelFilter && deadPixelFilter && hotdeadpix_thresh && darkFrame + && df_autoselect && ff_file && ff_AutoSelect && ff_BlurRadius && ff_BlurType && exPos && ff_AutoClipControl && ff_clipControl; } bool LensProfParamsEdited::isUnchanged() const diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 2e39eab66..7a6c87bba 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -16,27 +16,19 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#ifndef _PARAMEDITED_H_ -#define _PARAMEDITED_H_ +#pragma once -#include #include -#include "../rtengine/procparams.h" + #include "../rtengine/rtengine.h" -class GeneralParamsEdited -{ - -public: +struct GeneralParamsEdited { bool rank; bool colorlabel; bool intrash; }; -class ToneCurveParamsEdited -{ - -public: +struct ToneCurveParamsEdited { bool curve; bool curve2; bool curveMode; @@ -54,11 +46,11 @@ public: bool hrenabled; bool method; bool histmatching; + bool fromHistMatching; + bool clampOOG; }; -class RetinexParamsEdited -{ -public: +struct RetinexParamsEdited { bool enabled; bool str; bool scal; @@ -88,19 +80,17 @@ public: bool lhcurve; bool retinex; bool medianmap; - bool isUnchanged() const; bool highlights; bool htonalwidth; bool shadows; bool stonalwidth; bool radius; + bool isUnchanged() const; }; -class LCurveParamsEdited -{ -public: +struct LCurveParamsEdited { bool enabled; bool brightness; bool contrast; @@ -120,8 +110,7 @@ public: }; -class LocalContrastParamsEdited { -public: +struct LocalContrastParamsEdited { bool enabled; bool radius; bool amount; @@ -129,11 +118,7 @@ public: bool lightness; }; - -class RGBCurvesParamsEdited -{ - -public: +struct RGBCurvesParamsEdited { bool enabled; bool lumamode; bool rcurve; @@ -141,10 +126,7 @@ public: bool bcurve; }; -class ColorToningEdited -{ - -public: +struct ColorToningEdited { bool enabled; bool opacityCurve; bool colorCurve; @@ -175,33 +157,29 @@ public: bool labgridBLow; bool labgridAHigh; bool labgridBHigh; + bool labregions; + bool labregionsShowMask; }; -class SharpenEdgeParamsEdited -{ - -public : +struct SharpenEdgeParamsEdited { bool enabled; bool passes; bool amount; bool threechannels; }; -class SharpenMicroParamsEdited -{ -public : +struct SharpenMicroParamsEdited { bool enabled; bool matrix; bool amount; + bool contrast; bool uniformity; - }; -class SharpeningParamsEdited -{ - -public: +struct SharpeningParamsEdited { bool enabled; + bool contrast; + bool blurradius; bool radius; bool amount; bool threshold; @@ -218,10 +196,7 @@ public: bool deconvdamping; }; -class VibranceParamsEdited -{ - -public: +struct VibranceParamsEdited { bool enabled; bool pastels; bool saturated; @@ -232,19 +207,7 @@ public: bool skintonescurve; }; -/*class ColorBoostParamsEdited { - - public: - bool amount; - bool avoidclip; - bool enable_saturationlimiter; - bool rstprotection; -};*/ - -class WBParamsEdited -{ - -public: +struct WBParamsEdited { bool enabled; bool method; bool temperature; @@ -253,50 +216,19 @@ public: bool tempBias; }; -/*class ColorShiftParamsEdited { - - public: - bool a; - bool b; -};*/ - -/*class LumaDenoiseParamsEdited { - - public: - bool enabled; - bool radius; - bool edgetolerance; -};*/ - -/*class ColorDenoiseParamsEdited { - - public: - bool enabled; - bool amount; -};*/ - -class DefringeParamsEdited -{ - -public: +struct DefringeParamsEdited { bool enabled; bool radius; bool threshold; bool huecurve; }; -class ImpulseDenoiseParamsEdited -{ - -public: +struct ImpulseDenoiseParamsEdited { bool enabled; bool thresh; }; -class ColorAppearanceParamsEdited -{ - -public: +struct ColorAppearanceParamsEdited { bool curve; bool curve2; bool curve3; @@ -329,22 +261,16 @@ public: bool rstprotection; bool surrsource; bool gamut; -// bool badpix; bool datacie; bool tonecie; -// bool sharpcie; bool tempout; bool greenout; bool ybout; bool tempsc; bool greensc; - }; -class DirPyrDenoiseParamsEdited -{ - -public: +struct DirPyrDenoiseParamsEdited { bool enabled; bool enhance; bool median; @@ -357,7 +283,6 @@ public: bool lcurve; bool cccurve; -// bool perform; bool dmethod; bool Lmethod; bool Cmethod; @@ -367,12 +292,9 @@ public: bool methodmed; bool rgbmethod; bool passes; - }; -class EPDParamsEdited -{ -public: +struct EPDParamsEdited { bool enabled; bool strength; bool gamma; @@ -381,32 +303,24 @@ public: bool reweightingIterates; }; - -class FattalToneMappingParamsEdited { -public: +struct FattalToneMappingParamsEdited { bool enabled; bool threshold; bool amount; + bool anchor; }; - -class SHParamsEdited -{ - -public: +struct SHParamsEdited { bool enabled; - bool hq; bool highlights; bool htonalwidth; bool shadows; bool stonalwidth; bool radius; + bool lab; }; -class CropParamsEdited -{ - -public: +struct CropParamsEdited { bool enabled; bool x; bool y; @@ -418,58 +332,47 @@ public: bool guide; }; -class CoarseTransformParamsEdited -{ - -public: +struct CoarseTransformParamsEdited { bool rotate; bool hflip; bool vflip; }; -class CommonTransformParamsEdited -{ - -public: +struct CommonTransformParamsEdited { bool autofill; }; -class RotateParamsEdited -{ - -public: +struct RotateParamsEdited { bool degree; }; -class DistortionParamsEdited -{ - -public: +struct DistortionParamsEdited { bool amount; }; -class LensProfParamsEdited -{ -public: - bool lcpFile, useDist, useVign, useCA; - bool useLensfun, lfAutoMatch, lfCameraMake, lfCameraModel, lfLens; +struct LensProfParamsEdited { + bool lcpFile; + bool useDist; + bool useVign; + bool useCA; + + bool useLensfun; + bool lfAutoMatch; + bool lfCameraMake; + bool lfCameraModel; + bool lfLens; + bool lcMode; bool isUnchanged() const; }; -class PerspectiveParamsEdited -{ - -public: +struct PerspectiveParamsEdited { bool horizontal; bool vertical; }; -class GradientParamsEdited -{ - -public: +struct GradientParamsEdited { bool enabled; bool degree; bool feather; @@ -478,20 +381,14 @@ public: bool centerY; }; -class PCVignetteParamsEdited -{ - -public: +struct PCVignetteParamsEdited { bool enabled; bool strength; bool feather; bool roundness; }; -class VignettingParamsEdited -{ - -public: +struct VignettingParamsEdited { bool amount; bool radius; bool strength; @@ -499,20 +396,15 @@ public: bool centerY; }; -class ChannelMixerParamsEdited -{ - -public: +struct ChannelMixerParamsEdited { bool enabled; bool red[3]; bool green[3]; bool blue[3]; }; -class BlackWhiteParamsEdited -{ -public: +struct BlackWhiteParamsEdited { bool enabledcc; bool enabled; bool method; @@ -536,28 +428,14 @@ public: bool afterCurveMode; bool autoc; bool algo; - }; -class CACorrParamsEdited -{ - -public: +struct CACorrParamsEdited { bool red; bool blue; }; -/* -class HRecParamsEdited { - public: - bool enabled; - bool method; -}; -*/ -class ResizeParamsEdited -{ - -public: +struct ResizeParamsEdited { bool scale; bool appliesTo; bool method; @@ -565,6 +443,7 @@ public: bool width; bool height; bool enabled; + bool allowUpscaling; }; class SpotParamsEdited @@ -574,29 +453,25 @@ public: bool entries; }; -class ColorManagementParamsEdited -{ - -public: - bool input; +struct ColorManagementParamsEdited { + bool inputProfile; bool toneCurve; bool applyLookTable; bool applyBaselineExposureOffset; bool applyHueSatMap; bool dcpIlluminant; - bool working; - bool output; + + bool workingProfile; + bool workingTRC; + bool workingTRCGamma; + bool workingTRCSlope; + + bool outputProfile; bool outputIntent; bool outputBPC; - bool gamma; - bool gampos; - bool slpos; - bool freegamma; }; -class WaveletParamsEdited -{ -public: +struct WaveletParamsEdited { bool enabled; bool strength; bool balance; @@ -680,13 +555,9 @@ public: bool expfinal; bool exptoning; bool expnoise; - }; -class DirPyrEqualizerParamsEdited -{ - -public: +struct DirPyrEqualizerParamsEdited { bool enabled; bool gamutlab; bool mult[6]; @@ -694,36 +565,37 @@ public: bool threshold; bool skinprotect; bool hueskin; - // bool algo; }; -class HSVEqualizerParamsEdited -{ - -public: +struct HSVEqualizerParamsEdited { bool enabled; bool hcurve; bool scurve; bool vcurve; }; -class FilmSimulationParamsEdited -{ -public: +struct FilmSimulationParamsEdited { bool enabled; bool clutFilename; bool strength; }; -class RAWParamsEdited -{ +struct SoftLightParamsEdited { + bool enabled; + bool strength; +}; -public: - class BayerSensor - { +struct DehazeParamsEdited { + bool enabled; + bool strength; + bool showDepthMap; + bool depth; +}; - public: +struct RAWParamsEdited { + struct BayerSensor { bool method; + bool border; bool imageNum; bool ccSteps; bool exBlack0; @@ -734,50 +606,36 @@ public: bool dcbIterations; bool dcbEnhance; bool lmmseIterations; - bool pixelShiftMotion; - bool pixelShiftMotionCorrection; + bool dualDemosaicAutoContrast; + bool dualDemosaicContrast; bool pixelShiftMotionCorrectionMethod; - bool pixelShiftStddevFactorGreen; - bool pixelShiftStddevFactorRed; - bool pixelShiftStddevFactorBlue; bool pixelShiftEperIso; - bool pixelShiftNreadIso; - bool pixelShiftPrnu; bool pixelShiftSigma; - bool pixelShiftSum; - bool pixelShiftRedBlueWeight; bool pixelShiftShowMotion; bool pixelShiftShowMotionMaskOnly; - bool pixelShiftAutomatic; - bool pixelShiftNonGreenHorizontal; - bool pixelShiftNonGreenVertical; bool pixelShiftHoleFill; bool pixelShiftMedian; - bool pixelShiftMedian3; bool pixelShiftGreen; bool pixelShiftBlur; bool pixelShiftSmooth; - bool pixelShiftExp0; - bool pixelShiftLmmse; - bool pixelShiftOneGreen; bool pixelShiftEqualBright; bool pixelShiftEqualBrightChannel; bool pixelShiftNonGreenCross; - bool pixelShiftNonGreenCross2; - bool pixelShiftNonGreenAmaze; + bool pixelShiftDemosaicMethod; - //bool allEnhance; bool greenEq; bool linenoise; + bool linenoiseDirection; + bool pdafLinesFilter; bool isUnchanged() const; }; - class XTransSensor - { - - public: + struct XTransSensor { bool method; + bool dualDemosaicAutoContrast; + bool dualDemosaicContrast; + bool border; bool ccSteps; bool exBlackRed; bool exBlackGreen; @@ -790,6 +648,8 @@ public: XTransSensor xtranssensor; bool ca_autocorrect; + bool ca_avoidcolourshift; + bool caautoiterations; bool cared; bool cablue; bool hotPixelFilter; @@ -804,75 +664,66 @@ public: bool ff_AutoClipControl; bool ff_clipControl; bool exPos; - bool exPreser; bool isUnchanged() const; }; -class MetaDataParamsEdited { -public: +struct MetaDataParamsEdited { bool mode; }; - -class ParamsEdited -{ - -public: - GeneralParamsEdited general; - ToneCurveParamsEdited toneCurve; - LCurveParamsEdited labCurve; - LocalContrastParamsEdited localContrast; - RGBCurvesParamsEdited rgbCurves; - ColorToningEdited colorToning; - RetinexParamsEdited retinex; - SharpeningParamsEdited sharpening; - SharpeningParamsEdited prsharpening; - SharpenEdgeParamsEdited sharpenEdge; - SharpenMicroParamsEdited sharpenMicro; - VibranceParamsEdited vibrance; - ColorAppearanceParamsEdited colorappearance; - //ColorBoostParamsEdited colorBoost; - WBParamsEdited wb; - //ColorShiftParamsEdited colorShift; - //LumaDenoiseParamsEdited lumaDenoise; - //ColorDenoiseParamsEdited colorDenoise; - DefringeParamsEdited defringe; - DirPyrDenoiseParamsEdited dirpyrDenoise; - EPDParamsEdited epd; +struct ParamsEdited { + GeneralParamsEdited general; + ToneCurveParamsEdited toneCurve; + LCurveParamsEdited labCurve; + LocalContrastParamsEdited localContrast; + RGBCurvesParamsEdited rgbCurves; + ColorToningEdited colorToning; + RetinexParamsEdited retinex; + SharpeningParamsEdited sharpening; + SharpeningParamsEdited prsharpening; + SharpenEdgeParamsEdited sharpenEdge; + SharpenMicroParamsEdited sharpenMicro; + VibranceParamsEdited vibrance; + ColorAppearanceParamsEdited colorappearance; + WBParamsEdited wb; + DefringeParamsEdited defringe; + DirPyrDenoiseParamsEdited dirpyrDenoise; + EPDParamsEdited epd; FattalToneMappingParamsEdited fattal; - ImpulseDenoiseParamsEdited impulseDenoise; - SHParamsEdited sh; - CropParamsEdited crop; - CoarseTransformParamsEdited coarse; - CommonTransformParamsEdited commonTrans; - RotateParamsEdited rotate; - DistortionParamsEdited distortion; - LensProfParamsEdited lensProf; - PerspectiveParamsEdited perspective; - GradientParamsEdited gradient; - PCVignetteParamsEdited pcvignette; - CACorrParamsEdited cacorrection; - VignettingParamsEdited vignetting; - ChannelMixerParamsEdited chmixer; - BlackWhiteParamsEdited blackwhite; - ResizeParamsEdited resize; - SpotParamsEdited spot; - ColorManagementParamsEdited icm; - RAWParamsEdited raw; - DirPyrEqualizerParamsEdited dirpyrequalizer; - WaveletParamsEdited wavelet; - HSVEqualizerParamsEdited hsvequalizer; - FilmSimulationParamsEdited filmSimulation; - MetaDataParamsEdited metadata; - bool exif; - bool iptc; + ImpulseDenoiseParamsEdited impulseDenoise; + SHParamsEdited sh; + CropParamsEdited crop; + CoarseTransformParamsEdited coarse; + CommonTransformParamsEdited commonTrans; + RotateParamsEdited rotate; + DistortionParamsEdited distortion; + LensProfParamsEdited lensProf; + PerspectiveParamsEdited perspective; + GradientParamsEdited gradient; + PCVignetteParamsEdited pcvignette; + CACorrParamsEdited cacorrection; + VignettingParamsEdited vignetting; + ChannelMixerParamsEdited chmixer; + BlackWhiteParamsEdited blackwhite; + ResizeParamsEdited resize; + SpotParamsEdited spot; + ColorManagementParamsEdited icm; + RAWParamsEdited raw; + DirPyrEqualizerParamsEdited dirpyrequalizer; + WaveletParamsEdited wavelet; + HSVEqualizerParamsEdited hsvequalizer; + FilmSimulationParamsEdited filmSimulation; + SoftLightParamsEdited softlight; + DehazeParamsEdited dehaze; + MetaDataParamsEdited metadata; + bool exif; + bool iptc; - explicit ParamsEdited (bool value = false); + explicit ParamsEdited(bool value = false); - void set (bool v); - void initFrom (const std::vector& src); - void combine (rtengine::procparams::ProcParams& toEdit, const rtengine::procparams::ProcParams& mods, bool forceSet); + void set(bool v); + void initFrom(const std::vector& src); + void combine(rtengine::procparams::ProcParams& toEdit, const rtengine::procparams::ProcParams& mods, bool forceSet); }; -#endif diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index f11a94393..734f7c29b 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -49,7 +49,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Basic Settings: wb = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WHITEBALANCE"))); exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE"))); - localcontrast = Gtk::manage(new Gtk::CheckButton(M("PARTIALPASTE_LOCALCONTRAST"))); sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS"))); epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD"))); fattal = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_TM_FATTAL"))); @@ -59,12 +58,14 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // 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"))); 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"))); + dehaze = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DEHAZE")) ); // Advanced Settings: retinex = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX"))); @@ -78,6 +79,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren blackwhite = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXERBW"))); hsveq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HSVEQUALIZER"))); filmSimulation = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_FILMSIMULATION")) ); + softlight = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SOFTLIGHT")) ); rgbcurves = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RGBCURVES"))); colortoning = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORTONING"))); @@ -104,6 +106,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // 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_border = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_BORDER"))); 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"))); @@ -114,9 +117,9 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren 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_pdaf_lines_filter = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_PDAFLINESFILTER"))); //--- 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"))); @@ -130,6 +133,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren //--- raw_ca_autocorrect = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AUTO"))); raw_caredblue = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_CAREDBLUE"))); + raw_ca_avoid_colourshift = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT"))); Gtk::VBox* vboxes[8]; Gtk::HSeparator* hseps[8]; @@ -146,7 +150,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[0]->pack_start (*hseps[0], Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*wb, Gtk::PACK_SHRINK, 2); vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2); - vboxes[0]->pack_start (*localcontrast, 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 (*fattal, Gtk::PACK_SHRINK, 2); @@ -158,12 +161,14 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren 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); vboxes[1]->pack_start (*dirpyrden, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*defringe, Gtk::PACK_SHRINK, 2); vboxes[1]->pack_start (*dirpyreq, Gtk::PACK_SHRINK, 2); + vboxes[1]->pack_start (*dehaze, Gtk::PACK_SHRINK, 2); //COLOR vboxes[2]->pack_start (*color, Gtk::PACK_SHRINK, 2); @@ -174,6 +179,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[2]->pack_start (*blackwhite, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*hsveq, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*filmSimulation, Gtk::PACK_SHRINK, 2); + vboxes[2]->pack_start (*softlight, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*rgbcurves, Gtk::PACK_SHRINK, 2); vboxes[2]->pack_start (*colortoning, Gtk::PACK_SHRINK, 2); @@ -214,6 +220,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[7]->pack_start (*raw, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*hseps[7], Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_border, 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); @@ -225,9 +232,9 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren 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 (*raw_pdaf_lines_filter, 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); @@ -241,6 +248,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren 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); + vboxes[7]->pack_start (*raw_ca_avoid_colourshift, Gtk::PACK_SHRINK, 2); Gtk::VBox* vbCol1 = Gtk::manage (new Gtk::VBox ()); Gtk::VBox* vbCol2 = Gtk::manage (new Gtk::VBox ()); @@ -303,7 +311,6 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // 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)); - localcontrastConn = localcontrast->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)); fattalConn = fattal->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true)); @@ -313,12 +320,14 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // 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)); 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)); + dehazeConn = dehaze->signal_toggled().connect (sigc::bind (sigc::mem_fun(*detail, &Gtk::CheckButton::set_inconsistent), true)); // Advanced Settings: retinexConn = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*advanced, &Gtk::CheckButton::set_inconsistent), true)); @@ -332,6 +341,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren chmixerbwConn = blackwhite->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); hsveqConn = hsveq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); filmSimulationConn = filmSimulation->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); + softlightConn = softlight->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); 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)); @@ -357,6 +367,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Raw Settings: raw_methodConn = raw_method->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_borderConn = raw_border->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)); @@ -368,9 +379,9 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren 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_pdaf_lines_filterConn = raw_pdaf_lines_filter->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)); //--- df_fileConn = df_file->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); @@ -384,6 +395,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren //--- 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_ca_avoid_colourshiftconn = raw_ca_avoid_colourshift->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); @@ -431,6 +443,7 @@ void PartialPasteDlg::rawToggled () { ConnectionBlocker raw_methodBlocker(raw_methodConn); + ConnectionBlocker raw_borderBlocker(raw_borderConn); ConnectionBlocker raw_imagenumBlocker(raw_imagenumConn); ConnectionBlocker raw_pixelshiftBlocker(raw_pixelshiftConn); ConnectionBlocker raw_ccStepsBlocker(raw_ccStepsConn); @@ -441,8 +454,8 @@ void PartialPasteDlg::rawToggled () ConnectionBlocker raw_greenthreshBlocker(raw_greenthreshConn); ConnectionBlocker raw_hotpix_filtBlocker(raw_hotpix_filtConn); ConnectionBlocker raw_deadpix_filtBlocker(raw_deadpix_filtConn); + ConnectionBlocker raw_pdaf_lines_filterBlocker(raw_pdaf_lines_filterConn); 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); @@ -453,10 +466,12 @@ void PartialPasteDlg::rawToggled () ConnectionBlocker ff_ClipControlBlocker(ff_ClipControlConn); ConnectionBlocker raw_ca_autocorrectBlocker(raw_ca_autocorrectConn); ConnectionBlocker raw_caredblueBlocker(raw_caredblueConn); + ConnectionBlocker raw_ca_avoid_colourshiftBlocker(raw_ca_avoid_colourshiftconn); raw->set_inconsistent (false); raw_method->set_active (raw->get_active ()); + raw_border->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 ()); @@ -467,8 +482,8 @@ void PartialPasteDlg::rawToggled () raw_greenthresh->set_active (raw->get_active ()); raw_hotpix_filt->set_active (raw->get_active ()); raw_deadpix_filt->set_active (raw->get_active ()); + raw_pdaf_lines_filter->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 ()); df_file->set_active (raw->get_active ()); df_AutoSelect->set_active (raw->get_active ()); @@ -479,6 +494,7 @@ void PartialPasteDlg::rawToggled () ff_ClipControl->set_active (raw->get_active ()); raw_ca_autocorrect->set_active (raw->get_active ()); raw_caredblue->set_active (raw->get_active ()); + raw_ca_avoid_colourshift->set_active (raw->get_active ()); } void PartialPasteDlg::basicToggled () @@ -486,7 +502,6 @@ void PartialPasteDlg::basicToggled () ConnectionBlocker wbBlocker(wbConn); ConnectionBlocker exposureBlocker(exposureConn); - ConnectionBlocker localcontrastBlocker(localcontrastConn); ConnectionBlocker shBlocker(shConn); ConnectionBlocker epdBlocker(epdConn); ConnectionBlocker fattalBlocker(fattalConn); @@ -498,7 +513,6 @@ void PartialPasteDlg::basicToggled () wb->set_active (basic->get_active ()); exposure->set_active (basic->get_active ()); - localcontrast->set_active(basic->get_active()); sh->set_active (basic->get_active ()); epd->set_active (basic->get_active ()); fattal->set_active (basic->get_active ()); @@ -511,22 +525,26 @@ void PartialPasteDlg::detailToggled () { ConnectionBlocker sharpenBlocker(sharpenConn); + ConnectionBlocker localcontrastBlocker(localcontrastConn); ConnectionBlocker gradsharpenBlocker(gradsharpenConn); ConnectionBlocker microcontrastBlocker(microcontrastConn); ConnectionBlocker impdenBlocker(impdenConn); ConnectionBlocker dirpyrdenBlocker(dirpyrdenConn); ConnectionBlocker defringeBlocker(defringeConn); ConnectionBlocker dirpyreqBlocker(dirpyreqConn); + ConnectionBlocker dehazeBlocker(dehazeConn); 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 ()); + dehaze->set_active (detail->get_active ()); } void PartialPasteDlg::advancedToggled () @@ -552,6 +570,7 @@ void PartialPasteDlg::colorToggled () ConnectionBlocker chmixerbwBlocker(chmixerbwConn); ConnectionBlocker hsveqBlocker(hsveqConn); ConnectionBlocker filmSimulationBlocker(filmSimulationConn); + ConnectionBlocker softlightBlocker(softlightConn); ConnectionBlocker rgbcurvesBlocker(rgbcurvesConn); ConnectionBlocker colortoningBlocker(colortoningConn); @@ -563,6 +582,7 @@ void PartialPasteDlg::colorToggled () blackwhite->set_active (color->get_active ()); hsveq->set_active (color->get_active ()); filmSimulation->set_active (color->get_active ()); + softlight->set_active (color->get_active ()); rgbcurves->set_active (color->get_active ()); colortoning->set_active(color->get_active ()); } @@ -738,6 +758,14 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.filmSimulation = falsePE.filmSimulation; } + if (!softlight->get_active ()) { + filterPE.softlight = falsePE.softlight; + } + + if (!dehaze->get_active ()) { + filterPE.dehaze = falsePE.dehaze; + } + if (!rgbcurves->get_active ()) { filterPE.rgbCurves = falsePE.rgbCurves; } @@ -804,7 +832,16 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param if (!raw_method->get_active ()) { filterPE.raw.bayersensor.method = falsePE.raw.bayersensor.method; + filterPE.raw.bayersensor.dualDemosaicAutoContrast = falsePE.raw.bayersensor.dualDemosaicAutoContrast; + filterPE.raw.bayersensor.dualDemosaicContrast = falsePE.raw.bayersensor.dualDemosaicContrast; filterPE.raw.xtranssensor.method = falsePE.raw.xtranssensor.method; + filterPE.raw.xtranssensor.dualDemosaicAutoContrast = falsePE.raw.xtranssensor.dualDemosaicAutoContrast; + filterPE.raw.xtranssensor.dualDemosaicContrast = falsePE.raw.xtranssensor.dualDemosaicContrast; + } + + if (!raw_border->get_active ()) { + filterPE.raw.bayersensor.border = falsePE.raw.bayersensor.border; + filterPE.raw.xtranssensor.border = falsePE.raw.xtranssensor.border; } if (!raw_imagenum->get_active ()) { @@ -841,40 +878,25 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param } if (!raw_pixelshift->get_active ()) { - filterPE.raw.bayersensor.pixelShiftAutomatic = falsePE.raw.bayersensor.pixelShiftAutomatic; filterPE.raw.bayersensor.pixelShiftBlur = falsePE.raw.bayersensor.pixelShiftBlur; filterPE.raw.bayersensor.pixelShiftEperIso = falsePE.raw.bayersensor.pixelShiftEperIso; filterPE.raw.bayersensor.pixelShiftEqualBright = falsePE.raw.bayersensor.pixelShiftEqualBright; filterPE.raw.bayersensor.pixelShiftEqualBrightChannel = falsePE.raw.bayersensor.pixelShiftEqualBrightChannel; - filterPE.raw.bayersensor.pixelShiftExp0 = falsePE.raw.bayersensor.pixelShiftExp0; filterPE.raw.bayersensor.pixelShiftGreen = falsePE.raw.bayersensor.pixelShiftGreen; filterPE.raw.bayersensor.pixelShiftHoleFill = falsePE.raw.bayersensor.pixelShiftHoleFill; - filterPE.raw.bayersensor.pixelShiftLmmse = falsePE.raw.bayersensor.pixelShiftLmmse; + filterPE.raw.bayersensor.pixelShiftDemosaicMethod = falsePE.raw.bayersensor.pixelShiftDemosaicMethod; filterPE.raw.bayersensor.pixelShiftMedian = falsePE.raw.bayersensor.pixelShiftMedian; - filterPE.raw.bayersensor.pixelShiftMedian3 = falsePE.raw.bayersensor.pixelShiftMedian3; - filterPE.raw.bayersensor.pixelShiftMotion = falsePE.raw.bayersensor.pixelShiftMotion; - filterPE.raw.bayersensor.pixelShiftMotionCorrection = falsePE.raw.bayersensor.pixelShiftMotionCorrection; filterPE.raw.bayersensor.pixelShiftMotionCorrectionMethod = falsePE.raw.bayersensor.pixelShiftMotionCorrectionMethod; - filterPE.raw.bayersensor.pixelShiftNonGreenAmaze = falsePE.raw.bayersensor.pixelShiftNonGreenAmaze; filterPE.raw.bayersensor.pixelShiftNonGreenCross = falsePE.raw.bayersensor.pixelShiftNonGreenCross; - filterPE.raw.bayersensor.pixelShiftNonGreenCross2 = falsePE.raw.bayersensor.pixelShiftNonGreenCross2; - filterPE.raw.bayersensor.pixelShiftNonGreenHorizontal = falsePE.raw.bayersensor.pixelShiftNonGreenHorizontal; - filterPE.raw.bayersensor.pixelShiftNonGreenVertical = falsePE.raw.bayersensor.pixelShiftNonGreenVertical; - filterPE.raw.bayersensor.pixelShiftNreadIso = falsePE.raw.bayersensor.pixelShiftNreadIso; - filterPE.raw.bayersensor.pixelShiftPrnu = falsePE.raw.bayersensor.pixelShiftPrnu; - filterPE.raw.bayersensor.pixelShiftRedBlueWeight = falsePE.raw.bayersensor.pixelShiftRedBlueWeight; filterPE.raw.bayersensor.pixelShiftSigma = falsePE.raw.bayersensor.pixelShiftSigma; filterPE.raw.bayersensor.pixelShiftSmooth = falsePE.raw.bayersensor.pixelShiftSmooth; - filterPE.raw.bayersensor.pixelShiftStddevFactorBlue = falsePE.raw.bayersensor.pixelShiftStddevFactorBlue; - filterPE.raw.bayersensor.pixelShiftStddevFactorGreen = falsePE.raw.bayersensor.pixelShiftStddevFactorGreen; - filterPE.raw.bayersensor.pixelShiftStddevFactorRed = falsePE.raw.bayersensor.pixelShiftStddevFactorRed; - filterPE.raw.bayersensor.pixelShiftSum = falsePE.raw.bayersensor.pixelShiftSum; filterPE.raw.bayersensor.pixelShiftShowMotion = falsePE.raw.bayersensor.pixelShiftShowMotion; filterPE.raw.bayersensor.pixelShiftShowMotionMaskOnly = falsePE.raw.bayersensor.pixelShiftShowMotionMaskOnly; } if (!raw_linenoise->get_active ()) { filterPE.raw.bayersensor.linenoise = falsePE.raw.bayersensor.linenoise; + filterPE.raw.bayersensor.linenoiseDirection = falsePE.raw.bayersensor.linenoiseDirection; } if (!raw_greenthresh->get_active ()) { @@ -885,12 +907,9 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.raw.exPos = falsePE.raw.exPos; } - if (!raw_preser->get_active ()) { - filterPE.raw.exPreser = falsePE.raw.exPreser; - } - if (!raw_ca_autocorrect->get_active ()) { filterPE.raw.ca_autocorrect = falsePE.raw.ca_autocorrect; + filterPE.raw.caautoiterations = falsePE.raw.caautoiterations; } if (!raw_caredblue->get_active ()) { @@ -898,6 +917,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.raw.cablue = falsePE.raw.cablue; } + if (!raw_ca_avoid_colourshift->get_active ()) { + filterPE.raw.ca_avoidcolourshift = falsePE.raw.ca_avoidcolourshift; + } + if (!raw_hotpix_filt->get_active ()) { filterPE.raw.hotPixelFilter = falsePE.raw.hotPixelFilter; } @@ -910,6 +933,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.raw.hotdeadpix_thresh = falsePE.raw.hotdeadpix_thresh; } + if (!raw_pdaf_lines_filter->get_active ()) { + filterPE.raw.bayersensor.pdafLinesFilter = falsePE.raw.bayersensor.pdafLinesFilter; + } + if (!df_file->get_active ()) { filterPE.raw.darkFrame = falsePE.raw.darkFrame; } diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index e270a1e6e..0325fa063 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -22,6 +22,8 @@ #include #include "../rtengine/rtengine.h" +struct ParamsEdited; + class PartialPasteDlg : public Gtk::Dialog { @@ -63,6 +65,7 @@ public: Gtk::CheckButton* dirpyrden; Gtk::CheckButton* defringe; Gtk::CheckButton* dirpyreq; + Gtk::CheckButton* dehaze; // options in wavelet Gtk::CheckButton* wavelet; @@ -73,6 +76,7 @@ public: Gtk::CheckButton* chmixer; Gtk::CheckButton* blackwhite; Gtk::CheckButton* hsveq; + Gtk::CheckButton* softlight; Gtk::CheckButton* filmSimulation; Gtk::CheckButton* rgbcurves; Gtk::CheckButton* colortoning; @@ -100,15 +104,17 @@ public: // options in raw: Gtk::CheckButton* raw_expos; - Gtk::CheckButton* raw_preser; Gtk::CheckButton* raw_black; Gtk::CheckButton* raw_ca_autocorrect; Gtk::CheckButton* raw_caredblue; + Gtk::CheckButton* raw_ca_avoid_colourshift; Gtk::CheckButton* raw_hotpix_filt; Gtk::CheckButton* raw_deadpix_filt; + Gtk::CheckButton* raw_pdaf_lines_filter; Gtk::CheckButton* raw_linenoise; Gtk::CheckButton* raw_greenthresh; Gtk::CheckButton* raw_method; + Gtk::CheckButton* raw_border; Gtk::CheckButton* raw_imagenum; Gtk::CheckButton* raw_ccSteps; Gtk::CheckButton* raw_dcb_iterations; @@ -127,13 +133,13 @@ public: sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, advancedConn; 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 sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, fattalConn, dirpyreqConn, waveletConn, retinexConn, dehazeConn; + sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn, chmixerbwConn, colortoningConn, filmSimulationConn, softlightConn; sigc::connection distortionConn, cacorrConn, vignettingConn, lcpConn; sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, prsharpeningConn, perspectiveConn, commonTransConn; 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; + sigc::connection raw_caredblueConn, raw_ca_autocorrectConn, raw_ca_avoid_colourshiftconn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_pdaf_lines_filterConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_borderConn, raw_imagenumConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_pixelshiftConn, raw_dcb_enhanceConn, raw_exposConn, raw_blackConn; public: PartialPasteDlg (const Glib::ustring &title, Gtk::Window* parent); diff --git a/rtgui/pcvignette.cc b/rtgui/pcvignette.cc index 735b766c7..303ae5cfb 100644 --- a/rtgui/pcvignette.cc +++ b/rtgui/pcvignette.cc @@ -3,6 +3,8 @@ */ #include "pcvignette.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -78,9 +80,8 @@ void PCVignette::setDefaults (const ProcParams* defParams, const ParamsEdited* p } } -void PCVignette::adjusterChanged (Adjuster* a, double newval) +void PCVignette::adjusterChanged(Adjuster* a, double newval) { - if (listener && getEnabled()) { if (a == strength) { listener->panelChanged (EvPCVignetteStrength, strength->getTextValue()); @@ -92,6 +93,10 @@ void PCVignette::adjusterChanged (Adjuster* a, double newval) } } +void PCVignette::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void PCVignette::enabledChanged () { diff --git a/rtgui/pcvignette.h b/rtgui/pcvignette.h index eab1cf67d..98d42a477 100644 --- a/rtgui/pcvignette.h +++ b/rtgui/pcvignette.h @@ -20,15 +20,16 @@ public: PCVignette (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void setAdjusterBehavior (bool strengthadd, bool featheradd, bool roundnessadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/perspective.cc b/rtgui/perspective.cc index c94e9d568..db2f32248 100644 --- a/rtgui/perspective.cc +++ b/rtgui/perspective.cc @@ -17,18 +17,21 @@ * along with RawTherapee. If not, see . */ #include "perspective.h" + #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M("TP_PERSPECTIVE_LABEL")) { - Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-h1.png")); - Gtk::Image* ipersHR = Gtk::manage (new RTImage ("perspective-h2.png")); - Gtk::Image* ipersVL = Gtk::manage (new RTImage ("perspective-v1.png")); - Gtk::Image* ipersVR = Gtk::manage (new RTImage ("perspective-v2.png")); + Gtk::Image* ipersHL = Gtk::manage (new RTImage ("perspective-horizontal-left-small.png")); + Gtk::Image* ipersHR = Gtk::manage (new RTImage ("perspective-horizontal-right-small.png")); + Gtk::Image* ipersVL = Gtk::manage (new RTImage ("perspective-vertical-bottom-small.png")); + Gtk::Image* ipersVR = Gtk::manage (new RTImage ("perspective-vertical-top-small.png")); horiz = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_HORIZONTAL"), -100, 100, 0.1, 0, ipersHL, ipersHR)); horiz->setAdjusterListener (this); @@ -39,6 +42,9 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M(" pack_start (*horiz); pack_start (*vert); + horiz->setLogScale(2, 0); + vert->setLogScale(2, 0); + show_all(); } @@ -85,14 +91,17 @@ void PerspCorrection::setDefaults (const ProcParams* defParams, const ParamsEdit } } -void PerspCorrection::adjusterChanged (Adjuster* a, double newval) +void PerspCorrection::adjusterChanged(Adjuster* a, double newval) { - if (listener) { listener->panelChanged (EvPerspCorr, Glib::ustring::compose ("%1=%3\n%2=%4", M("TP_PERSPECTIVE_HORIZONTAL"), M("TP_PERSPECTIVE_VERTICAL"), horiz->getValue(), vert->getValue())); } } +void PerspCorrection::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void PerspCorrection::setAdjusterBehavior (bool badd) { diff --git a/rtgui/perspective.h b/rtgui/perspective.h index 434df2b3f..8038120fa 100644 --- a/rtgui/perspective.h +++ b/rtgui/perspective.h @@ -34,14 +34,15 @@ public: PerspCorrection (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; void setAdjusterBehavior (bool badd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/placesbrowser.cc b/rtgui/placesbrowser.cc index 490b9ff47..0d20e9bad 100644 --- a/rtgui/placesbrowser.cc +++ b/rtgui/placesbrowser.cc @@ -42,13 +42,13 @@ PlacesBrowser::PlacesBrowser () setExpandAlignProperties(add, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //add->get_style_context()->set_junction_sides(Gtk::JUNCTION_RIGHT); add->get_style_context()->add_class("Left"); - add->set_image (*Gtk::manage (new RTImage ("list-add.png"))); + add->set_image (*Gtk::manage (new RTImage ("add-small.png"))); del = Gtk::manage (new Gtk::Button ()); del->set_tooltip_text(M("MAIN_FRAME_PLACES_DEL")); setExpandAlignProperties(del, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); //del->get_style_context()->set_junction_sides(Gtk::JUNCTION_LEFT); del->get_style_context()->add_class("Right"); - del->set_image (*Gtk::manage (new RTImage ("list-remove.png"))); + del->set_image (*Gtk::manage (new RTImage ("remove-small.png"))); Gtk::Grid* buttonBox = Gtk::manage (new Gtk::Grid ()); buttonBox->set_orientation(Gtk::ORIENTATION_HORIZONTAL); buttonBox->attach_next_to(*add, Gtk::POS_LEFT, 1, 1); diff --git a/rtgui/pointermotionlistener.h b/rtgui/pointermotionlistener.h index 09a9b3b4f..88a4b2279 100644 --- a/rtgui/pointermotionlistener.h +++ b/rtgui/pointermotionlistener.h @@ -27,9 +27,8 @@ protected: public: virtual ~PointerMotionListener() {} - virtual void pointerMoved (bool validPos, Glib::ustring profile, Glib::ustring profileW, int x, int y, int r, int g, int b) {} - virtual void toggleFreeze () {} - virtual void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB) { sR = "--"; sG = "--"; sB = "--"; } + virtual void pointerMoved (bool validPos, const Glib::ustring &profile, const Glib::ustring &profileW, int x, int y, int r, int g, int b, bool isRaw = false) = 0; + virtual void getRGBText (int r, int g, int b, Glib::ustring &sR, Glib::ustring &sG, Glib::ustring &sB, bool isRaw = false) { sR = "--"; sG = "--"; sB = "--"; } virtual void getHSVText (float h, float s, float v, Glib::ustring &sH, Glib::ustring &sS, Glib::ustring &sV) { sH = "--"; sS = "--"; sV = "--"; } virtual void getLABText (float l, float a, float b, Glib::ustring &sL, Glib::ustring &sA, Glib::ustring &sB) { sL = "--"; sA = "--"; sB = "--"; } diff --git a/rtgui/popupbutton.h b/rtgui/popupbutton.h index 245d29aee..be08cd1ba 100644 --- a/rtgui/popupbutton.h +++ b/rtgui/popupbutton.h @@ -34,7 +34,7 @@ public: void set_sensitive (bool isSensitive=true); protected: - bool on_button_release_event (GdkEventButton* event); + bool on_button_release_event (GdkEventButton* event) override; private: bool nextOnClicked; diff --git a/rtgui/popupcommon.cc b/rtgui/popupcommon.cc index c79c69011..c5a5a03e3 100644 --- a/rtgui/popupcommon.cc +++ b/rtgui/popupcommon.cc @@ -47,6 +47,7 @@ PopUpCommon::PopUpCommon (Gtk::Button* thisButton, const Glib::ustring& label) buttonGroup = Gtk::manage( new Gtk::Grid()); setExpandAlignProperties(buttonGroup, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); buttonGroup->attach(*button, 0, 0, 1, 1); + buttonGroup->get_style_context()->add_class("image-combo"); } PopUpCommon::~PopUpCommon () @@ -79,7 +80,8 @@ bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring& // When there is at least 1 choice, we add the arrow button if (images.size() == 1) { Gtk::Button* arrowButton = Gtk::manage( new Gtk::Button() ); - RTImage* arrowImage = Gtk::manage( new RTImage("popuparrow.png") ); + Gtk::Image *arrowImage = Gtk::manage(new Gtk::Image()); + arrowImage->set_from_icon_name("pan-down-symbolic", Gtk::ICON_SIZE_BUTTON); setExpandAlignProperties(arrowButton, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); arrowButton->add(*arrowImage); //menuSymbol); buttonGroup->attach_next_to(*arrowButton, *button, Gtk::POS_RIGHT, 1, 1); @@ -101,17 +103,18 @@ bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring& void PopUpCommon::entrySelected (int i) { // Emit a signal if the selected item has changed - if (setSelected (i)) - messageChanged (selected); + if (setSelected (posToIndex(i))) + messageChanged (posToIndex(selected)); // Emit a signal in all case (i.e. propagate the signal_activate event) - messageItemSelected (selected); + messageItemSelected (posToIndex(selected)); } void PopUpCommon::setItemSensitivity (int index, bool isSensitive) { const auto items = menu->get_children (); - if (size_t(index) < items.size ()) { - items[size_t(index)]->set_sensitive (isSensitive); + size_t pos = indexToPos(index); + if (pos < items.size ()) { + items[pos]->set_sensitive (isSensitive); } } @@ -121,6 +124,8 @@ void PopUpCommon::setItemSensitivity (int index, bool isSensitive) { */ bool PopUpCommon::setSelected (int entryNum) { + entryNum = indexToPos(entryNum); + if (entryNum < 0 || entryNum > ((int)images.size() - 1) || (int)entryNum == selected) { return false; } else { diff --git a/rtgui/popupcommon.h b/rtgui/popupcommon.h index f4bdb581f..f939dbe96 100644 --- a/rtgui/popupcommon.h +++ b/rtgui/popupcommon.h @@ -75,6 +75,9 @@ private: void showMenu(GdkEventButton* event); protected: + virtual int posToIndex(int p) const { return p; } + virtual int indexToPos(int i) const { return i; } + void entrySelected (int i); }; @@ -96,7 +99,7 @@ inline int PopUpCommon::getEntryCount () const inline int PopUpCommon::getSelected () const { - return selected; + return posToIndex(selected); } #endif diff --git a/rtgui/pparamschangelistener.h b/rtgui/pparamschangelistener.h index ff55eea00..c8338745e 100644 --- a/rtgui/pparamschangelistener.h +++ b/rtgui/pparamschangelistener.h @@ -25,20 +25,23 @@ class PParamsChangeListener { - public: - virtual ~PParamsChangeListener() {} - virtual void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited = nullptr) {} - virtual void clearParamChanges () {} + virtual ~PParamsChangeListener() = default; + virtual void procParamsChanged( + const rtengine::procparams::ProcParams* params, + const rtengine::ProcEvent& ev, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited = nullptr + ) = 0; + virtual void clearParamChanges() = 0; }; class BatchPParamsChangeListener { - public: - virtual ~BatchPParamsChangeListener() {} - virtual void beginBatchPParamsChange(int numberOfEntries) {} - virtual void endBatchPParamsChange() {} + virtual ~BatchPParamsChangeListener() = default; + virtual void beginBatchPParamsChange(int numberOfEntries) = 0; + virtual void endBatchPParamsChange() = 0; }; #endif diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index 1eb54d68b..89f93ed44 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -1,14 +1,46 @@ #pragma once // This number has to be incremented whenever the PP3 file format is modified or the behaviour of a tool changes -#define PPVERSION 330 +#define PPVERSION 346 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes - 330 2018-20-01 + 346 2019-01-01 + changed microcontrast uniformity + 345 2018-10-21 + dual demosaic auto contrast threshold + 344 2018-10-04 + added Lab/RGB color space selection for shadows/highlights + 343 2018-09-06 + raw auto ca correction avoid colour shift + 342 2018-09-05 + raw auto ca correction iterations + 341 2018-07-22 + [ICM] enhanced custom output profile + 340 2018-07-08 + store whether curve is from histogram matching + 339 2018-07-04 + added allowUpscaling to ResizeParams + 338 2018-06-15 + increased precision for the channel mixer + 337 2018-06-13 + new scales for the LabGrid color toning parameters + 336 2018-06-01 + new demosaic method combobox for pixelshift + 335 2018-05-30 + new contrast adjuster in Bayer process tool + 334 2018-05-13 + new contrast threshold adjuster in Microcontrast tool + 333 2018-04-26 + new Shadows/Highlights tool + 332 2018-04-18 + changed pixelShiftEperIso calculation + 331 2018-02-14 + changed wavelet.Lmethod to int + 330 2018-01-20 Added 'Auto-matched Tone Curve' button, performing histogram matching - 329 2017-12-09 + 329 2017-09-12 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 @@ -25,7 +57,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 diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index bb60aba90..c41e38ac9 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -31,6 +31,25 @@ #include #endif +namespace { +void placeSpinBox(Gtk::Container* where, Gtk::SpinButton* &spin, const std::string &labelText, int digits, int inc0, int inc1, int maxLength, int range0, int range1, const std::string &toolTip = "") { + Gtk::HBox* HB = Gtk::manage ( new Gtk::HBox () ); + HB->set_spacing (4); + if (!toolTip.empty()) { + HB->set_tooltip_text (M (toolTip)); + } + Gtk::Label* label = Gtk::manage ( new Gtk::Label (M (labelText) + ":", Gtk::ALIGN_START)); + spin = Gtk::manage ( new Gtk::SpinButton () ); + spin->set_digits (digits); + spin->set_increments (inc0, inc1); + spin->set_max_length (maxLength); // Will this be sufficient? :) + spin->set_range (range0, range1); + HB->pack_start (*label, Gtk::PACK_SHRINK, 0); + HB->pack_end (*spin, Gtk::PACK_SHRINK, 0); + where->add(*HB); +} +} + extern Options options; extern Glib::ustring argv0; Glib::RefPtr themecss; @@ -49,13 +68,6 @@ Preferences::Preferences (RTWindow *rtwindow) moptions.copyFrom (&options); - /* - * Do not increase height, since it's not visible on e.g. smaller netbook - * screens. The default height is about 620 pixels currently, that's why - * we do not set the height anymore. Netbook users will most certainly set - * a smaller font, so they'll be able to shrink the Preferences window and - * close it. - */ set_size_request (650, -1); set_default_size (options.preferencesWidth, options.preferencesHeight); @@ -69,9 +81,9 @@ Preferences::Preferences (RTWindow *rtwindow) mainBox->set_spacing (8); #endif //GTK318 - //set_has_separator (false); Gtk::Notebook* nb = Gtk::manage (new Gtk::Notebook ()); + nb->set_scrollable(true); nb->set_name ("PrefNotebook"); mainBox->pack_start (*nb); @@ -87,16 +99,16 @@ Preferences::Preferences (RTWindow *rtwindow) get_action_area()->pack_end (*ok); get_action_area()->pack_end (*cancel); - nb->append_page (*getGeneralPanel(), M ("PREFERENCES_TAB_GENERAL")); - nb->append_page (*getProcParamsPanel(), M ("PREFERENCES_TAB_IMPROC")); - nb->append_page (*getDynProfilePanel(), M ("PREFERENCES_TAB_DYNAMICPROFILE")); - nb->append_page (*getFileBrowserPanel(), M ("PREFERENCES_TAB_BROWSER")); - nb->append_page (*getColorManagementPanel(), M ("PREFERENCES_TAB_COLORMGR")); - nb->append_page (*getBatchProcPanel(), M ("PREFERENCES_BATCH_PROCESSING")); - nb->append_page (*getPerformancePanel(), M ("PREFERENCES_TAB_PERFORMANCE")); + nb->append_page(*getGeneralPanel(), M("PREFERENCES_TAB_GENERAL")); + nb->append_page(*getImageProcessingPanel(), M("PREFERENCES_TAB_IMPROC")); + nb->append_page(*getDynamicProfilePanel(), M("PREFERENCES_TAB_DYNAMICPROFILE")); + nb->append_page(*getFileBrowserPanel(), M("PREFERENCES_TAB_BROWSER")); + nb->append_page(*getColorManPanel(), M("PREFERENCES_TAB_COLORMGR")); + nb->append_page(*getBatchProcPanel(), M("PREFERENCES_BATCH_PROCESSING")); + nb->append_page(*getPerformancePanel(), M("PREFERENCES_TAB_PERFORMANCE")); // Sounds only on Windows and Linux #if defined(WIN32) || defined(__linux__) - nb->append_page (*getSoundPanel(), M ("PREFERENCES_TAB_SOUND")); + nb->append_page(*getSoundsPanel(), M("PREFERENCES_TAB_SOUND")); #endif nb->set_current_page (0); @@ -131,8 +143,10 @@ int Preferences::getThemeRowNumber (Glib::ustring& longThemeFName) Gtk::Widget* Preferences::getBatchProcPanel () { + swBatchProc = Gtk::manage(new Gtk::ScrolledWindow()); + swBatchProc->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* mvbpp = Gtk::manage (new Gtk::VBox ()); + Gtk::VBox* vbBatchProc = Gtk::manage (new Gtk::VBox ()); Gtk::ScrolledWindow* behscrollw = Gtk::manage (new Gtk::ScrolledWindow ()); behscrollw->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); @@ -141,8 +155,7 @@ Gtk::Widget* Preferences::getBatchProcPanel () vbbeh->pack_start (*behscrollw, Gtk::PACK_EXPAND_WIDGET); Gtk::Frame* behFrame = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_BEHAVIOR"))); behFrame->add (*vbbeh); - //mvbpp->pack_start (*behFrame); - mvbpp->pack_start (*behFrame, Gtk::PACK_EXPAND_WIDGET, 4); + vbBatchProc->pack_start (*behFrame, Gtk::PACK_EXPAND_WIDGET, 4); Gtk::TreeView* behTreeView = Gtk::manage (new Gtk::TreeView ()); behscrollw->add (*behTreeView); @@ -187,14 +200,6 @@ Gtk::Widget* Preferences::getBatchProcPanel () appendBehavList (mi, M ("TP_EXPOSURE_CONTRAST"), ADDSET_TC_CONTRAST, false); appendBehavList (mi, M ("TP_EXPOSURE_SATURATION"), ADDSET_TC_SATURATION, 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_EPD_LABEL")); appendBehavList (mi, M ("TP_EPD_STRENGTH"), ADDSET_EPD_STRENGTH, false); @@ -205,8 +210,9 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_TM_FATTAL_LABEL")); - appendBehavList (mi, M ("TP_TM_FATTAL_THRESHOLD"), ADDSET_FATTAL_ALPHA, false); - appendBehavList (mi, M ("TP_TM_FATTAL_AMOUNT"), ADDSET_FATTAL_BETA, false); + 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")); @@ -232,6 +238,7 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi = behModel->append (); // Used for both Resize and Post-Resize sharpening mi->set_value (behavColumns.label, M ("TP_SHARPENING_LABEL")); + appendBehavList (mi, M ("TP_SHARPENING_CONTRAST"), ADDSET_SHARP_CONTRAST, false); appendBehavList (mi, M ("TP_SHARPENING_RADIUS"), ADDSET_SHARP_RADIUS, false); appendBehavList (mi, M ("TP_SHARPENING_AMOUNT"), ADDSET_SHARP_AMOUNT, false); appendBehavList (mi, M ("TP_SHARPENING_RLD_DAMPING"), ADDSET_SHARP_DAMPING, false); @@ -239,6 +246,13 @@ Gtk::Widget* Preferences::getBatchProcPanel () 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); @@ -247,18 +261,22 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_SHARPENMICRO_LABEL")); appendBehavList (mi, M ("TP_SHARPENMICRO_AMOUNT"), ADDSET_SHARPENMICRO_AMOUNT, false); + appendBehavList (mi, M ("TP_SHARPENMICRO_CONTRAST"), ADDSET_SHARPENMICRO_CONTRAST, false); appendBehavList (mi, M ("TP_SHARPENMICRO_UNIFORMITY"), ADDSET_SHARPENMICRO_UNIFORMITY, false); 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_DEHAZE_LABEL") ); + appendBehavList ( mi, M ( "TP_DEHAZE_STRENGTH" ), ADDSET_DEHAZE_STRENGTH, true ); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_WBALANCE_LABEL")); @@ -269,18 +287,17 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_COLORAPP_LABEL")); - appendBehavList (mi, M ("TP_COLORAPP_CIECAT_DEGREE"), ADDSET_CAT_DEGREE, true); - appendBehavList (mi, M ("TP_COLORAPP_ADAPTSCENE"), ADDSET_CAT_ADAPTSCENE, true); + appendBehavList (mi, M("TP_COLORAPP_LABEL_SCENE") + " - " + M("TP_COLORAPP_ABSOLUTELUMINANCE"), ADDSET_CAT_ADAPTSCENE, true); + appendBehavList (mi, M("TP_COLORAPP_LABEL_VIEWING") + " - " + M("TP_COLORAPP_ABSOLUTELUMINANCE"), ADDSET_CAT_ADAPTVIEWING, true); appendBehavList (mi, M ("TP_COLORAPP_LIGHT"), ADDSET_CAT_LIGHT, true); appendBehavList (mi, M ("TP_COLORAPP_BRIGHT"), ADDSET_CAT_BRIGHT, true); appendBehavList (mi, M ("TP_COLORAPP_CHROMA"), ADDSET_CAT_CHROMA, true); + appendBehavList (mi, M ("TP_COLORAPP_CHROMA_S"), ADDSET_CAT_CHROMA_S, true); + appendBehavList (mi, M ("TP_COLORAPP_CHROMA_M"), ADDSET_CAT_CHROMA_M, true); appendBehavList (mi, M ("TP_COLORAPP_RSTPRO"), ADDSET_CAT_RSTPRO, true); appendBehavList (mi, M ("TP_COLORAPP_CONTRAST"), ADDSET_CAT_CONTRAST, true); appendBehavList (mi, M ("TP_COLORAPP_CONTRAST_Q"), ADDSET_CAT_CONTRAST_Q, true); - appendBehavList (mi, M ("TP_COLORAPP_CHROMA_S"), ADDSET_CAT_CHROMA_S, true); - appendBehavList (mi, M ("TP_COLORAPP_CHROMA_M"), ADDSET_CAT_CHROMA_M, true); appendBehavList (mi, M ("TP_COLORAPP_HUE"), ADDSET_CAT_HUE, true); - appendBehavList (mi, M ("TP_COLORAPP_ADAPTVIEWING"), ADDSET_CAT_ADAPTVIEWING, true); appendBehavList (mi, M ("TP_COLORAPP_BADPIXSL"), ADDSET_CAT_BADPIX, true); mi = behModel->append (); @@ -288,10 +305,6 @@ Gtk::Widget* Preferences::getBatchProcPanel () appendBehavList (mi, M ("TP_VIBRANCE_PASTELS"), ADDSET_VIBRANCE_PASTELS, false); appendBehavList (mi, M ("TP_VIBRANCE_SATURATED"), ADDSET_VIBRANCE_SATURATED, false); - mi = behModel->append (); - mi->set_value (behavColumns.label, M ("TP_GAMMA_OUTPUT")); - appendBehavList (mi, M ("TP_GAMMA_CURV"), ADDSET_FREE_OUPUT_GAMMA, false); - appendBehavList (mi, M ("TP_GAMMA_SLOP"), ADDSET_FREE_OUTPUT_SLOPE, false); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_CHMIXER_LABEL")); @@ -306,6 +319,10 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi->set_value ( behavColumns.label, M ("TP_FILMSIMULATION_LABEL") ); appendBehavList ( mi, M ( "TP_FILMSIMULATION_STRENGTH" ), ADDSET_FILMSIMULATION_STRENGTH, true ); + mi = behModel->append (); + mi->set_value ( behavColumns.label, M ("TP_SOFTLIGHT_LABEL") ); + appendBehavList ( mi, M ( "TP_SOFTLIGHT_STRENGTH" ), ADDSET_SOFTLIGHT_STRENGTH, true ); + mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_COLORTONING_LABEL")); appendBehavList (mi, M ("TP_COLORTONING_SPLITCOCO"), ADDSET_COLORTONING_SPLIT, true); @@ -385,6 +402,19 @@ Gtk::Widget* Preferences::getBatchProcPanel () appendBehavList (mi, M ("TP_WAVELET_EDGEDETECTTHR"), ADDSET_WA_EDGEDETECTTHR, true); appendBehavList (mi, M ("TP_WAVELET_EDGEDETECTTHR2"), ADDSET_WA_EDGEDETECTTHR2, true); + mi = behModel->append (); + mi->set_value (behavColumns.label, M ("TP_RAW_SENSOR_BAYER_LABEL")); + appendBehavList (mi, M ("TP_RAW_FALSECOLOR"), ADDSET_BAYER_FALSE_COLOR_SUPPRESSION, false); + appendBehavList (mi, M ("TP_RAW_DCBITERATIONS") + ", " + M("TP_RAW_LMMSEITERATIONS"), ADDSET_BAYER_ITER, false); + appendBehavList (mi, M ("TP_RAW_DUALDEMOSAICCONTRAST"), ADDSET_BAYER_DUALDEMOZCONTRAST, false); + appendBehavList (mi, M ("TP_RAW_PIXELSHIFTSIGMA"), ADDSET_BAYER_PS_SIGMA, false); + appendBehavList (mi, M ("TP_RAW_PIXELSHIFTSMOOTH"), ADDSET_BAYER_PS_SMOOTH, false); + appendBehavList (mi, M ("TP_RAW_PIXELSHIFTEPERISO"), ADDSET_BAYER_PS_EPERISO, false); + + mi = behModel->append (); + mi->set_value (behavColumns.label, M ("TP_RAW_SENSOR_XTRANS_LABEL")); + appendBehavList (mi, M ("TP_RAW_FALSECOLOR"), ADDSET_XTRANS_FALSE_COLOR_SUPPRESSION, false); + mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_PREPROCESS_LABEL")); appendBehavList (mi, M ("TP_PREPROCESS_GREENEQUIL"), ADDSET_PREPROCESS_GREENEQUIL, false); @@ -393,7 +423,6 @@ Gtk::Widget* Preferences::getBatchProcPanel () mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_EXPOS_WHITEPOINT_LABEL")); appendBehavList (mi, M ("TP_RAWEXPOS_LINEAR"), ADDSET_RAWEXPOS_LINEAR, false); - appendBehavList (mi, M ("TP_RAWEXPOS_PRESER"), ADDSET_RAWEXPOS_PRESER, false); mi = behModel->append (); mi->set_value (behavColumns.label, M ("TP_RAWEXPOS_BLACKS")); @@ -418,15 +447,15 @@ Gtk::Widget* Preferences::getBatchProcPanel () behSetAll->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::behSetAllPressed) ); Gtk::HBox* buttonpanel1 = Gtk::manage (new Gtk::HBox ()); - //buttonpanel1->set_spacing(8); buttonpanel1->pack_end (*behSetAll, Gtk::PACK_SHRINK, 4); buttonpanel1->pack_end (*behAddAll, Gtk::PACK_SHRINK, 4); vbbeh->pack_start (*buttonpanel1, Gtk::PACK_SHRINK, 4); chOverwriteOutputFile = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_OVERWRITEOUTPUTFILE")) ); - mvbpp->pack_start (*chOverwriteOutputFile, Gtk::PACK_SHRINK, 4); + vbBatchProc->pack_start (*chOverwriteOutputFile, Gtk::PACK_SHRINK, 4); - return mvbpp; + swBatchProc->add(*vbBatchProc); + return swBatchProc; } void Preferences::appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set) @@ -458,17 +487,24 @@ void Preferences::behSetRadioToggled (const Glib::ustring& path) } -Gtk::Widget *Preferences::getDynProfilePanel() +Gtk::Widget *Preferences::getDynamicProfilePanel() { + swDynamicProfile = Gtk::manage(new Gtk::ScrolledWindow()); + swDynamicProfile->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + dynProfilePanel = Gtk::manage (new DynamicProfilePanel()); - return dynProfilePanel; + + swDynamicProfile->add(*dynProfilePanel); + return swDynamicProfile; } -Gtk::Widget* Preferences::getProcParamsPanel () +Gtk::Widget* Preferences::getImageProcessingPanel () { + swImageProcessing = Gtk::manage(new Gtk::ScrolledWindow()); + swImageProcessing->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* mvbpp = Gtk::manage (new Gtk::VBox ()); + Gtk::VBox* vbImageProcessing = Gtk::manage (new Gtk::VBox ()); Gtk::Frame* fpp = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_IMPROCPARAMS"))); Gtk::VBox* vbpp = Gtk::manage (new Gtk::VBox ()); @@ -495,7 +531,7 @@ Gtk::Widget* Preferences::getProcParamsPanel () bpconn = useBundledProfiles->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::bundledProfilesChanged) ); vbpp->pack_start (*useBundledProfiles, Gtk::PACK_SHRINK, 4); fpp->add (*vbpp); - mvbpp->pack_start (*fpp, Gtk::PACK_SHRINK, 4); + vbImageProcessing->pack_start (*fpp, Gtk::PACK_SHRINK, 4); // Custom profile builder box Gtk::Frame* cpfrm = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CUSTPROFBUILD")) ); @@ -513,7 +549,7 @@ Gtk::Widget* Preferences::getProcParamsPanel () cpbt->attach (*cpltypelab, 0, 1, 1, 2, Gtk::FILL, Gtk::SHRINK, 2, 2); cpbt->attach (*custProfBuilderLabelType, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); cpfrm->add (*cpbt); - mvbpp->pack_start (*cpfrm, Gtk::PACK_SHRINK, 4); + vbImageProcessing->pack_start (*cpfrm, Gtk::PACK_SHRINK, 4); Gtk::Frame* fdp = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_PROFILEHANDLING"))); Gtk::Table* vbdp = Gtk::manage (new Gtk::Table (2, 2)); @@ -531,7 +567,7 @@ Gtk::Widget* Preferences::getProcParamsPanel () vbdp->attach (*lplab, 0, 1, 1, 2, Gtk::FILL, Gtk::SHRINK, 2, 2); vbdp->attach (*loadParamsPreference, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); fdp->add (*vbdp); - mvbpp->pack_start (*fdp, Gtk::PACK_SHRINK, 4); + vbImageProcessing->pack_start (*fdp, Gtk::PACK_SHRINK, 4); // Directories Gtk::Frame* cdf = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_DIRECTORIES")) ); @@ -549,8 +585,7 @@ Gtk::Widget* Preferences::getProcParamsPanel () 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)); // FLATFIELD Gtk::Label *ffLab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_FLATFIELDSDIR") + ":")); @@ -564,8 +599,7 @@ Gtk::Widget* Preferences::getProcParamsPanel () 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)); //Cluts Dir Gtk::Label *clutsDirLabel = Gtk::manage (new Gtk::Label (M ("PREFERENCES_CLUTSDIR") + ":")); @@ -580,31 +614,38 @@ Gtk::Widget* Preferences::getProcParamsPanel () dirgrid->attach_next_to(*clutsRestartNeeded, *clutsDir, Gtk::POS_RIGHT, 1, 1); cdf->add(*dirgrid); - mvbpp->pack_start (*cdf, Gtk::PACK_SHRINK, 4 ); + vbImageProcessing->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); + Gtk::Frame *cropFrame = Gtk::manage(new Gtk::Frame(M("PREFERENCES_CROP"))); + Gtk::Grid *cropGrid = Gtk::manage(new Gtk::Grid()); + Gtk::Label *cropGuidesLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_GUIDES") + ": ")); + cropGuidesCombo = Gtk::manage(new Gtk::ComboBoxText()); + cropGuidesCombo->append(M("PREFERENCES_CROP_GUIDES_NONE")); + cropGuidesCombo->append(M("PREFERENCES_CROP_GUIDES_FRAME")); + cropGuidesCombo->append(M("PREFERENCES_CROP_GUIDES_FULL")); + cropAutoFitCB = Gtk::manage(new Gtk::CheckButton()); + Gtk::Label *cropAutoFitLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_CROP_AUTO_FIT"))); + cropAutoFitLbl->set_line_wrap(true); + cropAutoFitCB->add(*cropAutoFitLbl); + cropGrid->attach(*cropGuidesLbl, 0, 0, 1, 1); + cropGrid->attach(*cropGuidesCombo, 1, 0, 1, 1); + cropGrid->attach(*cropAutoFitCB, 0, 1, 2, 1); + cropFrame->add(*cropGrid); + vbImageProcessing->pack_start(*cropFrame, Gtk::PACK_SHRINK, 4); - return mvbpp; + swImageProcessing->add(*vbImageProcessing); + + return swImageProcessing; } Gtk::Widget* Preferences::getPerformancePanel () { - Gtk::VBox* mainContainer = Gtk::manage ( new Gtk::VBox () ); - mainContainer->set_spacing (4); + swPerformance = Gtk::manage(new Gtk::ScrolledWindow()); + swPerformance->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + + Gtk::VBox* vbPerformance = Gtk::manage ( new Gtk::VBox () ); + vbPerformance->set_spacing (4); Gtk::Frame* fprevdemo = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_PREVDEMO"))); Gtk::HBox* hbprevdemo = Gtk::manage (new Gtk::HBox (false, 4)); @@ -616,7 +657,7 @@ Gtk::Widget* Preferences::getPerformancePanel () hbprevdemo->pack_start (*lprevdemo, Gtk::PACK_SHRINK); hbprevdemo->pack_start (*cprevdemo); fprevdemo->add (*hbprevdemo); - mainContainer->pack_start (*fprevdemo, Gtk::PACK_SHRINK, 4); + vbPerformance->pack_start (*fprevdemo, Gtk::PACK_SHRINK, 4); Gtk::Frame* ftiffserialize = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_SERIALIZE_TIFF_READ"))); Gtk::HBox* htiffserialize = Gtk::manage (new Gtk::HBox (false, 4)); @@ -624,129 +665,77 @@ Gtk::Widget* Preferences::getPerformancePanel () ctiffserialize->set_tooltip_text (M ("PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP")); htiffserialize->pack_start (*ctiffserialize); ftiffserialize->add (*htiffserialize); - mainContainer->pack_start (*ftiffserialize, Gtk::PACK_SHRINK, 4); + vbPerformance->pack_start (*ftiffserialize, Gtk::PACK_SHRINK, 4); Gtk::Frame* fclut = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CLUTSCACHE")) ); - Gtk::HBox* clutCacheSizeHB = Gtk::manage ( new Gtk::HBox () ); - clutCacheSizeHB->set_spacing (4); - Gtk::Label* CLUTLl = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CLUTSCACHE_LABEL") + ":", Gtk::ALIGN_START)); - clutCacheSizeSB = Gtk::manage ( new Gtk::SpinButton () ); - clutCacheSizeSB->set_digits (0); - clutCacheSizeSB->set_increments (1, 5); - clutCacheSizeSB->set_max_length (2); // Will this be sufficient? :) #ifdef _OPENMP - clutCacheSizeSB->set_range (1, 3 * omp_get_num_procs()); + placeSpinBox(fclut, clutCacheSizeSB, "PREFERENCES_CLUTSCACHE_LABEL", 0, 1, 5, 2, 1, 3 * omp_get_num_procs()); #else - clutCacheSizeSB->set_range (1, 12); + placeSpinBox(fclut, clutCacheSizeSB, "PREFERENCES_CLUTSCACHE_LABEL", 0, 1, 5, 2, 1, 12); #endif - clutCacheSizeHB->pack_start (*CLUTLl, Gtk::PACK_SHRINK, 0); - clutCacheSizeHB->pack_end (*clutCacheSizeSB, Gtk::PACK_SHRINK, 0); - fclut->add (*clutCacheSizeHB); - mainContainer->pack_start (*fclut, Gtk::PACK_SHRINK, 4); + vbPerformance->pack_start (*fclut, Gtk::PACK_SHRINK, 4); + + Gtk::Frame* fchunksize = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CHUNKSIZES")) ); + Gtk::VBox* chunkSizeVB = Gtk::manage ( new Gtk::VBox () ); + + Gtk::HBox* measureHB = Gtk::manage ( new Gtk::HBox () ); + measureHB->set_spacing (4); + measureCB = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_PERFORMANCE_MEASURE")) ); + measureCB->set_tooltip_text (M ("PREFERENCES_PERFORMANCE_MEASURE_HINT")); + measureHB->pack_start(*measureCB, Gtk::PACK_SHRINK, 0); + chunkSizeVB->add(*measureHB); + + placeSpinBox(chunkSizeVB, chunkSizeAMSB, "PREFERENCES_CHUNKSIZE_RAW_AMAZE", 0, 1, 5, 2, 1, 16); + placeSpinBox(chunkSizeVB, chunkSizeCASB, "PREFERENCES_CHUNKSIZE_RAW_CA", 0, 1, 5, 2, 1, 16); + placeSpinBox(chunkSizeVB, chunkSizeRCDSB, "PREFERENCES_CHUNKSIZE_RAW_RCD", 0, 1, 5, 2, 1, 16); + placeSpinBox(chunkSizeVB, chunkSizeRGBSB, "PREFERENCES_CHUNKSIZE_RGB", 0, 1, 5, 2, 1, 16); + placeSpinBox(chunkSizeVB, chunkSizeXTSB, "PREFERENCES_CHUNKSIZE_RAW_XT", 0, 1, 5, 2, 1, 16); + + fchunksize->add (*chunkSizeVB); + + vbPerformance->pack_start (*fchunksize, Gtk::PACK_SHRINK, 4); Gtk::Frame* finspect = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_INSPECT_LABEL")) ); - Gtk::HBox* maxIBuffersHB = Gtk::manage ( new Gtk::HBox () ); - maxIBuffersHB->set_spacing (4); - maxIBuffersHB->set_tooltip_text (M ("PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP")); - Gtk::Label* maxIBufferLbl = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_INSPECT_MAXBUFFERS_LABEL") + ":", Gtk::ALIGN_START)); - maxInspectorBuffersSB = Gtk::manage ( new Gtk::SpinButton () ); - maxInspectorBuffersSB->set_digits (0); - maxInspectorBuffersSB->set_increments (1, 5); - maxInspectorBuffersSB->set_max_length (2); - maxInspectorBuffersSB->set_range (1, 12); // ... we have to set a limit, 12 seem to be enough even for systems with tons of RAM - maxIBuffersHB->pack_start (*maxIBufferLbl, Gtk::PACK_SHRINK, 0); - maxIBuffersHB->pack_end (*maxInspectorBuffersSB, Gtk::PACK_SHRINK, 0); - finspect->add (*maxIBuffersHB); - mainContainer->pack_start (*finspect, Gtk::PACK_SHRINK, 4); + Gtk::VBox *inspectorvb = Gtk::manage(new Gtk::VBox()); + placeSpinBox(inspectorvb, maxInspectorBuffersSB, "PREFERENCES_INSPECT_MAXBUFFERS_LABEL", 0, 1, 5, 2, 1, 12, "PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP"); - Gtk::Frame* fdenoise = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_NOISE")) ); - Gtk::VBox* vbdenoise = Gtk::manage ( new Gtk::VBox (Gtk::PACK_SHRINK, 4) ); + Gtk::HBox *insphb = Gtk::manage(new Gtk::HBox()); + thumbnailInspectorMode = Gtk::manage(new Gtk::ComboBoxText()); + thumbnailInspectorMode->append(M("PREFERENCES_THUMBNAIL_INSPECTOR_JPEG")); + thumbnailInspectorMode->append(M("PREFERENCES_THUMBNAIL_INSPECTOR_RAW")); + thumbnailInspectorMode->append(M("PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE")); + insphb->pack_start(*Gtk::manage(new Gtk::Label(M("PREFERENCES_THUMBNAIL_INSPECTOR_MODE") + ": ")), Gtk::PACK_SHRINK, 4); + insphb->pack_start(*thumbnailInspectorMode); + inspectorvb->pack_start(*insphb); + finspect->add (*inspectorvb); + vbPerformance->pack_start (*finspect, Gtk::PACK_SHRINK, 4); + + Gtk::Frame* threadsFrame = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_PERFORMANCE_THREADS")) ); + Gtk::VBox* threadsVBox = Gtk::manage ( new Gtk::VBox (Gtk::PACK_SHRINK, 4) ); - Gtk::Label* lreloadneeded2 = Gtk::manage (new Gtk::Label (M ("PREFERENCES_IMG_RELOAD_NEEDED"), Gtk::ALIGN_START)); - Gtk::HBox* threadLimitHB = Gtk::manage (new Gtk::HBox (Gtk::PACK_SHRINK, 4)); - threadLimitHB->set_tooltip_text (M ("PREFERENCES_RGBDTL_TOOLTIP")); - Gtk::Label* RGBDTLl = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_RGBDTL_LABEL") + ":", Gtk::ALIGN_START)); - rgbDenoiseTreadLimitSB = Gtk::manage ( new Gtk::SpinButton () ); - rgbDenoiseTreadLimitSB->set_digits (0); - rgbDenoiseTreadLimitSB->set_increments (1, 5); - rgbDenoiseTreadLimitSB->set_max_length (2); // Will this be sufficient? :) #ifdef _OPENMP int maxThreadNumber = omp_get_max_threads(); #else int maxThreadNumber = 10; #endif - rgbDenoiseTreadLimitSB->set_range (0, maxThreadNumber); - threadLimitHB->pack_start (*RGBDTLl, Gtk::PACK_SHRINK, 2); - threadLimitHB->pack_end (*rgbDenoiseTreadLimitSB, Gtk::PACK_SHRINK, 2); - Gtk::Label* dnlab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_LEVDN") + ":", Gtk::ALIGN_START)); - Gtk::Label* dnautlab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_LEVAUTDN") + ":", Gtk::ALIGN_START)); - Gtk::Label* dnautsimpllab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_SIMPLAUT") + ":", Gtk::ALIGN_START)); - Gtk::Label* dntilab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_TINB") + ":", Gtk::ALIGN_START)); - Gtk::Label* dnwavlab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_WAVLEV") + ":", Gtk::ALIGN_START)); - Gtk::Label* dnlisslab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_LISS") + ":", Gtk::ALIGN_START)); + placeSpinBox(threadsVBox, threadsSpinBtn, "PREFERENCES_PERFORMANCE_THREADS_LABEL", 0, 1, 5, 2, 0, maxThreadNumber); - dnv = Gtk::manage (new Gtk::ComboBoxText ()); - dnv->append (M ("PREFERENCES_MIN")); - dnv->append (M ("PREFERENCES_SMA")); - dnv->append (M ("PREFERENCES_MED")); - dnv->append (M ("PREFERENCES_MAX")); - dnaut = Gtk::manage (new Gtk::ComboBoxText ()); - dnaut->append (M ("PREFERENCES_AUTLOW")); - dnaut->append (M ("PREFERENCES_AUTSTD")); + threadsFrame->add (*threadsVBox); - dnautsimpl = Gtk::manage (new Gtk::ComboBoxText ()); - dnautsimpl->append (M ("PREFERENCES_STDAUT")); - dnautsimpl->append (M ("PREFERENCES_EXPAUT")); + vbPerformance->pack_start (*threadsFrame, Gtk::PACK_SHRINK, 4); + swPerformance->add(*vbPerformance); - dnliss = Gtk::manage (new Gtk::ComboBoxText ()); - dnliss->append (M ("PREFERENCES_AUTLISVLOW")); //very low - dnliss->append (M ("PREFERENCES_AUTLISLOW")); //low - dnliss->append (M ("PREFERENCES_AUTLISSTD")); //med - dnliss->append (M ("PREFERENCES_AUTLISMAX")); //max - - dnti = Gtk::manage (new Gtk::ComboBoxText ()); - dnti->append (M ("PREFERENCES_TISTD")); - dnti->append (M ("PREFERENCES_TIMAX")); - - dnwavlev = Gtk::manage (new Gtk::ComboBoxText ()); - dnwavlev->append (M ("PREFERENCES_WLZER")); - dnwavlev->append (M ("PREFERENCES_WLONE")); - dnwavlev->append (M ("PREFERENCES_WLTWO")); - - Gtk::Table* colon = Gtk::manage (new Gtk::Table (6, 2)); - colon->attach (*dnlab, 0, 1, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 2); - colon->attach (*dnv, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colon->attach (*dnautlab, 0, 1, 1, 2, Gtk::FILL, Gtk::SHRINK, 2, 2); - colon->attach (*dnaut, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colon->attach (*dnautsimpllab, 0, 1, 2, 3, Gtk::FILL, Gtk::SHRINK, 2, 2); - colon->attach (*dnautsimpl, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colon->attach (*dnlisslab, 0, 1, 3, 4, Gtk::FILL, Gtk::SHRINK, 2, 2); - colon->attach (*dnliss, 1, 2, 3, 4, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colon->attach (*dntilab, 0, 1, 4, 5, Gtk::FILL, Gtk::SHRINK, 2, 2); - colon->attach (*dnti, 1, 2, 4, 5, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - colon->attach (*dnwavlab, 0, 1, 5, 6, Gtk::FILL, Gtk::SHRINK, 2, 2); - colon->attach (*dnwavlev, 1, 2, 5, 6, Gtk::EXPAND | Gtk::FILL | Gtk::SHRINK, Gtk::SHRINK, 2, 2); - - vbdenoise->pack_start (*lreloadneeded2, Gtk::PACK_SHRINK); - vbdenoise->pack_start (*colon, Gtk::PACK_SHRINK); - vbdenoise->pack_start (*threadLimitHB, Gtk::PACK_SHRINK); - // <--- To be hard-coded and removed once tested - cbdaubech = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_DAUB_LABEL"), Gtk::ALIGN_START)); - cbdaubech->set_tooltip_markup (M ("PREFERENCES_DAUB_TOOLTIP")); -// vbdenoise->pack_start (*cbdaubech, Gtk::PACK_SHRINK); - // ---> - fdenoise->add (*vbdenoise); - mainContainer->pack_start (*fdenoise, Gtk::PACK_SHRINK, 4); - - return mainContainer; + return swPerformance; } -Gtk::Widget* Preferences::getColorManagementPanel () +Gtk::Widget* Preferences::getColorManPanel () { + swColorMan = Gtk::manage(new Gtk::ScrolledWindow()); + swColorMan->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* mvbcm = Gtk::manage (new Gtk::VBox ()); - mvbcm->set_spacing (4); + Gtk::VBox* vbColorMan = Gtk::manage (new Gtk::VBox ()); + vbColorMan->set_spacing (4); iccDir = Gtk::manage (new MyFileChooserButton (M ("PREFERENCES_ICCDIR"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER)); setExpandAlignProperties (iccDir, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); @@ -766,7 +755,7 @@ Gtk::Widget* Preferences::getColorManagementPanel () iccDir->signal_selection_changed ().connect (sigc::mem_fun (this, &Preferences::iccDirChanged)); - mvbcm->pack_start (*iccdgrid, Gtk::PACK_SHRINK); + vbColorMan->pack_start (*iccdgrid, Gtk::PACK_SHRINK); //------------------------- MONITOR ---------------------- @@ -790,8 +779,13 @@ Gtk::Widget* Preferences::getColorManagementPanel () const std::vector profiles = rtengine::ICCStore::getInstance ()->getProfiles (rtengine::ICCStore::ProfileType::MONITOR); for (const auto profile : profiles) { - if (profile.find ("file:") != 0) { - monProfile->append (profile); + if (profile.find("file:") != 0) { + std::string fileis_RTv4 = profile.substr(0, 4); + + if (fileis_RTv4 != "RTv4") { + // printf("pro=%s \n", profile.c_str()); + monProfile->append(profile); + } } } @@ -806,11 +800,9 @@ Gtk::Widget* Preferences::getColorManagementPanel () setExpandAlignProperties (monBPC, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); monBPC->set_active (true); -//#if defined(WIN32) // Auto-detection not implemented for Linux, see issue 851 cbAutoMonProfile = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_AUTOMONPROFILE"))); setExpandAlignProperties (cbAutoMonProfile, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); autoMonProfileConn = cbAutoMonProfile->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::autoMonProfileToggled)); -//#endif int row = 0; gmonitor->attach (*mplabel, 0, row, 1, 1); @@ -822,22 +814,18 @@ Gtk::Widget* Preferences::getColorManagementPanel () gmonitor->attach (*monProfile, 1, row, 1, 1); #endif ++row; -//#if defined(WIN32) gmonitor->attach (*cbAutoMonProfile, 1, row, 1, 1); ++row; -//#endif gmonitor->attach (*milabel, 0, row, 1, 1); gmonitor->attach (*monIntent, 1, row, 1, 1); ++row; gmonitor->attach (*monBPC, 0, row, 2, 1); -//#if defined(WIN32) autoMonProfileToggled(); -//#endif fmonitor->add (*gmonitor); - mvbcm->pack_start (*fmonitor, Gtk::PACK_SHRINK); + vbColorMan->pack_start (*fmonitor, Gtk::PACK_SHRINK); //------------------------- PRINTER ---------------------- @@ -882,88 +870,24 @@ Gtk::Widget* Preferences::getColorManagementPanel () ++row; gprinter->attach (*prtBPC, 0, row, 2, 1); -//#if defined(WIN32) autoMonProfileToggled(); -//#endif fprinter->add (*gprinter); - mvbcm->pack_start (*fprinter, Gtk::PACK_SHRINK); + vbColorMan->pack_start (*fprinter, Gtk::PACK_SHRINK); - //------------------------- CIECAM ---------------------- - - /* - Gtk::Label* viewlab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_VIEW") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (viewlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - - view = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (view, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - view->append (M("PREFERENCES_D50_MENU")); - - view->append (M ("PREFERENCES_D50")); - view->append (M("PREFERENCES_D55")); - view->append (M("PREFERENCES_D60")); - view->append (M("PREFERENCES_D65")); - view->append (M("PREFERENCES_BLACKBODY")); - view->append (M("PREFERENCES_FLUOF2")); - view->append (M("PREFERENCES_FLUOF7")); - view->append (M("PREFERENCES_FLUOF11")); - - Gtk::Label* greylab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_GREY") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (greylab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - grey = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (grey, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - grey->append (M("PREFERENCES_GREY05")); - grey->append (M("PREFERENCES_GREY10")); - grey->append (M("PREFERENCES_GREY15")); - grey->append (M ("PREFERENCES_GREY18")); - grey->append (M("PREFERENCES_GREY18_MENU")); - - grey->append (M("PREFERENCES_GREY23")); - grey->append (M("PREFERENCES_GREY30")); - grey->append (M("PREFERENCES_GREY40")); - */ - /* - Gtk::Label* greySclab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_GREYSC") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (greySclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - greySc = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (greySc, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - greySc->append (M ("PREFERENCES_GREYSCA")); - greySc->append (M ("PREFERENCES_GREYSC18")); - */ - Gtk::Frame* fcielab = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CIEART_FRAME")) ); - setExpandAlignProperties (fcielab, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - - Gtk::Grid* colo = Gtk::manage (new Gtk::Grid ()); - setExpandAlignProperties (colo, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); - Gtk::Label* lreloadneeded1 = Gtk::manage (new Gtk::Label (M ("PREFERENCES_IMG_RELOAD_NEEDED"), Gtk::ALIGN_START)); - setExpandAlignProperties (lreloadneeded1, true, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - colo->attach (*lreloadneeded1, 0, 0, 2, 1); - /* - colo->attach (*viewlab, 0, 1, 1, 1); - colo->attach (*view, 1, 1, 1, 1); - colo->attach (*greylab, 0, 2, 1, 1); - colo->attach (*grey, 1, 2, 1, 1); - */ -// colo->attach (*greySclab, 0, 3, 1, 1); -// colo->attach (*greySc, 1, 3, 1, 1); - cbciecamfloat = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_CIEART_LABEL"))); - setExpandAlignProperties (cbciecamfloat, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - colo->attach (*cbciecamfloat, 0, 4, 2, 1); - cbciecamfloat->set_tooltip_markup (M ("PREFERENCES_CIEART_TOOLTIP")); - fcielab->add (*colo); - - mvbcm->pack_start (*fcielab, Gtk::PACK_SHRINK, 4); - - return mvbcm; + swColorMan->add(*vbColorMan); + return swColorMan; } Gtk::Widget* Preferences::getGeneralPanel () { + swGeneral = Gtk::manage(new Gtk::ScrolledWindow()); + swGeneral->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::Grid* mvbsd = Gtk::manage ( new Gtk::Grid () ); - mvbsd->set_column_spacing (4); - mvbsd->set_row_spacing (4); + Gtk::Grid* vbGeneral = Gtk::manage ( new Gtk::Grid () ); + vbGeneral->set_column_spacing (4); + vbGeneral->set_row_spacing (4); Gtk::Frame* fworklflow = Gtk::manage (new Gtk::Frame (M ("PREFERENCES_WORKFLOW"))); setExpandAlignProperties (fworklflow, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); @@ -1022,16 +946,8 @@ Gtk::Widget* Preferences::getGeneralPanel () 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); workflowGrid->attach_next_to (*ckbHideTPVScrollbar, *hb4label, Gtk::POS_RIGHT, 1, 1); - workflowGrid->attach_next_to (*ckbUseIconNoText, *ckbHideTPVScrollbar, Gtk::POS_RIGHT, 1, 1); ckbAutoSaveTpOpen = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_AUTOSAVE_TP_OPEN"))); workflowGrid->attach_next_to (*ckbAutoSaveTpOpen, *hb4label, Gtk::POS_BOTTOM, 1, 1); btnSaveTpOpenNow = Gtk::manage (new Gtk::Button (M ("PREFERENCES_SAVE_TP_OPEN_NOW"))); @@ -1046,7 +962,7 @@ Gtk::Widget* Preferences::getGeneralPanel () fworklflow->add (*workflowGrid); - mvbsd->attach_next_to (*fworklflow, Gtk::POS_TOP, 2, 1); + vbGeneral->attach_next_to (*fworklflow, Gtk::POS_TOP, 2, 1); // --------------------------------------------- @@ -1081,80 +997,79 @@ Gtk::Widget* Preferences::getGeneralPanel () langGrid->attach_next_to (*languages, *langlab, Gtk::POS_RIGHT, 1, 1); langGrid->attach_next_to (*langw, *languages, Gtk::POS_RIGHT, 1, 1); flang->add (*langGrid); - mvbsd->attach_next_to (*flang, *fworklflow, Gtk::POS_BOTTOM, 2, 1); + vbGeneral->attach_next_to (*flang, *fworklflow, Gtk::POS_BOTTOM, 2, 1); - // --------------------------------------------- + // Appearance --------------------------------------------- - Gtk::Frame* ftheme = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_THEME")) ); - setExpandAlignProperties (ftheme, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - Gtk::Grid* themeGrid = Gtk::manage ( new Gtk::Grid() ); - themeGrid->set_column_spacing (4); - themeGrid->set_row_spacing (4); - setExpandAlignProperties (themeGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); + Gtk::Frame* appearanceFrame = Gtk::manage(new Gtk::Frame(M("PREFERENCES_APPEARANCE"))); - Gtk::Label* themelab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_SELECTTHEME") + ":") ); - setExpandAlignProperties (themelab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - theme = Gtk::manage ( new Gtk::ComboBoxText () ); - setExpandAlignProperties (theme, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + Gtk::Grid* appearanceGrid = Gtk::manage(new Gtk::Grid()); + appearanceGrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(appearanceGrid, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - theme->set_active (0); - parseThemeDir (Glib::build_filename (argv0, "themes")); + Gtk::Label* themeLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_APPEARANCE_THEME") + ":")); + setExpandAlignProperties(themeLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Label* themeRestartLbl = Gtk::manage ( new Gtk::Label (Glib::ustring (" (") + M ("PREFERENCES_APPLNEXTSTARTUP") + ")") ); + setExpandAlignProperties(themeRestartLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + themeCBT = Gtk::manage(new Gtk::ComboBoxText()); + themeCBT->set_active(0); + parseThemeDir(Glib::build_filename(argv0, "themes")); for (size_t i = 0; i < themeFNames.size(); i++) { - theme->append (themeFNames.at (i).shortFName); + themeCBT->append(themeFNames.at(i).shortFName); } - themeGrid->attach_next_to (*themelab, Gtk::POS_LEFT, 1, 1); - themeGrid->attach_next_to (*theme, *themelab, Gtk::POS_RIGHT, 1, 1); - - Gtk::Label* fontlab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_SELECTFONT")) ); - setExpandAlignProperties (fontlab, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - fontButton = Gtk::manage ( new Gtk::FontButton ()); - setExpandAlignProperties (fontButton, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - fontButton->set_use_size (true); + Gtk::Label* mainFontLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_APPEARANCE_MAINFONT"))); + setExpandAlignProperties(mainFontLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + mainFontFB = Gtk::manage(new Gtk::FontButton()); + mainFontFB->set_use_size(true); if (options.fontFamily == "default") { - fontButton->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); + mainFontFB->set_font_name(Glib::ustring::compose("%1 %2", initialFontFamily, initialFontSize)); } else { - fontButton->set_font_name (Glib::ustring::compose ("%1 %2", options.fontFamily, options.fontSize)); + mainFontFB->set_font_name(Glib::ustring::compose("%1 %2", options.fontFamily, options.fontSize)); } - themeGrid->attach_next_to (*fontlab, *theme, Gtk::POS_RIGHT, 1, 1); - themeGrid->attach_next_to (*fontButton, *fontlab, Gtk::POS_RIGHT, 1, 1); - - Gtk::Label* cpfontlab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_SELECTFONT_COLPICKER") + ":") ); - setExpandAlignProperties (cpfontlab, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - colorPickerFontButton = Gtk::manage ( new Gtk::FontButton ()); - setExpandAlignProperties (fontButton, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); - colorPickerFontButton->set_use_size (true); + Gtk::Label* colorPickerFontLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_APPEARANCE_COLORPICKERFONT") + ":")); + setExpandAlignProperties(colorPickerFontLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + colorPickerFontFB = Gtk::manage(new Gtk::FontButton()); + colorPickerFontFB->set_use_size(true); if (options.fontFamily == "default") { - colorPickerFontButton->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); + colorPickerFontFB->set_font_name(Glib::ustring::compose("%1 %2", initialFontFamily, initialFontSize)); } else { - colorPickerFontButton->set_font_name (Glib::ustring::compose ("%1 %2", options.CPFontFamily, options.CPFontSize)); + colorPickerFontFB->set_font_name(Glib::ustring::compose("%1 %2", options.CPFontFamily, options.CPFontSize)); } - themeGrid->attach_next_to (*cpfontlab, *fontButton, Gtk::POS_RIGHT, 1, 1); - themeGrid->attach_next_to (*colorPickerFontButton, *cpfontlab, Gtk::POS_RIGHT, 1, 1); + Gtk::Label* cropMaskColorLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_APPEARANCE_CROPMASKCOLOR") + ":")); + setExpandAlignProperties(cropMaskColorLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - Gtk::Label* cutOverlayLabel = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CUTOVERLAYBRUSH") + ":") ); - setExpandAlignProperties (cutOverlayLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - butCropCol = Gtk::manage ( new Gtk::ColorButton() ); - setExpandAlignProperties (butCropCol, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - butCropCol->set_use_alpha (true); - themeGrid->attach_next_to (*cutOverlayLabel, *themelab, Gtk::POS_BOTTOM, 1, 1); - themeGrid->attach_next_to (*butCropCol, *cutOverlayLabel, Gtk::POS_RIGHT, 1, 1); + cropMaskColorCB = Gtk::manage(new Gtk::ColorButton()); + cropMaskColorCB->set_use_alpha(true); - Gtk::Label* navGuideLabel = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_NAVGUIDEBRUSH") + ":") ); - setExpandAlignProperties (navGuideLabel, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); - butNavGuideCol = Gtk::manage ( new Gtk::ColorButton() ); - setExpandAlignProperties (butNavGuideCol, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - butNavGuideCol->set_use_alpha (true); - themeGrid->attach_next_to (*navGuideLabel, *butCropCol, Gtk::POS_RIGHT, 2, 1); - themeGrid->attach_next_to (*butNavGuideCol, *navGuideLabel, Gtk::POS_RIGHT, 1, 1); + Gtk::Label* navGuideColorLbl = Gtk::manage(new Gtk::Label(M("PREFERENCES_APPEARANCE_NAVGUIDECOLOR") + ":")); + setExpandAlignProperties(navGuideColorLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - ftheme->add (*themeGrid); - mvbsd->attach_next_to (*ftheme, *flang, Gtk::POS_BOTTOM, 2, 1); + navGuideColorCB = Gtk::manage(new Gtk::ColorButton()); + navGuideColorCB->set_use_alpha(true); + + Gtk::VSeparator *vSep = Gtk::manage(new Gtk::VSeparator()); + + appearanceGrid->attach(*themeLbl, 0, 0, 1, 1); + appearanceGrid->attach(*themeCBT, 1, 0, 1, 1); + appearanceGrid->attach(*themeRestartLbl, 2, 0, 2, 1); + appearanceGrid->attach(*vSep, 2, 1, 1, 3); + appearanceGrid->attach(*mainFontLbl, 0, 1, 1, 1); + appearanceGrid->attach(*mainFontFB, 1, 1, 1, 1); + appearanceGrid->attach(*cropMaskColorLbl, 3, 1, 1, 1); + appearanceGrid->attach(*cropMaskColorCB, 4, 1, 1, 1); + appearanceGrid->attach(*colorPickerFontLbl, 0, 2, 1, 1); + appearanceGrid->attach(*colorPickerFontFB, 1, 2, 1, 1); + appearanceGrid->attach(*navGuideColorLbl, 3, 2, 1, 1); + appearanceGrid->attach(*navGuideColorCB, 4, 2, 1, 1); + + appearanceFrame->add(*appearanceGrid); + vbGeneral->attach_next_to(*appearanceFrame, *flang, Gtk::POS_BOTTOM, 2, 1); // --------------------------------------------- @@ -1187,7 +1102,7 @@ Gtk::Widget* Preferences::getGeneralPanel () clipGrid->attach_next_to (*shThresh, *shl, Gtk::POS_RIGHT, 1, 1); fclip->add (*clipGrid); - mvbsd->attach_next_to (*fclip, *ftheme, Gtk::POS_BOTTOM, 1, 1); + vbGeneral->attach_next_to (*fclip, *appearanceFrame, Gtk::POS_BOTTOM, 1, 1); // --------------------------------------------- @@ -1215,7 +1130,7 @@ Gtk::Widget* Preferences::getGeneralPanel () navigationGrid->attach_next_to (*rememberZoomPanCheckbutton, *panFactorLabel, Gtk::POS_BOTTOM, 2, 1); fnav->add (*navigationGrid); - mvbsd->attach_next_to (*fnav, *fclip, Gtk::POS_RIGHT, 1, 1); + vbGeneral->attach_next_to (*fnav, *fclip, Gtk::POS_RIGHT, 1, 1); // --------------------------------------------- @@ -1278,20 +1193,23 @@ Gtk::Widget* Preferences::getGeneralPanel () #endif fdg->add (*externaleditorGrid); - mvbsd->attach_next_to (*fdg, *fclip, Gtk::POS_BOTTOM, 2, 1); + vbGeneral->attach_next_to (*fdg, *fclip, Gtk::POS_BOTTOM, 2, 1); langAutoDetectConn = ckbLangAutoDetect->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::langAutoDetectToggled)); - tconn = theme->signal_changed().connect ( sigc::mem_fun (*this, &Preferences::themeChanged) ); - fconn = fontButton->signal_font_set().connect ( sigc::mem_fun (*this, &Preferences::fontChanged) ); - cpfconn = colorPickerFontButton->signal_font_set().connect ( sigc::mem_fun (*this, &Preferences::cpFontChanged) ); + tconn = themeCBT->signal_changed().connect ( sigc::mem_fun (*this, &Preferences::themeChanged) ); + fconn = mainFontFB->signal_font_set().connect ( sigc::mem_fun (*this, &Preferences::fontChanged) ); + cpfconn = colorPickerFontFB->signal_font_set().connect ( sigc::mem_fun (*this, &Preferences::cpFontChanged) ); - return mvbsd; + swGeneral->add(*vbGeneral); + return swGeneral; } Gtk::Widget* Preferences::getFileBrowserPanel () { + swFileBrowser = Gtk::manage(new Gtk::ScrolledWindow()); + swFileBrowser->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - Gtk::VBox* mvbfb = Gtk::manage ( new Gtk::VBox () ); + Gtk::VBox* vbFileBrowser = Gtk::manage ( new Gtk::VBox () ); Gtk::Frame* fsd = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_STARTUPIMDIR")) ); @@ -1302,7 +1220,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () startupdir = Gtk::manage ( new Gtk::Entry () ); Gtk::Button* sdselect = Gtk::manage ( new Gtk::Button () ); - sdselect->set_image (*Gtk::manage (new RTImage ("gtk-open.png"))); + sdselect->set_image (*Gtk::manage (new RTImage ("folder-open-small.png"))); Gtk::RadioButton::Group opts = sdcurrent->get_group(); sdlast->set_group (opts); @@ -1320,7 +1238,7 @@ Gtk::Widget* Preferences::getFileBrowserPanel () vbsd->pack_start (*otherbox, Gtk::PACK_SHRINK, 0); fsd->add (*vbsd); - mvbfb->pack_start (*fsd, Gtk::PACK_SHRINK, 4); + vbFileBrowser->pack_start (*fsd, Gtk::PACK_SHRINK, 4); sdselect->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::selectStartupDir) ); @@ -1371,20 +1289,26 @@ Gtk::Widget* Preferences::getFileBrowserPanel () Gtk::Frame* frmnu = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_MENUOPTIONS")) ); + + Gtk::Grid* menuGrid = Gtk::manage(new Gtk::Grid()); + menuGrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(menuGrid, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + ckbmenuGroupRank = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPRANK")) ); + setExpandAlignProperties(ckbmenuGroupRank, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); ckbmenuGroupLabel = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPLABEL")) ); ckbmenuGroupFileOperations = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPFILEOPERATIONS")) ); + setExpandAlignProperties(ckbmenuGroupFileOperations, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); ckbmenuGroupProfileOperations = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPPROFILEOPERATIONS")) ); ckbmenuGroupExtProg = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_MENUGROUPEXTPROGS")) ); - Gtk::VBox* vbmnu = Gtk::manage ( new Gtk::VBox () ); + + menuGrid->attach (*ckbmenuGroupRank, 0, 0, 1, 1); + menuGrid->attach (*ckbmenuGroupLabel, 1, 0, 1, 1); + menuGrid->attach (*ckbmenuGroupFileOperations, 0, 1, 1, 1); + menuGrid->attach (*ckbmenuGroupProfileOperations, 1, 1, 1, 1); + menuGrid->attach (*ckbmenuGroupExtProg, 0, 2, 2, 1); - vbmnu->pack_start (*ckbmenuGroupRank, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupLabel, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupFileOperations, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupProfileOperations, Gtk::PACK_SHRINK, 0); - vbmnu->pack_start (*ckbmenuGroupExtProg, Gtk::PACK_SHRINK, 0); - - frmnu->add (*vbmnu); + frmnu->add (*menuGrid); Gtk::Frame* fre = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_PARSEDEXT")) ); @@ -1404,8 +1328,8 @@ Gtk::Widget* Preferences::getFileBrowserPanel () delExt->set_tooltip_text (M ("PREFERENCES_PARSEDEXTDELHINT")); moveExtUp->set_tooltip_text (M ("PREFERENCES_PARSEDEXTUPHINT")); moveExtDown->set_tooltip_text (M ("PREFERENCES_PARSEDEXTDOWNHINT")); - Gtk::Image* addExtImg = Gtk::manage ( new RTImage ("list-add-small.png") ); - Gtk::Image* delExtImg = Gtk::manage ( new RTImage ("list-remove-red-small.png") ); + Gtk::Image* addExtImg = Gtk::manage ( new RTImage ("add-small.png") ); + Gtk::Image* delExtImg = Gtk::manage ( new RTImage ("remove-small.png") ); Gtk::Image* moveExtUpImg = Gtk::manage ( new RTImage ("arrow-up-small.png") ); Gtk::Image* moveExtDownImg = Gtk::manage ( new RTImage ("arrow-down-small.png") ); addExt->add (*addExtImg); @@ -1430,40 +1354,67 @@ Gtk::Widget* Preferences::getFileBrowserPanel () fre->add (*vbre); - Gtk::Frame* frc = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CACHEOPTS")) ); - Gtk::VBox* vbc = Gtk::manage ( new Gtk::VBox () ); + // Cache + + Gtk::Frame* frc = Gtk::manage (new Gtk::Frame(M("PREFERENCES_CACHEOPTS"))); + Gtk::VBox* vbc = Gtk::manage (new Gtk::VBox()); frc->add (*vbc); - Gtk::HBox* hb3 = Gtk::manage ( new Gtk::HBox () ); - Gtk::Label* chlab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CACHETHUMBHEIGHT") + ":") ); - maxThumbSize = Gtk::manage ( new Gtk::SpinButton () ); - hb3->pack_start (*chlab, Gtk::PACK_SHRINK, 4); - hb3->pack_start (*maxThumbSize, Gtk::PACK_SHRINK, 4); + Gtk::Grid* cacheGrid = Gtk::manage(new Gtk::Grid()); + cacheGrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(cacheGrid, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - maxThumbSize->set_digits (0); - maxThumbSize->set_increments (1, 10); - maxThumbSize->set_range (40, 800); - vbc->pack_start (*hb3, Gtk::PACK_SHRINK, 4); + Gtk::Label* maxThumbHeightLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHETHUMBHEIGHT") + ":")); + setExpandAlignProperties(maxThumbHeightLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + maxThumbHeightSB = Gtk::manage (new Gtk::SpinButton()); + maxThumbHeightSB->set_digits (0); + maxThumbHeightSB->set_increments (1, 10); + maxThumbHeightSB->set_range (40, 800); - Gtk::HBox* hb4 = Gtk::manage ( new Gtk::HBox () ); - Gtk::Label* celab = Gtk::manage ( new Gtk::Label (M ("PREFERENCES_CACHEMAXENTRIES") + ":") ); - maxCacheEntries = Gtk::manage ( new Gtk::SpinButton () ); - hb4->pack_start (*celab, Gtk::PACK_SHRINK, 4); - hb4->pack_start (*maxCacheEntries, Gtk::PACK_SHRINK, 4); + Gtk::Label* maxCacheEntriesLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHEMAXENTRIES") + ":")); + setExpandAlignProperties(maxCacheEntriesLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + maxCacheEntriesSB = Gtk::manage (new Gtk::SpinButton()); + maxCacheEntriesSB->set_digits (0); + maxCacheEntriesSB->set_increments (1, 10); + maxCacheEntriesSB->set_range (10, 100000); - maxCacheEntries->set_digits (0); - maxCacheEntries->set_increments (1, 10); - maxCacheEntries->set_range (10, 100000); - vbc->pack_start (*hb4, Gtk::PACK_SHRINK, 4); + // Separation is needed so that a button is not accidentally clicked when one wanted + // to click a spinbox. Ideally, the separation wouldn't require attaching a widget, but how? + Gtk::HSeparator *cacheSeparator = Gtk::manage (new Gtk::HSeparator()); + cacheSeparator->get_style_context()->add_class("grid-row-separator"); - Gtk::HBox* hb5 = Gtk::manage ( new Gtk::HBox () ); - clearThumbnails = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_CACHECLEARTHUMBS")) ); - clearProfiles = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_CACHECLEARPROFILES")) ); - clearAll = Gtk::manage ( new Gtk::Button (M ("PREFERENCES_CACHECLEARALL")) ); - hb5->pack_start (*clearThumbnails, Gtk::PACK_SHRINK, 4); - hb5->pack_start (*clearProfiles, Gtk::PACK_SHRINK, 4); - hb5->pack_start (*clearAll, Gtk::PACK_SHRINK, 4); - vbc->pack_start (*hb5, Gtk::PACK_SHRINK, 4); + Gtk::Label* clearThumbsLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ALLBUTPROFILES"))); + setExpandAlignProperties(clearThumbsLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Button* clearThumbsBtn = Gtk::manage (new Gtk::Button(M("PREFERENCES_CACHECLEAR"))); + + Gtk::Label* clearProfilesLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ONLYPROFILES"))); + setExpandAlignProperties(clearProfilesLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Button* clearProfilesBtn = Gtk::manage (new Gtk::Button(M("PREFERENCES_CACHECLEAR"))); + + Gtk::Label* clearAllLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_ALL"))); + setExpandAlignProperties(clearAllLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + Gtk::Button* clearAllBtn = Gtk::manage (new Gtk::Button(M("PREFERENCES_CACHECLEAR"))); + + cacheGrid->attach (*maxThumbHeightLbl, 0, 0, 1, 1); + cacheGrid->attach (*maxThumbHeightSB, 1, 0, 1, 1); + cacheGrid->attach (*maxCacheEntriesLbl, 0, 1, 1, 1); + cacheGrid->attach (*maxCacheEntriesSB, 1, 1, 1, 1); + cacheGrid->attach (*cacheSeparator, 0, 2, 2, 1); + cacheGrid->attach (*clearThumbsLbl, 0, 3, 1, 1); + cacheGrid->attach (*clearThumbsBtn, 1, 3, 1, 1); + if (moptions.saveParamsCache) { + cacheGrid->attach (*clearProfilesLbl, 0, 4, 1, 1); + cacheGrid->attach (*clearProfilesBtn, 1, 4, 1, 1); + cacheGrid->attach (*clearAllLbl, 0, 5, 1, 1); + cacheGrid->attach (*clearAllBtn, 1, 5, 1, 1); + } + + vbc->pack_start (*cacheGrid, Gtk::PACK_SHRINK, 4); + + Gtk::Label* clearSafetyLbl = Gtk::manage (new Gtk::Label(M("PREFERENCES_CACHECLEAR_SAFETY"))); + setExpandAlignProperties(clearSafetyLbl, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + clearSafetyLbl->set_line_wrap(true); + vbc->pack_start(*clearSafetyLbl, Gtk::PACK_SHRINK, 4); Gtk::HBox* hb6 = Gtk::manage ( new Gtk::HBox () ); Gtk::VBox* vb6 = Gtk::manage ( new Gtk::VBox () ); @@ -1475,37 +1426,39 @@ Gtk::Widget* Preferences::getFileBrowserPanel () hb6->pack_start (*fre); hb6->set_spacing (4); - mvbfb->pack_start (*hb6, Gtk::PACK_SHRINK, 4); - -// mvbfb->pack_start (*fro, Gtk::PACK_SHRINK, 4); -// mvbfb->pack_start (*fre); -// mvbfb->pack_start (*frc, Gtk::PACK_SHRINK, 4); + vbFileBrowser->pack_start (*hb6, Gtk::PACK_SHRINK, 4); addExt->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::addExtPressed) ); delExt->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::delExtPressed) ); moveExtUp->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::moveExtUpPressed) ); moveExtDown->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::moveExtDownPressed) ); extension->signal_activate().connect ( sigc::mem_fun (*this, &Preferences::addExtPressed) ); - clearThumbnails->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearThumbImagesPressed) ); - clearProfiles->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearProfilesPressed) ); - clearAll->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearAllPressed) ); + clearThumbsBtn->signal_clicked().connect ( sigc::mem_fun (*this, &Preferences::clearThumbImagesPressed) ); + if (moptions.saveParamsCache) { + clearProfilesBtn->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::clearProfilesPressed)); + clearAllBtn->signal_clicked().connect(sigc::mem_fun(*this, &Preferences::clearAllPressed)); + } - return mvbfb; + swFileBrowser->add(*vbFileBrowser); + return swFileBrowser; } -Gtk::Widget* Preferences::getSoundPanel () +Gtk::Widget* Preferences::getSoundsPanel () { - Gtk::VBox* pSnd = new Gtk::VBox (); + swSounds = Gtk::manage(new Gtk::ScrolledWindow()); + swSounds->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + + Gtk::VBox* vbSounds = new Gtk::VBox (); ckbSndEnable = Gtk::manage ( new Gtk::CheckButton (M ("GENERAL_ENABLE"))); sndEnableConn = ckbSndEnable->signal_toggled().connect (sigc::mem_fun (*this, &Preferences::sndEnableToggled)); - pSnd->pack_start (*ckbSndEnable, Gtk::PACK_SHRINK, 4); + vbSounds->pack_start (*ckbSndEnable, Gtk::PACK_SHRINK, 4); Gtk::HBox* hblSndHelp = Gtk::manage (new Gtk::HBox ()); Gtk::Label* lSndHelp = Gtk::manage (new Gtk::Label (M ("PREFERENCES_SND_HELP"))); hblSndHelp->pack_start (*lSndHelp, Gtk::PACK_SHRINK, 4); - pSnd->pack_start (*hblSndHelp, Gtk::PACK_SHRINK, 4); + vbSounds->pack_start (*hblSndHelp, Gtk::PACK_SHRINK, 4); // BatchQueueDone Gtk::HBox* pBatchQueueDone = Gtk::manage ( new Gtk::HBox() ); @@ -1516,7 +1469,7 @@ Gtk::Widget* Preferences::getSoundPanel () txtSndBatchQueueDone = Gtk::manage (new Gtk::Entry()); pBatchQueueDone->pack_end (*txtSndBatchQueueDone, Gtk::PACK_EXPAND_WIDGET, 4); - pSnd->pack_start (*pBatchQueueDone, Gtk::PACK_SHRINK, 4); + vbSounds->pack_start (*pBatchQueueDone, Gtk::PACK_SHRINK, 4); // LngEditProcDone Gtk::HBox* pSndLngEditProcDone = Gtk::manage ( new Gtk::HBox() ); @@ -1527,7 +1480,7 @@ Gtk::Widget* Preferences::getSoundPanel () txtSndLngEditProcDone = Gtk::manage (new Gtk::Entry()); pSndLngEditProcDone->pack_start (*txtSndLngEditProcDone, Gtk::PACK_EXPAND_WIDGET, 4); - Gtk::Label* lSndLngEditProcDoneSecs = Gtk::manage (new Gtk::Label (M ("PREFERENCES_SND_TRESHOLDSECS") + Glib::ustring (":"))); + Gtk::Label* lSndLngEditProcDoneSecs = Gtk::manage (new Gtk::Label (M ("PREFERENCES_SND_THRESHOLDSECS") + Glib::ustring (":"))); pSndLngEditProcDone->pack_start (*lSndLngEditProcDoneSecs, Gtk::PACK_SHRINK, 12); spbSndLngEditProcDoneSecs = Gtk::manage ( new Gtk::SpinButton () ); @@ -1536,11 +1489,12 @@ Gtk::Widget* Preferences::getSoundPanel () spbSndLngEditProcDoneSecs->set_range (0, 10); pSndLngEditProcDone->pack_end (*spbSndLngEditProcDoneSecs, Gtk::PACK_SHRINK, 4); - pSnd->pack_start (*pSndLngEditProcDone, Gtk::PACK_SHRINK, 4); + vbSounds->pack_start (*pSndLngEditProcDone, Gtk::PACK_SHRINK, 4); sndEnableToggled(); - return pSnd; + swSounds->add(*vbSounds); + return swSounds; } void Preferences::parseDir (Glib::ustring dirname, std::vector& items, Glib::ustring ext) @@ -1632,8 +1586,9 @@ void Preferences::parseThemeDir (Glib::ustring dirname) void Preferences::storePreferences () { -// With the new mechanism, we can't be sure of the availability of the DEFPROFILE_RAW & DEFPROFILE_IMG profiles, -// because useBundledProfiles may be false. We're now using DEFPROFILE_INTERNAL instead, which is always available. + // With the new mechanism, we can't be sure of the availability of the DEFPROFILE_RAW & DEFPROFILE_IMG profiles, + // because useBundledProfiles may be false. We're now using DEFPROFILE_INTERNAL instead, which is always available. + moptions.defProfRaw = rprofiles->getFullPathFromActiveRow(); if (moptions.defProfRaw.empty()) { @@ -1661,28 +1616,28 @@ void Preferences::storePreferences () moptions.shadowThreshold = (int)shThresh->get_value (); moptions.language = languages->get_active_text (); moptions.languageAutoDetect = ckbLangAutoDetect->get_active (); - moptions.theme = themeFNames.at (theme->get_active_row_number ()).longFName; + moptions.theme = themeFNames.at (themeCBT->get_active_row_number ()).longFName; - Gdk::RGBA cropCol = butCropCol->get_rgba(); + Gdk::RGBA cropCol = cropMaskColorCB->get_rgba(); moptions.cutOverlayBrush[0] = cropCol.get_red(); moptions.cutOverlayBrush[1] = cropCol.get_green(); moptions.cutOverlayBrush[2] = cropCol.get_blue(); - moptions.cutOverlayBrush[3] = butCropCol->get_alpha() / 65535.0; + moptions.cutOverlayBrush[3] = cropMaskColorCB->get_alpha() / 65535.0; - Gdk::RGBA NavGuideCol = butNavGuideCol->get_rgba(); + Gdk::RGBA NavGuideCol = navGuideColorCB->get_rgba(); moptions.navGuideBrush[0] = NavGuideCol.get_red(); moptions.navGuideBrush[1] = NavGuideCol.get_green(); moptions.navGuideBrush[2] = NavGuideCol.get_blue(); - moptions.navGuideBrush[3] = butNavGuideCol->get_alpha() / 65535.0; + moptions.navGuideBrush[3] = navGuideColorCB->get_alpha() / 65535.0; - Pango::FontDescription fd (fontButton->get_font_name()); + Pango::FontDescription fd (mainFontFB->get_font_name()); if (newFont) { moptions.fontFamily = fd.get_family(); moptions.fontSize = fd.get_size() / Pango::SCALE; } - Pango::FontDescription cpfd (colorPickerFontButton->get_font_name()); + Pango::FontDescription cpfd (colorPickerFontFB->get_font_name()); if (newCPFont) { moptions.CPFontFamily = cpfd.get_family(); @@ -1766,24 +1721,10 @@ void Preferences::storePreferences () } moptions.rtSettings.monitorBPC = monBPC->get_active (); -//#if defined(WIN32) moptions.rtSettings.autoMonitorProfile = cbAutoMonProfile->get_active (); -//#endif #endif moptions.rtSettings.iccDirectory = iccDir->get_filename (); -// moptions.rtSettings.viewingdevice = view->get_active_row_number (); -// moptions.rtSettings.viewingdevicegrey = grey->get_active_row_number (); -// moptions.rtSettings.viewinggreySc = greySc->get_active_row_number (); -// moptions.rtSettings.autocielab = cbAutocielab->get_active (); - moptions.rtSettings.ciecamfloat = cbciecamfloat->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 (); - moptions.rtSettings.leveldnaut = dnaut->get_active_row_number (); - moptions.rtSettings.nrwavlevel = dnwavlev->get_active_row_number (); - moptions.rtSettings.leveldnautsimpl = dnautsimpl->get_active_row_number (); - moptions.rtSettings.daubech = cbdaubech->get_active (); moptions.prevdemo = (prevdemo_t)cprevdemo->get_active_row_number (); moptions.serializeTiffRead = ctiffserialize->get_active(); @@ -1809,8 +1750,8 @@ void Preferences::storePreferences () } moptions.maxRecentFolders = (int)maxRecentFolders->get_value(); - moptions.maxThumbnailHeight = (int)maxThumbSize->get_value (); - moptions.maxCacheEntries = (int)maxCacheEntries->get_value (); + moptions.maxThumbnailHeight = (int)maxThumbHeightSB->get_value (); + moptions.maxCacheEntries = (int)maxCacheEntriesSB->get_value (); moptions.overlayedFileNames = overlayedFileNames->get_active (); moptions.filmStripOverlayedFileNames = filmStripOverlayedFileNames->get_active(); moptions.sameThumbSize = sameThumbSize->get_active(); @@ -1845,13 +1786,19 @@ void Preferences::storePreferences () moptions.showFilmStripToolBar = ckbShowFilmStripToolBar->get_active(); moptions.hideTPVScrollbar = ckbHideTPVScrollbar->get_active(); moptions.overwriteOutputFile = chOverwriteOutputFile->get_active (); - moptions.UseIconNoText = ckbUseIconNoText->get_active(); moptions.autoSaveTpOpen = ckbAutoSaveTpOpen->get_active(); - moptions.rgbDenoiseThreadLimit = rgbDenoiseTreadLimitSB->get_value_as_int(); + moptions.rgbDenoiseThreadLimit = threadsSpinBtn->get_value_as_int(); moptions.clutCacheSize = clutCacheSizeSB->get_value_as_int(); + moptions.measure = measureCB->get_active(); + moptions.chunkSizeAMAZE = chunkSizeAMSB->get_value_as_int(); + moptions.chunkSizeCA = chunkSizeCASB->get_value_as_int(); + moptions.chunkSizeRCD = chunkSizeRCDSB->get_value_as_int(); + moptions.chunkSizeRGB = chunkSizeRGBSB->get_value_as_int(); + moptions.chunkSizeXT = chunkSizeXTSB->get_value_as_int(); moptions.maxInspectorBuffers = maxInspectorBuffersSB->get_value_as_int(); + moptions.rtSettings.thumbnail_inspector_mode = static_cast(thumbnailInspectorMode->get_active_row_number()); // Sounds only on Windows and Linux #if defined(WIN32) || defined(__linux__) @@ -1861,8 +1808,8 @@ void Preferences::storePreferences () moptions.sndLngEditProcDoneSecs = spbSndLngEditProcDoneSecs->get_value (); #endif - moptions.cropGuides = Options::CropGuidesMode(cropGuides->get_active_row_number()); - moptions.cropAutoFit = cropAutoFit->get_active(); + moptions.cropGuides = Options::CropGuidesMode(cropGuidesCombo->get_active_row_number()); + moptions.cropAutoFit = cropAutoFitCB->get_active(); } void Preferences::fillPreferences () @@ -1925,54 +1872,40 @@ void Preferences::fillPreferences () } monBPC->set_active (moptions.rtSettings.monitorBPC); -//#if defined(WIN32) cbAutoMonProfile->set_active (moptions.rtSettings.autoMonitorProfile); -//#endif #endif if (Glib::file_test (moptions.rtSettings.iccDirectory, Glib::FILE_TEST_IS_DIR)) { iccDir->set_current_folder (moptions.rtSettings.iccDirectory); } -// view->set_active (moptions.rtSettings.viewingdevice); -// grey->set_active (moptions.rtSettings.viewingdevicegrey); -// greySc->set_active (moptions.rtSettings.viewinggreySc); - dnv->set_active (moptions.rtSettings.leveldnv); - dnti->set_active (moptions.rtSettings.leveldnti); - dnliss->set_active (moptions.rtSettings.leveldnliss); - dnaut->set_active (moptions.rtSettings.leveldnaut); - dnautsimpl->set_active (moptions.rtSettings.leveldnautsimpl); - dnwavlev->set_active (moptions.rtSettings.nrwavlevel); cprevdemo->set_active (moptions.prevdemo); - cbdaubech->set_active (moptions.rtSettings.daubech); -// cbAutocielab->set_active (moptions.rtSettings.autocielab); - cbciecamfloat->set_active (moptions.rtSettings.ciecamfloat); languages->set_active_text (moptions.language); ckbLangAutoDetect->set_active (moptions.languageAutoDetect); int themeNbr = getThemeRowNumber (moptions.theme); - theme->set_active (themeNbr == -1 ? 0 : themeNbr); + themeCBT->set_active (themeNbr == -1 ? 0 : themeNbr); Gdk::RGBA cropCol; cropCol.set_rgba (moptions.cutOverlayBrush[0], moptions.cutOverlayBrush[1], moptions.cutOverlayBrush[2]); - butCropCol->set_rgba (cropCol); - butCropCol->set_alpha ( (unsigned short) (moptions.cutOverlayBrush[3] * 65535.0)); + cropMaskColorCB->set_rgba (cropCol); + cropMaskColorCB->set_alpha ( (unsigned short) (moptions.cutOverlayBrush[3] * 65535.0)); Gdk::RGBA NavGuideCol; NavGuideCol.set_rgba (moptions.navGuideBrush[0], moptions.navGuideBrush[1], moptions.navGuideBrush[2]); - butNavGuideCol->set_rgba (NavGuideCol); - butNavGuideCol->set_alpha ( (unsigned short) (moptions.navGuideBrush[3] * 65535.0)); + navGuideColorCB->set_rgba (NavGuideCol); + navGuideColorCB->set_alpha ( (unsigned short) (moptions.navGuideBrush[3] * 65535.0)); if (options.fontFamily == "default") { - fontButton->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); + mainFontFB->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); } else { - fontButton->set_font_name (Glib::ustring::compose ("%1 %2", options.fontFamily, options.fontSize)); + mainFontFB->set_font_name (Glib::ustring::compose ("%1 %2", options.fontFamily, options.fontSize)); } if (options.CPFontFamily == "default") { - colorPickerFontButton->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); + colorPickerFontFB->set_font_name (Glib::ustring::compose ("%1 %2", initialFontFamily, initialFontSize)); } else { - colorPickerFontButton->set_font_name (Glib::ustring::compose ("%1 %2", options.CPFontFamily, options.CPFontSize)); + colorPickerFontFB->set_font_name (Glib::ustring::compose ("%1 %2", options.CPFontFamily, options.CPFontSize)); } showDateTime->set_active (moptions.fbShowDateTime); @@ -2039,9 +1972,9 @@ void Preferences::fillPreferences () row[extensionColumns.ext] = moptions.parseExtensions[i]; } - maxThumbSize->set_value (moptions.maxThumbnailHeight); maxRecentFolders->set_value (moptions.maxRecentFolders); - maxCacheEntries->set_value (moptions.maxCacheEntries); + maxThumbHeightSB->set_value (moptions.maxThumbnailHeight); + maxCacheEntriesSB->set_value (moptions.maxCacheEntries); overlayedFileNames->set_active (moptions.overlayedFileNames); filmStripOverlayedFileNames->set_active (moptions.filmStripOverlayedFileNames); sameThumbSize->set_active (moptions.sameThumbSize); @@ -2060,17 +1993,22 @@ void Preferences::fillPreferences () curveBBoxPosC->set_active (moptions.curvebboxpos); ckbHistogramPositionLeft->set_active (moptions.histogramPosition == 1); -// ckbHistogramWorking->set_active(moptions.histogramWorking==1); ckbFileBrowserToolbarSingleRow->set_active (moptions.FileBrowserToolbarSingleRow); ckbShowFilmStripToolBar->set_active (moptions.showFilmStripToolBar); ckbHideTPVScrollbar->set_active (moptions.hideTPVScrollbar); - ckbUseIconNoText->set_active (moptions.UseIconNoText); ckbAutoSaveTpOpen->set_active (moptions.autoSaveTpOpen); - rgbDenoiseTreadLimitSB->set_value (moptions.rgbDenoiseThreadLimit); + threadsSpinBtn->set_value (moptions.rgbDenoiseThreadLimit); clutCacheSizeSB->set_value (moptions.clutCacheSize); + measureCB->set_active (moptions.measure); + chunkSizeAMSB->set_value (moptions.chunkSizeAMAZE); + chunkSizeCASB->set_value (moptions.chunkSizeCA); + chunkSizeRGBSB->set_value (moptions.chunkSizeRGB); + chunkSizeRCDSB->set_value (moptions.chunkSizeRCD); + chunkSizeXTSB->set_value (moptions.chunkSizeXT); maxInspectorBuffersSB->set_value (moptions.maxInspectorBuffers); + thumbnailInspectorMode->set_active(int(moptions.rtSettings.thumbnail_inspector_mode)); darkFrameDir->set_current_folder ( moptions.rtSettings.darkFramesPath ); darkFrameChanged (); @@ -2093,8 +2031,8 @@ void Preferences::fillPreferences () } } - cropGuides->set_active(moptions.cropGuides); - cropAutoFit->set_active(moptions.cropAutoFit); + cropGuidesCombo->set_active(moptions.cropGuides); + cropAutoFitCB->set_active(moptions.cropAutoFit); addc.block (false); setc.block (false); @@ -2134,17 +2072,17 @@ void Preferences::savePressed () { } */ -//#if defined(WIN32) void Preferences::autoMonProfileToggled () { monProfile->set_sensitive (!cbAutoMonProfile->get_active()); } -//#endif + /* void Preferences::autocielabToggled () { // cbAutocielab->set_sensitive(cbAutocielab->get_active()); } */ + void Preferences::sndEnableToggled () { txtSndBatchQueueDone->set_sensitive (ckbSndEnable->get_active()); @@ -2179,14 +2117,14 @@ void Preferences::okPressed () void Preferences::cancelPressed () { // set the initial theme back - if (themeFNames.at (theme->get_active_row_number ()).longFName != options.theme) { + if (themeFNames.at (themeCBT->get_active_row_number ()).longFName != options.theme) { rtengine::setPaths(); RTImage::updateImages(); switchThemeTo (options.theme); } // set the initial font back - Pango::FontDescription fd (fontButton->get_font_name()); + Pango::FontDescription fd (mainFontFB->get_font_name()); if (fd.get_family() != options.fontFamily && (fd.get_size() / Pango::SCALE) != options.fontSize) { if (options.fontFamily == "default") { @@ -2198,7 +2136,7 @@ void Preferences::cancelPressed () // update the profileStore if (useBundledProfiles->get_active () != options.useBundledProfiles) { - // we have to rescan with the old value; + // we have to rescan with the old value bpconn.block (true); useBundledProfiles->set_active (false); bundledProfilesChanged(); @@ -2212,9 +2150,9 @@ void Preferences::selectStartupDir () { Gtk::FileChooserDialog dialog (getToplevelWindow (this), M ("PREFERENCES_DIRSELECTDLG"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); -// dialog.set_transient_for(*this); + //dialog.set_transient_for(*this); - //Add response buttons the the dialog: + //Add response buttons to the dialog: dialog.add_button (M ("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); dialog.add_button (M ("GENERAL_OPEN"), Gtk::RESPONSE_OK); @@ -2237,7 +2175,7 @@ void Preferences::aboutPressed () void Preferences::themeChanged () { - moptions.theme = themeFNames.at (theme->get_active_row_number ()).longFName; + moptions.theme = themeFNames.at (themeCBT->get_active_row_number ()).longFName; rtengine::setPaths(); RTImage::updateImages(); switchThemeTo (moptions.theme); @@ -2393,7 +2331,7 @@ void Preferences::fontChanged () { newFont = true; - Pango::FontDescription fd (fontButton->get_font_name()); + Pango::FontDescription fd (mainFontFB->get_font_name()); switchFontTo (fd.get_family(), fd.get_size() / Pango::SCALE); } @@ -2447,11 +2385,6 @@ void Preferences::workflowUpdate () parent->updateTPVScrollbar (moptions.hideTPVScrollbar); } - if (moptions.UseIconNoText != options.UseIconNoText) { - // Update the tool's tab titles - parent->updateTabsUsesIcons (moptions.UseIconNoText); - } - if (moptions.FileBrowserToolbarSingleRow != options.FileBrowserToolbarSingleRow) { // Update the position of the Query toolbar parent->updateFBQueryTB (moptions.FileBrowserToolbarSingleRow); @@ -2471,7 +2404,7 @@ void Preferences::workflowUpdate () || moptions.rtSettings.printerBPC != options.rtSettings.printerBPC || moptions.rtSettings.printerIntent != options.rtSettings.printerIntent) { // Update the position of the Histogram - parent->updateProfiles (moptions.rtSettings.printerProfile, moptions.rtSettings.printerIntent, moptions.rtSettings.printerBPC); + parent->updateProfiles (moptions.rtSettings.printerProfile, rtengine::RenderingIntent(moptions.rtSettings.printerIntent), moptions.rtSettings.printerBPC); } } diff --git a/rtgui/preferences.h b/rtgui/preferences.h index cb0e6c709..6f434c477 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -114,7 +114,6 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::CheckButton* monBPC; Gtk::CheckButton* cbAutoMonProfile; //Gtk::CheckButton* cbAutocielab; - Gtk::CheckButton* cbciecamfloat; Gtk::CheckButton* cbdaubech; Gtk::SpinButton* hlThresh; Gtk::SpinButton* shThresh; @@ -141,18 +140,15 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::CheckButton* ctiffserialize; Gtk::ComboBoxText* curveBBoxPosC; - Gtk::ComboBoxText* theme; - Gtk::FontButton* fontButton; - Gtk::FontButton* colorPickerFontButton; - Gtk::ColorButton* butCropCol; - Gtk::ColorButton* butNavGuideCol; + Gtk::ComboBoxText* themeCBT; + Gtk::FontButton* mainFontFB; + Gtk::FontButton* colorPickerFontFB; + Gtk::ColorButton* cropMaskColorCB; + Gtk::ColorButton* navGuideColorCB; - Gtk::SpinButton* maxThumbSize; - Gtk::SpinButton* maxCacheEntries; Gtk::SpinButton* maxRecentFolders; - Gtk::Button* clearThumbnails; - Gtk::Button* clearProfiles; - Gtk::Button* clearAll; + Gtk::SpinButton* maxThumbHeightSB; + Gtk::SpinButton* maxCacheEntriesSB; Gtk::Entry* extension; Gtk::TreeView* extensions; Gtk::Button* addExt; @@ -163,9 +159,16 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::CheckButton* filmStripOverlayedFileNames; Gtk::CheckButton* sameThumbSize; - Gtk::SpinButton* rgbDenoiseTreadLimitSB; + Gtk::SpinButton* threadsSpinBtn; Gtk::SpinButton* clutCacheSizeSB; + Gtk::CheckButton* measureCB; + Gtk::SpinButton* chunkSizeAMSB; + Gtk::SpinButton* chunkSizeCASB; + Gtk::SpinButton* chunkSizeRCDSB; + Gtk::SpinButton* chunkSizeRGBSB; + Gtk::SpinButton* chunkSizeXTSB; Gtk::SpinButton* maxInspectorBuffersSB; + Gtk::ComboBoxText *thumbnailInspectorMode; Gtk::CheckButton* ckbmenuGroupRank; Gtk::CheckButton* ckbmenuGroupLabel; @@ -197,15 +200,14 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::CheckButton* ckbFileBrowserToolbarSingleRow; Gtk::CheckButton* ckbShowFilmStripToolBar; Gtk::CheckButton* ckbHideTPVScrollbar; - Gtk::CheckButton* ckbUseIconNoText; Gtk::CheckButton* ckbAutoSaveTpOpen; Gtk::Button* btnSaveTpOpenNow; DynamicProfilePanel *dynProfilePanel; - Gtk::ComboBoxText *cropGuides; - Gtk::CheckButton *cropAutoFit; + Gtk::ComboBoxText *cropGuidesCombo; + Gtk::CheckButton *cropAutoFitCB; Glib::ustring storedValueRaw; Glib::ustring storedValueImg; @@ -242,18 +244,27 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener void appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set); - Gtk::Widget* getProcParamsPanel (); - Gtk::Widget* getColorManagementPanel (); - Gtk::Widget* getFileBrowserPanel (); - Gtk::Widget* getGeneralPanel (); - Gtk::Widget* getBatchProcPanel (); - Gtk::Widget* getPerformancePanel (); - Gtk::Widget* getSoundPanel (); - Gtk::Widget* getDynProfilePanel (); + Gtk::ScrolledWindow *swGeneral; + Gtk::ScrolledWindow *swImageProcessing; + Gtk::ScrolledWindow *swDynamicProfile; + Gtk::ScrolledWindow *swFileBrowser; + Gtk::ScrolledWindow *swColorMan; + Gtk::ScrolledWindow *swBatchProc; + Gtk::ScrolledWindow *swPerformance; + Gtk::ScrolledWindow *swSounds; + + Gtk::Widget *getGeneralPanel(); + Gtk::Widget *getImageProcessingPanel(); + Gtk::Widget *getDynamicProfilePanel(); + Gtk::Widget *getFileBrowserPanel(); + Gtk::Widget *getColorManPanel(); + Gtk::Widget *getBatchProcPanel(); + Gtk::Widget *getPerformancePanel(); + Gtk::Widget *getSoundsPanel(); public: explicit Preferences (RTWindow *rtwindow); - ~Preferences (); + ~Preferences () override; void savePressed (); void loadPressed (); @@ -283,9 +294,9 @@ public: void behAddAllPressed (); void behSetAllPressed (); - virtual void storeCurrentValue(); - virtual void updateProfileList(); - virtual void restoreValue(); + void storeCurrentValue() override; + void updateProfileList() override; + void restoreValue() override; // void selectICCProfileDir (); // void selectMonitorProfile (); diff --git a/rtgui/preprocess.cc b/rtgui/preprocess.cc index 02e0ff220..0d8933a98 100644 --- a/rtgui/preprocess.cc +++ b/rtgui/preprocess.cc @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "preprocess.h" -#include "guiutils.h" #include +#include "preprocess.h" + +#include "guiutils.h" + +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -87,7 +91,7 @@ void PreProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedi } } -void PreProcess::adjusterChanged (Adjuster* a, double newval) +void PreProcess::adjusterChanged(Adjuster* a, double newval) { if (listener) { if (a == hdThreshold) { @@ -96,6 +100,10 @@ void PreProcess::adjusterChanged (Adjuster* a, double newval) } } +void PreProcess::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void PreProcess::hotPixelChanged () { if (batchMode) { diff --git a/rtgui/preprocess.h b/rtgui/preprocess.h index 856a9a25e..58cc2c2de 100644 --- a/rtgui/preprocess.h +++ b/rtgui/preprocess.h @@ -40,14 +40,15 @@ public: PreProcess (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; //void setBatchMode (bool batchMode); //void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL); void hotPixelChanged(); void deadPixelChanged(); - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; //void adjusterChanged (Adjuster* a, double newval); diff --git a/rtgui/previewhandler.cc b/rtgui/previewhandler.cc index 45e46d2d8..a1640b39c 100644 --- a/rtgui/previewhandler.cc +++ b/rtgui/previewhandler.cc @@ -19,23 +19,15 @@ #include "previewhandler.h" #include #include "../rtengine/rtengine.h" +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; -namespace -{ - -struct iaimgpar { - IImage8* image; - PreviewHandlerIdleHelper* pih; - double scale; - CropParams cp; -}; - -} - -PreviewHandler::PreviewHandler () : image(nullptr), previewScale(1.) +PreviewHandler::PreviewHandler () : + image(nullptr), + cropParams(new procparams::CropParams), + previewScale(1.) { pih = new PreviewHandlerIdleHelper; @@ -57,133 +49,107 @@ PreviewHandler::~PreviewHandler () //----------------previewimagelistener functions-------------------- -void PreviewHandler::setImage (rtengine::IImage8* i, double scale, rtengine::procparams::CropParams cp) +void PreviewHandler::setImage(rtengine::IImage8* i, double scale, const rtengine::procparams::CropParams& cp) { pih->pending++; - iaimgpar* iap = new iaimgpar; - iap->image = i; - iap->pih = pih; - iap->scale = scale; - iap->cp = cp; + idle_register.add( + [this, i, scale, cp]() -> bool + { + if (pih->destroyed) { + if (pih->pending == 1) { + delete pih; + } else { + --pih->pending; + } - const auto func = [](gpointer data) -> gboolean { - iaimgpar* const iap = static_cast(data); - PreviewHandlerIdleHelper* const pih = iap->pih; - - if (pih->destroyed) { - if (pih->pending == 1) { - delete pih; - } else { - pih->pending--; + return false; } - delete iap; + if (pih->phandler->image) { + IImage8* const oldImg = pih->phandler->image; - return FALSE; + oldImg->getMutex().lock(); + pih->phandler->image = i; + oldImg->getMutex().unlock(); + } else { + pih->phandler->image = i; + } + + *pih->phandler->cropParams = cp; + pih->phandler->previewScale = scale; + --pih->pending; + + return false; } - - if (pih->phandler->image) { - IImage8* const oldImg = pih->phandler->image; - oldImg->getMutex().lock (); - pih->phandler->image = iap->image; - oldImg->getMutex().unlock (); - } else { - pih->phandler->image = iap->image; - } - - pih->phandler->cropParams = iap->cp; - pih->phandler->previewScale = iap->scale; - pih->pending--; - delete iap; - - return FALSE; - }; - - idle_register.add(func, iap); + ); } -void PreviewHandler::delImage (IImage8* i) +void PreviewHandler::delImage(IImage8* i) { pih->pending++; - iaimgpar* iap = new iaimgpar; - iap->image = i; - iap->pih = pih; + idle_register.add( + [this, i]() -> bool + { + if (pih->destroyed) { + if (pih->pending == 1) { + delete pih; + } else { + --pih->pending; + } - const auto func = [](gpointer data) -> gboolean { - iaimgpar* iap = static_cast(data); - PreviewHandlerIdleHelper* pih = iap->pih; - - if (pih->destroyed) { - if (pih->pending == 1) { - delete pih; - } else { - pih->pending--; + return false; } - delete iap; + if (pih->phandler->image) { + IImage8* oldImg = pih->phandler->image; + oldImg->getMutex().lock(); + pih->phandler->image = nullptr; + oldImg->getMutex().unlock(); + } - return FALSE; + i->free(); + pih->phandler->previewImgMutex.lock(); + pih->phandler->previewImg.clear(); + pih->phandler->previewImgMutex.unlock(); + + --pih->pending; + + return false; } - - if (pih->phandler->image) { - IImage8* oldImg = pih->phandler->image; - oldImg->getMutex().lock (); - pih->phandler->image = nullptr; - oldImg->getMutex().unlock (); - } - - iap->image->free (); - pih->phandler->previewImgMutex.lock (); - pih->phandler->previewImg.clear (); - pih->phandler->previewImgMutex.unlock (); - - pih->pending--; - delete iap; - - return FALSE; - }; - - idle_register.add(func, iap); + ); } -void PreviewHandler::imageReady (CropParams cp) +void PreviewHandler::imageReady(const rtengine::procparams::CropParams& cp) { pih->pending++; - iaimgpar* iap = new iaimgpar; - iap->pih = pih; - iap->cp = cp; - const auto func = [](gpointer data) -> gboolean { - iaimgpar* const iap = static_cast(data); - PreviewHandlerIdleHelper* pih = iap->pih; + idle_register.add( + [this, cp]() -> bool + { + if (pih->destroyed) { + if (pih->pending == 1) { + delete pih; + } else { + --pih->pending; + } - if (pih->destroyed) { - if (pih->pending == 1) { - delete pih; - } else { - pih->pending--; + return false; } - delete iap; + pih->phandler->previewImgMutex.lock(); + pih->phandler->previewImg = Gdk::Pixbuf::create_from_data(pih->phandler->image->getData(), Gdk::COLORSPACE_RGB, false, 8, pih->phandler->image->getWidth(), pih->phandler->image->getHeight(), 3 * pih->phandler->image->getWidth()); + pih->phandler->previewImgMutex.unlock (); - return FALSE; + *pih->phandler->cropParams = cp; + pih->phandler->previewImageChanged (); + --pih->pending; + + return false; } - - pih->phandler->previewImgMutex.lock (); - pih->phandler->previewImg = Gdk::Pixbuf::create_from_data (pih->phandler->image->getData(), Gdk::COLORSPACE_RGB, false, 8, pih->phandler->image->getWidth(), pih->phandler->image->getHeight(), 3 * pih->phandler->image->getWidth()); - pih->phandler->previewImgMutex.unlock (); - pih->phandler->cropParams = iap->cp; - pih->phandler->previewImageChanged (); - pih->pending--; - delete iap; - - return FALSE; - }; - - idle_register.add(func, iap); + ); } Glib::RefPtr PreviewHandler::getRoughImage (int x, int y, int w, int h, double zoom) @@ -242,3 +208,8 @@ void PreviewHandler::previewImageChanged () (*i)->previewImageChanged (); } } + +rtengine::procparams::CropParams PreviewHandler::getCropParams() +{ + return *cropParams; +} diff --git a/rtgui/previewhandler.h b/rtgui/previewhandler.h index 1258083ec..fcd0a0c5f 100644 --- a/rtgui/previewhandler.h +++ b/rtgui/previewhandler.h @@ -20,6 +20,7 @@ #define _PREVIEWHANDLER_ #include +#include #include @@ -30,13 +31,13 @@ class PreviewListener { - public: - virtual ~PreviewListener () {} - virtual void previewImageChanged () {} + virtual ~PreviewListener() = default; + virtual void previewImageChanged() = 0; }; class PreviewHandler; + struct PreviewHandlerIdleHelper { PreviewHandler* phandler; bool destroyed; @@ -54,7 +55,7 @@ private: protected: rtengine::IImage8* image; - rtengine::procparams::CropParams cropParams; + const std::unique_ptr cropParams; double previewScale; PreviewHandlerIdleHelper* pih; std::list listeners; @@ -64,7 +65,7 @@ protected: public: PreviewHandler (); - virtual ~PreviewHandler (); + ~PreviewHandler () override; void addPreviewImageListener (PreviewListener* l) { @@ -72,9 +73,9 @@ public: } // previewimagelistener - void setImage (rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cp); - void delImage (rtengine::IImage8* img); - void imageReady (rtengine::procparams::CropParams cp); + void setImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cp) override; + void delImage(rtengine::IImage8* img) override; + void imageReady(const rtengine::procparams::CropParams& cp) override; // this function is called when a new preview image arrives from rtengine void previewImageChanged (); @@ -82,10 +83,7 @@ public: // with this function it is possible to ask for a rough approximation of a (possibly zoomed) crop of the image Glib::RefPtr getRoughImage (int x, int y, int w, int h, double zoom); Glib::RefPtr getRoughImage (int desiredW, int desiredH, double& zoom); - rtengine::procparams::CropParams getCropParams () - { - return cropParams; - } + rtengine::procparams::CropParams getCropParams (); }; #endif diff --git a/rtgui/previewloader.cc b/rtgui/previewloader.cc index 0c0ecf9f6..34b42dcb7 100644 --- a/rtgui/previewloader.cc +++ b/rtgui/previewloader.cc @@ -59,7 +59,7 @@ public: }; */ struct JobCompare { - bool operator()(const Job& lhs, const Job& rhs) + bool operator()(const Job& lhs, const Job& rhs) const { if ( lhs.dir_id_ == rhs.dir_id_ ) { return lhs.dir_entry_ < rhs.dir_entry_; @@ -168,6 +168,10 @@ PreviewLoader::PreviewLoader(): { } +PreviewLoader::~PreviewLoader() { + delete impl_; +} + PreviewLoader* PreviewLoader::getInstance() { static PreviewLoader instance_; diff --git a/rtgui/previewloader.h b/rtgui/previewloader.h index d5207cd44..311d9d5ce 100644 --- a/rtgui/previewloader.h +++ b/rtgui/previewloader.h @@ -29,9 +29,7 @@ class PreviewLoaderListener { public: - virtual ~PreviewLoaderListener() - { - } + virtual ~PreviewLoaderListener() = default; /** * @brief a preview is ready @@ -39,16 +37,12 @@ public: * @param dir_id directory ID this is for * @param fd entry */ - virtual void previewReady(int dir_id, FileBrowserEntry* fd) - { - } + virtual void previewReady(int dir_id, FileBrowserEntry* fd) = 0; /** * @brief all previews have finished loading */ - virtual void previewsFinished(int dir_id_) - { - } + virtual void previewsFinished(int dir_id_) = 0; }; class PreviewLoader : @@ -88,6 +82,7 @@ public: private: PreviewLoader(); + ~PreviewLoader(); class Impl; Impl* impl_; diff --git a/rtgui/previewmodepanel.cc b/rtgui/previewmodepanel.cc index 60b450e4a..086f6ab17 100644 --- a/rtgui/previewmodepanel.cc +++ b/rtgui/previewmodepanel.cc @@ -24,60 +24,68 @@ PreviewModePanel::PreviewModePanel (ImageArea* ia) : imageArea(ia) { - iR = new RTImage ("previewmodeR-on.png"); - iG = new RTImage ("previewmodeG-on.png"); - iB = new RTImage ("previewmodeB-on.png"); - iL = new RTImage ("previewmodeL-on.png"); - iBC0 = new RTImage ("previewmodeBC0-on.png"); - iBC1 = new RTImage ("previewmodeBC1-on.png"); - iBC2 = new RTImage ("previewmodeBC2-on.png"); - iBC3 = new RTImage ("previewmodeBC3-on.png"); + iR = new RTImage ("square-toggle-red-on-narrow.png"); + iG = new RTImage ("square-toggle-green-on-narrow.png"); + iB = new RTImage ("square-toggle-blue-on-narrow.png"); + iL = new RTImage ("square-toggle-luminosity-on-narrow.png"); + iBC0 = new RTImage ("square-toggle-theme-on-narrow.png"); + iBC1 = new RTImage ("square-toggle-black-on-narrow.png"); + iBC2 = new RTImage ("square-toggle-white-on-narrow.png"); + iBC3 = new RTImage ("square-toggle-gray-on-narrow.png"); - igR = new RTImage ("previewmodeR-off.png"); - igG = new RTImage ("previewmodeG-off.png"); - igB = new RTImage ("previewmodeB-off.png"); - igL = new RTImage ("previewmodeL-off.png"); - igBC0 = new RTImage ("previewmodeBC0-off.png"); - igBC1 = new RTImage ("previewmodeBC1-off.png"); - igBC2 = new RTImage ("previewmodeBC2-off.png"); - igBC3 = new RTImage ("previewmodeBC3-off.png"); + igR = new RTImage ("square-toggle-red-off-narrow.png"); + igG = new RTImage ("square-toggle-green-off-narrow.png"); + igB = new RTImage ("square-toggle-blue-off-narrow.png"); + igL = new RTImage ("square-toggle-luminosity-off-narrow.png"); + igBC0 = new RTImage ("square-toggle-theme-off-narrow.png"); + igBC1 = new RTImage ("square-toggle-black-off-narrow.png"); + igBC2 = new RTImage ("square-toggle-white-off-narrow.png"); + igBC3 = new RTImage ("square-toggle-gray-off-narrow.png"); backColor0 = Gtk::manage (new Gtk::ToggleButton ()); + backColor0->get_style_context()->add_class("narrowbutton"); backColor0->set_relief(Gtk::RELIEF_NONE); backColor0->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR0")); backColor0->set_image(options.bgcolor == 0 ? *iBC0 : *igBC0); backColor1 = Gtk::manage (new Gtk::ToggleButton ()); + backColor1->get_style_context()->add_class("narrowbutton"); backColor1->set_relief(Gtk::RELIEF_NONE); backColor1->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR1")); backColor1->set_image(options.bgcolor == 1 ? *iBC1 : *igBC1); backColor3 = Gtk::manage (new Gtk::ToggleButton ()); + backColor3->get_style_context()->add_class("narrowbutton"); backColor3->set_relief(Gtk::RELIEF_NONE); backColor3->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR3")); backColor3->set_image(options.bgcolor == 3 ? *iBC3 : *igBC3); backColor2 = Gtk::manage (new Gtk::ToggleButton ()); + backColor2->get_style_context()->add_class("narrowbutton"); backColor2->set_relief(Gtk::RELIEF_NONE); backColor2->set_tooltip_markup (M("MAIN_TOOLTIP_BACKCOLOR2")); backColor2->set_image(options.bgcolor == 2 ? *iBC2 : *igBC2); previewR = Gtk::manage (new Gtk::ToggleButton ()); + previewR->get_style_context()->add_class("narrowbutton"); previewR->set_relief(Gtk::RELIEF_NONE); previewR->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWR")); previewR->set_image(*igR); previewG = Gtk::manage (new Gtk::ToggleButton ()); + previewG->get_style_context()->add_class("narrowbutton"); previewG->set_relief(Gtk::RELIEF_NONE); previewG->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWG")); previewG->set_image(*igG); previewB = Gtk::manage (new Gtk::ToggleButton ()); + previewB->get_style_context()->add_class("narrowbutton"); previewB->set_relief(Gtk::RELIEF_NONE); previewB->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWB")); previewB->set_image(*igB); previewL = Gtk::manage (new Gtk::ToggleButton ()); + previewL->get_style_context()->add_class("narrowbutton"); previewL->set_relief(Gtk::RELIEF_NONE); previewL->set_tooltip_markup (M("MAIN_TOOLTIP_PREVIEWL")); previewL->set_image(*igL); diff --git a/rtgui/previewmodepanel.h b/rtgui/previewmodepanel.h index 1d7b99625..4924b77af 100644 --- a/rtgui/previewmodepanel.h +++ b/rtgui/previewmodepanel.h @@ -47,7 +47,7 @@ protected: public: explicit PreviewModePanel (ImageArea* ia); - ~PreviewModePanel(); + ~PreviewModePanel() override; void toggleR (); void toggleG (); diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index 06ce3ad18..c999ff663 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -21,6 +21,8 @@ #include "imagearea.h" #include "cursormanager.h" +#include "../rtengine/procparams.h" + PreviewWindow::PreviewWindow () : previewHandler(nullptr), mainCropWin(nullptr), imageArea(nullptr), imgX(0), imgY(0), imgW(0), imgH(0), zoom(0.0), press_x(0), press_y(0), isMoving(false), needsUpdate(false), cursor_type(CSUndefined) @@ -34,7 +36,7 @@ void PreviewWindow::on_realize () { Gtk::DrawingArea::on_realize (); - add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK); + add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); } void PreviewWindow::getObservedFrameArea (int& x, int& y, int& w, int& h) @@ -194,24 +196,25 @@ void PreviewWindow::setImageArea (ImageArea* ia) } } -void PreviewWindow::cropPositionChanged (CropWindow* w) +void PreviewWindow::cropPositionChanged(CropWindow* w) { - queue_draw (); } -void PreviewWindow::cropWindowSizeChanged (CropWindow* w) +void PreviewWindow::cropWindowSizeChanged(CropWindow* w) { - queue_draw (); } -void PreviewWindow::cropZoomChanged (CropWindow* w) +void PreviewWindow::cropZoomChanged(CropWindow* w) { - queue_draw (); } +void PreviewWindow::initialImageArrived() +{ +} + bool PreviewWindow::on_motion_notify_event (GdkEventMotion* event) { @@ -230,8 +233,9 @@ bool PreviewWindow::on_motion_notify_event (GdkEventMotion* event) mainCropWin->remoteMove ((event->x - press_x) / zoom, (event->y - press_y) / zoom); press_x = event->x; press_y = event->y; + newType = CSHandClosed; } else if (inside) { - newType = CSClosedHand; + newType = CSHandOpen; } else { newType = CSArrow; } @@ -262,8 +266,8 @@ bool PreviewWindow::on_button_press_event (GdkEventButton* event) press_x = event->x; press_y = event->y; - if (cursor_type != CSClosedHand) { - cursor_type = CSClosedHand; + if (cursor_type != CSHandClosed) { + cursor_type = CSHandClosed; CursorManager::setWidgetCursor(get_window(), cursor_type); } } diff --git a/rtgui/previewwindow.h b/rtgui/previewwindow.h index f50411170..c89c89d4e 100644 --- a/rtgui/previewwindow.h +++ b/rtgui/previewwindow.h @@ -50,25 +50,26 @@ public: void setPreviewHandler (PreviewHandler* ph); void setImageArea (ImageArea* ia); - void on_realize (); + void on_realize () override; void on_resized (Gtk::Allocation& req); - bool on_draw (const ::Cairo::RefPtr< Cairo::Context> &cr); - bool on_motion_notify_event (GdkEventMotion* event); - bool on_button_press_event (GdkEventButton* event); - bool on_button_release_event(GdkEventButton* event); - 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; - 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 on_draw (const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool on_motion_notify_event (GdkEventMotion* event) override; + bool on_button_press_event (GdkEventButton* event) override; + bool on_button_release_event(GdkEventButton* event) override; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; // PreviewListener interface - void previewImageChanged (); + void previewImageChanged () override; // CropWindowListener interface - void cropPositionChanged (CropWindow* w); - void cropWindowSizeChanged (CropWindow* w); - void cropZoomChanged (CropWindow* w); + void cropPositionChanged(CropWindow* w) override; + void cropWindowSizeChanged(CropWindow* w) override; + void cropZoomChanged(CropWindow* w) override; + void initialImageArrived() override; }; #endif diff --git a/rtgui/profilechangelistener.h b/rtgui/profilechangelistener.h index b3baa62d7..e333933ea 100644 --- a/rtgui/profilechangelistener.h +++ b/rtgui/profilechangelistener.h @@ -19,27 +19,35 @@ #ifndef _PROFILECHANGELISTENER_ #define _PROFILECHANGELISTENER_ +#include + #include "../rtengine/rtengine.h" -#include + +namespace rtengine +{ + +namespace procparams +{ + +class PartialProfile; + +} + +} class ProfileChangeListener { - public: - virtual ~ProfileChangeListener() {} - virtual void profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited = nullptr) {} - virtual void setDefaults (rtengine::procparams::ProcParams* defparams) {} + virtual ~ProfileChangeListener() = default; + virtual void profileChange( + const rtengine::procparams::PartialProfile* nparams, + const rtengine::ProcEvent& event, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited = nullptr, + bool fromLastSaved = false + ) = 0; + virtual void setDefaults(const rtengine::procparams::ProcParams* defparams) = 0; }; -class BatchProfileChangeListener -{ - -public: - virtual ~BatchProfileChangeListener() {} - virtual void beginBatchProfileChange(int numberOfEntries) {} - virtual void endBatchProfileChange() {} -}; - - #endif diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index 57204f8b1..af39695fa 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -17,12 +17,15 @@ * along with RawTherapee. If not, see . */ #include "profilepanel.h" -#include "options.h" + #include "clipboard.h" #include "multilangmgr.h" +#include "options.h" #include "profilestorecombobox.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -63,20 +66,20 @@ ProfilePanel::ProfilePanel () : storedPProfile(nullptr), lastFilename(""), image setExpandAlignProperties(profiles, true, true, Gtk::ALIGN_FILL, Gtk::ALIGN_FILL); load = Gtk::manage (new Gtk::Button ()); - load->add (*Gtk::manage (new RTImage ("gtk-open.png"))); + load->add (*Gtk::manage (new RTImage ("folder-open.png"))); load->get_style_context()->add_class("Left"); load->set_margin_left(2); setExpandAlignProperties(load, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); save = Gtk::manage (new Gtk::Button ()); - save->add (*Gtk::manage (new RTImage ("gtk-save-large.png"))); + save->add (*Gtk::manage (new RTImage ("save.png"))); save->get_style_context()->add_class("MiddleH"); setExpandAlignProperties(save, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); copy = Gtk::manage (new Gtk::Button ()); - copy->add (*Gtk::manage (new RTImage ("edit-copy.png"))); + copy->add (*Gtk::manage (new RTImage ("copy.png"))); copy->get_style_context()->add_class("MiddleH"); setExpandAlignProperties(copy, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); paste = Gtk::manage (new Gtk::Button ()); - paste->add (*Gtk::manage (new RTImage ("edit-paste.png"))); + paste->add (*Gtk::manage (new RTImage ("paste.png"))); paste->get_style_context()->add_class("Right"); setExpandAlignProperties(paste, false, true, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); @@ -167,6 +170,7 @@ Gtk::TreeIter ProfilePanel::getLastSavedRow() Gtk::TreeIter ProfilePanel::addCustomRow() { if(customPSE) { + profiles->deleteRow(customPSE); delete customPSE; customPSE = nullptr; } @@ -179,6 +183,7 @@ Gtk::TreeIter ProfilePanel::addCustomRow() Gtk::TreeIter ProfilePanel::addLastSavedRow() { if(lastSavedPSE) { + profiles->deleteRow(lastSavedPSE); delete lastSavedPSE; lastSavedPSE = nullptr; } @@ -284,7 +289,7 @@ void ProfilePanel::save_clicked (GdkEventButton* event) dialog.add_shortcut_folder(imagePath); } catch (Glib::Error&) {} - //Add response buttons the the dialog: + //Add response buttons to the dialog: dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK); @@ -307,8 +312,6 @@ void ProfilePanel::save_clicked (GdkEventButton* event) do { if (dialog.run() == Gtk::RESPONSE_OK) { - dialog.hide(); - std::string fname = dialog.get_filename(); Glib::ustring ext = getExtension (fname); @@ -457,7 +460,7 @@ void ProfilePanel::load_clicked (GdkEventButton* event) dialog.add_shortcut_folder(imagePath); } catch (Glib::Error&) {} - //Add response buttons the the dialog: + //Add response buttons to the dialog: dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL); dialog.add_button(M("GENERAL_OPEN"), Gtk::RESPONSE_OK); @@ -709,9 +712,13 @@ void ProfilePanel::selection_changed () dontupdate = false; } -void ProfilePanel::procParamsChanged (rtengine::procparams::ProcParams* p, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited) +void ProfilePanel::procParamsChanged( + const rtengine::procparams::ProcParams* p, + const rtengine::ProcEvent& ev, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited +) { - // to prevent recursion, filter out the events caused by the profilepanel if (ev == EvProfileChanged || ev == EvPhotoLoaded) { return; @@ -734,6 +741,10 @@ void ProfilePanel::procParamsChanged (rtengine::procparams::ProcParams* p, rteng *custom->pparams = *p; } +void ProfilePanel::clearParamChanges() +{ +} + /** @brief Initialize the Profile panel with a default profile, overridden by the last saved profile if provided * * The file tree has already been created on object's construction. We add here the Custom, LastSaved and/or Internal item. @@ -797,7 +808,7 @@ void ProfilePanel::initProfile (const Glib::ustring& profileFullPath, ProcParams if (tpc) { tpc->setDefaults (lastsaved->pparams); - tpc->profileChange (lastsaved, EvPhotoLoaded, profiles->getSelectedEntry()->label); + tpc->profileChange (lastsaved, EvPhotoLoaded, profiles->getSelectedEntry()->label, nullptr, true); } } else { if (pse) { diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index dc07e2006..b0fb42ab7 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -72,7 +72,7 @@ protected: public: explicit ProfilePanel (); - virtual ~ProfilePanel (); + ~ProfilePanel () override; void setProfileChangeListener (ProfileChangeListener* ppl) { @@ -81,15 +81,21 @@ public: static void init (Gtk::Window* parentWindow); static void cleanup (); - void storeCurrentValue(); - void updateProfileList (); - void restoreValue(); + void storeCurrentValue() override; + void updateProfileList () override; + void restoreValue() override; void initProfile (const Glib::ustring& profileFullPath, rtengine::procparams::ProcParams* lastSaved); void setInitialFileName (const Glib::ustring& filename); // PParamsChangeListener interface - void procParamsChanged (rtengine::procparams::ProcParams* params, rtengine::ProcEvent ev, Glib::ustring descr, ParamsEdited* paramsEdited = nullptr); + void procParamsChanged( + const rtengine::procparams::ProcParams* params, + const rtengine::ProcEvent& ev, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited = nullptr + ) override; + void clearParamChanges() override; // gui callbacks void save_clicked (GdkEventButton* event); diff --git a/rtgui/profilestorecombobox.cc b/rtgui/profilestorecombobox.cc index 186309aa3..96bbc32fa 100644 --- a/rtgui/profilestorecombobox.cc +++ b/rtgui/profilestorecombobox.cc @@ -24,9 +24,6 @@ #include "toolpanel.h" #include "guiutils.h" -using namespace rtengine; -using namespace rtengine::procparams; - ProfileStoreLabel::ProfileStoreLabel (const ProfileStoreEntry *entry) : Gtk::Label (entry->label), entry (entry) { set_alignment (0, 0.5); @@ -337,7 +334,7 @@ Gtk::TreeIter ProfileStoreComboBox::getRowFromLabel (Glib::ustring name) const ProfileStoreEntry *pse = currRow[methodColumns.profileStoreEntry]; if (pse->label == name) { - return currRow; + return std::move(currRow); } } } @@ -356,3 +353,11 @@ Gtk::TreeIter ProfileStoreComboBox::addRow (const ProfileStoreEntry *profileStor return newEntry; } +/** @brief Delete a row from the first level of the tree */ +void ProfileStoreComboBox::deleteRow (const ProfileStoreEntry *profileStoreEntry) +{ + Gtk::TreeIter entry = findRowFromEntry(profileStoreEntry); + if (entry) { + refTreeModel->erase(entry); + } +} diff --git a/rtgui/profilestorecombobox.h b/rtgui/profilestorecombobox.h index 111e767c2..9c31ad60a 100644 --- a/rtgui/profilestorecombobox.h +++ b/rtgui/profilestorecombobox.h @@ -90,6 +90,7 @@ public: bool setInternalEntry (); Gtk::TreeIter getRowFromLabel (Glib::ustring name); Gtk::TreeIter addRow (const ProfileStoreEntry *profileStoreEntry); + void deleteRow (const ProfileStoreEntry *profileStoreEntry); }; #endif diff --git a/rtgui/progressconnector.h b/rtgui/progressconnector.h index 3ce20f8f8..394ad3909 100644 --- a/rtgui/progressconnector.h +++ b/rtgui/progressconnector.h @@ -26,22 +26,22 @@ #undef THREAD_PRIORITY_NORMAL -class PLDBridge : public rtengine::ProgressListener +class PLDBridge : + public rtengine::ProgressListener { - - rtengine::ProgressListener* pl; - public: - explicit PLDBridge ( rtengine::ProgressListener* pb) - : pl(pb) {} + explicit PLDBridge(rtengine::ProgressListener* pb) : + pl(pb) + { + } // ProgressListener interface - void setProgress (double p) + void setProgress(double p) override { GThreadLock lock; pl->setProgress(p); } - void setProgressStr (Glib::ustring str) + void setProgressStr(const Glib::ustring& str) override { GThreadLock lock; Glib::ustring progrstr; @@ -49,17 +49,20 @@ public: pl->setProgressStr(progrstr); } - void setProgressState (bool inProcessing) + void setProgressState(bool inProcessing) override { GThreadLock lock; pl->setProgressState(inProcessing); } - void error (Glib::ustring descr) + void error(const Glib::ustring& descr) override { GThreadLock lock; pl->error(descr); } + +private: + rtengine::ProgressListener* const pl; }; template diff --git a/rtgui/prsharpening.cc b/rtgui/prsharpening.cc index 94034b471..c7c2ddf9f 100644 --- a/rtgui/prsharpening.cc +++ b/rtgui/prsharpening.cc @@ -16,8 +16,9 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "prsharpening.h" #include +#include "eventmapper.h" +#include "prsharpening.h" using namespace rtengine; using namespace rtengine::procparams; @@ -25,6 +26,9 @@ using namespace rtengine::procparams; PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PRSHARPENING_LABEL"), false, true) { + auto m = ProcEventMapper::getInstance(); + EvPrShrContrast = m->newEvent(RESIZE, "HISTORY_MSG_PRSHARPEN_CONTRAST"); + std::vector milestones; milestones.push_back( GradientMilestone(0.0, 0.0, 0.0, 0.0) ); milestones.push_back( GradientMilestone(1.0, 1.0, 1.0, 1.0) ); @@ -33,6 +37,11 @@ PrSharpening::PrSharpening () : FoldableToolPanel(this, "prsharpening", M("TP_PR Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); hb->show (); + contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 15)); + contrast->setAdjusterListener (this); + pack_start(*contrast); + contrast->show(); + Gtk::Label* ml = Gtk::manage (new Gtk::Label (M("TP_SHARPENING_METHOD") + ":")); ml->show (); method = Gtk::manage (new MyComboBoxText ()); @@ -150,6 +159,7 @@ void PrSharpening::read (const ProcParams* pp, const ParamsEdited* pedited) disableListener (); if (pedited) { + contrast->setEditedState (pedited->prsharpening.contrast ? Edited : UnEdited); amount->setEditedState (pedited->prsharpening.amount ? Edited : UnEdited); radius->setEditedState (pedited->prsharpening.radius ? Edited : UnEdited); threshold->setEditedState (pedited->prsharpening.threshold ? Edited : UnEdited); @@ -178,6 +188,7 @@ void PrSharpening::read (const ProcParams* pp, const ParamsEdited* pedited) hcConn.block (false); lastHaloControl = pp->prsharpening.halocontrol; + contrast->setValue (pp->prsharpening.contrast); amount->setValue (pp->prsharpening.amount); radius->setValue (pp->prsharpening.radius); threshold->setValue(pp->prsharpening.threshold); @@ -219,6 +230,7 @@ void PrSharpening::read (const ProcParams* pp, const ParamsEdited* pedited) void PrSharpening::write (ProcParams* pp, ParamsEdited* pedited) { + pp->prsharpening.contrast = contrast->getValue (); pp->prsharpening.amount = (int)amount->getValue(); pp->prsharpening.enabled = getEnabled (); pp->prsharpening.radius = radius->getValue (); @@ -240,6 +252,7 @@ void PrSharpening::write (ProcParams* pp, ParamsEdited* pedited) } if (pedited) { + pedited->prsharpening.contrast = contrast->getEditedState (); pedited->prsharpening.amount = amount->getEditedState (); pedited->prsharpening.radius = radius->getEditedState (); pedited->prsharpening.threshold = threshold->getEditedState (); @@ -260,6 +273,7 @@ void PrSharpening::write (ProcParams* pp, ParamsEdited* pedited) void PrSharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { + contrast->setDefault (defParams->prsharpening.contrast); amount->setDefault (defParams->prsharpening.amount); radius->setDefault (defParams->prsharpening.radius); threshold->setDefault (defParams->prsharpening.threshold); @@ -272,6 +286,7 @@ void PrSharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* ddamping->setDefault (defParams->prsharpening.deconvdamping); if (pedited) { + contrast->setDefaultEditedState (pedited->prsharpening.contrast ? Edited : UnEdited); amount->setDefaultEditedState (pedited->prsharpening.amount ? Edited : UnEdited); radius->setDefaultEditedState (pedited->prsharpening.radius ? Edited : UnEdited); threshold->setDefaultEditedState (pedited->prsharpening.threshold ? Edited : UnEdited); @@ -283,6 +298,7 @@ void PrSharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* diter->setDefaultEditedState (pedited->prsharpening.deconviter ? Edited : UnEdited); ddamping->setDefaultEditedState (pedited->prsharpening.deconvdamping ? Edited : UnEdited); } else { + contrast->setDefaultEditedState (Irrelevant); amount->setDefaultEditedState (Irrelevant); radius->setDefaultEditedState (Irrelevant); threshold->setDefaultEditedState (Irrelevant); @@ -298,7 +314,6 @@ void PrSharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* void PrSharpening::adjusterChanged (Adjuster* a, double newval) { - if (listener && (multiImage || getEnabled()) ) { Glib::ustring costr; @@ -311,7 +326,9 @@ void PrSharpening::adjusterChanged (Adjuster* a, double newval) costr = Glib::ustring::format ((int)a->getValue()); } - if (a == amount) { + if (a == contrast) { + listener->panelChanged (EvPrShrContrast, costr); + } else if (a == amount) { listener->panelChanged (EvPrShrAmount, costr); } else if (a == radius) { listener->panelChanged (EvPrShrRadius, costr); @@ -333,9 +350,12 @@ void PrSharpening::adjusterChanged (Adjuster* a, double newval) } } +void PrSharpening::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void PrSharpening::enabledChanged () { - if (listener) { if (get_inconsistent()) { listener->panelChanged (EvPrShrEnabled, M("GENERAL_UNCHANGED")); @@ -437,7 +457,19 @@ void PrSharpening::method_changed () } -void PrSharpening::adjusterChanged (ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +void PrSharpening::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) +{ +} + +void PrSharpening::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) +{ +} + +void PrSharpening::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) +{ +} + +void PrSharpening::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) { if (listener && (multiImage || getEnabled()) ) { if(a == threshold) { @@ -446,6 +478,10 @@ void PrSharpening::adjusterChanged (ThresholdAdjuster* a, int newBottomL, int ne } } +void PrSharpening::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ +} + void PrSharpening::setBatchMode (bool batchMode) { @@ -457,6 +493,7 @@ void PrSharpening::setBatchMode (bool batchMode) edgebin->pack_start (*edgebox); pack_start (*rld); + contrast->showEditedCB (); radius->showEditedCB (); amount->showEditedCB (); threshold->showEditedCB (); @@ -470,9 +507,10 @@ void PrSharpening::setBatchMode (bool batchMode) method->append (M("GENERAL_UNCHANGED")); } -void PrSharpening::setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) +void PrSharpening::setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) { + contrast->setAddMode(contrastadd); radius->setAddMode(radiusadd); dradius->setAddMode(radiusadd); amount->setAddMode(amountadd); @@ -487,6 +525,7 @@ void PrSharpening::setAdjusterBehavior (bool radiusadd, bool amountadd, bool dam void PrSharpening::trimValues (rtengine::procparams::ProcParams* pp) { + contrast->trimValue(pp->prsharpening.contrast); radius->trimValue(pp->prsharpening.radius); dradius->trimValue(pp->prsharpening.deconvradius); amount->trimValue(pp->prsharpening.amount); diff --git a/rtgui/prsharpening.h b/rtgui/prsharpening.h index 50dc91258..0bceca856 100644 --- a/rtgui/prsharpening.h +++ b/rtgui/prsharpening.h @@ -28,6 +28,7 @@ class PrSharpening : public ToolParamBlock, public ThresholdAdjusterListener, pu { protected: + Adjuster* contrast; MyComboBoxText* method; Adjuster* dradius; Adjuster* damount; @@ -52,26 +53,32 @@ protected: Gtk::CheckButton* halocontrol; bool lastHaloControl; sigc::connection hcConn; - + rtengine::ProcEvent EvPrShrContrast; public: PrSharpening (); - virtual ~PrSharpening (); + ~PrSharpening () override; - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void edgesonly_toggled (); void halocontrol_toggled (); void method_changed (); - void adjusterChanged (ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR); - void setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); - void trimValues (rtengine::procparams::ProcParams* pp); + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/quickzoomlistener.h b/rtgui/quickzoomlistener.h deleted file mode 100644 index 5857bc259..000000000 --- a/rtgui/quickzoomlistener.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 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 . - */ -#ifndef _QZLISTENER_ -#define _QZLISTENER_ - -class QuickZoomListener -{ - -public: - - virtual void increaseZoom () {} - virtual void decreaseZoom () {} - virtual void quickZoom () {} - virtual void increaseCropZoom () {} - virtual void decreaseCropZoom () {} - virtual void quickCropZoom () {} -}; - -#endif diff --git a/rtgui/rawcacorrection.cc b/rtgui/rawcacorrection.cc index 75c60a7a2..57b8ff4ac 100644 --- a/rtgui/rawcacorrection.cc +++ b/rtgui/rawcacorrection.cc @@ -17,22 +17,39 @@ * along with RawTherapee. If not, see . */ #include "rawcacorrection.h" + +#include "eventmapper.h" #include "guiutils.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_CHROMATABERR_LABEL")) { - Gtk::Image* icaredL = Gtk::manage (new RTImage ("ajd-ca-red1.png")); - Gtk::Image* icaredR = Gtk::manage (new RTImage ("ajd-ca-red2.png")); - Gtk::Image* icablueL = Gtk::manage (new RTImage ("ajd-ca-blue1.png")); - Gtk::Image* icablueR = Gtk::manage (new RTImage ("ajd-ca-blue2.png")); + auto m = ProcEventMapper::getInstance(); + EvPreProcessCAAutoiterations = m->newEvent(DARKFRAME, "HISTORY_MSG_RAWCACORR_AUTOIT"); + EvPreProcessCAColourshift = m->newEvent(DARKFRAME, "HISTORY_MSG_RAWCACORR_COLORSHIFT"); + EvPreProcessCAColourshiftHistory = m->newEvent(M_VOID, "HISTORY_MSG_RAWCACORR_COLORSHIFT"); + + Gtk::Image* icaredL = Gtk::manage (new RTImage ("circle-red-cyan-small.png")); + Gtk::Image* icaredR = Gtk::manage (new RTImage ("circle-cyan-red-small.png")); + Gtk::Image* icablueL = Gtk::manage (new RTImage ("circle-blue-yellow-small.png")); + Gtk::Image* icablueR = Gtk::manage (new RTImage ("circle-yellow-blue-small.png")); caAutocorrect = Gtk::manage (new CheckBox(M("TP_RAWCACORR_AUTO"), multiImage)); caAutocorrect->setCheckBoxListener (this); + caAutoiterations = Gtk::manage(new Adjuster (M("TP_RAWCACORR_AUTOIT"), 1, 5, 1, 2)); + caAutoiterations->setAdjusterListener (this); + caAutoiterations->set_tooltip_markup(M("TP_RAWCACORR_AUTOIT_TOOLTIP")); + + if (caAutoiterations->delay < options.adjusterMaxDelay) { + caAutoiterations->delay = options.adjusterMaxDelay; + } + caRed = Gtk::manage(new Adjuster (M("TP_RAWCACORR_CARED"), -4.0, 4.0, 0.1, 0, icaredL, icaredR)); caRed->setAdjusterListener (this); @@ -41,7 +58,7 @@ RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_CHROM } caRed->show(); - caBlue = Gtk::manage(new Adjuster (M("TP_RAWCACORR_CABLUE"), -4.0, 4.0, 0.1, 0, icablueL, icablueR)); + caBlue = Gtk::manage(new Adjuster (M("TP_RAWCACORR_CABLUE"), -8.0, 8.0, 0.1, 0, icablueL, icablueR)); caBlue->setAdjusterListener (this); if (caBlue->delay < options.adjusterMaxDelay) { @@ -50,10 +67,19 @@ RAWCACorr::RAWCACorr () : FoldableToolPanel(this, "rawcacorrection", M("TP_CHROM caBlue->show(); + caRed->setLogScale(10, 0); + caBlue->setLogScale(10, 0); + pack_start( *caAutocorrect, Gtk::PACK_SHRINK, 4); + pack_start( *caAutoiterations, Gtk::PACK_SHRINK, 4); pack_start( *caRed, Gtk::PACK_SHRINK, 4); pack_start( *caBlue, Gtk::PACK_SHRINK, 4); + caAvoidcolourshift = Gtk::manage (new CheckBox(M("TP_RAWCACORR_AVOIDCOLORSHIFT"), multiImage)); + caAvoidcolourshift->setCheckBoxListener (this); + pack_start( *caAvoidcolourshift, Gtk::PACK_SHRINK, 4); + + } void RAWCACorr::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) @@ -62,15 +88,21 @@ void RAWCACorr::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi if(pedited ) { caAutocorrect->setEdited(pedited->raw.ca_autocorrect); + caAvoidcolourshift->setEdited(pedited->raw.ca_avoidcolourshift); + caAutoiterations->setEditedState( pedited->raw.caautoiterations ? Edited : UnEdited ); caRed->setEditedState( pedited->raw.cared ? Edited : UnEdited ); caBlue->setEditedState( pedited->raw.cablue ? Edited : UnEdited ); } - // disable Red and Blue sliders when caAutocorrect is enabled - caRed->set_sensitive(!pp->raw.ca_autocorrect); - caBlue->set_sensitive(!pp->raw.ca_autocorrect); - + if (!batchMode) { + // disable Red and Blue sliders when caAutocorrect is enabled + caAutoiterations->set_sensitive(pp->raw.ca_autocorrect); + caRed->set_sensitive(!pp->raw.ca_autocorrect); + caBlue->set_sensitive(!pp->raw.ca_autocorrect); + } caAutocorrect->setValue(pp->raw.ca_autocorrect); + caAvoidcolourshift->setValue(pp->raw.ca_avoidcolourshift); + caAutoiterations->setValue (pp->raw.caautoiterations); caRed->setValue (pp->raw.cared); caBlue->setValue (pp->raw.cablue); @@ -80,24 +112,30 @@ void RAWCACorr::read(const rtengine::procparams::ProcParams* pp, const ParamsEdi void RAWCACorr::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) { pp->raw.ca_autocorrect = caAutocorrect->getLastActive(); + pp->raw.ca_avoidcolourshift = caAvoidcolourshift->getLastActive(); + pp->raw.caautoiterations = caAutoiterations->getValue(); pp->raw.cared = caRed->getValue(); pp->raw.cablue = caBlue->getValue(); if (pedited) { pedited->raw.ca_autocorrect = !caAutocorrect->get_inconsistent(); + pedited->raw.ca_avoidcolourshift = !caAvoidcolourshift->get_inconsistent(); + pedited->raw.caautoiterations = caAutoiterations->getEditedState (); pedited->raw.cared = caRed->getEditedState (); pedited->raw.cablue = caBlue->getEditedState (); } } -void RAWCACorr::adjusterChanged (Adjuster* a, double newval) +void RAWCACorr::adjusterChanged(Adjuster* a, double newval) { if (listener) { Glib::ustring value = a->getTextValue(); - if (a == caRed) { + if (a == caAutoiterations) { + listener->panelChanged (EvPreProcessCAAutoiterations, value ); + } else if (a == caRed) { listener->panelChanged (EvPreProcessCARed, value ); } else if (a == caBlue) { listener->panelChanged (EvPreProcessCABlue, value ); @@ -105,11 +143,16 @@ void RAWCACorr::adjusterChanged (Adjuster* a, double newval) } } +void RAWCACorr::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void RAWCACorr::checkBoxToggled (CheckBox* c, CheckValue newval) { if (c == caAutocorrect) { if (!batchMode) { // disable Red and Blue sliders when caAutocorrect is enabled + caAutoiterations->set_sensitive(caAutocorrect->getLastActive ()); caRed->set_sensitive(!caAutocorrect->getLastActive ()); caBlue->set_sensitive(!caAutocorrect->getLastActive ()); } @@ -117,24 +160,33 @@ void RAWCACorr::checkBoxToggled (CheckBox* c, CheckValue newval) listener->panelChanged (EvPreProcessAutoCA, caAutocorrect->getLastActive() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); } } + else if (c == caAvoidcolourshift) { + if (listener) { + listener->panelChanged ((caAutocorrect->getLastActive() || caRed->getValue() != 0 || caBlue->getValue() != 0) ? EvPreProcessCAColourshift : EvPreProcessCAColourshiftHistory, caAvoidcolourshift->getLastActive() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } + } } void RAWCACorr::setBatchMode(bool batchMode) { ToolPanel::setBatchMode (batchMode); + caAutoiterations->showEditedCB (); caRed->showEditedCB (); caBlue->showEditedCB (); } void RAWCACorr::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) { + caAutoiterations->setDefault( defParams->raw.caautoiterations); caRed->setDefault( defParams->raw.cared); caBlue->setDefault( defParams->raw.cablue); if (pedited) { + caAutoiterations->setDefaultEditedState( pedited->raw.caautoiterations ? Edited : UnEdited); caRed->setDefaultEditedState( pedited->raw.cared ? Edited : UnEdited); caBlue->setDefaultEditedState( pedited->raw.cablue ? Edited : UnEdited); } else { + caAutoiterations->setDefaultEditedState( Irrelevant ); caRed->setDefaultEditedState( Irrelevant ); caBlue->setDefaultEditedState( Irrelevant ); } @@ -150,6 +202,7 @@ void RAWCACorr::setAdjusterBehavior (bool caadd) void RAWCACorr::trimValues (rtengine::procparams::ProcParams* pp) { + caAutoiterations->trimValue(pp->raw.caautoiterations); caRed->trimValue(pp->raw.cared); caBlue->trimValue(pp->raw.cablue); } diff --git a/rtgui/rawcacorrection.h b/rtgui/rawcacorrection.h index 69292b1aa..13db1d1e3 100644 --- a/rtgui/rawcacorrection.h +++ b/rtgui/rawcacorrection.h @@ -29,22 +29,29 @@ class RAWCACorr : public ToolParamBlock, public AdjusterListener, public CheckBo protected: CheckBox* caAutocorrect; + Adjuster* caAutoiterations; Adjuster* caRed; Adjuster* caBlue; + CheckBox* caAvoidcolourshift; + + rtengine::ProcEvent EvPreProcessCAAutoiterations; + rtengine::ProcEvent EvPreProcessCAColourshift; + rtengine::ProcEvent EvPreProcessCAColourshiftHistory; public: RAWCACorr (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; void setAdjusterBehavior (bool caadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; - void adjusterChanged (Adjuster* a, double newval); - void checkBoxToggled (CheckBox* c, CheckValue newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; + void checkBoxToggled (CheckBox* c, CheckValue newval) override; }; #endif diff --git a/rtgui/rawexposure.cc b/rtgui/rawexposure.cc index 56fcf7ec9..6f08e64c7 100644 --- a/rtgui/rawexposure.cc +++ b/rtgui/rawexposure.cc @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "rawexposure.h" -#include "guiutils.h" #include +#include "rawexposure.h" + +#include "guiutils.h" + +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -33,18 +37,8 @@ RAWExposure::RAWExposure () : FoldableToolPanel(this, "rawexposure", M("TP_EXPOS } PexPos->show(); - PexPreser = Gtk::manage(new Adjuster (M("TP_RAWEXPOS_PRESER"), 0, 2.5, 0.1, 0)); - PexPreser->setAdjusterListener (this); - - if (PexPreser->delay < options.adjusterMaxDelay) { - PexPreser->delay = options.adjusterMaxDelay; - } - - PexPreser->show(); - pack_start( *PexPos, Gtk::PACK_SHRINK, 4);//exposi - // raw highlight exposure setting is obsolete, removing from GUI - //pack_start( *PexPreser, Gtk::PACK_SHRINK, 4); + PexPos->setLogScale(100, 0); } void RAWExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) @@ -53,11 +47,9 @@ void RAWExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsE if(pedited ) { PexPos->setEditedState( pedited->raw.exPos ? Edited : UnEdited ); - PexPreser->setEditedState( pedited->raw.exPreser ? Edited : UnEdited ); } PexPos->setValue (pp->raw.expos); - PexPreser->setValue (pp->raw.preser);//exposi enableListener (); } @@ -65,59 +57,53 @@ void RAWExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsE void RAWExposure::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) { pp->raw.expos = PexPos->getValue(); - pp->raw.preser = PexPreser->getValue();//exposi if (pedited) { pedited->raw.exPos = PexPos->getEditedState (); - pedited->raw.exPreser = PexPreser->getEditedState ();//exposi } } -void RAWExposure::adjusterChanged (Adjuster* a, double newval) +void RAWExposure::adjusterChanged(Adjuster* a, double newval) { if (listener) { Glib::ustring value = a->getTextValue(); if (a == PexPos ) { listener->panelChanged (EvPreProcessExpCorrLinear, value ); - } else if (a == PexPreser && ABS(PexPos->getValue() - 1.0) > 0.0001) { // update takes long, only do it if it would have an effect - listener->panelChanged (EvPreProcessExpCorrPH, value ); } } } +void RAWExposure::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void RAWExposure::setBatchMode(bool batchMode) { ToolPanel::setBatchMode (batchMode); PexPos->showEditedCB (); - PexPreser->showEditedCB ();//exposure } void RAWExposure::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) { PexPos->setDefault( defParams->raw.expos); - PexPreser->setDefault( defParams->raw.preser); if (pedited) { PexPos->setDefaultEditedState( pedited->raw.exPos ? Edited : UnEdited); - PexPreser->setDefaultEditedState( pedited->raw.exPreser ? Edited : UnEdited); } else { PexPos->setDefaultEditedState( Irrelevant ); - PexPreser->setDefaultEditedState( Irrelevant ); } } -void RAWExposure::setAdjusterBehavior (bool pexposadd, bool pexpreseradd) +void RAWExposure::setAdjusterBehavior (bool pexposadd) { PexPos->setAddMode(pexposadd); - PexPreser->setAddMode(pexpreseradd); } void RAWExposure::trimValues (rtengine::procparams::ProcParams* pp) { PexPos->trimValue(pp->raw.expos); - PexPreser->trimValue(pp->raw.preser); } diff --git a/rtgui/rawexposure.h b/rtgui/rawexposure.h index d6e3e863f..f34776d19 100644 --- a/rtgui/rawexposure.h +++ b/rtgui/rawexposure.h @@ -29,7 +29,6 @@ class RAWExposure : public ToolParamBlock, public AdjusterListener, public Folda protected: Adjuster* PexPos; - Adjuster* PexPreser; private: // Gtk::CheckButton* PextwoGreen; @@ -37,13 +36,14 @@ public: RAWExposure (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void adjusterChanged (Adjuster* a, double newval); - void setAdjusterBehavior (bool pexposadd, bool pexpreseradd); - void trimValues (rtengine::procparams::ProcParams* pp); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; + void setAdjusterBehavior (bool pexposadd); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/recentselectionlistener.h b/rtgui/recentselectionlistener.h deleted file mode 100644 index a06048336..000000000 --- a/rtgui/recentselectionlistener.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 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 . - */ -#ifndef _RECENTSELECTIONLISTENER_ -#define _RECENTSELECTIONLISTENER_ - -#include - -class RecentSelectionListener -{ - -public: - virtual void recentSelected (Glib::ustring recentdir) {} -}; - -#endif diff --git a/rtgui/renamedlg.cc b/rtgui/renamedlg.cc index ce59fe5f5..f03df455f 100644 --- a/rtgui/renamedlg.cc +++ b/rtgui/renamedlg.cc @@ -179,8 +179,8 @@ Glib::ustring RenameDialog::getNewName () // templ = Gtk::manage (new Gtk::Entry ()); // Gtk::Button* add = Gtk::manage (new Gtk::Button ()); // Gtk::Button* del = Gtk::manage (new Gtk::Button ()); -// add->add (*Gtk::manage (new RTImage ("list-add-small.png"))); -// del->add (*Gtk::manage (new RTImage ("list-remove-red-small.png"))); +// add->add (*Gtk::manage (new RTImage ("add-small.png"))); +// del->add (*Gtk::manage (new RTImage ("remove-small.png"))); // hb->pack_start (*templ); // hb->pack_start (*add, Gtk::PACK_SHRINK, 2); // hb->pack_start (*del, Gtk::PACK_SHRINK, 2); diff --git a/rtgui/resize.cc b/rtgui/resize.cc index 971901b84..4635dca50 100644 --- a/rtgui/resize.cc +++ b/rtgui/resize.cc @@ -17,13 +17,19 @@ * along with RawTherapee. If not, see . */ #include "resize.h" + +#include "eventmapper.h" #include "guiutils.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; Resize::Resize () : FoldableToolPanel(this, "resize", M("TP_RESIZE_LABEL"), false, true), maxw(100000), maxh(100000) { + auto m = ProcEventMapper::getInstance(); + EvResizeAllowUpscaling = m->newEvent(RESIZE, "HISTORY_MSG_RESIZE_ALLOWUPSCALING"); cropw = 0; croph = 0; @@ -65,7 +71,7 @@ Resize::Resize () : FoldableToolPanel(this, "resize", M("TP_RESIZE_LABEL"), fals pack_start (*combos, Gtk::PACK_SHRINK, 4); - scale = new Adjuster (M("TP_RESIZE_SCALE"), 0.01, 4, 0.01, 1.); + scale = new Adjuster (M("TP_RESIZE_SCALE"), 0.01, MAX_SCALE, 0.01, 1.); scale->setAdjusterListener (this); pack_start (*scale, Gtk::PACK_SHRINK, 4); @@ -88,18 +94,23 @@ Resize::Resize () : FoldableToolPanel(this, "resize", M("TP_RESIZE_LABEL"), fals sbox->pack_start (*hbox); sizeBox->pack_start (*sbox, Gtk::PACK_SHRINK, 0); + + allowUpscaling = Gtk::manage(new Gtk::CheckButton(M("TP_RESIZE_ALLOW_UPSCALING"))); + sizeBox->pack_start(*allowUpscaling); + allowUpscaling->signal_toggled().connect(sigc::mem_fun(*this, &Resize::allowUpscalingChanged)); + sizeBox->show_all (); sizeBox->reference (); w->set_digits (0); w->set_increments (1, 100); w->set_value (800); - w->set_range (32, 4 * maxw); + w->set_range (32, MAX_SCALE * maxw); h->set_digits (0); h->set_increments (1, 100); h->set_value (600); - h->set_range (32, 4 * maxh); + h->set_range (32, MAX_SCALE * maxh); wconn = w->signal_value_changed().connect ( sigc::mem_fun(*this, &Resize::entryWChanged), true); hconn = h->signal_value_changed().connect ( sigc::mem_fun(*this, &Resize::entryHChanged), true); @@ -137,6 +148,7 @@ void Resize::read (const ProcParams* pp, const ParamsEdited* pedited) h->set_value (pp->resize.height); setEnabled (pp->resize.enabled); spec->set_active (pp->resize.dataspec); + allowUpscaling->set_active(pp->resize.allowUpscaling); updateGUI(); appliesTo->set_active (0); @@ -175,6 +187,7 @@ void Resize::read (const ProcParams* pp, const ParamsEdited* pedited) spec->set_active (4); } + allowUpscaling->set_inconsistent(!pedited->resize.allowUpscaling); set_inconsistent (multiImage && !pedited->resize.enabled); } @@ -214,9 +227,11 @@ void Resize::write (ProcParams* pp, ParamsEdited* pedited) pp->resize.enabled = getEnabled (); //printf(" L:%d H:%d\n", pp->resize.width, pp->resize.height); + pp->resize.allowUpscaling = allowUpscaling->get_active(); + if (pedited) { pedited->resize.enabled = !get_inconsistent(); - pedited->resize.dataspec = dataSpec != 4; + pedited->resize.dataspec = dataSpec != MAX_SCALE; pedited->resize.appliesTo = appliesTo->get_active_row_number() != 2; pedited->resize.method = method->get_active_row_number() != 3; @@ -229,6 +244,7 @@ void Resize::write (ProcParams* pp, ParamsEdited* pedited) pedited->resize.width = false; pedited->resize.height = false; } + pedited->resize.allowUpscaling = !allowUpscaling->get_inconsistent(); } } @@ -244,9 +260,8 @@ void Resize::setDefaults (const ProcParams* defParams, const ParamsEdited* pedit } } -void Resize::adjusterChanged (Adjuster* a, double newval) +void Resize::adjusterChanged(Adjuster* a, double newval) { - if (!batchMode) { wconn.block (true); hconn.block (true); @@ -261,6 +276,10 @@ void Resize::adjusterChanged (Adjuster* a, double newval) } } +void Resize::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + int Resize::getComputedWidth() { @@ -338,9 +357,8 @@ void Resize::update (bool isCropped, int cw, int ch, int ow, int oh) setDimensions(); } -void Resize::sizeChanged (int mw, int mh, int ow, int oh) +void Resize::sizeChanged(int mw, int mh, int ow, int oh) { - // updating max values now maxw = ow; maxh = oh; @@ -351,76 +369,75 @@ void Resize::sizeChanged (int mw, int mh, int ow, int oh) void Resize::setDimensions () { - const auto func = [](gpointer data) -> gboolean { - Resize* const self = static_cast(data); + idle_register.add( + [this]() -> bool + { + wconn.block(true); + hconn.block(true); + scale->block(true); - self->wconn.block(true); - self->hconn.block(true); - self->scale->block(true); + int refw, refh; - int refw, refh; + if (appliesTo->get_active_row_number() == 0 && cropw) { + // Applies to Cropped area + refw = cropw; + refh = croph; + } else { + // Applies to Full image or crop is disabled + refw = maxw; + refh = maxh; + } - if (self->appliesTo->get_active_row_number() == 0 && self->cropw) { - // Applies to Cropped area - refw = self->cropw; - refh = self->croph; - } else { - // Applies to Full image or crop is disabled - refw = self->maxw; - refh = self->maxh; + w->set_range(32, MAX_SCALE * refw); + h->set_range(32, MAX_SCALE * refh); + + switch (spec->get_active_row_number()) { + case 0: { + // Scale mode + w->set_value(static_cast(static_cast(static_cast(refw) * scale->getValue() + 0.5))); + h->set_value(static_cast(static_cast(static_cast(refh) * scale->getValue() + 0.5))); + break; + } + + case 1: { + // Width mode + const double tmp_scale = w->get_value() / static_cast(refw); + scale->setValue(tmp_scale); + h->set_value(static_cast(static_cast(static_cast(refh) * tmp_scale + 0.5))); + break; + } + + case 2: { + // Height mode + const double tmp_scale = h->get_value() / static_cast(refh); + scale->setValue(tmp_scale); + w->set_value(static_cast(static_cast(static_cast(refw) * tmp_scale + 0.5))); + break; + } + + case 3: { + // Bounding box mode + const double tmp_scale = + w->get_value() / h->get_value() < static_cast(refw) / static_cast(refh) + ? w->get_value() / static_cast(refw) + : h->get_value() / static_cast(refh); + + scale->setValue(tmp_scale); + break; + } + + default: { + break; + } + } + + scale->block(false); + wconn.block(false); + hconn.block(false); + + return false; } - - self->w->set_range(32, 4 * refw); - self->h->set_range(32, 4 * refh); - - switch (self->spec->get_active_row_number()) { - case 0: { - // Scale mode - self->w->set_value(static_cast(static_cast(static_cast(refw) * self->scale->getValue() + 0.5))); - self->h->set_value(static_cast(static_cast(static_cast(refh) * self->scale->getValue() + 0.5))); - break; - } - - case 1: { - // Width mode - const double tmp_scale = self->w->get_value() / static_cast(refw); - self->scale->setValue(tmp_scale); - self->h->set_value(static_cast(static_cast(static_cast(refh) * tmp_scale + 0.5))); - break; - } - - case 2: { - // Height mode - const double tmp_scale = self->h->get_value() / static_cast(refh); - self->scale->setValue(tmp_scale); - self->w->set_value(static_cast(static_cast(static_cast(refw) * tmp_scale + 0.5))); - break; - } - - case 3: { - // Bounding box mode - const double tmp_scale = - self->w->get_value() / self->h->get_value() < static_cast(refw) / static_cast(refh) - ? self->w->get_value() / static_cast(refw) - : self->h->get_value() / static_cast(refh); - - self->scale->setValue(tmp_scale); - break; - } - - default: { - break; - } - } - - self->scale->block(false); - self->wconn.block(false); - self->hconn.block(false); - - return FALSE; - }; - - idle_register.add(func, this); + ); } void Resize::fitBoxScale() @@ -620,6 +637,22 @@ void Resize::enabledChanged () } } + +void Resize::allowUpscalingChanged() +{ + + if (listener) { + if (allowUpscaling->get_inconsistent()) { + listener->panelChanged(EvResizeAllowUpscaling, M("GENERAL_UNCHANGED")); + } else if (allowUpscaling->get_active()) { + listener->panelChanged(EvResizeAllowUpscaling, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvResizeAllowUpscaling, M("GENERAL_DISABLED")); + } + } +} + + void Resize::setAdjusterBehavior (bool scaleadd) { diff --git a/rtgui/resize.h b/rtgui/resize.h index 2b2c2ea26..3c599808d 100644 --- a/rtgui/resize.h +++ b/rtgui/resize.h @@ -33,19 +33,20 @@ class Resize final : { public: Resize (); - ~Resize (); + ~Resize () override; Gtk::Box* getPackBox () { return packBox; } - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; void entryWChanged (); void entryHChanged (); void appliesToChanged (); @@ -53,12 +54,12 @@ public: void specChanged (); void update (bool isCropped, int cw, int ch, int ow = 0, int oh = 0); void setGUIFromCrop (bool isCropped, int cw, int ch); - void sizeChanged (int w, int h, int ow, int oh); + void sizeChanged (int w, int h, int ow, int oh) override; void setDimensions (); - void enabledChanged (); + void enabledChanged () override; void setAdjusterBehavior (bool scaleadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; private: void fitBoxScale (); @@ -66,7 +67,9 @@ private: int getComputedHeight (); void notifyBBox (); void updateGUI (); + void allowUpscalingChanged(); + rtengine::ProcEvent EvResizeAllowUpscaling; Adjuster* scale; Gtk::VBox* sizeBox; MyComboBoxText* appliesTo; @@ -74,12 +77,15 @@ private: MyComboBoxText* spec; MySpinButton* w; MySpinButton* h; + Gtk::CheckButton *allowUpscaling; int maxw, maxh; int cropw, croph; sigc::connection sconn, aconn, wconn, hconn; bool wDirty, hDirty; ToolParamBlock* packBox; IdleRegister idle_register; + + static constexpr int MAX_SCALE = 16; // 16 to match the main preview max scale of 1600% }; #endif diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc index 320c91fd5..544ace535 100644 --- a/rtgui/retinex.cc +++ b/rtgui/retinex.cc @@ -11,7 +11,6 @@ using namespace rtengine::procparams; Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL"), false, true), lastmedianmap (false) { CurveListener::setMulti (true); - std::vector defaultCurve; std::vector milestones; nextmin = 0.; nextmax = 0.; @@ -468,7 +467,7 @@ Retinex::Retinex () : FoldableToolPanel (this, "retinex", M ("TP_RETINEX_LABEL") neutral = Gtk::manage (new Gtk::Button (M ("TP_RETINEX_NEUTRAL"))); setExpandAlignProperties (neutral, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); - RTImage *resetImg = Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png")); + RTImage *resetImg = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); setExpandAlignProperties (resetImg, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); neutral->set_image (*resetImg); neutral->set_tooltip_text (M ("TP_RETINEX_NEUTRAL_TIP")); @@ -673,26 +672,20 @@ void Retinex::minmaxChanged (double cdma, double cdmin, double mini, double maxi nextminT = Tmin; nextmaxT = Tmax; - const auto func = [] (gpointer data) -> gboolean { - GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected - static_cast (data)->minmaxComputed_(); - - return FALSE; - }; - - idle_register.add (func, this); + idle_register.add( + [this]() -> bool + { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + // FIXME: The above can't be true?! + disableListener(); + enableListener(); + updateLabel(); + updateTrans(); + return false; + } + ); } -bool Retinex::minmaxComputed_ () -{ - - disableListener (); - enableListener (); - updateLabel (); - updateTrans (); - return false; - -} void Retinex::updateLabel () { if (!batchMode) { @@ -1311,9 +1304,8 @@ void Retinex::setAdjusterBehavior (bool strAdd, bool neighAdd, bool limdAdd, boo } -void Retinex::adjusterChanged (Adjuster* a, double newval) +void Retinex::adjusterChanged(Adjuster* a, double newval) { - if (a == iter && !batchMode) { if (iter->getIntValue() > 1) { scal->set_sensitive (true); @@ -1368,11 +1360,11 @@ void Retinex::adjusterChanged (Adjuster* a, double newval) listener->panelChanged (EvLradius, radius->getTextValue()); } - - } - +void Retinex::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} void Retinex::autoOpenCurve () { @@ -1439,11 +1431,22 @@ void Retinex::trimValues (rtengine::procparams::ProcParams* pp) } -void Retinex::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) -{ - cdshape->updateBackgroundHistogram (histLRETI); - cdshapeH->updateBackgroundHistogram (histLRETI); +void Retinex::updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI +) +{ + cdshape->updateBackgroundHistogram(histLRETI); + cdshapeH->updateBackgroundHistogram(histLRETI); } void Retinex::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller) diff --git a/rtgui/retinex.h b/rtgui/retinex.h index 134be502e..8703ec607 100644 --- a/rtgui/retinex.h +++ b/rtgui/retinex.h @@ -96,24 +96,24 @@ protected: public: Retinex (); - ~Retinex (); + ~Retinex () override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void trimValues (rtengine::procparams::ProcParams* pp); - void adjusterChanged (Adjuster* a, double newval); - void autoOpenCurve (); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void trimValues (rtengine::procparams::ProcParams* pp) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; + void autoOpenCurve () override; void medianmapChanged (); - void minmaxChanged (double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax); - bool minmaxComputed_ (); + void minmaxChanged (double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax) override; void updateLabel (); void updateTrans (); void neutral_pressed (); - void enabledChanged (); - void curveChanged (CurveEditor* ce); + void enabledChanged () override; + void curveChanged (CurveEditor* ce) override; void retinexMethodChanged(); void mapMethodChanged(); void viewMethodChanged(); @@ -123,9 +123,20 @@ public: void writeOptions (std::vector &tpOpen); void updateToolState (std::vector &tpOpen); void setAdjusterBehavior (bool strAdd, bool neighAdd, bool limdAdd, bool offsAdd, bool vartAdd, bool gamAdd, bool slopeAdd); - 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 updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI + ); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; private: void foldAllButMe (GdkEventButton* event, MyExpander *expander); diff --git a/rtgui/rgbcurves.cc b/rtgui/rgbcurves.cc index d32633bf4..75af43508 100644 --- a/rtgui/rgbcurves.cc +++ b/rtgui/rgbcurves.cc @@ -18,6 +18,8 @@ */ #include "rgbcurves.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -198,12 +200,19 @@ void RGBCurves::setBatchMode (bool batchMode) } -void RGBCurves::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 RGBCurves::updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI +) { - - // Rshape->updateBackgroundHistogram (histRed); - // Gshape->updateBackgroundHistogram (histGreen); - // Bshape->updateBackgroundHistogram (histBlue); } diff --git a/rtgui/rgbcurves.h b/rtgui/rgbcurves.h index dfcba71f9..a7846f9ab 100644 --- a/rtgui/rgbcurves.h +++ b/rtgui/rgbcurves.h @@ -26,7 +26,7 @@ #include "curveeditorgroup.h" #include "colorprovider.h" -class RGBCurves : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public CurveListener, public ColorProvider +class RGBCurves : public ToolParamBlock, public FoldableToolPanel, public CurveListener, public ColorProvider { protected: @@ -42,18 +42,29 @@ protected: public: RGBCurves (); - ~RGBCurves (); + ~RGBCurves () override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setEditProvider (EditDataProvider *provider); - void autoOpenCurve (); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setEditProvider (EditDataProvider *provider) override; + void autoOpenCurve () override; - 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 curveChanged (CurveEditor* ce) override; + void updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI + ); void lumamodeChanged (); - void enabledChanged(); + void enabledChanged() override; }; #endif diff --git a/rtgui/rotate.cc b/rtgui/rotate.cc index e8ea6c48e..9f5d665d5 100644 --- a/rtgui/rotate.cc +++ b/rtgui/rotate.cc @@ -16,11 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "rotate.h" #include + +#include "rotate.h" + #include "guiutils.h" #include "rtimage.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -30,19 +34,22 @@ Rotate::Rotate () : FoldableToolPanel(this, "rotate", M("TP_ROTATE_LABEL")) rlistener = nullptr; //TODO the action of the rotation slider is counter-intuitive - Gtk::Image* irotateL = Gtk::manage (new RTImage ("rotate-right-2.png")); - Gtk::Image* irotateR = Gtk::manage (new RTImage ("rotate-left-2.png")); + Gtk::Image* irotateL = Gtk::manage (new RTImage ("rotate-right-small.png")); + Gtk::Image* irotateR = Gtk::manage (new RTImage ("rotate-left-small.png")); degree = Gtk::manage (new Adjuster (M("TP_ROTATE_DEGREE"), -45, 45, 0.01, 0, irotateL, irotateR)); degree->setAdjusterListener (this); pack_start (*degree); selectStraight = Gtk::manage (new Gtk::Button (M("TP_ROTATE_SELECTLINE"))); - selectStraight->set_image (*Gtk::manage (new RTImage ("straighten-small.png"))); + selectStraight->set_image (*Gtk::manage (new RTImage ("rotate-straighten-small.png"))); + selectStraight->get_style_context()->add_class("independent"); pack_start (*selectStraight, Gtk::PACK_SHRINK, 2); selectStraight->signal_pressed().connect( sigc::mem_fun(*this, &Rotate::selectStraightPressed) ); + degree->setLogScale(2, 0); + show_all (); } @@ -82,14 +89,17 @@ void Rotate::setDefaults (const ProcParams* defParams, const ParamsEdited* pedit } } -void Rotate::adjusterChanged (Adjuster* a, double newval) +void Rotate::adjusterChanged(Adjuster* a, double newval) { - if (listener) { - listener->panelChanged (EvROTDegree, Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), degree->getValue())); + listener->panelChanged(EvROTDegree, Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), degree->getValue())); } } +void Rotate::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void Rotate::straighten (double deg) { diff --git a/rtgui/rotate.h b/rtgui/rotate.h index bad46ef84..c23807361 100644 --- a/rtgui/rotate.h +++ b/rtgui/rotate.h @@ -36,16 +36,17 @@ public: Rotate (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void straighten (double deg); - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; void setAdjusterBehavior (bool rotadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; void selectStraightPressed (); void setLensGeomListener (LensGeomListener* l) { diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 80e481315..8ecd31cc1 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -21,6 +21,7 @@ #include "rtwindow.h" #include "options.h" #include "preferences.h" +#include "iccprofilecreator.h" #include "cursormanager.h" #include "rtimage.h" #include "whitebalance.h" @@ -93,14 +94,20 @@ RTWindow::RTWindow () 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("rawtherapee-logo-16.png"), + RTImage::createFromFile("rawtherapee-logo-24.png"), + RTImage::createFromFile("rawtherapee-logo-48.png"), + RTImage::createFromFile("rawtherapee-logo-128.png"), + RTImage::createFromFile("rawtherapee-logo-256.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__) { @@ -185,10 +192,10 @@ RTWindow::RTWindow () if (options.mainNBVertical) { mainNB->set_tab_pos (Gtk::POS_LEFT); fpl->set_angle (90); - fpanelLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("gtk-directory.png")), Gtk::POS_TOP, 1, 1); + fpanelLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("folder-closed.png")), Gtk::POS_TOP, 1, 1); fpanelLabelGrid->attach_next_to (*fpl, Gtk::POS_TOP, 1, 1); } else { - fpanelLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("gtk-directory.png")), Gtk::POS_RIGHT, 1, 1); + fpanelLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("folder-closed.png")), Gtk::POS_RIGHT, 1, 1); fpanelLabelGrid->attach_next_to (*fpl, Gtk::POS_RIGHT, 1, 1); } @@ -220,20 +227,29 @@ RTWindow::RTWindow () //mainBox->pack_start (*mainNB); // filling bottom box - iFullscreen = new RTImage ("fullscreen.png"); - iFullscreen_exit = new RTImage ("fullscreen-exit.png"); + iFullscreen = new RTImage ("fullscreen-enter.png"); + iFullscreen_exit = new RTImage ("fullscreen-leave.png"); + + Gtk::Button* iccProfileCreator = Gtk::manage (new Gtk::Button ()); + setExpandAlignProperties (iccProfileCreator, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + iccProfileCreator->set_relief(Gtk::RELIEF_NONE); + iccProfileCreator->set_image (*Gtk::manage (new RTImage ("gamut-plus.png"))); + iccProfileCreator->set_tooltip_markup (M ("MAIN_BUTTON_ICCPROFCREATOR")); + iccProfileCreator->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::showICCProfileCreator) ); //Gtk::LinkButton* rtWeb = Gtk::manage (new Gtk::LinkButton ("http://rawtherapee.com")); // unused... but fail to be linked anyway !? //Gtk::Button* preferences = Gtk::manage (new Gtk::Button (M("MAIN_BUTTON_PREFERENCES")+"...")); Gtk::Button* preferences = Gtk::manage (new Gtk::Button ()); setExpandAlignProperties (preferences, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); - preferences->set_image (*Gtk::manage (new RTImage ("gtk-preferences.png"))); + preferences->set_relief(Gtk::RELIEF_NONE); + preferences->set_image (*Gtk::manage (new RTImage ("preferences.png"))); preferences->set_tooltip_markup (M ("MAIN_BUTTON_PREFERENCES")); preferences->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::showPreferences) ); //btn_fullscreen = Gtk::manage( new Gtk::Button(M("MAIN_BUTTON_FULLSCREEN"))); btn_fullscreen = Gtk::manage ( new Gtk::Button()); setExpandAlignProperties (btn_fullscreen, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER); + btn_fullscreen->set_relief(Gtk::RELIEF_NONE); btn_fullscreen->set_tooltip_markup (M ("MAIN_BUTTON_FULLSCREEN")); btn_fullscreen->set_image (*iFullscreen); btn_fullscreen->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::toggle_fullscreen) ); @@ -251,6 +267,7 @@ RTWindow::RTWindow () prProgBar.set_inverted (true); actionGrid->set_orientation (Gtk::ORIENTATION_VERTICAL); actionGrid->attach_next_to (prProgBar, Gtk::POS_BOTTOM, 1, 1); + actionGrid->attach_next_to (*iccProfileCreator, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (*preferences, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_BOTTOM, 1, 1); mainNB->set_action_widget (actionGrid, Gtk::PACK_END); @@ -258,6 +275,7 @@ RTWindow::RTWindow () prProgBar.set_orientation (Gtk::ORIENTATION_HORIZONTAL); actionGrid->set_orientation (Gtk::ORIENTATION_HORIZONTAL); actionGrid->attach_next_to (prProgBar, Gtk::POS_RIGHT, 1, 1); + actionGrid->attach_next_to (*iccProfileCreator, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (*preferences, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_RIGHT, 1, 1); mainNB->set_action_widget (actionGrid, Gtk::PACK_END); @@ -321,6 +339,7 @@ void RTWindow::on_realize () 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 +349,7 @@ void RTWindow::on_realize () splash->signal_delete_event().connect ( sigc::mem_fun (*this, &RTWindow::splashClosed) ); if (splash->hasReleaseNotes()) { + waitForSplash = true; splash->showReleaseNotes(); splash->show (); } else { @@ -337,6 +357,36 @@ void RTWindow::on_realize () 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) @@ -403,7 +453,7 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) // construct closeable tab for the image Gtk::Grid* titleGrid = Gtk::manage (new Gtk::Grid ()); titleGrid->set_tooltip_markup (name); - RTImage *closebimg = Gtk::manage (new RTImage ("gtk-close.png")); + RTImage *closebimg = Gtk::manage (new RTImage ("cancel-small.png")); Gtk::Button* closeb = Gtk::manage (new Gtk::Button ()); closeb->set_name ("CloseButton"); closeb->add (*closebimg); @@ -411,7 +461,7 @@ void RTWindow::addEditorPanel (EditorPanel* ep, const std::string &name) closeb->set_focus_on_click (false); closeb->signal_clicked().connect ( sigc::bind (sigc::mem_fun (*this, &RTWindow::remEditorPanel), ep)); - titleGrid->attach_next_to (*Gtk::manage (new RTImage ("rtwindow.png")), Gtk::POS_RIGHT, 1, 1); + titleGrid->attach_next_to (*Gtk::manage (new RTImage ("aperture.png")), Gtk::POS_RIGHT, 1, 1); titleGrid->attach_next_to (*Gtk::manage (new Gtk::Label (Glib::path_get_basename (name))), Gtk::POS_RIGHT, 1, 1); titleGrid->attach_next_to (*closeb, Gtk::POS_RIGHT, 1, 1); titleGrid->show_all (); @@ -580,9 +630,8 @@ void RTWindow::addBatchQueueJob (BatchQueueEntry* bqe, bool head) fpanel->queue_draw (); } -void RTWindow::addBatchQueueJobs (std::vector &entries) +void RTWindow::addBatchQueueJobs(const std::vector& entries) { - bpanel->addBatchQueueJobs (entries, false); fpanel->queue_draw (); } @@ -710,6 +759,23 @@ void RTWindow::writeToolExpandedStatus (std::vector &tpOpen) } +void RTWindow::showICCProfileCreator () +{ + ICCProfileCreator *iccpc = new ICCProfileCreator (this); + iccpc->run (); + delete iccpc; + + fpanel->optionsChanged (); + + if (epanel) { + epanel->defaultMonitorProfileChanged (options.rtSettings.monitorProfile, options.rtSettings.autoMonitorProfile); + } + + for (const auto &p : epanels) { + p.second->defaultMonitorProfileChanged (options.rtSettings.monitorProfile, options.rtSettings.autoMonitorProfile); + } +} + void RTWindow::showPreferences () { Preferences *pref = new Preferences (this); @@ -727,19 +793,19 @@ void RTWindow::showPreferences () } } -void RTWindow::setProgress (double p) +void RTWindow::setProgress(double p) { - prProgBar.set_fraction (p); + prProgBar.set_fraction(p); } -void RTWindow::setProgressStr (Glib::ustring str) +void RTWindow::setProgressStr(const Glib::ustring& str) { if (!options.mainNBVertical) { - prProgBar.set_text ( str ); + prProgBar.set_text(str); } } -void RTWindow::setProgressState (bool inProcessing) +void RTWindow::setProgressState(bool inProcessing) { if (inProcessing) { prProgBar.show(); @@ -748,6 +814,11 @@ void RTWindow::setProgressState (bool inProcessing) } } +void RTWindow::error(const Glib::ustring& descr) +{ + prProgBar.set_text(descr); +} + void RTWindow::toggle_fullscreen () { if (is_fullscreen) { @@ -771,11 +842,6 @@ void RTWindow::toggle_fullscreen () } } -void RTWindow::error (Glib::ustring descr) -{ - prProgBar.set_text ( descr ); -} - void RTWindow::SetEditorCurrent() { mainNB->set_current_page (mainNB->page_num (*epanel)); @@ -837,19 +903,6 @@ void RTWindow::updateTPVScrollbar (bool hide) } } -void RTWindow::updateTabsUsesIcons (bool useIcons) -{ - fpanel->updateTabsUsesIcons (useIcons); - - if (epanel) { - epanel->updateTabsUsesIcons (useIcons); - } - - for (auto panel : epanels) { - panel.second->updateTabsUsesIcons (useIcons); - } -} - void RTWindow::updateFBQueryTB (bool singleRow) { fpanel->fileCatalog->updateFBQueryTB (singleRow); @@ -875,6 +928,7 @@ bool RTWindow::splashClosed (GdkEventAny* event) { delete splash; splash = nullptr; + showErrors(); return true; } @@ -945,7 +999,7 @@ void RTWindow::createSetmEditor() el->set_angle (90); } - editorLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("rt-logo-small.png")), pos, 1, 1); + editorLabelGrid->attach_next_to (*Gtk::manage (new RTImage ("rawtherapee-logo-24.png")), pos, 1, 1); editorLabelGrid->attach_next_to (*el, pos, 1, 1); editorLabelGrid->set_tooltip_markup (M ("MAIN_FRAME_EDITOR_TOOLTIP")); diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index 9c1699bcf..5b58ab0eb 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -59,6 +59,7 @@ private: bool splashClosed (GdkEventAny* event); bool isEditorPanel (Widget* panel); bool isEditorPanel (guint pageNum); + void showErrors (); Glib::ustring versionStr; #if defined(__APPLE__) @@ -67,7 +68,7 @@ private: public: RTWindow (); - ~RTWindow(); + ~RTWindow() override; #if defined(__APPLE__) bool osxFileOpenEvent (Glib::ustring path); @@ -77,21 +78,24 @@ public: bool selectEditorPanel (const std::string &name); void addBatchQueueJob (BatchQueueEntry* bqe, bool head = false); - void addBatchQueueJobs (std::vector &entries); + void addBatchQueueJobs (const std::vector& entries); bool keyPressed (GdkEventKey* event); - bool on_configure_event (GdkEventConfigure* event); - bool on_delete_event (GdkEventAny* event); - bool on_window_state_event (GdkEventWindowState* event); + bool on_configure_event (GdkEventConfigure* event) override; + bool on_delete_event (GdkEventAny* event) override; + bool on_window_state_event (GdkEventWindowState* event) override; void on_mainNB_switch_page (Gtk::Widget* widget, guint page_num); + void showICCProfileCreator (); void showPreferences (); - void on_realize (); + void on_realize () override; void toggle_fullscreen (); - void setProgress (double p); - void setProgressStr (Glib::ustring str); - void setProgressState (bool inProcessing); - void error (Glib::ustring descr); + + void setProgress(double p) override; + void setProgressStr(const Glib::ustring& str) override; + void setProgressState(bool inProcessing) override; + void error(const Glib::ustring& descr) override; + rtengine::ProgressListener* getProgressListener () { return pldBridge; @@ -108,7 +112,6 @@ public: void updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC); void updateTPVScrollbar (bool hide); void updateHistogramPosition (int oldPosition, int newPosition); - void updateTabsUsesIcons (bool useIcons); void updateFBQueryTB (bool singleRow); void updateFBToolBarVisibility (bool showFilmStripToolBar); bool getIsFullscreen() diff --git a/rtgui/saveasdlg.cc b/rtgui/saveasdlg.cc index 1818d748a..f2a7206b9 100644 --- a/rtgui/saveasdlg.cc +++ b/rtgui/saveasdlg.cc @@ -16,15 +16,36 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include + #include "saveasdlg.h" -#include "multilangmgr.h" + #include "guiutils.h" +#include "multilangmgr.h" #include "rtimage.h" #include "../rtengine/utils.h" extern Options options; +namespace +{ + +Glib::ustring getCurrentFilename(const Gtk::FileChooserWidget* fchooser) +{ + Glib::ustring res = fchooser->get_filename(); + + // NB: There seem to be a bug in Gtkmm2.22 / FileChooserWidget : if you suppress the filename entry and + // click on a folder in the list, the filename field is empty but get_filename will return the folder's path :/ + if (Glib::file_test(res, Glib::FILE_TEST_IS_DIR)) { + res = fchooser->get_current_name(); + } + + return res; +} + +} + SaveAsDialog::SaveAsDialog (const Glib::ustring &initialDir, Gtk::Window* parent) : Gtk::Dialog (M("GENERAL_SAVE"), *parent) { @@ -219,13 +240,7 @@ SaveFormat SaveAsDialog::getFormat () void SaveAsDialog::okPressed () { - fname = fchooser->get_filename(); - - // NB: There seem to be a bug in Gtkmm2.22 / FileChooserWidget : if you suppress the filename entry and - // click on a folder in the list, the filename field is empty but get_filename will return the folder's path :/ - if (Glib::file_test(fname, Glib::FILE_TEST_IS_DIR)) { - fname = fchooser->get_current_name(); - } + fname = getCurrentFilename(fchooser); // Checking if the filename field is empty. The user have to click Cancel if he don't want to specify a filename if (fname.empty()) { @@ -246,9 +261,18 @@ void SaveAsDialog::okPressed () // Extension is either empty or unfamiliar fname += '.' + formatOpts->getFormat().format; } else if ( - !rtengine::hasJpegExtension(fname) - && !rtengine::hasTiffExtension(fname) - && !rtengine::hasPngExtension(fname) + ( + formatOpts->getFormat().format == "jpg" + && !rtengine::hasJpegExtension(fname) + ) + || ( + formatOpts->getFormat().format == "tif" + && !rtengine::hasTiffExtension(fname) + ) + || ( + formatOpts->getFormat().format == "png" + && !rtengine::hasPngExtension(fname) + ) ) { // Create dialog to warn user that the filename may have two extensions on the end Gtk::MessageDialog msgd( @@ -280,24 +304,49 @@ void SaveAsDialog::okPressed () void SaveAsDialog::cancelPressed () { - - fname = fchooser->get_filename(); response (Gtk::RESPONSE_CANCEL); } -void SaveAsDialog::formatChanged (Glib::ustring f) +void SaveAsDialog::formatChanged(const Glib::ustring& format) { + const auto sanitize_suffix = + [this, format](const std::function& has_suffix) + { + const Glib::ustring name = getCurrentFilename(fchooser); - if (f == "jpg") { + if (!has_suffix(name)) { + fchooser->set_current_name(removeExtension(Glib::path_get_basename(name)) + '.' + format); + } + }; + + if (format == "jpg") { fchooser->set_filter (filter_jpg); - } else if (f == "png") { + sanitize_suffix( + [](const Glib::ustring& filename) + { + return rtengine::hasJpegExtension(filename); + } + ); + } else if (format == "png") { fchooser->set_filter (filter_png); - } else if (f == "tif") { + sanitize_suffix( + [](const Glib::ustring& filename) + { + return rtengine::hasPngExtension(filename); + } + ); + } else if (format == "tif") { fchooser->set_filter (filter_tif); + sanitize_suffix( + [](const Glib::ustring& filename) + { + return rtengine::hasTiffExtension(filename); + } + ); } } -void SaveAsDialog::setInitialFileName (Glib::ustring fname) +void SaveAsDialog::setInitialFileName (const Glib::ustring& fname) { this->fname = fname; fchooser->set_current_name(fname); diff --git a/rtgui/saveasdlg.h b/rtgui/saveasdlg.h index 9b06471e8..e02be340f 100644 --- a/rtgui/saveasdlg.h +++ b/rtgui/saveasdlg.h @@ -57,12 +57,12 @@ public: bool getToTailOfQueue (); int getSaveMethodNum (); - void setInitialFileName (Glib::ustring iname); + void setInitialFileName (const Glib::ustring& iname); void setImagePath (const Glib::ustring& imagePath); void okPressed (); void cancelPressed (); - void formatChanged (Glib::ustring f); + void formatChanged(const Glib::ustring& format) override; bool keyPressed (GdkEventKey* event); }; diff --git a/rtgui/saveformatpanel.cc b/rtgui/saveformatpanel.cc index fef05de23..de2240fc6 100644 --- a/rtgui/saveformatpanel.cc +++ b/rtgui/saveformatpanel.cc @@ -16,10 +16,28 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ +#include +#include + #include "saveformatpanel.h" #include "multilangmgr.h" #include "guiutils.h" +namespace +{ + +const std::array, 7> sf_templates = {{ + {"JPEG (8-bit)", SaveFormat("jpg", 8, 8, false)}, + {"TIFF (8-bit)", SaveFormat("tif", 8, 8, false)}, + {"TIFF (16-bit)", SaveFormat("tif", 8, 16, false)}, + {"TIFF (16-bit float)", SaveFormat("tif", 8, 16, true)}, + {"TIFF (32-bit float)", SaveFormat("tif", 8, 32, true)}, + {"PNG (8-bit)", SaveFormat("png", 8, 8, false)}, + {"PNG (16-bit)", SaveFormat("png", 16, 8, false)} +}}; + +} + SaveFormatPanel::SaveFormatPanel () : listener (nullptr) { @@ -37,19 +55,9 @@ SaveFormatPanel::SaveFormatPanel () : listener (nullptr) setExpandAlignProperties(format, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); format->signal_changed ().connect (sigc::mem_fun (*this, &SaveFormatPanel::formatChanged)); - 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] = "tif"; - fstr[4] = "png"; - fstr[5] = "png"; + for (const auto& sf_template : sf_templates) { + format->append(sf_template.first); + } hb1->attach (*flab, 0, 0, 1, 1); hb1->attach (*format, 1, 0, 1, 1); @@ -116,71 +124,71 @@ SaveFormatPanel::~SaveFormatPanel () void SaveFormatPanel::init (SaveFormat &sf) { - - FormatChangeListener* tmp = listener; + FormatChangeListener* const tmp = listener; listener = nullptr; - if (sf.format == "jpg") { - format->set_active (0); - } else if (sf.format == "png" && sf.pngBits == 16) { - 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); - } else if (sf.format == "tif" && sf.tiffBits == 8) { - format->set_active (1); + std::pair index; + + for (std::size_t i = 0; i < sf_templates.size(); ++i) { + // Without relating the other SaveFormat fields to the + // SaveFormat::format by additional logic the best + // way is computing a weight for fitting the input + // to one of the sf_templates. + // The format field must match exactly, tiffBits, + // tiffFloat, and pngBits fields all weigh the same. + // By providing sane sets of parameters in getFormat() + // we have perfect matches. If the parameters were + // tampered with, some entry within SaveFormat::format + // will be selected, which will be consistent again. + + const int weight = + 10 * (sf.format == sf_templates[i].second.format) + + (sf.tiffBits == sf_templates[i].second.tiffBits) + + (sf.tiffFloat == sf_templates[i].second.tiffFloat) + + (sf.pngBits == sf_templates[i].second.pngBits); + + if (weight > index.first) { + index = {weight, i}; + } } - jpegSubSamp->set_active (sf.jpegSubSamp - 1); + format->set_active(index.second); + + jpegSubSamp->set_active(sf.jpegSubSamp - 1); + jpegQual->setValue(sf.jpegQuality); + savesPP->set_active(sf.saveParams); + tiffUncompressed->set_active(sf.tiffUncompressed); - jpegQual->setValue (sf.jpegQuality); - savesPP->set_active (sf.saveParams); - tiffUncompressed->set_active (sf.tiffUncompressed); listener = tmp; } SaveFormat SaveFormatPanel::getFormat () { - SaveFormat sf; - int sel = format->get_active_row_number(); - sf.format = fstr[sel]; + const unsigned int sel = format->get_active_row_number(); - if (sel == 5) { - sf.pngBits = 16; - } else { - sf.pngBits = 8; + if (sel < sf_templates.size()) { + sf = sf_templates[sel].second; } - if (sel == 2) { - sf.tiffBits = 16; - } else if (sel == 3) { - sf.tiffBits = 32; - } else { - sf.tiffBits = 8; - } - - sf.jpegQuality = (int) jpegQual->getValue (); - sf.jpegSubSamp = jpegSubSamp->get_active_row_number() + 1; + sf.jpegQuality = jpegQual->getValue(); + sf.jpegSubSamp = jpegSubSamp->get_active_row_number() + 1; sf.tiffUncompressed = tiffUncompressed->get_active(); - sf.saveParams = savesPP->get_active (); + sf.saveParams = savesPP->get_active(); + return sf; } void SaveFormatPanel::formatChanged () { + const unsigned int act = format->get_active_row_number(); - int act = format->get_active_row_number(); - - if (act < 0 || act > 4) { + if (act >= sf_templates.size()) { return; } - Glib::ustring fr = fstr[act]; + const Glib::ustring& fr = sf_templates[act].second.format; if (fr == "jpg") { jpegOpts->show_all(); @@ -198,16 +206,19 @@ void SaveFormatPanel::formatChanged () } } -void SaveFormatPanel::adjusterChanged (Adjuster* a, double newval) +void SaveFormatPanel::adjusterChanged(Adjuster* a, double newval) { + const unsigned int act = format->get_active_row_number(); - int act = format->get_active_row_number(); - - if (act < 0 || act > 4) { + if (act >= sf_templates.size()) { return; } if (listener) { - listener->formatChanged (fstr[act]); + listener->formatChanged(sf_templates[act].second.format); } } + +void SaveFormatPanel::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} diff --git a/rtgui/saveformatpanel.h b/rtgui/saveformatpanel.h index 8dc493051..48fa97e13 100644 --- a/rtgui/saveformatpanel.h +++ b/rtgui/saveformatpanel.h @@ -26,10 +26,9 @@ class FormatChangeListener { - public: - virtual ~FormatChangeListener () {} - virtual void formatChanged (Glib::ustring f) {} + virtual ~FormatChangeListener() = default; + virtual void formatChanged(const Glib::ustring& format) = 0; }; class SaveFormatPanel : public Gtk::Grid, public AdjusterListener @@ -44,14 +43,13 @@ protected: Gtk::Grid* jpegOpts; Gtk::Label* jpegSubSampLabel; FormatChangeListener* listener; - Glib::ustring fstr[6]; Gtk::CheckButton* savesPP; public: SaveFormatPanel (); - ~SaveFormatPanel (); + ~SaveFormatPanel () override; void setListener (FormatChangeListener* l) { listener = l; @@ -61,7 +59,8 @@ public: SaveFormat getFormat (); void formatChanged (); - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; }; #endif diff --git a/rtgui/sensorbayer.cc b/rtgui/sensorbayer.cc index 8bd36fe32..44afdd2e8 100644 --- a/rtgui/sensorbayer.cc +++ b/rtgui/sensorbayer.cc @@ -20,9 +20,6 @@ #include "guiutils.h" #include "rtimage.h" -using namespace rtengine; -using namespace rtengine::procparams; - SensorBayer::SensorBayer () : FoldableToolPanel(this, "sensorbayer", M("TP_RAW_SENSOR_BAYER_LABEL")) { diff --git a/rtgui/sensorxtrans.cc b/rtgui/sensorxtrans.cc index 3f93e050a..c0a704ebf 100644 --- a/rtgui/sensorxtrans.cc +++ b/rtgui/sensorxtrans.cc @@ -20,9 +20,6 @@ #include "guiutils.h" #include "rtimage.h" -using namespace rtengine; -using namespace rtengine::procparams; - SensorXTrans::SensorXTrans () : FoldableToolPanel(this, "sensorxtrans", M("TP_RAW_SENSOR_XTRANS_LABEL")) { diff --git a/rtgui/shadowshighlights.cc b/rtgui/shadowshighlights.cc index 8c701dae6..6fdf6f2f3 100644 --- a/rtgui/shadowshighlights.cc +++ b/rtgui/shadowshighlights.cc @@ -18,33 +18,43 @@ */ #include "shadowshighlights.h" +#include "eventmapper.h" + +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, "shadowshighlights", M("TP_SHADOWSHLIGHTS_LABEL"), false, true) { + auto m = ProcEventMapper::getInstance(); + EvSHColorspace = m->newEvent(RGBCURVE, "HISTORY_MSG_SH_COLORSPACE"); - hq = Gtk::manage (new Gtk::CheckButton (M("TP_SHADOWSHLIGHTS_SHARPMASK"))); - hq->set_active (false); - pack_start (*hq); - hqConn = hq->signal_toggled().connect( sigc::mem_fun(*this, &ShadowsHighlights::hqChanged) ); + Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); + hb->pack_start(*Gtk::manage(new Gtk::Label(M("TP_DIRPYRDENOISE_MAIN_COLORSPACE") + ": ")), Gtk::PACK_SHRINK); + colorspace = Gtk::manage(new MyComboBoxText()); + colorspace->append(M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_RGB")); + colorspace->append(M("TP_DIRPYRDENOISE_MAIN_COLORSPACE_LAB")); + hb->pack_start(*colorspace); + pack_start(*hb); pack_start (*Gtk::manage (new Gtk::HSeparator())); + highlights = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), 0, 100, 1, 0)); - h_tonalwidth = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_HLTONALW"), 10, 100, 1, 80)); + h_tonalwidth = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_HLTONALW"), 10, 100, 1, 70)); pack_start (*highlights); pack_start (*h_tonalwidth); pack_start (*Gtk::manage (new Gtk::HSeparator())); shadows = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_SHADOWS"), 0, 100, 1, 0)); - s_tonalwidth = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_SHTONALW"), 10, 100, 1, 80)); + s_tonalwidth = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_SHTONALW"), 10, 100, 1, 30)); pack_start (*shadows); pack_start (*s_tonalwidth); pack_start (*Gtk::manage (new Gtk::HSeparator())); - radius = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_RADIUS"), 5, 100, 1, 30)); + radius = Gtk::manage (new Adjuster (M("TP_SHADOWSHLIGHTS_RADIUS"), 1, 100, 1, 40)); pack_start (*radius); radius->setAdjusterListener (this); @@ -53,6 +63,8 @@ ShadowsHighlights::ShadowsHighlights () : FoldableToolPanel(this, "shadowshighli shadows->setAdjusterListener (this); s_tonalwidth->setAdjusterListener (this); + colorspace->signal_changed().connect(sigc::mem_fun(*this, &ShadowsHighlights::colorspaceChanged)); + show_all_children (); } @@ -68,23 +80,25 @@ void ShadowsHighlights::read (const ProcParams* pp, const ParamsEdited* pedited) shadows->setEditedState (pedited->sh.shadows ? Edited : UnEdited); s_tonalwidth->setEditedState (pedited->sh.stonalwidth ? Edited : UnEdited); set_inconsistent (multiImage && !pedited->sh.enabled); - hq->set_inconsistent (!pedited->sh.hq); + } setEnabled (pp->sh.enabled); - hqConn.block (true); - hq->set_active (pp->sh.hq); - hqConn.block (false); - - lastHQ = pp->sh.hq; - radius->setValue (pp->sh.radius); highlights->setValue (pp->sh.highlights); h_tonalwidth->setValue (pp->sh.htonalwidth); shadows->setValue (pp->sh.shadows); s_tonalwidth->setValue (pp->sh.stonalwidth); + if (pedited && !pedited->sh.lab) { + colorspace->set_active(2); + } else if (pp->sh.lab) { + colorspace->set_active(1); + } else { + colorspace->set_active(0); + } + enableListener (); } @@ -97,7 +111,12 @@ void ShadowsHighlights::write (ProcParams* pp, ParamsEdited* pedited) pp->sh.shadows = (int)shadows->getValue (); pp->sh.stonalwidth = (int)s_tonalwidth->getValue (); pp->sh.enabled = getEnabled(); - pp->sh.hq = hq->get_active(); + + if (colorspace->get_active_row_number() == 0) { + pp->sh.lab = false; + } else if (colorspace->get_active_row_number() == 1) { + pp->sh.lab = true; + } if (pedited) { pedited->sh.radius = radius->getEditedState (); @@ -106,7 +125,7 @@ void ShadowsHighlights::write (ProcParams* pp, ParamsEdited* pedited) pedited->sh.shadows = shadows->getEditedState (); pedited->sh.stonalwidth = s_tonalwidth->getEditedState (); pedited->sh.enabled = !get_inconsistent(); - pedited->sh.hq = !hq->get_inconsistent(); + pedited->sh.lab = colorspace->get_active_row_number() != 2; } } @@ -136,10 +155,8 @@ void ShadowsHighlights::setDefaults (const ProcParams* defParams, const ParamsEd void ShadowsHighlights::adjusterChanged (Adjuster* a, double newval) { - if (listener && getEnabled()) { - - Glib::ustring costr = Glib::ustring::format ((int)a->getValue()); + const Glib::ustring costr = Glib::ustring::format ((int)a->getValue()); if (a == highlights) { listener->panelChanged (EvSHHighlights, costr); @@ -155,6 +172,10 @@ void ShadowsHighlights::adjusterChanged (Adjuster* a, double newval) } } +void ShadowsHighlights::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void ShadowsHighlights::enabledChanged () { @@ -169,28 +190,10 @@ void ShadowsHighlights::enabledChanged () } } -void ShadowsHighlights::hqChanged () +void ShadowsHighlights::colorspaceChanged() { - - if (batchMode) { - if (hq->get_inconsistent()) { - hq->set_inconsistent (false); - hqConn.block (true); - hq->set_active (false); - hqConn.block (false); - } else if (lastHQ) { - hq->set_inconsistent (true); - } - - lastHQ = hq->get_active (); - } - - if (listener) { - if (hq->get_active()) { - listener->panelChanged (EvSHHighQuality, M("GENERAL_ENABLED")); - } else { - listener->panelChanged (EvSHHighQuality, M("GENERAL_DISABLED")); - } + if (listener && (multiImage || getEnabled()) ) { + listener->panelChanged(EvSHColorspace, colorspace->get_active_text()); } } @@ -203,6 +206,7 @@ void ShadowsHighlights::setBatchMode (bool batchMode) h_tonalwidth->showEditedCB (); shadows->showEditedCB (); s_tonalwidth->showEditedCB (); + colorspace->append(M("GENERAL_UNCHANGED")); } void ShadowsHighlights::setAdjusterBehavior (bool hadd, bool sadd) diff --git a/rtgui/shadowshighlights.h b/rtgui/shadowshighlights.h index de3f893d5..e04e2000a 100644 --- a/rtgui/shadowshighlights.h +++ b/rtgui/shadowshighlights.h @@ -32,25 +32,27 @@ protected: Adjuster* shadows; Adjuster* s_tonalwidth; Adjuster* radius; - Gtk::CheckButton* hq; - bool lastHQ; - sigc::connection hqConn; + MyComboBoxText *colorspace; + + rtengine::ProcEvent EvSHColorspace; public: ShadowsHighlights (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); - void hqChanged (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void setAdjusterBehavior (bool hadd, bool sadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; + + void colorspaceChanged(); }; #endif diff --git a/rtgui/sharpenedge.cc b/rtgui/sharpenedge.cc index 8849ffa72..b6528e4c9 100644 --- a/rtgui/sharpenedge.cc +++ b/rtgui/sharpenedge.cc @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "sharpenedge.h" -#include "guiutils.h" -#include #include +#include + +#include "sharpenedge.h" + +#include "guiutils.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -129,7 +133,7 @@ void SharpenEdge::chanthree_toggled () } } -void SharpenEdge::adjusterChanged (Adjuster* a, double newval) +void SharpenEdge::adjusterChanged(Adjuster* a, double newval) { if (listener && getEnabled()) { Glib::ustring value = a->getTextValue(); @@ -142,6 +146,10 @@ void SharpenEdge::adjusterChanged (Adjuster* a, double newval) } } +void SharpenEdge::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void SharpenEdge::setBatchMode(bool batchMode) { passes->showEditedCB (); diff --git a/rtgui/sharpenedge.h b/rtgui/sharpenedge.h index f27d4ecee..8bf5647ed 100644 --- a/rtgui/sharpenedge.h +++ b/rtgui/sharpenedge.h @@ -44,15 +44,16 @@ public: SharpenEdge (); - 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 trimValues (rtengine::procparams::ProcParams* pp); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void trimValues (rtengine::procparams::ProcParams* pp) override; void setAdjusterBehavior (bool amountadd, bool passadd); - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; - void enabledChanged (); + void enabledChanged () override; void chanthree_toggled (); }; diff --git a/rtgui/sharpening.cc b/rtgui/sharpening.cc index 9abfc6de8..8a7b8e591 100644 --- a/rtgui/sharpening.cc +++ b/rtgui/sharpening.cc @@ -16,17 +16,30 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "sharpening.h" #include +#include "eventmapper.h" +#include "sharpening.h" using namespace rtengine; using namespace rtengine::procparams; Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENING_LABEL"), true, true) { + auto m = ProcEventMapper::getInstance(); + EvSharpenContrast = m->newEvent(SHARPENING, "HISTORY_MSG_SHARPENING_CONTRAST"); + EvSharpenBlur = m->newEvent(SHARPENING, "HISTORY_MSG_SHARPENING_BLUR"); Gtk::HBox* hb = Gtk::manage (new Gtk::HBox ()); hb->show (); + contrast = Gtk::manage(new Adjuster (M("TP_SHARPENING_CONTRAST"), 0, 200, 1, 20)); + contrast->setAdjusterListener (this); + pack_start(*contrast); + contrast->show(); + blur = Gtk::manage(new Adjuster (M("TP_SHARPENING_BLUR"), 0.2, 2.0, 0.05, 0.2)); + blur->setAdjusterListener (this); + pack_start(*blur); + blur->show(); + Gtk::Label* ml = Gtk::manage (new Gtk::Label (M("TP_SHARPENING_METHOD") + ":")); ml->show (); method = Gtk::manage (new MyComboBoxText ()); @@ -39,8 +52,8 @@ Sharpening::Sharpening () : FoldableToolPanel(this, "sharpening", M("TP_SHARPENI rld = new Gtk::VBox (); dradius = Gtk::manage (new Adjuster (M("TP_SHARPENING_EDRADIUS"), 0.4, 2.5, 0.01, 0.75)); - damount = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_AMOUNT"), 0.0, 100, 1, 75)); - ddamping = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_DAMPING"), 0, 100, 1, 20)); + damount = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_AMOUNT"), 0.0, 100, 1, 100)); + ddamping = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_DAMPING"), 0, 100, 1, 0)); diter = Gtk::manage (new Adjuster (M("TP_SHARPENING_RLD_ITERATIONS"), 5, 100, 1, 30)); rld->pack_start (*dradius); rld->pack_start (*damount); @@ -144,6 +157,8 @@ void Sharpening::read (const ProcParams* pp, const ParamsEdited* pedited) disableListener (); if (pedited) { + contrast->setEditedState (pedited->sharpening.contrast ? Edited : UnEdited); + blur->setEditedState (pedited->sharpening.blurradius ? Edited : UnEdited); amount->setEditedState (pedited->sharpening.amount ? Edited : UnEdited); radius->setEditedState (pedited->sharpening.radius ? Edited : UnEdited); threshold->setEditedState (pedited->sharpening.threshold ? Edited : UnEdited); @@ -172,6 +187,8 @@ void Sharpening::read (const ProcParams* pp, const ParamsEdited* pedited) hcConn.block (false); lastHaloControl = pp->sharpening.halocontrol; + contrast->setValue (pp->sharpening.contrast); + blur->setValue (pp->sharpening.blurradius); amount->setValue (pp->sharpening.amount); radius->setValue (pp->sharpening.radius); threshold->setValue(pp->sharpening.threshold); @@ -213,6 +230,8 @@ void Sharpening::read (const ProcParams* pp, const ParamsEdited* pedited) void Sharpening::write (ProcParams* pp, ParamsEdited* pedited) { + pp->sharpening.contrast = contrast->getValue (); + pp->sharpening.blurradius = blur->getValue (); pp->sharpening.amount = (int)amount->getValue(); pp->sharpening.enabled = getEnabled (); pp->sharpening.radius = radius->getValue (); @@ -234,6 +253,8 @@ void Sharpening::write (ProcParams* pp, ParamsEdited* pedited) } if (pedited) { + pedited->sharpening.contrast = contrast->getEditedState (); + pedited->sharpening.blurradius = blur->getEditedState (); pedited->sharpening.amount = amount->getEditedState (); pedited->sharpening.radius = radius->getEditedState (); pedited->sharpening.threshold = threshold->getEditedState (); @@ -253,7 +274,8 @@ void Sharpening::write (ProcParams* pp, ParamsEdited* pedited) void Sharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { - + contrast->setDefault (defParams->sharpening.contrast); + blur->setDefault (defParams->sharpening.blurradius); amount->setDefault (defParams->sharpening.amount); radius->setDefault (defParams->sharpening.radius); threshold->setDefault (defParams->sharpening.threshold); @@ -266,6 +288,8 @@ void Sharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* p ddamping->setDefault (defParams->sharpening.deconvdamping); if (pedited) { + contrast->setDefaultEditedState (pedited->sharpening.contrast ? Edited : UnEdited); + blur->setDefaultEditedState (pedited->sharpening.blurradius ? Edited : UnEdited); amount->setDefaultEditedState (pedited->sharpening.amount ? Edited : UnEdited); radius->setDefaultEditedState (pedited->sharpening.radius ? Edited : UnEdited); threshold->setDefaultEditedState (pedited->sharpening.threshold ? Edited : UnEdited); @@ -277,6 +301,8 @@ void Sharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* p diter->setDefaultEditedState (pedited->sharpening.deconviter ? Edited : UnEdited); ddamping->setDefaultEditedState (pedited->sharpening.deconvdamping ? Edited : UnEdited); } else { + contrast->setDefaultEditedState (Irrelevant); + blur->setDefaultEditedState (Irrelevant); amount->setDefaultEditedState (Irrelevant); radius->setDefaultEditedState (Irrelevant); threshold->setDefaultEditedState (Irrelevant); @@ -290,14 +316,13 @@ void Sharpening::setDefaults (const ProcParams* defParams, const ParamsEdited* p } } -void Sharpening::adjusterChanged (Adjuster* a, double newval) +void Sharpening::adjusterChanged(Adjuster* a, double newval) { - if (listener && (multiImage || getEnabled()) ) { Glib::ustring costr; - if (a == radius || a == dradius) { + if (a == radius || a == dradius || a == blur) { costr = Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), a->getValue()); } else if (a == eradius) { costr = Glib::ustring::format (std::setw(2), std::fixed, std::setprecision(1), a->getValue()); @@ -305,10 +330,14 @@ void Sharpening::adjusterChanged (Adjuster* a, double newval) costr = Glib::ustring::format ((int)a->getValue()); } - if (a == amount) { + if (a == contrast) { + listener->panelChanged (EvSharpenContrast, costr); + } else if (a == amount) { listener->panelChanged (EvShrAmount, costr); } else if (a == radius) { listener->panelChanged (EvShrRadius, costr); + } else if (a == blur) { + listener->panelChanged (EvSharpenBlur, costr); } else if (a == eradius) { listener->panelChanged (EvShrEdgeRadius, costr); } else if (a == etolerance) { @@ -327,15 +356,35 @@ void Sharpening::adjusterChanged (Adjuster* a, double newval) } } -void Sharpening::adjusterChanged (ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) +void Sharpening::adjusterAutoToggled(Adjuster* a, bool newval) { - if (listener && (multiImage || getEnabled()) ) { - if(a == threshold) { - listener->panelChanged (EvShrThresh, threshold->getHistoryString()); +} + +void Sharpening::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) +{ +} + +void Sharpening::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) +{ +} + +void Sharpening::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) +{ +} + +void Sharpening::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) +{ + if (listener && (multiImage || getEnabled())) { + if (a == threshold) { + listener->panelChanged(EvShrThresh, threshold->getHistoryString()); } } } +void Sharpening::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ +} + void Sharpening::enabledChanged () { @@ -451,6 +500,8 @@ void Sharpening::setBatchMode (bool batchMode) edgebin->pack_start (*edgebox); pack_start (*rld); + contrast->showEditedCB (); + blur->showEditedCB (); radius->showEditedCB (); amount->showEditedCB (); threshold->showEditedCB (); @@ -464,9 +515,10 @@ void Sharpening::setBatchMode (bool batchMode) method->append (M("GENERAL_UNCHANGED")); } -void Sharpening::setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) +void Sharpening::setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd) { + contrast->setAddMode(contrastadd); radius->setAddMode(radiusadd); dradius->setAddMode(radiusadd); amount->setAddMode(amountadd); @@ -480,7 +532,8 @@ void Sharpening::setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampi void Sharpening::trimValues (rtengine::procparams::ProcParams* pp) { - + contrast->trimValue(pp->sharpening.contrast); + blur->trimValue(pp->sharpening.blurradius); radius->trimValue(pp->sharpening.radius); dradius->trimValue(pp->sharpening.deconvradius); amount->trimValue(pp->sharpening.amount); diff --git a/rtgui/sharpening.h b/rtgui/sharpening.h index 2901036f5..75ea083c9 100644 --- a/rtgui/sharpening.h +++ b/rtgui/sharpening.h @@ -28,6 +28,8 @@ class Sharpening : public ToolParamBlock, public ThresholdAdjusterListener, publ { protected: + Adjuster* contrast; + Adjuster* blur; MyComboBoxText* method; Adjuster* dradius; Adjuster* damount; @@ -53,25 +55,33 @@ protected: bool lastHaloControl; sigc::connection hcConn; + rtengine::ProcEvent EvSharpenContrast; + rtengine::ProcEvent EvSharpenBlur; public: Sharpening (); - virtual ~Sharpening (); + ~Sharpening () override; - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); - void adjusterChanged (ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight); - void enabledChanged (); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged () override; void edgesonly_toggled (); void halocontrol_toggled (); void method_changed (); - void setAdjusterBehavior (bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); - void trimValues (rtengine::procparams::ProcParams* pp); + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + + void setAdjusterBehavior (bool contrastadd, bool radiusadd, bool amountadd, bool dampingadd, bool iteradd, bool edgetoladd, bool haloctrladd); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/sharpenmicro.cc b/rtgui/sharpenmicro.cc index 871e0d38b..0b4142677 100644 --- a/rtgui/sharpenmicro.cc +++ b/rtgui/sharpenmicro.cc @@ -16,10 +16,15 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "sharpenmicro.h" -#include "guiutils.h" -#include #include +#include + +#include "sharpenmicro.h" + +#include "eventmapper.h" +#include "guiutils.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -28,31 +33,30 @@ using namespace rtengine::procparams; SharpenMicro::SharpenMicro () : FoldableToolPanel(this, "sharpenmicro", M("TP_SHARPENMICRO_LABEL"), true, true) { + auto m = ProcEventMapper::getInstance(); + EvSharpenMicroContrast = m->newEvent(SHARPENING, "HISTORY_MSG_MICROCONTRAST_CONTRAST"); + + contrast = Gtk::manage(new Adjuster (M("TP_SHARPENMICRO_CONTRAST"), 0, 200, 1, 20)); + contrast->setAdjusterListener (this); + contrast->show(); + amount = Gtk::manage(new Adjuster (M("TP_SHARPENMICRO_AMOUNT"), 0, 100, 1, 20)); amount->setAdjusterListener (this); - - if (amount->delay < options.adjusterMaxDelay) { - amount->delay = options.adjusterMaxDelay; - } - amount->show(); - uniformity = Gtk::manage(new Adjuster (M("TP_SHARPENMICRO_UNIFORMITY"), 0, 100, 10, 50)); + uniformity = Gtk::manage(new Adjuster (M("TP_SHARPENMICRO_UNIFORMITY"), 0, 10, 1, 5)); uniformity->setAdjusterListener (this); - - if (uniformity->delay < options.adjusterMaxDelay) { - uniformity->delay = options.adjusterMaxDelay; - } - uniformity->show(); + + pack_start( *contrast, Gtk::PACK_SHRINK, 0); + pack_start( *amount, Gtk::PACK_SHRINK, 0); + pack_start( *uniformity, Gtk::PACK_SHRINK, 0); + matrix = Gtk::manage (new Gtk::CheckButton (M("TP_SHARPENMICRO_MATRIX"))); matrix->set_active (true); pack_start(*matrix, Gtk::PACK_SHRINK, 0); matrix->show (); - pack_start( *amount, Gtk::PACK_SHRINK, 0); - pack_start( *uniformity, Gtk::PACK_SHRINK, 0); - matrixconn = matrix->signal_toggled().connect( sigc::mem_fun(*this, &SharpenMicro::matrix_toggled) ); } @@ -64,6 +68,7 @@ void SharpenMicro::read(const ProcParams* pp, const ParamsEdited* pedited) set_inconsistent (multiImage && !pedited->sharpenMicro.enabled); matrix->set_inconsistent (!pedited->sharpenMicro.matrix); amount->setEditedState (pedited->sharpenMicro.amount ? Edited : UnEdited); + contrast->setEditedState (pedited->sharpenMicro.contrast ? Edited : UnEdited); uniformity->setEditedState (pedited->sharpenMicro.uniformity ? Edited : UnEdited); } @@ -75,6 +80,7 @@ void SharpenMicro::read(const ProcParams* pp, const ParamsEdited* pedited) lastmatrix = pp->sharpenMicro.matrix; amount->setValue (pp->sharpenMicro.amount); + contrast->setValue (pp->sharpenMicro.contrast); uniformity->setValue (pp->sharpenMicro.uniformity); enableListener (); @@ -85,12 +91,14 @@ void SharpenMicro::write( ProcParams* pp, ParamsEdited* pedited) pp->sharpenMicro.enabled = getEnabled(); pp->sharpenMicro.matrix = matrix->get_active (); pp->sharpenMicro.amount = amount->getValue (); + pp->sharpenMicro.contrast = contrast->getValue (); pp->sharpenMicro.uniformity = uniformity->getValue (); if (pedited) { pedited->sharpenMicro.enabled = !get_inconsistent(); pedited->sharpenMicro.matrix = !matrix->get_inconsistent(); pedited->sharpenMicro.amount = amount->getEditedState (); + pedited->sharpenMicro.contrast = contrast->getEditedState (); pedited->sharpenMicro.uniformity = uniformity->getEditedState (); } } @@ -133,47 +141,59 @@ void SharpenMicro::matrix_toggled () } } -void SharpenMicro::adjusterChanged (Adjuster* a, double newval) +void SharpenMicro::adjusterChanged(Adjuster* a, double newval) { if (listener && getEnabled()) { - Glib::ustring value = a->getTextValue(); + const Glib::ustring value = a->getTextValue(); if (a == amount) { - listener->panelChanged (EvSharpenMicroAmount, value ); + listener->panelChanged (EvSharpenMicroAmount, value); + } else if (a == contrast) { + listener->panelChanged (EvSharpenMicroContrast, value); } else if (a == uniformity) { - listener->panelChanged (EvSharpenMicroUniformity, value ); + listener->panelChanged (EvSharpenMicroUniformity, value); } } } +void SharpenMicro::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void SharpenMicro::setBatchMode(bool batchMode) { amount->showEditedCB (); + contrast->showEditedCB (); uniformity->showEditedCB (); } void SharpenMicro::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) { amount->setDefault (defParams->sharpenMicro.amount); + contrast->setDefault (defParams->sharpenMicro.contrast); uniformity->setDefault (defParams->sharpenMicro.uniformity); if (pedited) { amount->setDefaultEditedState (pedited->sharpenMicro.amount ? Edited : UnEdited); + contrast->setDefaultEditedState (pedited->sharpenMicro.contrast ? Edited : UnEdited); uniformity->setDefaultEditedState (pedited->sharpenMicro.uniformity ? Edited : UnEdited); } else { amount->setDefaultEditedState (Irrelevant); + contrast->setDefaultEditedState (Irrelevant); uniformity->setDefaultEditedState (Irrelevant); } } -void SharpenMicro::setAdjusterBehavior (bool amountadd, bool uniformityadd ) +void SharpenMicro::setAdjusterBehavior (bool amountadd, bool contrastadd, bool uniformityadd) { amount->setAddMode (amountadd); + contrast->setAddMode (contrastadd); uniformity->setAddMode (uniformityadd); } void SharpenMicro::trimValues (ProcParams* pp) { amount->trimValue (pp->sharpenMicro.amount); + contrast->trimValue (pp->sharpenMicro.contrast); uniformity->trimValue (pp->sharpenMicro.uniformity); } diff --git a/rtgui/sharpenmicro.h b/rtgui/sharpenmicro.h index 03a75eaa5..6dfccea85 100644 --- a/rtgui/sharpenmicro.h +++ b/rtgui/sharpenmicro.h @@ -36,6 +36,9 @@ protected: Gtk::CheckButton* matrix; Adjuster* amount; Adjuster* uniformity; + Adjuster* contrast; + + rtengine::ProcEvent EvSharpenMicroContrast; sigc::connection matrixconn; bool lastmatrix; @@ -44,15 +47,16 @@ public: SharpenMicro (); - 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 trimValues (rtengine::procparams::ProcParams* pp); - void setAdjusterBehavior (bool amountadd, bool uniformityadd ); - void adjusterChanged (Adjuster* a, double newval); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void trimValues (rtengine::procparams::ProcParams* pp) override; + void setAdjusterBehavior (bool amountadd, bool contrastadd, bool uniformityadd); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; - void enabledChanged (); + void enabledChanged () override; void matrix_toggled (); diff --git a/rtgui/shcselector.h b/rtgui/shcselector.h index 92d4c21ba..ac6c8afed 100644 --- a/rtgui/shcselector.h +++ b/rtgui/shcselector.h @@ -25,8 +25,8 @@ class SHCListener { public: - virtual ~SHCListener() {} - virtual void shcChanged () {} + virtual ~SHCListener() = default; + virtual void shcChanged() = 0; }; class SHCSelector : public Gtk::DrawingArea, BackBuffer @@ -51,16 +51,16 @@ protected: SHCListener* cl; - 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; - 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; - void on_realize(); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - 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 override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; + void on_realize() override; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool on_button_press_event (GdkEventButton* event) override; + bool on_button_release_event (GdkEventButton* event) override; + bool on_motion_notify_event (GdkEventMotion* event) override; void updateBackBuffer(); public: diff --git a/rtgui/softlight.cc b/rtgui/softlight.cc new file mode 100644 index 000000000..0054f8f6d --- /dev/null +++ b/rtgui/softlight.cc @@ -0,0 +1,124 @@ +/** -*- 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 +#include + +#include "softlight.h" + +#include "eventmapper.h" + +#include "../rtengine/procparams.h" + +using namespace rtengine; +using namespace rtengine::procparams; + +SoftLight::SoftLight(): FoldableToolPanel(this, "softlight", M("TP_SOFTLIGHT_LABEL"), false, true) +{ + auto m = ProcEventMapper::getInstance(); + EvSoftLightEnabled = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_SOFTLIGHT_ENABLED"); + EvSoftLightStrength = m->newEvent(LUMINANCECURVE, "HISTORY_MSG_SOFTLIGHT_STRENGTH"); + + strength = Gtk::manage(new Adjuster(M("TP_SOFTLIGHT_STRENGTH"), 0., 100., 1., 30.)); + strength->setAdjusterListener(this); + strength->show(); + + pack_start(*strength); +} + + +void SoftLight::read(const ProcParams *pp, const ParamsEdited *pedited) +{ + disableListener(); + + if (pedited) { + strength->setEditedState(pedited->softlight.strength ? Edited : UnEdited); + set_inconsistent(multiImage && !pedited->softlight.enabled); + } + + setEnabled(pp->softlight.enabled); + strength->setValue(pp->softlight.strength); + + enableListener(); +} + + +void SoftLight::write(ProcParams *pp, ParamsEdited *pedited) +{ + pp->softlight.strength = strength->getValue(); + pp->softlight.enabled = getEnabled(); + + if (pedited) { + pedited->softlight.strength = strength->getEditedState(); + pedited->softlight.enabled = !get_inconsistent(); + } +} + +void SoftLight::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited) +{ + strength->setDefault(defParams->softlight.strength); + + if (pedited) { + strength->setDefaultEditedState(pedited->softlight.strength ? Edited : UnEdited); + } else { + strength->setDefaultEditedState(Irrelevant); + } +} + + +void SoftLight::adjusterChanged(Adjuster* a, double newval) +{ + if (listener && getEnabled()) { + listener->panelChanged(EvSoftLightStrength, a->getTextValue()); + } +} + + +void SoftLight::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + + +void SoftLight::enabledChanged () +{ + if (listener) { + if (get_inconsistent()) { + listener->panelChanged(EvSoftLightEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged(EvSoftLightEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged(EvSoftLightEnabled, M("GENERAL_DISABLED")); + } + } +} + + +void SoftLight::setBatchMode(bool batchMode) +{ + ToolPanel::setBatchMode(batchMode); + + strength->showEditedCB(); +} + + +void SoftLight::setAdjusterBehavior(bool strengthAdd) +{ + strength->setAddMode(strengthAdd); +} + diff --git a/rtgui/softlight.h b/rtgui/softlight.h new file mode 100644 index 000000000..a036592e4 --- /dev/null +++ b/rtgui/softlight.h @@ -0,0 +1,48 @@ +/** -*- 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 . + */ +#pragma once + +#include +#include "adjuster.h" +#include "toolpanel.h" + +class SoftLight: public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +{ +private: + Adjuster *strength; + + rtengine::ProcEvent EvSoftLightEnabled; + rtengine::ProcEvent EvSoftLightStrength; + +public: + + SoftLight(); + + void read(const rtengine::procparams::ProcParams *pp, const ParamsEdited *pedited=nullptr) override; + void write(rtengine::procparams::ProcParams *pp, ParamsEdited *pedited=nullptr) override; + void setDefaults(const rtengine::procparams::ProcParams *defParams, const ParamsEdited *pedited=nullptr) override; + void setBatchMode(bool batchMode) override; + + void adjusterChanged(Adjuster *a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void enabledChanged() override; + void setAdjusterBehavior(bool strengthAdd); +}; + diff --git a/rtgui/soundman.cc b/rtgui/soundman.cc index ff562d030..62c7d59b6 100644 --- a/rtgui/soundman.cc +++ b/rtgui/soundman.cc @@ -40,7 +40,7 @@ void SoundManager::init() // 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 --git a/rtgui/splash.cc b/rtgui/splash.cc index 576692690..b95071d0b 100644 --- a/rtgui/splash.cc +++ b/rtgui/splash.cc @@ -116,7 +116,7 @@ Splash::Splash (Gtk::Window& parent) : Gtk::Dialog(M("GENERAL_ABOUT"), parent, t 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::showReleaseNotes() void Splash::closePressed() { hide(); + close(); } diff --git a/rtgui/splash.h b/rtgui/splash.h index 4769700f6..b35021c65 100644 --- a/rtgui/splash.h +++ b/rtgui/splash.h @@ -30,12 +30,12 @@ private: public: SplashImage (); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - 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; - 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 on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int &minimum_height, int &natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; }; //class Splash : public Gtk::Window { diff --git a/rtgui/spot.cc b/rtgui/spot.cc index 55480ece5..bc3c8709f 100644 --- a/rtgui/spot.cc +++ b/rtgui/spot.cc @@ -1,6 +1,7 @@ /* * This file is part of RawTherapee. */ +#include "../rtengine/procparams.h" #include "spot.h" #include "rtimage.h" #include @@ -402,7 +403,7 @@ void Spot::deleteSelectedEntry() // TODO CursorShape Spot::getCursor (const int objectID) { - return CSOpenHand; + return CSHandOpen; } bool Spot::mouseOver (const int modifierKey) diff --git a/rtgui/spot.h b/rtgui/spot.h index 27b4708bc..d62ab7b2f 100644 --- a/rtgui/spot.h +++ b/rtgui/spot.h @@ -34,6 +34,13 @@ * To delete a point, move your mouse over any of its geometry press the middle or right mouse button * (the point will be deleted on button release). */ + +namespace rtengine { +namespace procparams { + class SpotEntry; +} +} + class Spot : public ToolParamBlock, public FoldableToolPanel, public EditSubscriber { diff --git a/rtgui/thresholdadjuster.cc b/rtgui/thresholdadjuster.cc index 7afd128b5..210f63333 100644 --- a/rtgui/thresholdadjuster.cc +++ b/rtgui/thresholdadjuster.cc @@ -96,9 +96,9 @@ void ThresholdAdjuster::initObject (Glib::ustring label, bool editedcb) hbox->pack_start (*this->label); reset = Gtk::manage (new Gtk::Button ()); - reset->add (*Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png"))); + reset->add (*Gtk::manage (new RTImage ("undo-small.png", "redo-small.png"))); reset->set_relief (Gtk::RELIEF_NONE); - reset->set_tooltip_text (M("ADJUSTER_RESET_TO_DEFAULT")); + reset->set_tooltip_markup (M("ADJUSTER_RESET_TO_DEFAULT")); hbox->pack_end (*reset, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/thresholdadjuster.h b/rtgui/thresholdadjuster.h index 200fe2175..54026a183 100644 --- a/rtgui/thresholdadjuster.h +++ b/rtgui/thresholdadjuster.h @@ -33,16 +33,16 @@ class ThresholdAdjusterListener { public: - virtual ~ThresholdAdjusterListener() {} + virtual ~ThresholdAdjusterListener() = default; // to be used by listener that has created a ThresholdAdjuster with with single threshold and precision > 0 - virtual void adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop) {} + virtual void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) = 0; // to be used by listener that has created a ThresholdAdjuster with with double threshold and precision > 0 - virtual void adjusterChanged (ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) {} + virtual void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) = 0; // to be used by listener that has created a ThresholdAdjuster with with single threshold and precision == 0 - virtual void adjusterChanged (ThresholdAdjuster* a, int newBottom, int newTop) {} + virtual void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) = 0; // to be used by listener that has created a ThresholdAdjuster with with double threshold and precision == 0 - virtual void adjusterChanged (ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) {} - virtual void adjusterChanged2 (ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) {} + virtual void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) = 0; + virtual void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) = 0; }; @@ -91,7 +91,7 @@ public: double defTopLeft, double defBottomRight, double defTopRight, unsigned int precision, bool startAtOne, bool editedCheckBox = false); - virtual ~ThresholdAdjuster (); + ~ThresholdAdjuster () override; void setAdjusterListener (ThresholdAdjusterListener* alistener) { adjusterListener = alistener; diff --git a/rtgui/thresholdselector.cc b/rtgui/thresholdselector.cc index 891095e6f..2d94d43de 100644 --- a/rtgui/thresholdselector.cc +++ b/rtgui/thresholdselector.cc @@ -21,9 +21,12 @@ #include #include "thresholdselector.h" + #include "multilangmgr.h" #include "mycurve.h" +#include "../rtengine/procparams.h" + ThresholdSelector::ThresholdSelector(double minValueBottom, double maxValueBottom, double defBottom, Glib::ustring labelBottom, unsigned int precisionBottom, double minValueTop, double maxValueTop, double defTop, Glib::ustring labelTop, unsigned int precisionTop, ThresholdCurveProvider* curveProvider) diff --git a/rtgui/thresholdselector.h b/rtgui/thresholdselector.h index 32b423e64..0b0f46d5f 100644 --- a/rtgui/thresholdselector.h +++ b/rtgui/thresholdselector.h @@ -111,17 +111,17 @@ protected: void updateTooltip(); void updateBackBuffer(); - 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; - 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; - void on_realize (); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); - bool on_button_press_event (GdkEventButton* event); - bool on_button_release_event (GdkEventButton* event); - bool on_motion_notify_event (GdkEventMotion* event); - bool on_leave_notify_event (GdkEventCrossing* event); + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int& minimum_height, int& natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; + void on_realize () override; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; + bool on_button_press_event (GdkEventButton* event) override; + bool on_button_release_event (GdkEventButton* event) override; + bool on_motion_notify_event (GdkEventMotion* event) override; + bool on_leave_notify_event (GdkEventCrossing* event) override; public: diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index abb8ec68d..6c15411a1 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -68,23 +68,64 @@ void ThumbBrowserBase::scrollChanged () } } -void ThumbBrowserBase::scroll (int direction) +void ThumbBrowserBase::scroll (int direction, double deltaX, double deltaY) { - // GUI already acquired when here - if (arrangement == TB_Vertical) { - vscroll.set_value (vscroll.get_value() + (direction == GDK_SCROLL_DOWN ? +1 : -1) * vscroll.get_adjustment()->get_step_increment()); + double delta = 0.0; + if (abs(deltaX) > abs(deltaY)) { + delta = deltaX; } else { - hscroll.set_value (hscroll.get_value() + (direction == GDK_SCROLL_DOWN ? +1 : -1) * hscroll.get_adjustment()->get_step_increment()); + delta = deltaY; + } + if (direction == GDK_SCROLL_SMOOTH && delta == 0.0) { + // sometimes this case happens. To avoid scrolling the wrong direction in this case, we just do nothing + return; + } + double coef = direction == GDK_SCROLL_DOWN || (direction == GDK_SCROLL_SMOOTH && delta > 0.0) ? +1.0 : -1.0; + + // GUI already acquired when here + if (direction == GDK_SCROLL_UP || direction == GDK_SCROLL_DOWN || direction == GDK_SCROLL_SMOOTH) { + if (arrangement == TB_Vertical) { + double currValue = vscroll.get_value(); + double newValue = rtengine::LIM(currValue + coef * vscroll.get_adjustment()->get_step_increment(), + vscroll.get_adjustment()->get_lower (), + vscroll.get_adjustment()->get_upper()); + if (newValue != currValue) { + vscroll.set_value (newValue); + } + } else { + double currValue = hscroll.get_value(); + double newValue = rtengine::LIM(currValue + coef * hscroll.get_adjustment()->get_step_increment(), + hscroll.get_adjustment()->get_lower(), + hscroll.get_adjustment()->get_upper()); + if (newValue != currValue) { + hscroll.set_value (newValue); + } + } } } void ThumbBrowserBase::scrollPage (int direction) { // GUI already acquired when here - if (arrangement == TB_Vertical) { - vscroll.set_value (vscroll.get_value() + (direction == GDK_SCROLL_DOWN ? +1 : -1) * vscroll.get_adjustment()->get_page_increment()); - } else { - hscroll.set_value (hscroll.get_value() + (direction == GDK_SCROLL_DOWN ? +1 : -1) * hscroll.get_adjustment()->get_page_increment()); + // GUI already acquired when here + if (direction == GDK_SCROLL_UP || direction == GDK_SCROLL_DOWN) { + if (arrangement == TB_Vertical) { + double currValue = vscroll.get_value(); + double newValue = rtengine::LIM(currValue + (direction == GDK_SCROLL_DOWN ? +1 : -1) * vscroll.get_adjustment()->get_page_increment(), + vscroll.get_adjustment()->get_lower(), + vscroll.get_adjustment()->get_upper()); + if (newValue != currValue) { + vscroll.set_value (newValue); + } + } else { + double currValue = hscroll.get_value(); + double newValue = rtengine::LIM(currValue + (direction == GDK_SCROLL_DOWN ? +1 : -1) * hscroll.get_adjustment()->get_page_increment(), + hscroll.get_adjustment()->get_lower(), + hscroll.get_adjustment()->get_upper()); + if (newValue != currValue) { + hscroll.set_value (newValue); + } + } } } @@ -129,33 +170,37 @@ void ThumbBrowserBase::selectSingle (ThumbBrowserEntryBase* clicked) void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additional) { - if (selected.empty ()) { - addToSelection (clicked, selected); + if (selected.empty()) { + addToSelection(clicked, selected); return; } if (!additional || !lastClicked) { // Extend the current range w.r.t to first selected entry. - ThumbIterator front = std::find (fd.begin (), fd.end (), selected.front ()); - ThumbIterator current = std::find (fd.begin (), fd.end (), clicked); + ThumbIterator front = std::find(fd.begin(), fd.end(), selected.front()); + ThumbIterator current = std::find(fd.begin(), fd.end(), clicked); - if (front > current) - std::swap (front, current); + if (front > current) { + std::swap(front, current); + } - clearSelection (selected); + clearSelection(selected); - for (; front <= current; ++front) - addToSelection (*front, selected); + for (; front <= current && front != fd.end(); ++front) { + addToSelection(*front, selected); + } } else { // Add an additional range w.r.t. the last clicked entry. - ThumbIterator last = std::find (fd.begin (), fd.end (), lastClicked); - ThumbIterator current = std::find (fd.begin (), fd.end (), clicked); + ThumbIterator last = std::find(fd.begin(), fd.end(), lastClicked); + ThumbIterator current = std::find (fd.begin(), fd.end(), clicked); - if (last > current) - std::swap (last, current); + if (last > current) { + std::swap(last, current); + } - for (; last <= current; ++last) - addToSelection (*last, selected); + for (; last <= current && last != fd.end(); ++last) { + addToSelection(*last, selected); + } } } @@ -300,7 +345,7 @@ void ThumbBrowserBase::selectNext (int distance, bool enlarge) std::swap(front, back); } - for (; front <= back; ++front) { + for (; front <= back && front != fd.end(); ++front) { if (!(*front)->filtered) { (*front)->selected = true; redrawNeeded (*front); @@ -497,8 +542,8 @@ void ThumbBrowserBase::configScrollBars () vscroll.get_adjustment()->set_upper (inH); hscroll.get_adjustment()->set_lower (0); vscroll.get_adjustment()->set_lower (0); - hscroll.get_adjustment()->set_step_increment (32); - vscroll.get_adjustment()->set_step_increment (32); + hscroll.get_adjustment()->set_step_increment (!fd.empty() ? fd[0]->getEffectiveHeight() : 0); + vscroll.get_adjustment()->set_step_increment (!fd.empty() ? fd[0]->getEffectiveHeight() : 0); hscroll.get_adjustment()->set_page_increment (iw); vscroll.get_adjustment()->set_page_increment (ih); hscroll.get_adjustment()->set_page_size (iw); @@ -563,7 +608,7 @@ void ThumbBrowserBase::arrangeFiles() MYREADERLOCK_RELEASE(l); // This will require a Writer access - resizeThumbnailArea(currx, rowHeight); + resizeThumbnailArea(currx, !fd.empty() ? fd[0]->getEffectiveHeight() : rowHeight); } else { const int availWidth = internal.get_width(); @@ -678,7 +723,7 @@ void ThumbBrowserBase::Internal::on_realize() bgs = style->get_background_color(Gtk::STATE_FLAG_SELECTED); set_can_focus(true); - add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::KEY_PRESS_MASK); + add_events(Gdk::EXPOSURE_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK | Gdk::KEY_PRESS_MASK); set_has_tooltip (true); signal_query_tooltip().connect( sigc::mem_fun(*this, &ThumbBrowserBase::Internal::on_query_tooltip) ); } @@ -915,8 +960,7 @@ bool ThumbBrowserBase::Internal::on_motion_notify_event (GdkEventMotion* event) bool ThumbBrowserBase::Internal::on_scroll_event (GdkEventScroll* event) { // Gtk signals automatically acquire the GUI (i.e. this method is enclosed by gdk_thread_enter and gdk_thread_leave) - - parent->scroll (event->direction); + parent->scroll (event->direction, event->delta_x, event->delta_y); return true; } @@ -965,9 +1009,6 @@ void ThumbBrowserBase::zoomChanged (bool zoomIn) } redraw (); -#ifdef WIN32 - gdk_window_process_updates (get_window()->gobj(), true); -#endif } void ThumbBrowserBase::refreshThumbImages () diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index d4d7e63e2..dbc9374a0 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -49,21 +49,21 @@ class ThumbBrowserBase : public Gtk::Grid public: Internal (); void setParent (ThumbBrowserBase* p); - void on_realize(); - void on_style_updated(); - bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); + void on_realize() override; + void on_style_updated() override; + bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) override; - 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; - 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; + Gtk::SizeRequestMode get_request_mode_vfunc () const override; + void get_preferred_height_vfunc (int &minimum_height, int &natural_height) const override; + void get_preferred_width_vfunc (int &minimum_width, int &natural_width) const override; + void get_preferred_height_for_width_vfunc (int width, int &minimum_height, int &natural_height) const override; + void get_preferred_width_for_height_vfunc (int height, int &minimum_width, int &natural_width) const override; - bool on_button_press_event (GdkEventButton* event); - bool on_button_release_event (GdkEventButton* event); - bool on_motion_notify_event (GdkEventMotion* event); - bool on_scroll_event (GdkEventScroll* event); - bool on_key_press_event (GdkEventKey* event); + bool on_button_press_event (GdkEventButton* event) override; + bool on_button_release_event (GdkEventButton* event) override; + bool on_motion_notify_event (GdkEventMotion* event) override; + bool on_scroll_event (GdkEventScroll* event) override; + bool on_key_press_event (GdkEventKey* event) override; bool on_query_tooltip (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip); void setPosition (int x, int y); @@ -138,7 +138,7 @@ public: enum Arrangement {TB_Horizontal, TB_Vertical}; void configScrollBars (); void scrollChanged (); - void scroll (int direction); + void scroll (int direction, double deltaX=0.0, double deltaY=0.0); void scrollPage (int direction); private: @@ -199,7 +199,7 @@ public: { return fd; } - void on_style_updated (); + void on_style_updated () override; void redraw (); // arrange files and draw area void refreshThumbImages (); // refresh thumbnail sizes, re-generate thumbnail images, arrange and draw void refreshQuickThumbImages (); // refresh thumbnail sizes, re-generate thumbnail images, arrange and draw diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 2fff95904..ed34c65c7 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -23,6 +23,103 @@ #include "../rtengine/mytime.h" +namespace +{ + +Glib::ustring getPaddedName(const Glib::ustring& name) +{ + enum class State { + OTHER, + NUMBER + }; + + constexpr unsigned int pad_width = 16; + + Glib::ustring res; + + State state = State::OTHER; + Glib::ustring number; + + for (auto c : name) { + switch (state) { + case State::OTHER: { + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + number += c; + + state = State::NUMBER; + break; + } + + default: { + res += c; + break; + } + } + break; + } + + case State::NUMBER: { + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + number += c; + break; + } + + default: { + if (number.size() < pad_width) { + res.append(pad_width - number.size(), '0'); + } + res += number; + res += c; + number.clear(); + + state = State::OTHER; + break; + } + } + break; + } + } + } + + switch (state) { + case State::OTHER: { + break; + } + + case State::NUMBER: { + if (number.size() < pad_width) { + res.append(pad_width - number.size(), '0'); + } + res += number; + break; + } + } + + return res; +} + +} + ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : fnlabw(0), fnlabh(0), @@ -57,7 +154,7 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) : bbFramed(false), bbPreview(nullptr), cursor_type(CSUndefined), - collate_name(dispname.casefold().collate_key()), + collate_name(getPaddedName(dispname).casefold_collate_key()), thumbnail(nullptr), filename(fname), shortname(dispname), @@ -645,16 +742,19 @@ Glib::ustring ThumbBrowserEntryBase::getToolTip (int x, int y) tooltip = buttonSet->getToolTip (x, y); } - // if the fileinfo is not shown anyway, make a tooltip with the info - if (withFilename < WFNAME_FULL && inside(x, y) && tooltip.empty()) { + // Always show the filename in the tooltip since the filename in the thumbnail could be truncated. + // If "Show Exif info" is disabled, also show Exif info in the tooltip. + if (inside(x, y) && tooltip.empty()) { tooltip = dispname; - if (options.fbShowDateTime && datetimeline != "") { - tooltip += Glib::ustring("\n") + datetimeline; - } + if (withFilename < WFNAME_FULL) { + if (options.fbShowDateTime && datetimeline != "") { + tooltip += Glib::ustring("\n") + datetimeline; + } - if (options.fbShowBasicExif && exifline != "") { - tooltip += Glib::ustring("\n") + exifline; + if (options.fbShowBasicExif && exifline != "") { + tooltip += Glib::ustring("\n") + exifline; + } } } diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index 0ebf597e2..8237b7c6b 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -19,12 +19,15 @@ #ifndef _THUMBNAILBROWSERENTRYBASE_ #define _THUMBNAILBROWSERENTRYBASE_ +#include + #include -#include "lwbuttonset.h" -#include "thumbnail.h" -#include "threadutils.h" -#include "guiutils.h" + #include "cursormanager.h" +#include "guiutils.h" +#include "lwbuttonset.h" +#include "threadutils.h" +#include "thumbnail.h" class ThumbBrowserBase; class ThumbBrowserEntryBase @@ -71,7 +74,7 @@ protected: int ofsX, ofsY; // offset due to the scrolling of the parent - int redrawRequests; + std::atomic redrawRequests; ThumbBrowserBase* parent; ThumbBrowserEntryBase* original; diff --git a/rtgui/thumbimageupdater.cc b/rtgui/thumbimageupdater.cc index 185ca91b7..370112644 100644 --- a/rtgui/thumbimageupdater.cc +++ b/rtgui/thumbimageupdater.cc @@ -17,12 +17,18 @@ * along with RawTherapee. If not, see . */ +#include #include -#include "thumbimageupdater.h" + #include + +#include "thumbimageupdater.h" + #include "guiutils.h" #include "threadutils.h" +#include "../rtengine/procparams.h" + #ifdef _OPENMP #include #endif @@ -83,7 +89,7 @@ public: JobList jobs_; - unsigned int active_; + std::atomic active_; bool inactive_waiting_; @@ -157,13 +163,11 @@ public: j.listener_->updateImage(img, scale, thm->getProcParams().crop); } - { + if ( --active_ == 0 ) { Glib::Threads::Mutex::Lock lock(mutex_); - - if ( --active_ == 0 && - inactive_waiting_ ) { + if (inactive_waiting_) { inactive_waiting_ = false; - inactive_.signal(); + inactive_.broadcast(); } } } @@ -181,8 +185,11 @@ ThumbImageUpdater::ThumbImageUpdater(): { } -void -ThumbImageUpdater::add(ThumbBrowserEntryBase* tbe, bool* priority, bool upgrade, ThumbImageUpdateListener* l) +ThumbImageUpdater::~ThumbImageUpdater() { + delete impl_; +} + +void ThumbImageUpdater::add(ThumbBrowserEntryBase* tbe, bool* priority, bool upgrade, ThumbImageUpdateListener* l) { // nobody listening? if ( l == nullptr ) { @@ -208,7 +215,7 @@ ThumbImageUpdater::add(ThumbBrowserEntryBase* tbe, bool* priority, bool upgrade, } // 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()); @@ -216,49 +223,51 @@ ThumbImageUpdater::add(ThumbBrowserEntryBase* tbe, bool* priority, bool upgrade, } -void -ThumbImageUpdater::removeJobs(ThumbImageUpdateListener* listener) +void ThumbImageUpdater::removeJobs(ThumbImageUpdateListener* listener) { DEBUG("removeJobs(%p)", listener); - Glib::Threads::Mutex::Lock lock(impl_->mutex_); + { + Glib::Threads::Mutex::Lock lock(impl_->mutex_); - for( Impl::JobList::iterator i(impl_->jobs_.begin()); i != impl_->jobs_.end(); ) { - if (i->listener_ == listener) { - DEBUG("erasing specific job"); - Impl::JobList::iterator e(i++); - impl_->jobs_.erase(e); - } else { - ++i; + for( Impl::JobList::iterator i(impl_->jobs_.begin()); i != impl_->jobs_.end(); ) { + if (i->listener_ == listener) { + DEBUG("erasing specific job"); + Impl::JobList::iterator e(i++); + impl_->jobs_.erase(e); + } else { + ++i; + } } } while ( impl_->active_ != 0 ) { - // XXX this is nasty... it would be nicer if we weren't called with - // this lock held - GThreadUnLock unlock; DEBUG("waiting for running jobs1"); - impl_->inactive_waiting_ = true; - impl_->inactive_.wait(impl_->mutex_); + { + Glib::Threads::Mutex::Lock lock(impl_->mutex_); + impl_->inactive_waiting_ = true; + impl_->inactive_.wait(impl_->mutex_); + } } } -void -ThumbImageUpdater::removeAllJobs() +void ThumbImageUpdater::removeAllJobs() { DEBUG("stop"); - Glib::Threads::Mutex::Lock lock(impl_->mutex_); + { + Glib::Threads::Mutex::Lock lock(impl_->mutex_); - impl_->jobs_.clear(); + impl_->jobs_.clear(); + } while ( impl_->active_ != 0 ) { - // XXX this is nasty... it would be nicer if we weren't called with - // this lock held - GThreadUnLock unlock; DEBUG("waiting for running jobs2"); - impl_->inactive_waiting_ = true; - impl_->inactive_.wait(impl_->mutex_); + { + Glib::Threads::Mutex::Lock lock(impl_->mutex_); + impl_->inactive_waiting_ = true; + impl_->inactive_.wait(impl_->mutex_); + } } } diff --git a/rtgui/thumbimageupdater.h b/rtgui/thumbimageupdater.h index 3b34c9456..a3be44d7c 100644 --- a/rtgui/thumbimageupdater.h +++ b/rtgui/thumbimageupdater.h @@ -30,9 +30,7 @@ class ThumbImageUpdateListener { public: - virtual ~ThumbImageUpdateListener() - { - } + virtual ~ThumbImageUpdateListener() = default; /** * @brief Called when thumbnail image is update @@ -43,9 +41,7 @@ public: * * @note no locks are held when called back */ - virtual void updateImage(rtengine::IImage8* img, double scale, rtengine::procparams::CropParams cropParams) - { - } + virtual void updateImage(rtengine::IImage8* img, double scale, const rtengine::procparams::CropParams& cropParams) = 0; }; class ThumbImageUpdater : @@ -93,6 +89,7 @@ public: private: ThumbImageUpdater(); + ~ThumbImageUpdater(); class Impl; Impl* impl_; diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index bfb1b8797..757708002 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -25,6 +25,7 @@ #include #include #include "../rtengine/imagedata.h" +#include "../rtengine/procparams.h" #include #include "../rtengine/dynamicprofile.h" @@ -32,13 +33,25 @@ #include "batchqueue.h" #include "extprog.h" #include "profilestorecombobox.h" +#include "procparamchangers.h" using namespace rtengine::procparams; -Thumbnail::Thumbnail (CacheManager* cm, const Glib::ustring& fname, CacheImageData* cf) - : fname(fname), cfs(*cf), cachemgr(cm), ref(1), enqueueNumber(0), tpp(nullptr), - pparamsValid(false), needsReProcessing(true), imageLoading(false), lastImg(nullptr), - lastW(0), lastH(0), lastScale(0), initial_(false) +Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, CacheImageData* cf) : + fname(fname), + cfs(*cf), + cachemgr(cm), + ref(1), + enqueueNumber(0), + tpp(nullptr), + pparams(new ProcParams), + pparamsValid(false), + imageLoading(false), + lastImg(nullptr), + lastW(0), + lastH(0), + lastScale(0), + initial_(false) { loadProcParams (); @@ -63,10 +76,20 @@ Thumbnail::Thumbnail (CacheManager* cm, const Glib::ustring& fname, CacheImageDa tpp = nullptr; } -Thumbnail::Thumbnail (CacheManager* cm, const Glib::ustring& fname, const std::string& md5) - : fname(fname), cachemgr(cm), ref(1), enqueueNumber(0), tpp(nullptr), pparamsValid(false), - needsReProcessing(true), imageLoading(false), lastImg(nullptr), - lastW(0), lastH(0), lastScale(0.0), initial_(true) +Thumbnail::Thumbnail(CacheManager* cm, const Glib::ustring& fname, const std::string& md5) : + fname(fname), + cachemgr(cm), + ref(1), + enqueueNumber(0), + tpp(nullptr), + pparams(new ProcParams), + pparamsValid(false), + imageLoading(false), + lastImg(nullptr), + lastW(0), + lastH(0), + lastScale(0.0), + initial_(true) { @@ -106,20 +129,20 @@ void Thumbnail::_generateThumbnailImage () if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg") { infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams.wb.equal); + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams->wb.equal); if (tpp) { cfs.format = FT_Jpeg; } } else if (ext.lowercase() == "png") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams.wb.equal); + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams->wb.equal); if (tpp) { cfs.format = FT_Png; } } else if (ext.lowercase() == "tif" || ext.lowercase() == "tiff") { infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams.wb.equal); + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, 1, pparams->wb.equal); if (tpp) { cfs.format = FT_Tiff; @@ -140,7 +163,7 @@ void Thumbnail::_generateThumbnailImage () if ( tpp == nullptr ) { quick = false; - tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, tw, th, 1, pparams.wb.equal, TRUE); + tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, sensorType, tw, th, 1, pparams->wb.equal, TRUE); } cfs.sensortype = sensorType; @@ -155,7 +178,6 @@ void Thumbnail::_generateThumbnailImage () tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul); _saveThumbnail (); cfs.supported = true; - needsReProcessing = true; cfs.save (getCacheFileName ("data", ".txt")); @@ -178,22 +200,22 @@ const ProcParams& Thumbnail::getProcParams () const ProcParams& Thumbnail::getProcParamsU () { if (pparamsValid) { - return pparams; + return *pparams; } else { - pparams = *(ProfileStore::getInstance()->getDefaultProcParams (getType() == FT_Raw)); + *pparams = *(ProfileStore::getInstance()->getDefaultProcParams (getType() == FT_Raw)); - if (pparams.wb.method == "Camera") { + if (pparams->wb.method == "Camera") { double ct; - getCamWB (ct, pparams.wb.green); - pparams.wb.temperature = ct; - } else if (pparams.wb.method == "Auto") { + getCamWB (ct, pparams->wb.green); + pparams->wb.temperature = ct; + } else if (pparams->wb.method == "Auto") { double ct; - getAutoWB (ct, pparams.wb.green, pparams.wb.equal, pparams.wb.tempBias); - pparams.wb.temperature = ct; + getAutoWB (ct, pparams->wb.green, pparams->wb.equal, pparams->wb.tempBias); + pparams->wb.temperature = ct; } } - return pparams; // there is no valid pp to return, but we have to return something + return *pparams; // there is no valid pp to return, but we have to return something } /** @brief Create default params on demand and returns a new updatable object @@ -320,27 +342,27 @@ void Thumbnail::loadProcParams () MyMutex::MyLock lock(mutex); pparamsValid = false; - pparams.setDefaults(); + pparams->setDefaults(); const PartialProfile *defaultPP = ProfileStore::getInstance()->getDefaultPartialProfile(getType() == FT_Raw); - defaultPP->applyTo(&pparams); + defaultPP->applyTo(pparams.get()); if (options.paramsLoadLocation == PLL_Input) { // try to load it from params file next to the image file - int ppres = pparams.load (fname + paramFileExtension); - pparamsValid = !ppres && pparams.ppVersion >= 220; + int ppres = pparams->load (fname + paramFileExtension); + pparamsValid = !ppres && pparams->ppVersion >= 220; // if no success, try to load the cached version of the procparams if (!pparamsValid) { - pparamsValid = !pparams.load (getCacheFileName ("profiles", paramFileExtension)); + pparamsValid = !pparams->load (getCacheFileName ("profiles", paramFileExtension)); } } else { // try to load it from cache - pparamsValid = !pparams.load (getCacheFileName ("profiles", paramFileExtension)); + pparamsValid = !pparams->load (getCacheFileName ("profiles", paramFileExtension)); // if no success, try to load it from params file next to the image file if (!pparamsValid) { - int ppres = pparams.load (fname + paramFileExtension); - pparamsValid = !ppres && pparams.ppVersion >= 220; + int ppres = pparams->load (fname + paramFileExtension); + pparamsValid = !ppres && pparams->ppVersion >= 220; } } } @@ -368,13 +390,12 @@ void Thumbnail::clearProcParams (int whoClearedIt) cfs.recentlySaved = false; pparamsValid = false; - needsReProcessing = true; //TODO: run though customprofilebuilder? // probably not as this is the only option to set param values to default // reset the params to defaults - pparams.setDefaults(); + pparams->setDefaults(); // and restore rank and inTrash setRank(rank); @@ -413,60 +434,88 @@ void Thumbnail::clearProcParams (int whoClearedIt) } } -bool Thumbnail::hasProcParams () +bool Thumbnail::hasProcParams () const { return pparamsValid; } -void Thumbnail::setProcParams (const ProcParams& pp, ParamsEdited* pe, int whoChangedIt, bool updateCacheNow) +void Thumbnail::setProcParams (const ProcParams& pp, ParamsEdited* pe, int whoChangedIt, bool updateCacheNow, bool resetToDefault) { + const bool needsReprocessing = + resetToDefault + || pparams->toneCurve != pp.toneCurve + || pparams->labCurve != pp.labCurve + || pparams->localContrast != pp.localContrast + || pparams->rgbCurves != pp.rgbCurves + || pparams->colorToning != pp.colorToning + || pparams->vibrance != pp.vibrance + || pparams->wb != pp.wb + || pparams->colorappearance != pp.colorappearance + || pparams->epd != pp.epd + || pparams->fattal != pp.fattal + || pparams->sh != pp.sh + || pparams->crop != pp.crop + || pparams->coarse != pp.coarse + || pparams->commonTrans != pp.commonTrans + || pparams->rotate != pp.rotate + || pparams->distortion != pp.distortion + || pparams->lensProf != pp.lensProf + || pparams->perspective != pp.perspective + || pparams->gradient != pp.gradient + || pparams->pcvignette != pp.pcvignette + || pparams->cacorrection != pp.cacorrection + || pparams->vignetting != pp.vignetting + || pparams->chmixer != pp.chmixer + || pparams->blackwhite != pp.blackwhite + || pparams->icm != pp.icm + || pparams->hsvequalizer != pp.hsvequalizer + || pparams->filmSimulation != pp.filmSimulation + || pparams->softlight != pp.softlight + || pparams->dehaze != pp.dehaze + || whoChangedIt == FILEBROWSER + || whoChangedIt == BATCHEDITOR; { MyMutex::MyLock lock(mutex); - if (pparams.sharpening.threshold.isDouble() != pp.sharpening.threshold.isDouble()) { - printf("WARNING: Sharpening different!\n"); - } - - if (pparams.vibrance.psthreshold.isDouble() != pp.vibrance.psthreshold.isDouble()) { - printf("WARNING: Vibrance different!\n"); - } - - if (pparams != pp) { + if (*pparams != pp) { cfs.recentlySaved = false; + } else if (pparamsValid && !updateCacheNow) { + // nothing to do + return; } // do not update rank, colorlabel and inTrash - int rank = getRank(); - int colorlabel = getColorLabel(); - int inTrash = getStage(); + const int rank = getRank(); + const int colorlabel = getColorLabel(); + const int inTrash = getStage(); if (pe) { - pe->combine(pparams, pp, true); + pe->combine(*pparams, pp, true); } else { - pparams = pp; + *pparams = pp; } pparamsValid = true; - needsReProcessing = true; setRank(rank); setColorLabel(colorlabel); setStage(inTrash); if (updateCacheNow) { - updateCache (); + updateCache(); } - } // end of mutex lock - for (size_t i = 0; i < listeners.size(); i++) { - listeners[i]->procParamsChanged (this, whoChangedIt); + if (needsReprocessing) { + for (size_t i = 0; i < listeners.size(); i++) { + listeners[i]->procParamsChanged (this, whoChangedIt); + } } } -bool Thumbnail::isRecentlySaved () +bool Thumbnail::isRecentlySaved () const { return cfs.recentlySaved; @@ -479,7 +528,7 @@ void Thumbnail::imageDeveloped () cfs.save (getCacheFileName ("data", ".txt")); if (options.saveParamsCache) { - pparams.save (getCacheFileName ("profiles", paramFileExtension)); + pparams->save (getCacheFileName ("profiles", paramFileExtension)); } } @@ -495,17 +544,17 @@ void Thumbnail::imageRemovedFromQueue () enqueueNumber--; } -bool Thumbnail::isEnqueued () +bool Thumbnail::isEnqueued () const { return enqueueNumber > 0; } -bool Thumbnail::isPixelShift () +bool Thumbnail::isPixelShift () const { return cfs.isPixelShift; } -bool Thumbnail::isHDR () +bool Thumbnail::isHDR () const { return cfs.isHDR; } @@ -547,7 +596,7 @@ void Thumbnail::getThumbnailSize (int &w, int &h, const rtengine::procparams::Pr ppCoarse -= 180; } - int thisCoarse = this->pparams.coarse.rotate; + int thisCoarse = this->pparams->coarse.rotate; if (thisCoarse >= 180) { thisCoarse -= 180; @@ -594,6 +643,11 @@ void Thumbnail::getFinalSize (const rtengine::procparams::ProcParams& pparams, i } } +void Thumbnail::getOriginalSize (int& w, int& h) +{ + w = tw; + h = th; +} rtengine::IImage8* Thumbnail::processThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale) { @@ -694,13 +748,13 @@ void Thumbnail::generateExifDateTimeStrings () dateTimeString = ostr.str (); } -const Glib::ustring& Thumbnail::getExifString () +const Glib::ustring& Thumbnail::getExifString () const { return exifString; } -const Glib::ustring& Thumbnail::getDateTimeString () +const Glib::ustring& Thumbnail::getDateTimeString () const { return dateTimeString; @@ -798,7 +852,6 @@ int Thumbnail::infoFromImage (const Glib::ustring& fname, std::unique_ptrreadAEHistogram (getCacheFileName ("aehistograms", "")); + if(!tpp->isAeValid()) { + // load aehistogram + tpp->readAEHistogram (getCacheFileName ("aehistograms", "")); + } // load embedded profile tpp->readEmbProfile (getCacheFileName ("embprofiles", ".icc")); @@ -875,19 +930,15 @@ void Thumbnail::_saveThumbnail () return; } - if (g_remove (getCacheFileName ("images", ".rtti").c_str ()) != 0) { - // No file deleted, so we try to deleted obsolete files, if any - g_remove (getCacheFileName ("images", ".cust").c_str ()); - g_remove (getCacheFileName ("images", ".cust16").c_str ()); - g_remove (getCacheFileName ("images", ".jpg").c_str ()); - } + g_remove (getCacheFileName ("images", ".rtti").c_str ()); // save thumbnail image tpp->writeImage (getCacheFileName ("images", "")); - // save aehistogram - tpp->writeAEHistogram (getCacheFileName ("aehistograms", "")); - + if(!tpp->isAeValid()) { + // save aehistogram + tpp->writeAEHistogram (getCacheFileName ("aehistograms", "")); + } // save embedded profile tpp->writeEmbProfile (getCacheFileName ("embprofiles", ".icc")); @@ -919,7 +970,7 @@ void Thumbnail::updateCache (bool updatePParams, bool updateCacheImageData) { if (updatePParams && pparamsValid) { - pparams.save ( + pparams->save ( options.saveParamsFile ? fname + paramFileExtension : "", options.saveParamsCache ? getCacheFileName ("profiles", paramFileExtension) : "", true @@ -952,6 +1003,45 @@ void Thumbnail::setFileName (const Glib::ustring &fn) cfs.md5 = cachemgr->getMD5 (fname); } +int Thumbnail::getRank () const +{ + return pparams->rank; +} + +void Thumbnail::setRank (int rank) +{ + if (pparams->rank != rank) { + pparams->rank = rank; + pparamsValid = true; + } +} + +int Thumbnail::getColorLabel () const +{ + return pparams->colorlabel; +} + +void Thumbnail::setColorLabel (int colorlabel) +{ + if (pparams->colorlabel != colorlabel) { + pparams->colorlabel = colorlabel; + pparamsValid = true; + } +} + +int Thumbnail::getStage () const +{ + return pparams->inTrash; +} + +void Thumbnail::setStage (bool stage) +{ + if (pparams->inTrash != stage) { + pparams->inTrash = stage; + pparamsValid = true; + } +} + void Thumbnail::addThumbnailListener (ThumbnailListener* tnl) { diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index 3ef094d6b..0bcdd470a 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -19,7 +19,9 @@ #ifndef _THUMBNAIL_ #define _THUMBNAIL_ +#include #include + #include #include "cachemanager.h" #include "options.h" @@ -30,6 +32,8 @@ #include "threadutils.h" class CacheManager; +struct ParamsEdited; + class Thumbnail { @@ -47,9 +51,8 @@ class Thumbnail float imgRatio; // hack to avoid rounding error // double scale; // portion of the sizes of the processed thumbnail image and the full scale image - rtengine::procparams::ProcParams pparams; + const std::unique_ptr pparams; bool pparamsValid; - bool needsReProcessing; bool imageLoading; // these are the data of the result image of the last getthumbnailimage call (for caching purposes) @@ -81,44 +84,45 @@ public: Thumbnail (CacheManager* cm, const Glib::ustring& fname, const std::string& md5); ~Thumbnail (); - bool hasProcParams (); + bool hasProcParams () const; const rtengine::procparams::ProcParams& getProcParams (); const rtengine::procparams::ProcParams& getProcParamsU (); // Unprotected version // Use this to create params on demand for update ; if flaggingMode=true, the procparams is created for a file being flagged (inTrash, rank, colorLabel) rtengine::procparams::ProcParams* createProcParamsForUpdate (bool returnParams, bool force, bool flaggingMode = false); - void setProcParams (const rtengine::procparams::ProcParams& pp, ParamsEdited* pe = nullptr, int whoChangedIt = -1, bool updateCacheNow = true); + void setProcParams (const rtengine::procparams::ProcParams& pp, ParamsEdited* pe = nullptr, int whoChangedIt = -1, bool updateCacheNow = true, bool resetToDefault = false); void clearProcParams (int whoClearedIt = -1); void loadProcParams (); void notifylisterners_procParamsChanged(int whoChangedIt); - bool isQuick() + bool isQuick() const { return cfs.thumbImgType == CacheImageData::QUICK_THUMBNAIL; } - bool isPParamsValid() + bool isPParamsValid() const { return pparamsValid; } - bool isRecentlySaved (); + bool isRecentlySaved () const; void imageDeveloped (); void imageEnqueued (); void imageRemovedFromQueue (); - bool isEnqueued (); - bool isPixelShift (); - bool isHDR (); + bool isEnqueued () const; + bool isPixelShift () const; + bool isHDR () const; // 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); rtengine::IImage8* upgradeThumbImage (const rtengine::procparams::ProcParams& pparams, int h, double& scale); void getThumbnailSize (int &w, int &h, const rtengine::procparams::ProcParams *pparams = nullptr); void getFinalSize (const rtengine::procparams::ProcParams& pparams, int& w, int& h); + void getOriginalSize (int& w, int& h); - const Glib::ustring& getExifString (); - const Glib::ustring& getDateTimeString (); - void getCamWB (double& temp, double& green) + const Glib::ustring& getExifString () const; + const Glib::ustring& getDateTimeString () const; + void getCamWB (double& temp, double& green) const { if (tpp) { tpp->getCamWB (temp, green); @@ -143,7 +147,7 @@ public: } ThFileType getType (); - Glib::ustring getFileName () + Glib::ustring getFileName () const { return fname; } @@ -155,46 +159,19 @@ public: { return &cfs; } - std::string getMD5 () + std::string getMD5 () const { return cfs.md5; } - int getRank () - { - return pparams.rank; - } - void setRank (int rank) - { - if (pparams.rank != rank) { - pparams.rank = rank; - pparamsValid = true; - } - } + int getRank () const; + void setRank (int rank); - int getColorLabel () - { - return pparams.colorlabel; - } - void setColorLabel (int colorlabel) - { - if (pparams.colorlabel != colorlabel) { - pparams.colorlabel = colorlabel; - pparamsValid = true; - } - } + int getColorLabel () const; + void setColorLabel (int colorlabel); - int getStage () - { - return pparams.inTrash; - } - void setStage (bool stage) - { - if (pparams.inTrash != stage) { - pparams.inTrash = stage; - pparamsValid = true; - } - } + int getStage () const; + void setStage (bool stage); void addThumbnailListener (ThumbnailListener* tnl); void removeThumbnailListener (ThumbnailListener* tnl); diff --git a/rtgui/thumbnaillistener.h b/rtgui/thumbnaillistener.h index 3c4200838..99a9a9286 100644 --- a/rtgui/thumbnaillistener.h +++ b/rtgui/thumbnaillistener.h @@ -19,16 +19,13 @@ #ifndef _THUMBNAILLISTENER_ #define _THUMBNAILLISTENER_ -#include "thumbnail.h" - class Thumbnail; + class ThumbnailListener { - public: - - virtual void procParamsChanged (Thumbnail* thm, int whoChangedIt) {} - + virtual ~ThumbnailListener() = default; + virtual void procParamsChanged(Thumbnail* thm, int whoChangedIt) = 0; }; #endif diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 07822f857..1bd8b2cbd 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -16,13 +16,18 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "tonecurve.h" -#include "adjuster.h" -#include #include -#include "ppversion.h" + +#include + +#include "tonecurve.h" + +#include "adjuster.h" #include "edit.h" #include "eventmapper.h" +#include "ppversion.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; @@ -32,6 +37,7 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA auto m = ProcEventMapper::getInstance(); EvHistMatching = m->newEvent(AUTOEXP, "HISTORY_MSG_HISTMATCHING"); EvHistMatchingBatch = m->newEvent(M_VOID, "HISTORY_MSG_HISTMATCHING"); + EvClampOOG = m->newEvent(DARKFRAME, "HISTORY_MSG_CLAMPOOG"); CurveListener::setMulti(true); @@ -39,9 +45,15 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA bottomMilestones.push_back( GradientMilestone(0., 0., 0., 0.) ); bottomMilestones.push_back( GradientMilestone(1., 1., 1., 1.) ); +//----------- OOG clamping ---------------------------------- + clampOOG = Gtk::manage(new Gtk::CheckButton(M("TP_EXPOSURE_CLAMPOOG"))); + pack_start(*clampOOG); + pack_start (*Gtk::manage (new Gtk::HSeparator())); + clampOOG->signal_toggled().connect(sigc::mem_fun(*this, &ToneCurve::clampOOGChanged)); + //----------- Auto Levels ---------------------------------- abox = Gtk::manage (new Gtk::HBox ()); - abox->set_spacing (10); + abox->set_spacing (4); autolevels = Gtk::manage (new Gtk::ToggleButton (M("TP_EXPOSURE_AUTOLEVELS"))); autolevels->set_tooltip_markup (M("TP_EXPOSURE_AUTOLEVELS_TIP")); @@ -99,16 +111,18 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA pack_start (*Gtk::manage (new Gtk::HSeparator())); expcomp = Gtk::manage (new Adjuster (M("TP_EXPOSURE_EXPCOMP"), -5, 12, 0.05, 0)); + expcomp->setLogScale(2, 0, true); pack_start (*expcomp); //----------- Highlight recovery & threshold ------------- hlcompr = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRHIGHLIGHTS"), 0, 500, 1, 0)); pack_start (*hlcompr); - hlcomprthresh = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD"), 0, 100, 1, 33)); + hlcomprthresh = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRHIGHLIGHTSTHRESHOLD"), 0, 100, 1, 0)); pack_start (*hlcomprthresh); //----------- Black Level & Compression ------------------- black = Gtk::manage (new Adjuster (M("TP_EXPOSURE_BLACKLEVEL"), -16384, 32768, 50, 0)); + black->setLogScale(10, 0, true); pack_start (*black); shcompr = Gtk::manage (new Adjuster (M("TP_EXPOSURE_COMPRSHADOWS"), 0, 100, 1, 50)); pack_start (*shcompr); @@ -123,6 +137,10 @@ ToneCurve::ToneCurve () : FoldableToolPanel(this, "tonecurve", M("TP_EXPOSURE_LA saturation = Gtk::manage (new Adjuster (M("TP_EXPOSURE_SATURATION"), -100, 100, 1, 0)); pack_start (*saturation); + brightness->setLogScale(2, 0, true); + contrast->setLogScale(2, 0, true); + saturation->setLogScale(2, 0, true); + //----------- Curve 1 ------------------------------ pack_start (*Gtk::manage (new Gtk::HSeparator())); @@ -222,10 +240,14 @@ void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) hlcomprthresh->setValue (pp->toneCurve.hlcomprthresh); shcompr->setValue (pp->toneCurve.shcompr); - if (!black->getAddMode()) { + if (!black->getAddMode() && !batchMode) { shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect } + if (!hlcompr->getAddMode() && !batchMode) { + hlcomprthresh->set_sensitive(!((int)hlcompr->getValue () == 0)); //at hlcompr=0 hlcomprthresh value has no effect + } + brightness->setValue (pp->toneCurve.brightness); contrast->setValue (pp->toneCurve.contrast); saturation->setValue (pp->toneCurve.saturation); @@ -236,6 +258,8 @@ void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) toneCurveMode2->set_active(rtengine::toUnderlying(pp->toneCurve.curveMode2)); histmatching->set_active(pp->toneCurve.histmatching); + fromHistMatching = pp->toneCurve.fromHistMatching; + clampOOG->set_active(pp->toneCurve.clampOOG); if (pedited) { expcomp->setEditedState (pedited->toneCurve.expcomp ? Edited : UnEdited); @@ -261,6 +285,7 @@ void ToneCurve::read (const ProcParams* pp, const ParamsEdited* pedited) } histmatching->set_inconsistent(!pedited->toneCurve.histmatching); + clampOOG->set_inconsistent(!pedited->toneCurve.clampOOG); } enaconn.block (true); @@ -327,36 +352,38 @@ void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) int tcMode = toneCurveMode->get_active_row_number(); if (tcMode == 0) { - pp->toneCurve.curveMode = ToneCurveParams::TcMode::STD; + pp->toneCurve.curveMode = ToneCurveMode::STD; } else if (tcMode == 1) { - pp->toneCurve.curveMode = ToneCurveParams::TcMode::WEIGHTEDSTD; + pp->toneCurve.curveMode = ToneCurveMode::WEIGHTEDSTD; } else if (tcMode == 2) { - pp->toneCurve.curveMode = ToneCurveParams::TcMode::FILMLIKE; + pp->toneCurve.curveMode = ToneCurveMode::FILMLIKE; } else if (tcMode == 3) { - pp->toneCurve.curveMode = ToneCurveParams::TcMode::SATANDVALBLENDING; + pp->toneCurve.curveMode = ToneCurveMode::SATANDVALBLENDING; } else if (tcMode == 4) { - pp->toneCurve.curveMode = ToneCurveParams::TcMode::LUMINANCE; + pp->toneCurve.curveMode = ToneCurveMode::LUMINANCE; } else if (tcMode == 5) { - pp->toneCurve.curveMode = ToneCurveParams::TcMode::PERCEPTUAL; + pp->toneCurve.curveMode = ToneCurveMode::PERCEPTUAL; } tcMode = toneCurveMode2->get_active_row_number(); if (tcMode == 0) { - pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::STD; + pp->toneCurve.curveMode2 = ToneCurveMode::STD; } else if (tcMode == 1) { - pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::WEIGHTEDSTD; + pp->toneCurve.curveMode2 = ToneCurveMode::WEIGHTEDSTD; } else if (tcMode == 2) { - pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::FILMLIKE; + pp->toneCurve.curveMode2 = ToneCurveMode::FILMLIKE; } else if (tcMode == 3) { - pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::SATANDVALBLENDING; + pp->toneCurve.curveMode2 = ToneCurveMode::SATANDVALBLENDING; } else if (tcMode == 4) { - pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::LUMINANCE; + pp->toneCurve.curveMode2 = ToneCurveMode::LUMINANCE; } else if (tcMode == 5) { - pp->toneCurve.curveMode2 = ToneCurveParams::TcMode::PERCEPTUAL; + pp->toneCurve.curveMode2 = ToneCurveMode::PERCEPTUAL; } pp->toneCurve.histmatching = histmatching->get_active(); + pp->toneCurve.fromHistMatching = fromHistMatching; + pp->toneCurve.clampOOG = clampOOG->get_active(); if (pedited) { pedited->toneCurve.expcomp = expcomp->getEditedState (); @@ -376,6 +403,8 @@ void ToneCurve::write (ProcParams* pp, ParamsEdited* pedited) pedited->toneCurve.method = method->get_active_row_number() != 4; pedited->toneCurve.hrenabled = !hrenabled->get_inconsistent(); pedited->toneCurve.histmatching = !histmatching->get_inconsistent(); + pedited->toneCurve.fromHistMatching = true; + pedited->toneCurve.clampOOG = !clampOOG->get_inconsistent(); } pp->toneCurve.hrenabled = hrenabled->get_active(); @@ -443,6 +472,17 @@ void ToneCurve::methodChanged () } } } + + +void ToneCurve::clampOOGChanged() +{ + if (listener) { + listener->panelChanged(EvClampOOG, clampOOG->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} + + + void ToneCurve::setRaw (bool raw) { @@ -552,9 +592,8 @@ float ToneCurve::blendPipetteValues(CurveEditor *ce, float chan1, float chan2, f return CurveListener::blendPipetteValues(ce, chan1, chan2, chan3); } -void ToneCurve::adjusterChanged (Adjuster* a, double newval) +void ToneCurve::adjusterChanged(Adjuster* a, double newval) { - // Switch off auto exposure if user changes sliders manually if (autolevels->get_active() && (a == expcomp || a == brightness || a == contrast || a == black || a == hlcompr || a == hlcomprthresh)) { autoconn.block(true); @@ -570,7 +609,7 @@ void ToneCurve::adjusterChanged (Adjuster* a, double newval) if (a != expcomp && a != hlcompr && a != hlcomprthresh) { setHistmatching(false); } - + Glib::ustring costr; if (a == expcomp) { @@ -586,7 +625,7 @@ void ToneCurve::adjusterChanged (Adjuster* a, double newval) } else if (a == black) { listener->panelChanged (EvBlack, costr); - if (!black->getAddMode()) { + if (!black->getAddMode() && !batchMode) { shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect } } else if (a == contrast) { @@ -595,6 +634,10 @@ void ToneCurve::adjusterChanged (Adjuster* a, double newval) listener->panelChanged (EvSaturation, costr); } else if (a == hlcompr) { listener->panelChanged (EvHLCompr, costr); + + if (!hlcompr->getAddMode() && !batchMode) { + hlcomprthresh->set_sensitive(!((int)hlcompr->getValue () == 0)); //at hlcompr=0 hlcomprthresh value has no effect + } } else if (a == hlcomprthresh) { listener->panelChanged (EvHLComprThreshold, costr); } else if (a == shcompr) { @@ -602,13 +645,17 @@ void ToneCurve::adjusterChanged (Adjuster* a, double newval) } } +void ToneCurve::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void ToneCurve::neutral_pressed () { // 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); @@ -635,10 +682,14 @@ void ToneCurve::neutral_pressed () hlrbox->hide(); } - if (!black->getAddMode()) { + if (!black->getAddMode() && !batchMode) { shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect } + if (!hlcompr->getAddMode() && !batchMode) { + hlcomprthresh->set_sensitive(!((int)hlcompr->getValue () == 0)); //at hlcompr=0 hlcomprthresh value has no effect + } + contrast->setValue(0); //saturation->setValue(0); @@ -708,6 +759,11 @@ void ToneCurve::autolevels_toggled () if (!black->getAddMode()) { shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect } + + if (!hlcompr->getAddMode() && !batchMode) { + hlcomprthresh->set_sensitive(!((int)hlcompr->getValue () == 0)); //at hlcompr=0 hlcomprthresh value has no effect + } + } else { listener->panelChanged (EvFixedExp, M("GENERAL_DISABLED")); } @@ -760,25 +816,6 @@ void ToneCurve::waitForAutoExp () histmatching->set_sensitive(false); } -void ToneCurve::autoExpChanged (double expcomp, int bright, int contr, int black, int hlcompr, int hlcomprthresh, bool hlrecons) -{ - nextBlack = black; - nextExpcomp = expcomp; - nextBrightness = bright; - nextContrast = contr; - nextHlcompr = hlcompr; - nextHlcomprthresh = hlcomprthresh; - nextHLRecons = hlrecons; - - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->autoExpComputed_(); - - return FALSE; - }; - - idle_register.add(func, this); -} - void ToneCurve::enableAll () { @@ -800,37 +837,6 @@ void ToneCurve::enableAll () histmatching->set_sensitive(true); } -bool ToneCurve::autoExpComputed_ () -{ - - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected - disableListener (); - enableAll (); - expcomp->setValue (nextExpcomp); - brightness->setValue (nextBrightness); - contrast->setValue (nextContrast); - black->setValue (nextBlack); - hlcompr->setValue (nextHlcompr); - hlcomprthresh->setValue (nextHlcomprthresh); - enaconn.block (true); - hrenabled->set_active (nextHLRecons); - enaconn.block (false); - - if (nextHLRecons) { - hlrbox->show(); - } else if (!batchMode) { - hlrbox->hide(); - } - - if (!black->getAddMode()) { - shcompr->set_sensitive(!((int)black->getValue () == 0)); //at black=0 shcompr value has no effect - } - - enableListener (); - - return false; -} - void ToneCurve::setBatchMode (bool batchMode) { ToolPanel::setBatchMode (batchMode); @@ -885,15 +891,26 @@ void ToneCurve::trimValues (rtengine::procparams::ProcParams* pp) saturation->trimValue(pp->toneCurve.saturation); } -void ToneCurve::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 ToneCurve::updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI +) { - - shape->updateBackgroundHistogram (histToneCurve); + shape->updateBackgroundHistogram(histToneCurve); } void ToneCurve::setHistmatching(bool enabled) { + fromHistMatching = enabled; if (histmatching->get_active()) { histmatchconn.block(true); histmatching->set_active(enabled); @@ -908,6 +925,7 @@ void ToneCurve::histmatchingToggled() if (listener) { if (!batchMode) { if (histmatching->get_active()) { + fromHistMatching = false; listener->panelChanged(EvHistMatching, M("GENERAL_ENABLED")); waitForAutoExp(); } else { @@ -919,50 +937,93 @@ void ToneCurve::histmatchingToggled() } } +void ToneCurve::autoExpChanged(double expcomp, int bright, int contr, int black, int hlcompr, int hlcomprthresh, bool hlrecons) +{ + nextBlack = black; + nextExpcomp = expcomp; + nextBrightness = bright; + nextContrast = contr; + nextHlcompr = hlcompr; + nextHlcomprthresh = hlcomprthresh; + nextHLRecons = hlrecons; -void ToneCurve::autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve) + idle_register.add( + [this]() -> bool + { + GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected + // FIXME: We don't need the GThreadLock, don't we? + disableListener(); + enableAll(); + this->expcomp->setValue(nextExpcomp); + brightness->setValue(nextBrightness); + contrast->setValue(nextContrast); + this->black->setValue(nextBlack); + this->hlcompr->setValue(nextHlcompr); + this->hlcomprthresh->setValue(nextHlcomprthresh); + enaconn.block(true); + hrenabled->set_active(nextHLRecons); + enaconn.block(false); + + if (nextHLRecons) { + hlrbox->show(); + } else if (!batchMode) { + hlrbox->hide(); + } + + if (!this->black->getAddMode() && !batchMode) { + shcompr->set_sensitive(static_cast(this->black->getValue())); //at black=0 shcompr value has no effect + } + + if (!this->hlcompr->getAddMode() && !batchMode) { + this->hlcomprthresh->set_sensitive(static_cast(this->hlcompr->getValue())); //at hlcompr=0 hlcomprthresh value has no effect + } + + enableListener(); + return false; + } + ); +} + +void ToneCurve::autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveMode curveMode, const std::vector& curve) { nextToneCurveMode = curveMode; nextToneCurve = curve; - const auto func = [](gpointer data) -> gboolean { - static_cast(data)->histmatchingComputed(); + idle_register.add( + [this]() -> bool + { + GThreadLock lock; // FIXME: Obsolete + disableListener(); + enableAll(); + brightness->setValue(0); + contrast->setValue(0); + black->setValue(0); - return FALSE; - }; + if (!black->getAddMode() && !batchMode) { + shcompr->set_sensitive(static_cast(black->getValue())); + } - idle_register.add(func, this); -} - - -bool ToneCurve::histmatchingComputed() -{ - GThreadLock lock; - disableListener(); - enableAll(); - brightness->setValue(0); - contrast->setValue(0); - black->setValue(0); - hlcompr->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; + if (!hlcompr->getAddMode() && !batchMode) { + hlcomprthresh->set_sensitive(static_cast(hlcompr->getValue())); //at hlcompr=0 hlcomprthresh value has no effect + } + + 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(); + fromHistMatching = true; + + return false; + } + ); } diff --git a/rtgui/tonecurve.h b/rtgui/tonecurve.h index e85fefa39..47789ec01 100644 --- a/rtgui/tonecurve.h +++ b/rtgui/tonecurve.h @@ -58,6 +58,8 @@ protected: MyComboBoxText* toneCurveMode; MyComboBoxText* toneCurveMode2; Gtk::ToggleButton *histmatching; + bool fromHistMatching; + Gtk::CheckButton *clampOOG; bool clipDirty, lastAuto; sigc::connection autoconn, neutralconn, tcmodeconn, tcmode2conn; @@ -69,7 +71,8 @@ protected: rtengine::ProcEvent EvHistMatching; rtengine::ProcEvent EvHistMatchingBatch; - + rtengine::ProcEvent EvClampOOG; + // used temporarily in eventing double nextExpcomp; int nextBrightness; @@ -78,52 +81,64 @@ protected: int nextHlcompr; int nextHlcomprthresh; bool nextHLRecons; - rtengine::procparams::ToneCurveParams::TcMode nextToneCurveMode; + rtengine::procparams::ToneCurveMode nextToneCurveMode; std::vector nextToneCurve; void setHistmatching(bool enabled); public: ToneCurve (); - ~ToneCurve (); + ~ToneCurve () override; - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void setAdjusterBehavior (bool expadd, bool hlcompadd, bool hlcompthreshadd, bool bradd, bool blackadd, bool shcompadd, bool contradd, bool satadd); - void trimValues (rtengine::procparams::ProcParams* pp); - void autoOpenCurve (); - void setEditProvider (EditDataProvider *provider); + void trimValues (rtengine::procparams::ProcParams* pp) override; + void autoOpenCurve () override; + void setEditProvider (EditDataProvider *provider) override; - virtual float blendPipetteValues (CurveEditor *ce, float chan1, float chan2, float chan3); + float blendPipetteValues (CurveEditor *ce, float chan1, float chan2, float chan3) override; - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; void neutral_pressed (); void autolevels_toggled (); void clip_changed (); bool clip_changed_ (); void waitForAutoExp (); - void autoExpChanged (double expcomp, int bright, int contr, int black, int hlcompr, int hlcomprthresh, bool hlrecons); - bool autoExpComputed_ (); void enableAll (); - void curveChanged (CurveEditor* ce); + void curveChanged (CurveEditor* ce) override; void curveMode1Changed (); bool curveMode1Changed_ (); void curveMode2Changed (); bool curveMode2Changed_ (); void expandCurve (bool isExpanded); 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 updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI + ); void histmatchingToggled(); - void autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveParams::TcMode curveMode, const std::vector &curve); - bool histmatchingComputed(); + + void autoExpChanged(double expcomp, int bright, int contr, int black, int hlcompr, int hlcomprthresh, bool hlrecons) override; + void autoMatchedToneCurveChanged(rtengine::procparams::ToneCurveMode curveMode, const std::vector& curve) override; void setRaw (bool raw); void hrenabledChanged (); void methodChanged (); + void clampOOGChanged(); }; #endif diff --git a/rtgui/toolbar.cc b/rtgui/toolbar.cc index cf5148d8b..9bed78768 100644 --- a/rtgui/toolbar.cc +++ b/rtgui/toolbar.cc @@ -26,8 +26,8 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n editingMode = false; - handimg.reset(new RTImage("openhand.png")); - editinghandimg.reset(new RTImage("editmodehand.png")); + handimg.reset(new RTImage("hand-open.png")); + editinghandimg.reset(new RTImage("crosshair-adjust.png")); handTool = Gtk::manage (new Gtk::ToggleButton ()); handTool->add (*handimg); @@ -38,7 +38,7 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*handTool); wbTool = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* wbimg = Gtk::manage (new RTImage ("gtk-color-picker.png")); + Gtk::Image* wbimg = Gtk::manage (new RTImage ("color-picker.png")); wbTool->add (*wbimg); wbimg->show (); wbTool->set_relief(Gtk::RELIEF_NONE); @@ -46,8 +46,8 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*wbTool); - showcolpickersimg.reset(new RTImage("colorPickers-show.png")); - hidecolpickersimg.reset(new RTImage("colorPickers-hide.png")); + showcolpickersimg.reset(new RTImage("color-picker-bars.png")); + hidecolpickersimg.reset(new RTImage("color-picker-hide.png")); colPickerTool = Gtk::manage (new Gtk::ToggleButton ()); colPickerTool->add (*showcolpickersimg); @@ -67,7 +67,7 @@ ToolBar::ToolBar () : showColPickers(true), listener (nullptr), pickerListener(n pack_start (*cropTool); straTool = Gtk::manage (new Gtk::ToggleButton ()); - Gtk::Image* straimg = Gtk::manage (new RTImage ("straighten.png")); + Gtk::Image* straimg = Gtk::manage (new RTImage ("rotate-straighten.png")); straTool->add (*straimg); straimg->show (); straTool->set_relief(Gtk::RELIEF_NONE); diff --git a/rtgui/toolbar.h b/rtgui/toolbar.h index 42e764952..2d859eac7 100644 --- a/rtgui/toolbar.h +++ b/rtgui/toolbar.h @@ -28,12 +28,12 @@ class ToolBarListener { public: - virtual ~ToolBarListener() {} + virtual ~ToolBarListener() = default; /// Callback when a tool is selected - virtual void toolSelected (ToolMode tool) {} + virtual void toolSelected(ToolMode tool) = 0; /// Callback when the Edit mode is stopped - virtual void editModeSwitchedOff () {} + virtual void editModeSwitchedOff() = 0; }; class ToolBar : public Gtk::HBox diff --git a/rtgui/toolpanel.cc b/rtgui/toolpanel.cc index 812203517..1fe9808cd 100644 --- a/rtgui/toolpanel.cc +++ b/rtgui/toolpanel.cc @@ -20,6 +20,8 @@ #include "toolpanelcoord.h" #include "guiutils.h" +#include "../rtengine/procparams.h" + using namespace rtengine::procparams; @@ -56,7 +58,7 @@ FoldableToolPanel::FoldableToolPanel(Gtk::Box* content, Glib::ustring toolName, label->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); titleHBox->pack_start(*label, Gtk::PACK_EXPAND_WIDGET, 0); - RTImage *image = Gtk::manage (new RTImage("zoom-100-identifier.png")); + RTImage *image = Gtk::manage (new RTImage("one-to-one-small.png")); image->set_tooltip_text(M("TP_GENERAL_11SCALE_TOOLTIP")); titleHBox->pack_end(*image, Gtk::PACK_SHRINK, 0); @@ -146,5 +148,14 @@ void FoldableToolPanel::setEnabledTooltipText(Glib::ustring tooltipText) } } - +void FoldableToolPanel::setGrayedOut(bool doGrayOut) +{ + if (doGrayOut) { + exp->setEnabled(false); + exp->set_expanded(false); + exp->set_sensitive(false); + } else { + exp->set_sensitive(true); + } +} diff --git a/rtgui/toolpanel.h b/rtgui/toolpanel.h index d3d7439a9..521d52949 100644 --- a/rtgui/toolpanel.h +++ b/rtgui/toolpanel.h @@ -22,7 +22,6 @@ #include #include #include "../rtengine/rtengine.h" -#include "../rtengine/procparams.h" #include "guiutils.h" #include "multilangmgr.h" #include "paramsedited.h" @@ -33,11 +32,9 @@ class FoldableToolPanel; class ToolPanelListener { - public: - - virtual ~ToolPanelListener() {} - virtual void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr) {} + virtual ~ToolPanelListener() = default; + virtual void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) = 0; }; /// @brief This class control the space around the group of tools inside a tab, as well as the space separating each tool. */ @@ -133,6 +130,9 @@ public: this->batchMode = batchMode; } + virtual Glib::ustring getToolName () { + return toolName; + } }; class FoldableToolPanel : public ToolPanel @@ -150,11 +150,11 @@ public: FoldableToolPanel(Gtk::Box* content, Glib::ustring toolName, Glib::ustring UILabel, bool need11 = false, bool useEnabled = false); - MyExpander* getExpander() + MyExpander* getExpander() override { return exp; } - void setExpanded (bool expanded) + void setExpanded (bool expanded) override { if (exp) { exp->set_expanded( expanded ); @@ -172,7 +172,7 @@ public: exp->show(); } } - bool getExpanded () + bool getExpanded () override { if (exp) { return exp->get_expanded(); @@ -180,11 +180,11 @@ public: return false; } - void setParent (Gtk::Box* parent) + void setParent (Gtk::Box* parent) override { parentContainer = parent; } - Gtk::Box* getParent () + Gtk::Box* getParent () override { return parentContainer; } @@ -205,6 +205,7 @@ public: void setEnabledTooltipText(Glib::ustring tooltipText); bool get_inconsistent(); // related to the enabled/disabled state void set_inconsistent(bool isInconsistent); // related to the enabled/disabled state + void setGrayedOut(bool doGrayOut); // Set whether the tool should be disabled, collapsed and grayed-out. void setLevel (int level); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 8233779ce..47796ee94 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -28,9 +28,10 @@ using namespace rtengine::procparams; -ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChanged (false), editDataProvider (nullptr) +ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), favoritePanelSW(nullptr), hasChanged (false), editDataProvider (nullptr) { + favoritePanel = Gtk::manage (new ToolVBox ()); exposurePanel = Gtk::manage (new ToolVBox ()); detailsPanel = Gtk::manage (new ToolVBox ()); colorPanel = Gtk::manage (new ToolVBox ()); @@ -41,13 +42,13 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan coarse = Gtk::manage (new CoarsePanel ()); toneCurve = Gtk::manage (new ToneCurve ()); shadowshighlights = Gtk::manage (new ShadowsHighlights ()); - localContrast = Gtk::manage(new LocalContrast()); impulsedenoise = Gtk::manage (new ImpulseDenoise ()); defringe = Gtk::manage (new Defringe ()); spot = Gtk::manage (new Spot ()); 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 ()); @@ -77,6 +78,8 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan dirpyrequalizer = Gtk::manage (new DirPyrEqualizer ()); hsvequalizer = Gtk::manage (new HSVEqualizer ()); filmSimulation = Gtk::manage (new FilmSimulation ()); + softlight = Gtk::manage(new SoftLight()); + dehaze = Gtk::manage(new Dehaze()); sensorbayer = Gtk::manage (new SensorBayer ()); sensorxtrans = Gtk::manage (new SensorXTrans ()); bayerprocess = Gtk::manage (new BayerProcess ()); @@ -99,57 +102,68 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan // Valeurs par dfaut: // Best -> low ISO // Medium -> High ISO + favorites.resize(options.favorites.size(), nullptr); - addPanel (colorPanel, whitebalance); - addPanel (exposurePanel, toneCurve); - addPanel (colorPanel, vibrance); - addPanel (colorPanel, chmixer); - addPanel (colorPanel, blackwhite); - addPanel (exposurePanel, localContrast); - addPanel (exposurePanel, shadowshighlights); - addPanel (detailsPanel, spot); - addPanel (detailsPanel, sharpening); - addPanel (detailsPanel, sharpenEdge); - addPanel (detailsPanel, sharpenMicro); - addPanel (colorPanel, hsvequalizer); - addPanel (colorPanel, filmSimulation); - addPanel (colorPanel, rgbcurves); - addPanel (colorPanel, colortoning); - addPanel (exposurePanel, epd); - addPanel (exposurePanel, fattal); - addPanel (advancedPanel, retinex); - addPanel (exposurePanel, pcvignette); - addPanel (exposurePanel, gradient); - addPanel (exposurePanel, lcurve); - addPanel (advancedPanel, colorappearance); - addPanel (detailsPanel, impulsedenoise); - addPanel (detailsPanel, dirpyrdenoise); - addPanel (detailsPanel, defringe); - addPanel (detailsPanel, dirpyrequalizer); - addPanel (advancedPanel, wavelet); - addPanel (transformPanel, crop); - addPanel (transformPanel, resize); + addfavoritePanel (colorPanel, whitebalance); + addfavoritePanel (exposurePanel, toneCurve); + addfavoritePanel (colorPanel, vibrance); + addfavoritePanel (colorPanel, chmixer); + addfavoritePanel (colorPanel, blackwhite); + addfavoritePanel (exposurePanel, shadowshighlights); + addfavoritePanel (detailsPanel, spot); + addfavoritePanel (detailsPanel, sharpening); + addfavoritePanel (detailsPanel, localContrast); + addfavoritePanel (detailsPanel, sharpenEdge); + addfavoritePanel (detailsPanel, sharpenMicro); + addfavoritePanel (colorPanel, hsvequalizer); + addfavoritePanel (colorPanel, filmSimulation); + addfavoritePanel (colorPanel, softlight); + addfavoritePanel (colorPanel, rgbcurves); + addfavoritePanel (colorPanel, colortoning); + addfavoritePanel (exposurePanel, epd); + addfavoritePanel (exposurePanel, fattal); + addfavoritePanel (advancedPanel, retinex); + addfavoritePanel (exposurePanel, pcvignette); + addfavoritePanel (exposurePanel, gradient); + addfavoritePanel (exposurePanel, lcurve); + addfavoritePanel (advancedPanel, colorappearance); + addfavoritePanel (detailsPanel, impulsedenoise); + addfavoritePanel (detailsPanel, dirpyrdenoise); + addfavoritePanel (detailsPanel, defringe); + addfavoritePanel (detailsPanel, dirpyrequalizer); + addfavoritePanel (detailsPanel, dehaze); + addfavoritePanel (advancedPanel, wavelet); + addfavoritePanel (transformPanel, crop); + addfavoritePanel (transformPanel, resize); addPanel (resize->getPackBox(), prsharpening, 2); - addPanel (transformPanel, lensgeom); - addPanel (lensgeom->getPackBox(), rotate, 2); - addPanel (lensgeom->getPackBox(), perspective, 2); - addPanel (lensgeom->getPackBox(), lensProf, 2); - addPanel (lensgeom->getPackBox(), distortion, 2); - addPanel (lensgeom->getPackBox(), cacorrection, 2); - addPanel (lensgeom->getPackBox(), vignetting, 2); - addPanel (colorPanel, icm); - addPanel (rawPanel, sensorbayer); - addPanel (sensorbayer->getPackBox(), bayerprocess, 2); - addPanel (sensorbayer->getPackBox(), bayerrawexposure, 2); - addPanel (sensorbayer->getPackBox(), bayerpreprocess, 2); - addPanel (sensorbayer->getPackBox(), rawcacorrection, 2); - addPanel (rawPanel, sensorxtrans); - addPanel (sensorxtrans->getPackBox(), xtransprocess, 2); - addPanel (sensorxtrans->getPackBox(), xtransrawexposure, 2); - addPanel (rawPanel, rawexposure); - addPanel (rawPanel, preprocess); - addPanel (rawPanel, darkframe); - addPanel (rawPanel, flatfield); + addfavoritePanel (transformPanel, lensgeom); + addfavoritePanel (lensgeom->getPackBox(), rotate, 2); + addfavoritePanel (lensgeom->getPackBox(), perspective, 2); + addfavoritePanel (lensgeom->getPackBox(), lensProf, 2); + addfavoritePanel (lensgeom->getPackBox(), distortion, 2); + addfavoritePanel (lensgeom->getPackBox(), cacorrection, 2); + addfavoritePanel (lensgeom->getPackBox(), vignetting, 2); + addfavoritePanel (colorPanel, icm); + addfavoritePanel (rawPanel, sensorbayer); + addfavoritePanel (sensorbayer->getPackBox(), bayerprocess, 2); + addfavoritePanel (sensorbayer->getPackBox(), bayerrawexposure, 2); + addfavoritePanel (sensorbayer->getPackBox(), bayerpreprocess, 2); + addfavoritePanel (sensorbayer->getPackBox(), rawcacorrection, 2); + addfavoritePanel (rawPanel, sensorxtrans); + addfavoritePanel (sensorxtrans->getPackBox(), xtransprocess, 2); + addfavoritePanel (sensorxtrans->getPackBox(), xtransrawexposure, 2); + addfavoritePanel (rawPanel, rawexposure); + addfavoritePanel (rawPanel, preprocess); + addfavoritePanel (rawPanel, darkframe); + addfavoritePanel (rawPanel, flatfield); + + int favoriteCount = 0; + for(auto it = favorites.begin(); it != favorites.end(); ++it) { + if (*it) { + addPanel(favoritePanel, *it); + ++favoriteCount; + } + } toolPanels.push_back (coarse); toolPanels.push_back(metadata); @@ -157,60 +171,66 @@ ToolPanelCoordinator::ToolPanelCoordinator (bool batch) : ipc (nullptr), hasChan toolPanelNotebook = new Gtk::Notebook (); toolPanelNotebook->set_name ("ToolPanelNotebook"); - 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 ()); - advancedPanelSW = Gtk::manage (new MyScrolledWindow ()); + advancedPanelSW = Gtk::manage (new MyScrolledWindow ()); updateVScrollbars (options.hideTPVScrollbar); // load panel endings - for (int i = 0; i < 6; i++) { + for (int i = 0; i < 7; i++) { vbPanelEnd[i] = Gtk::manage (new Gtk::VBox ()); - imgPanelEnd[i] = Gtk::manage (new RTImage ("PanelEnding.png")); + imgPanelEnd[i] = Gtk::manage (new RTImage ("ornament1.png")); imgPanelEnd[i]->show (); vbPanelEnd[i]->pack_start (*imgPanelEnd[i], Gtk::PACK_SHRINK); vbPanelEnd[i]->show_all(); } + if(favoriteCount > 0) { + favoritePanelSW = Gtk::manage(new MyScrolledWindow()); + favoritePanelSW->add(*favoritePanel); + favoritePanel->pack_start(*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + favoritePanel->pack_start(*vbPanelEnd[0], Gtk::PACK_SHRINK, 4); + } + exposurePanelSW->add (*exposurePanel); exposurePanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - exposurePanel->pack_start (*vbPanelEnd[0], Gtk::PACK_SHRINK, 4); + exposurePanel->pack_start (*vbPanelEnd[1], Gtk::PACK_SHRINK, 4); detailsPanelSW->add (*detailsPanel); detailsPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - detailsPanel->pack_start (*vbPanelEnd[1], Gtk::PACK_SHRINK, 4); + detailsPanel->pack_start (*vbPanelEnd[2], Gtk::PACK_SHRINK, 4); colorPanelSW->add (*colorPanel); colorPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - colorPanel->pack_start (*vbPanelEnd[2], Gtk::PACK_SHRINK, 4); + colorPanel->pack_start (*vbPanelEnd[3], Gtk::PACK_SHRINK, 4); advancedPanelSW->add (*advancedPanel); advancedPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - advancedPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); + advancedPanel->pack_start (*vbPanelEnd[6], Gtk::PACK_SHRINK, 0); transformPanelSW->add (*transformPanel); transformPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - transformPanel->pack_start (*vbPanelEnd[3], Gtk::PACK_SHRINK, 4); + transformPanel->pack_start (*vbPanelEnd[4], Gtk::PACK_SHRINK, 4); rawPanelSW->add (*rawPanel); rawPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); - rawPanel->pack_start (*vbPanelEnd[4], Gtk::PACK_SHRINK, 0); + rawPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); + toiF = Gtk::manage (new TextOrIcon ("star.png", M ("MAIN_TAB_FAVORITES"), M ("MAIN_TAB_FAVORITES_TOOLTIP"))); + toiE = Gtk::manage (new TextOrIcon ("exposure.png", M ("MAIN_TAB_EXPOSURE"), M ("MAIN_TAB_EXPOSURE_TOOLTIP"))); + toiD = Gtk::manage (new TextOrIcon ("detail.png", M ("MAIN_TAB_DETAIL"), M ("MAIN_TAB_DETAIL_TOOLTIP"))); + toiC = Gtk::manage (new TextOrIcon ("color-circles.png", M ("MAIN_TAB_COLOR"), M ("MAIN_TAB_COLOR_TOOLTIP"))); + toiW = Gtk::manage (new TextOrIcon ("atom.png", M ("MAIN_TAB_ADVANCED"), M ("MAIN_TAB_ADVANCED_TOOLTIP"))); + toiT = Gtk::manage (new TextOrIcon ("transform.png", M ("MAIN_TAB_TRANSFORM"), M ("MAIN_TAB_TRANSFORM_TOOLTIP"))); + toiR = Gtk::manage (new TextOrIcon ("bayer.png", M ("MAIN_TAB_RAW"), M ("MAIN_TAB_RAW_TOOLTIP"))); + toiM = Gtk::manage (new TextOrIcon ("metadata.png", M ("MAIN_TAB_METADATA"), M ("MAIN_TAB_METADATA_TOOLTIP"))); - - TOITypes type = options.UseIconNoText ? TOI_ICON : TOI_TEXT; - - 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 ("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)); - + if (favoritePanelSW) { + toolPanelNotebook->append_page (*favoritePanelSW, *toiF); + } toolPanelNotebook->append_page (*exposurePanelSW, *toiE); toolPanelNotebook->append_page (*detailsPanelSW, *toiD); toolPanelNotebook->append_page (*colorPanelSW, *toiC); @@ -253,8 +273,21 @@ void ToolPanelCoordinator::addPanel (Gtk::Box* where, FoldableToolPanel* panel, toolPanels.push_back (panel); } +void ToolPanelCoordinator::addfavoritePanel (Gtk::Box* where, FoldableToolPanel* panel, int level) +{ + auto name = panel->getToolName(); + auto it = std::find(options.favorites.begin(), options.favorites.end(), name); + if (it != options.favorites.end()) { + int index = std::distance(options.favorites.begin(), it); + favorites[index] = panel; + } else { + addPanel(where, panel, level); + } +} + ToolPanelCoordinator::~ToolPanelCoordinator () { + idle_register.destroy(); closeImage (); @@ -262,39 +295,85 @@ ToolPanelCoordinator::~ToolPanelCoordinator () delete toolBar; } -void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans) +void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono) { - 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(); + idle_register.add( + [this]() -> bool + { + rawPanelSW->set_sensitive(true); + sensorxtrans->FoldableToolPanel::hide(); + sensorbayer->FoldableToolPanel::show(); + preprocess->FoldableToolPanel::show(); + flatfield->FoldableToolPanel::show(); + retinex->FoldableToolPanel::setGrayedOut(false); + + return false; + } + ); + } + else if (isXtrans) { + idle_register.add( + [this]() -> bool + { + rawPanelSW->set_sensitive(true); + sensorxtrans->FoldableToolPanel::show(); + sensorbayer->FoldableToolPanel::hide(); + preprocess->FoldableToolPanel::show(); + flatfield->FoldableToolPanel::show(); + retinex->FoldableToolPanel::setGrayedOut(false); + + return false; + } + ); + } + else if (isMono) { + idle_register.add( + [this]() -> bool + { + rawPanelSW->set_sensitive(true); + sensorbayer->FoldableToolPanel::hide(); + sensorxtrans->FoldableToolPanel::hide(); + preprocess->FoldableToolPanel::hide(); + flatfield->FoldableToolPanel::show(); + retinex->FoldableToolPanel::setGrayedOut(false); + + return false; + } + ); } else { - sensorbayer->FoldableToolPanel::hide(); - sensorxtrans->FoldableToolPanel::hide(); - preprocess->FoldableToolPanel::hide(); - flatfield->FoldableToolPanel::hide(); + idle_register.add( + [this]() -> bool + { + rawPanelSW->set_sensitive(true); + sensorbayer->FoldableToolPanel::hide(); + sensorxtrans->FoldableToolPanel::hide(); + preprocess->FoldableToolPanel::hide(); + flatfield->FoldableToolPanel::hide(); + retinex->FoldableToolPanel::setGrayedOut(false); + + return false; + } + ); } } else { - rawPanelSW->set_sensitive (false); + idle_register.add( + [this]() -> bool + { + rawPanelSW->set_sensitive(false); + retinex->FoldableToolPanel::setGrayedOut(true); + + return false; + } + ); } } -void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr) +void ToolPanelCoordinator::panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) { - if (!ipc) { return; } @@ -360,9 +439,14 @@ void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib:: } } -void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited) +void ToolPanelCoordinator::profileChange( + const PartialProfile* nparams, + const rtengine::ProcEvent& event, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited, + bool fromLastSave +) { - int fw, fh, tr; if (!ipc) { @@ -382,7 +466,7 @@ void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengi } // And apply the partial profile nparams to mergedParams - nparams->applyTo (mergedParams); + nparams->applyTo (mergedParams, fromLastSave); // Derive the effective changes, if it's a profile change, to prevent slow RAW rerendering if not necessary bool filterRawRefresh = false; @@ -442,13 +526,13 @@ void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengi } } -void ToolPanelCoordinator::setDefaults (ProcParams* defparams) +void ToolPanelCoordinator::setDefaults(const ProcParams* defparams) { - - if (defparams) + if (defparams) { for (auto toolPanel : toolPanels) { - toolPanel->setDefaults (defparams); + toolPanel->setDefaults(defparams); } + } } CropGUIListener* ToolPanelCoordinator::getCropGUIListener () @@ -473,6 +557,9 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool ipc->setAutoCamListener (colorappearance); ipc->setAutoBWListener (blackwhite); ipc->setFrameCountListener (bayerprocess); + ipc->setFlatFieldAutoClipListener (flatfield); + ipc->setBayerAutoContrastListener (bayerprocess); + ipc->setXtransAutoContrastListener (xtransprocess); ipc->setAutoWBListener (whitebalance); ipc->setAutoColorTonListener (colortoning); ipc->setAutoChromaListener (dirpyrdenoise); @@ -537,7 +624,6 @@ void ToolPanelCoordinator::updateToolState() } wavelet->updateToolState (temp); - wavelet->setExpanded (true); retinex->updateToolState (temp); } } @@ -572,33 +658,8 @@ void ToolPanelCoordinator::writeToolExpandedStatus (std::vector &tpOpen) } -void ToolPanelCoordinator::cropSelectionReady () +void ToolPanelCoordinator::spotWBselected(int x, int y, Thumbnail* thm) { - - toolBar->setTool (TMHand); - - if (!ipc) { - return; - } -} - -void ToolPanelCoordinator::rotateSelectionReady (double rotate_deg, Thumbnail* thm) -{ - - toolBar->setTool (TMHand); - - if (!ipc) { - return; - } - - if (rotate_deg != 0.0) { - rotate->straighten (rotate_deg); - } -} - -void ToolPanelCoordinator::spotWBselected (int x, int y, Thumbnail* thm) -{ - if (!ipc) { return; } @@ -616,8 +677,52 @@ void ToolPanelCoordinator::spotWBselected (int x, int y, Thumbnail* thm) } } +void ToolPanelCoordinator::sharpMaskSelected(bool sharpMask) +{ + if (!ipc) { + return; + } + ipc->beginUpdateParams (); + ipc->setSharpMask(sharpMask); + ipc->endUpdateParams (rtengine::EvShrEnabled); +} +int ToolPanelCoordinator::getSpotWBRectSize() const +{ + return whitebalance->getSize(); +} +void ToolPanelCoordinator::cropSelectionReady() +{ + toolBar->setTool (TMHand); + + if (!ipc) { + return; + } +} + +void ToolPanelCoordinator::rotateSelectionReady(double rotate_deg, Thumbnail* thm) +{ + toolBar->setTool (TMHand); + + if (!ipc) { + return; + } + + if (rotate_deg != 0.0) { + rotate->straighten (rotate_deg); + } +} + +ToolBar* ToolPanelCoordinator::getToolBar() const +{ + return toolBar; +} + +CropGUIListener* ToolPanelCoordinator::startCropEditing(Thumbnail* thm) +{ + return crop; +} void ToolPanelCoordinator::autoCropRequested () { @@ -728,28 +833,31 @@ void ToolPanelCoordinator::cropSelectRequested () toolBar->setTool (TMCropSelect); } -void ToolPanelCoordinator::saveInputICCReference (Glib::ustring fname, bool apply_wb) +void ToolPanelCoordinator::saveInputICCReference(const Glib::ustring& fname, bool apply_wb) { - if (ipc) { ipc->saveInputICCReference (fname, apply_wb); } } -int ToolPanelCoordinator::getSpotWBRectSize () +void ToolPanelCoordinator::updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI +) { - - return whitebalance->getSize (); -} - -void ToolPanelCoordinator::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) -{ - colorappearance->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); - toneCurve->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); - lcurve->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); - rgbcurves->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve, */histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); - retinex->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve, */histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); - + colorappearance->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); + toneCurve->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve,histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); + lcurve->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); + rgbcurves->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); + retinex->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve, histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); } void ToolPanelCoordinator::foldAllButOne (Gtk::Box* parent, FoldableToolPanel* openedSection) @@ -782,6 +890,12 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) if (alt) { switch (event->keyval) { + case GDK_KEY_u: + if (favoritePanelSW) { + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*favoritePanelSW)); + } + return true; + case GDK_KEY_e: toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*exposurePanelSW)); return true; @@ -817,8 +931,11 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) 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; + if (favoritePanelSW) { + favoritePanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); + } exposurePanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); detailsPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); colorPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); @@ -831,35 +948,14 @@ void ToolPanelCoordinator::updateVScrollbars (bool hide) } } -void ToolPanelCoordinator::updateTabsHeader (bool useIcons) -{ - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected - TOITypes type = useIcons ? TOI_ICON : TOI_TEXT; - - toiE->switchTo (type); - toiD->switchTo (type); - toiC->switchTo (type); - toiT->switchTo (type); - toiR->switchTo (type); - - if (toiM) { - toiM->switchTo (type); - } -} - void ToolPanelCoordinator::updateTPVScrollbar (bool hide) { updateVScrollbars (hide); } -void ToolPanelCoordinator::updateTabsUsesIcons (bool useIcons) -{ - updateTabsHeader (useIcons); -} - 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 --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 2b6b101b7..db2c84fc1 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -80,11 +80,14 @@ #include "prsharpening.h" #include "fattaltonemap.h" #include "localcontrast.h" +#include "softlight.h" +#include "dehaze.h" #include "guiutils.h" class ImageEditorCoordinator; -class ToolPanelCoordinator : public ToolPanelListener, +class ToolPanelCoordinator : + public ToolPanelListener, public ToolBarListener, public ProfileChangeListener, public WBProvider, @@ -97,9 +100,7 @@ class ToolPanelCoordinator : public ToolPanelListener, public ImageAreaToolListener, public rtengine::ImageTypeListener { - protected: - WhiteBalance* whitebalance; Vignetting* vignetting; Gradient* gradient; @@ -136,6 +137,8 @@ protected: Wavelet * wavelet; DirPyrEqualizer* dirpyrequalizer; HSVEqualizer* hsvequalizer; + SoftLight *softlight; + Dehaze *dehaze; FilmSimulation *filmSimulation; SensorBayer * sensorbayer; SensorXTrans * sensorxtrans; @@ -157,6 +160,8 @@ protected: rtengine::StagedImageProcessor* ipc; std::vector toolPanels; + std::vector favorites; + ToolVBox* favoritePanel; ToolVBox* exposurePanel; ToolVBox* detailsPanel; ToolVBox* colorPanel; @@ -165,6 +170,7 @@ protected: ToolVBox* advancedPanel; ToolBar* toolBar; + TextOrIcon* toiF; TextOrIcon* toiE; TextOrIcon* toiD; TextOrIcon* toiC; @@ -173,9 +179,10 @@ protected: TextOrIcon* toiM; TextOrIcon* toiW; - Gtk::Image* imgPanelEnd[6]; - Gtk::VBox* vbPanelEnd[6]; + Gtk::Image* imgPanelEnd[7]; + Gtk::VBox* vbPanelEnd[7]; + Gtk::ScrolledWindow* favoritePanelSW; Gtk::ScrolledWindow* exposurePanelSW; Gtk::ScrolledWindow* detailsPanelSW; Gtk::ScrolledWindow* colorPanelSW; @@ -190,25 +197,34 @@ protected: void addPanel (Gtk::Box* where, FoldableToolPanel* panel, int level = 1); void foldThemAll (GdkEventButton* event); void updateVScrollbars (bool hide); - void updateTabsHeader (bool useIcons); + void addfavoritePanel (Gtk::Box* where, FoldableToolPanel* panel, int level = 1); private: - EditDataProvider *editDataProvider; public: - CoarsePanel* coarse; Gtk::Notebook* toolPanelNotebook; ToolPanelCoordinator (bool batch = false); - virtual ~ToolPanelCoordinator (); + ~ToolPanelCoordinator () override; bool getChangedState () { return hasChanged; } - 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 updateCurveBackgroundHistogram( + const LUTu& histToneCurve, + const LUTu& histLCurve, + const LUTu& histCCurve, + const LUTu& histLCAM, + const LUTu& histCCAM, + const LUTu& histRed, + const LUTu& histGreen, + const LUTu& histBlue, + const LUTu& histLuma, + const LUTu& histLRETI + ); void foldAllButOne (Gtk::Box* parent, FoldableToolPanel* openedSection); // multiple listeners can be added that are notified on changes (typical: profile panel and the history) @@ -218,12 +234,20 @@ public: } // toolpanellistener interface - void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr); + void panelChanged(const rtengine::ProcEvent& event, const Glib::ustring& descr) override; - void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans); + void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans, bool isMono = false) override; + +// void autoContrastChanged (double autoContrast); // profilechangelistener interface - void profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited = nullptr); - void setDefaults (rtengine::procparams::ProcParams* defparams); + void profileChange( + const rtengine::procparams::PartialProfile* nparams, + const rtengine::ProcEvent& event, + const Glib::ustring& descr, + const ParamsEdited* paramsEdited = nullptr, + bool fromLastSave = false + ) override; + void setDefaults(const rtengine::procparams::ProcParams* defparams) override; // DirSelectionListener interface void dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile); @@ -246,13 +270,13 @@ public: // wbprovider interface - void getAutoWB (double& temp, double& green, double equal, double tempBias) + void getAutoWB (double& temp, double& green, double equal, double tempBias) override { if (ipc) { ipc->getAutoWB (temp, green, equal, tempBias); } } - void getCamWB (double& temp, double& green) + void getCamWB (double& temp, double& green) override { if (ipc) { ipc->getCamWB (temp, green); @@ -260,49 +284,46 @@ public: } //DFProvider interface - rtengine::RawImage* getDF(); + rtengine::RawImage* getDF() override; //FFProvider interface - rtengine::RawImage* getFF(); - Glib::ustring GetCurrentImageFilePath(); + rtengine::RawImage* getFF() override; + Glib::ustring GetCurrentImageFilePath() override; // rotatelistener interface - void straightenRequested (); - void autoCropRequested (); - double autoDistorRequested (); + void straightenRequested () override; + void autoCropRequested () override; + double autoDistorRequested () override; // spotwblistener interface - void spotWBRequested (int size); + void spotWBRequested (int size) override; // croppanellistener interface - void cropSelectRequested (); + void cropSelectRequested () override; // icmpanellistener interface - void saveInputICCReference (Glib::ustring fname, bool apply_wb); + void saveInputICCReference(const Glib::ustring& fname, bool apply_wb) override; // imageareatoollistener interface - void spotWBselected (int x, int y, Thumbnail* thm = nullptr); - void cropSelectionReady (); - void rotateSelectionReady (double rotate_deg, Thumbnail* thm = nullptr); - ToolBar* getToolBar () - { - return toolBar; - } - int getSpotWBRectSize (); - CropGUIListener* startCropEditing (Thumbnail* thm = nullptr) - { - return crop; - } + void spotWBselected(int x, int y, Thumbnail* thm = nullptr) override; + void sharpMaskSelected(bool sharpMask) override; + int getSpotWBRectSize() const override; + void cropSelectionReady() override; + void rotateSelectionReady(double rotate_deg, Thumbnail* thm = nullptr) override; + ToolBar* getToolBar() const override; + CropGUIListener* startCropEditing(Thumbnail* thm = nullptr) override; void updateTPVScrollbar (bool hide); - void updateTabsUsesIcons (bool useIcons); bool handleShortcutKey (GdkEventKey* event); // ToolBarListener interface - void toolSelected (ToolMode tool); - void editModeSwitchedOff (); + void toolSelected (ToolMode tool) override; + void editModeSwitchedOff () override; void setEditProvider (EditDataProvider *provider); + +private: + IdleRegister idle_register; }; #endif diff --git a/rtgui/vibrance.cc b/rtgui/vibrance.cc index 51cb31a02..0069576e0 100644 --- a/rtgui/vibrance.cc +++ b/rtgui/vibrance.cc @@ -273,7 +273,7 @@ void Vibrance::pastsattog_toggled () } } -void Vibrance::adjusterChanged (Adjuster* a, double newval) +void Vibrance::adjusterChanged(Adjuster* a, double newval) { if (a == pastels && pastSatTog->get_active()) { saturated->setValue (newval); @@ -290,13 +290,32 @@ void Vibrance::adjusterChanged (Adjuster* a, double newval) } } -void Vibrance::adjusterChanged (ThresholdAdjuster* a, int newBottom, int newTop) +void Vibrance::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + +void Vibrance::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) +{ +} + +void Vibrance::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) +{ +} + +void Vibrance::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) { if (listener && getEnabled()) { listener->panelChanged (EvVibrancePastSatThreshold, psThreshold->getHistoryString()); } } +void Vibrance::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) +{ +} + +void Vibrance::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +{ +} void Vibrance::setBatchMode(bool batchMode) { diff --git a/rtgui/vibrance.h b/rtgui/vibrance.h index ceb010434..ed3e10059 100644 --- a/rtgui/vibrance.h +++ b/rtgui/vibrance.h @@ -52,24 +52,30 @@ protected: public: Vibrance (); - ~Vibrance (); + ~Vibrance () override; - 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 trimValues (rtengine::procparams::ProcParams* pp); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void trimValues (rtengine::procparams::ProcParams* pp) override; void setAdjusterBehavior (bool pastelsadd, bool saturatedadd); - void adjusterChanged (Adjuster* a, double newval); - void adjusterChanged (ThresholdAdjuster* a, int newBottom, int newTop); - void curveChanged (); - void autoOpenCurve (); + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; + void curveChanged () override; + void autoOpenCurve () override; - void enabledChanged (); + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + + void enabledChanged () override; void protectskins_toggled (); void avoidcolorshift_toggled (); void pastsattog_toggled (); - std::vector getCurvePoints(ThresholdSelector* tAdjuster) const; + std::vector getCurvePoints(ThresholdSelector* tAdjuster) const override; }; diff --git a/rtgui/vignetting.cc b/rtgui/vignetting.cc index dd8d0a2b1..799a4cff7 100644 --- a/rtgui/vignetting.cc +++ b/rtgui/vignetting.cc @@ -18,6 +18,8 @@ */ #include "vignetting.h" +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -112,9 +114,8 @@ void Vignetting::setDefaults (const ProcParams* defParams, const ParamsEdited* p } } -void Vignetting::adjusterChanged (Adjuster* a, double newval) +void Vignetting::adjusterChanged(Adjuster* a, double newval) { - if (listener) { if (a == amount) { listener->panelChanged (EvVignettingAmount, amount->getTextValue()); @@ -128,6 +129,10 @@ void Vignetting::adjusterChanged (Adjuster* a, double newval) } } +void Vignetting::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void Vignetting::setAdjusterBehavior (bool amountadd, bool radiusadd, bool strengthadd, bool centeradd) { diff --git a/rtgui/vignetting.h b/rtgui/vignetting.h index 029f16808..5432b6178 100644 --- a/rtgui/vignetting.h +++ b/rtgui/vignetting.h @@ -37,14 +37,15 @@ public: Vignetting (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; void setAdjusterBehavior (bool amountadd, bool radiusadd, bool strengthadd, bool centeradd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/wavelet.cc b/rtgui/wavelet.cc index 160abf07e..60915fa02 100644 --- a/rtgui/wavelet.cc +++ b/rtgui/wavelet.cc @@ -144,7 +144,6 @@ Wavelet::Wavelet() : neutrHBox(Gtk::manage(new Gtk::HBox())) { CurveListener::setMulti(true); - nextnlevel = 7.; expsettings->signal_button_release_event().connect_notify( sigc::bind( sigc::mem_fun(this, &Wavelet::foldAllButMe), expsettings) ); @@ -698,20 +697,20 @@ Wavelet::Wavelet() : cbenabConn = cbenab->signal_toggled().connect( sigc::mem_fun(*this, &Wavelet::cbenabToggled) ); cbenab->set_tooltip_text (M("TP_WAVELET_CB_TOOLTIP")); - Gtk::Image* const iblueR = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* const iyelL = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* const imagL = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* const igreenR = Gtk::manage (new RTImage ("ajd-wb-green2.png")); + Gtk::Image* const iblueR = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* const iyelL = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* const imagL = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* const igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); - Gtk::Image* const iblueRm = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* const iyelLm = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* const imagLm = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* const igreenRm = Gtk::manage (new RTImage ("ajd-wb-green2.png")); + Gtk::Image* const iblueRm = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* const iyelLm = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* const imagLm = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* const igreenRm = Gtk::manage (new RTImage ("circle-green-small.png")); - Gtk::Image* const iblueRh = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* const iyelLh = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* const imagLh = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* const igreenRh = Gtk::manage (new RTImage ("ajd-wb-green2.png")); + Gtk::Image* const iblueRh = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* const iyelLh = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* const imagLh = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* const igreenRh = Gtk::manage (new RTImage ("circle-green-small.png")); greenhigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., igreenRh, imagLh)); bluehigh = Gtk::manage (new Adjuster ("", -100., 100., 1., 0., iblueRh, iyelLh)); @@ -745,7 +744,7 @@ Wavelet::Wavelet() : resBox->pack_start(*chanMixerMidFrame, Gtk::PACK_SHRINK); resBox->pack_start(*chanMixerShadowsFrame, Gtk::PACK_SHRINK); - //RTImage *resetImg = Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png")); + //RTImage *resetImg = Gtk::manage (new RTImage ("undo-small.png", "redo-small.png")); //neutral->set_image(*resetImg); Gtk::Button* const neutral = Gtk::manage(new Gtk::Button(M("TP_COLORTONING_NEUTRAL"))); neutral->set_tooltip_text (M("TP_COLORTONING_NEUTRAL_TIP")); @@ -886,40 +885,24 @@ Wavelet::~Wavelet () } void Wavelet::wavChanged (double nlevel) -{ - nextnlevel = nlevel; - - const auto func = [](gpointer data) -> gboolean { - GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected - static_cast(data)->wavComputed_(); - - return FALSE; - }; - - idle_register.add(func, this); -} - -bool Wavelet::wavComputed_ () -{ - disableListener (); - enableListener (); - updatewavLabel (); - return false; -} - -void Wavelet::updatewavLabel () { if (!batchMode) { - float lv; - lv = nextnlevel; - wavLabels->set_text( - Glib::ustring::compose(M("TP_WAVELET_LEVLABEL"), - Glib::ustring::format(std::fixed, std::setprecision(0), lv)) + idle_register.add( + [this, nlevel]() -> bool + { + wavLabels->set_text( + Glib::ustring::compose( + M("TP_WAVELET_LEVLABEL"), + Glib::ustring::format(std::fixed, std::setprecision(0), nlevel) + ) + ); + return false; + } ); } } -// Will only reset the chanel mixer +// Will only reset the channel mixer // WARNING! In mutiImage mode, and for sliders in ADD mode, this will reset the slider to 0, but not to the default value as in SET mode. void Wavelet::neutral_pressed () { @@ -934,7 +917,7 @@ void Wavelet::neutral_pressed () enableListener(); if (listener && getEnabled()) { - listener->panelChanged (EvWavNeutral, M("ADJUSTER_RESET_TO_DEFAULT")); + listener->panelChanged (EvWavNeutral, M("GENERAL_RESET")); } } @@ -1096,7 +1079,7 @@ void Wavelet::read (const ProcParams* pp, const ParamsEdited* pedited) 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); @@ -1735,9 +1718,7 @@ void Wavelet::write (ProcParams* pp, ParamsEdited* pedited) 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) @@ -1923,7 +1904,8 @@ void Wavelet::setDefaults (const ProcParams* defParams, const ParamsEdited* pedi } } } -void Wavelet::adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop) + +void Wavelet::adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) { if (listener && (multiImage || getEnabled()) ) { if(a == level0noise) { @@ -1943,8 +1925,19 @@ void Wavelet::adjusterChanged (ThresholdAdjuster* a, double newBottom, double ne } } +void Wavelet::adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) +{ +} -void Wavelet::adjusterChanged2 (ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) +void Wavelet::adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) +{ +} + +void Wavelet::adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) +{ +} + +void Wavelet::adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) { if (listener && (multiImage || getEnabled()) ) { if(a == hueskin) { @@ -2391,7 +2384,7 @@ void Wavelet::adjusterUpdateUI (Adjuster* a) */ } -void Wavelet::adjusterChanged (Adjuster* a, double newval) +void Wavelet::adjusterChanged(Adjuster* a, double newval) { if (listener && (multiImage || getEnabled()) ) { if (a == edgthresh) { @@ -2519,6 +2512,10 @@ void Wavelet::adjusterChanged (Adjuster* a, double newval) } } +void Wavelet::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void Wavelet::enabledUpdateUI () { if (!batchMode) { diff --git a/rtgui/wavelet.h b/rtgui/wavelet.h index b73045228..163395d52 100644 --- a/rtgui/wavelet.h +++ b/rtgui/wavelet.h @@ -40,27 +40,32 @@ class Wavelet : { public: Wavelet (); - ~Wavelet (); + ~Wavelet () override; bool wavComputed_ (); - void adjusterChanged (ThresholdAdjuster* a, double newBottom, double newTop); - void adjusterChanged (Adjuster* a, double newval); - void adjusterChanged2 (ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR); - void autoOpenCurve (); - void curveChanged (CurveEditor* ce); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; + void autoOpenCurve () override; + void curveChanged (CurveEditor* ce) override; + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; void setAdjusterBehavior (bool multiplieradd, bool thresholdadd, bool threshold2add, bool thresadd, bool chroadd, bool chromaadd, bool contrastadd, bool skinadd, bool reschroadd, bool tmrsadd, bool resconadd, bool resconHadd, bool thradd, bool thrHadd, bool skyadd, bool edgradadd, bool edgvaladd, bool strengthadd, bool gammaadd, bool edgedetectadd, bool edgedetectthradd, bool edgedetectthr2add); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void setEditProvider (EditDataProvider *provider); + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setEditProvider (EditDataProvider *provider) override; void updateToolState (std::vector &tpOpen); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; void writeOptions (std::vector &tpOpen); + void adjusterChanged(ThresholdAdjuster* a, double newBottom, double newTop) override; + void adjusterChanged(ThresholdAdjuster* a, double newBottomLeft, double newTopLeft, double newBottomRight, double newTopRight) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottom, int newTop) override; + void adjusterChanged(ThresholdAdjuster* a, int newBottomLeft, int newTopLeft, int newBottomRight, int newTopRight) override; + void adjusterChanged2(ThresholdAdjuster* a, int newBottomL, int newTopL, int newBottomR, int newTopR) override; + private: void foldAllButMe (GdkEventButton* event, MyExpander *expander); - virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); + void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller) override; void BAmethodChanged (); void NPmethodChanged (); void BackmethodChanged (); @@ -79,7 +84,7 @@ private: void contrastMinusPressed (); void contrastPlusPressed (); void daubcoeffmethodChanged (); - void enabledChanged (); + void enabledChanged () override; void linkedgToggled (); void lipstToggled (); void medianToggled (); @@ -89,7 +94,7 @@ private: void neutralchPressed (); void tmrToggled (); void updatewavLabel (); - void wavChanged (double nlevel); + void wavChanged (double nlevel) override; void HSmethodUpdateUI(); void CHmethodUpdateUI(); diff --git a/rtgui/whitebalance.cc b/rtgui/whitebalance.cc index 57d73b15f..02fb8d793 100644 --- a/rtgui/whitebalance.cc +++ b/rtgui/whitebalance.cc @@ -43,19 +43,19 @@ Glib::RefPtr WhiteBalance::wbCameraPB, WhiteBalance::wbAutoPB, Whit void WhiteBalance::init () { - 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"); + wbPixbufs[toUnderlying(WBEntry::Type::CAMERA)] = RTImage::createFromFile ("wb-camera-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::AUTO)] = RTImage::createFromFile ("wb-auto-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::DAYLIGHT)] = RTImage::createFromFile ("wb-sun-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::CLOUDY)] = RTImage::createFromFile ("wb-cloudy-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::SHADE)] = RTImage::createFromFile ("wb-shade-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::WATER)] = RTImage::createFromFile ("wb-water-small.png"); + //wbPixbufs[WBEntry::Type::WATER2] = RTImage::createFromFile ("wb-water-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::TUNGSTEN)] = RTImage::createFromFile ("wb-tungsten-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::FLUORESCENT)] = RTImage::createFromFile ("wb-fluorescent-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::LAMP)] = RTImage::createFromFile ("wb-lamp-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::FLASH)] = RTImage::createFromFile ("wb-flash-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::LED)] = RTImage::createFromFile ("wb-led-small.png"); + wbPixbufs[toUnderlying(WBEntry::Type::CUSTOM)] = RTImage::createFromFile ("wb-custom-small.png"); } void WhiteBalance::cleanup () @@ -150,16 +150,18 @@ static double wbTemp2Slider(double temp) WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WBALANCE_LABEL"), false, true), wbp(nullptr), wblistener(nullptr) { - Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox ()); - hbox->set_spacing(4); - hbox->show (); - Gtk::Label* lab = Gtk::manage (new Gtk::Label (M("TP_WBALANCE_METHOD"))); - lab->show (); + Gtk::Grid* methodgrid = Gtk::manage(new Gtk::Grid()); + methodgrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(methodgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + + Gtk::Label* lab = Gtk::manage (new Gtk::Label (M("TP_WBALANCE_METHOD") + ":")); + setExpandAlignProperties(lab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); // Create the Tree model refTreeModel = Gtk::TreeStore::create(methodColumns); // Create the Combobox method = Gtk::manage (new MyComboBox ()); + setExpandAlignProperties(method, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); // Assign the model to the Combobox method->set_model(refTreeModel); @@ -244,30 +246,30 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB cellRenderer->property_ellipsize() = Pango::ELLIPSIZE_MIDDLE; method->set_active (0); // Camera - method->show (); - hbox->pack_start (*lab, Gtk::PACK_SHRINK, 0); - hbox->pack_start (*method); - pack_start (*hbox, Gtk::PACK_SHRINK, 0); + methodgrid->attach (*lab, 0, 0, 1, 1); + methodgrid->attach (*method, 1, 0, 1, 1); + pack_start (*methodgrid, Gtk::PACK_SHRINK, 0 ); opt = 0; - Gtk::HBox* spotbox = Gtk::manage (new Gtk::HBox ()); - spotbox->set_spacing(4); - spotbox->show (); + Gtk::Grid* spotgrid = Gtk::manage(new Gtk::Grid()); + spotgrid->get_style_context()->add_class("grid-spacing"); + setExpandAlignProperties(spotgrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - spotbutton = Gtk::manage (new Gtk::Button ()); + spotbutton = Gtk::manage (new Gtk::Button (M("TP_WBALANCE_PICKER"))); + setExpandAlignProperties(spotbutton, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + spotbutton->get_style_context()->add_class("independent"); spotbutton->set_tooltip_text(M("TP_WBALANCE_SPOTWB")); - Gtk::Image* spotimg = Gtk::manage (new RTImage ("gtk-color-picker-small.png")); - spotimg->show (); - spotbutton->set_image (*spotimg); - spotbutton->show (); - - spotbox->pack_start (*spotbutton); + spotbutton->set_image (*Gtk::manage (new RTImage ("color-picker-small.png"))); Gtk::Label* slab = Gtk::manage (new Gtk::Label (M("TP_WBALANCE_SIZE"))); - slab->show (); + setExpandAlignProperties(slab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + + Gtk::Grid* wbsizehelper = Gtk::manage(new Gtk::Grid()); + wbsizehelper->set_name("WB-Size-Helper"); + setExpandAlignProperties(wbsizehelper, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); spotsize = Gtk::manage (new MyComboBoxText ()); - spotsize->show (); + setExpandAlignProperties(spotsize, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); spotsize->append ("2"); if (options.whiteBalanceSpotSize == 2) { @@ -298,19 +300,25 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB spotsize->set_active(4); } - spotbox->pack_end (*spotsize, Gtk::PACK_EXPAND_WIDGET, 0); - spotbox->pack_end (*slab, Gtk::PACK_SHRINK, 0); + wbsizehelper->attach (*spotsize, 0, 0, 1, 1); - pack_start (*spotbox, Gtk::PACK_SHRINK, 0); + spotgrid->attach (*spotbutton, 0, 0, 1, 1); + spotgrid->attach (*slab, 1, 0, 1, 1); + spotgrid->attach (*wbsizehelper, 2, 0, 1, 1); + pack_start (*spotgrid, Gtk::PACK_SHRINK, 0 ); - Gtk::Image* itempL = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* itempR = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* igreenL = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenR = Gtk::manage (new RTImage ("ajd-wb-green2.png")); - Gtk::Image* iblueredL = Gtk::manage (new RTImage ("ajd-wb-bluered1.png")); - Gtk::Image* iblueredR = Gtk::manage (new RTImage ("ajd-wb-bluered2.png")); - Gtk::Image* itempbiasL = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* itempbiasR = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); + Gtk::HSeparator *separator = Gtk::manage (new Gtk::HSeparator()); + separator->get_style_context()->add_class("grid-row-separator"); + pack_start (*separator, Gtk::PACK_SHRINK, 0); + + Gtk::Image* itempL = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* itempR = Gtk::manage (new RTImage ("circle-yellow-small.png")); + Gtk::Image* igreenL = Gtk::manage (new RTImage ("circle-magenta-small.png")); + Gtk::Image* igreenR = Gtk::manage (new RTImage ("circle-green-small.png")); + Gtk::Image* iblueredL = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* iblueredR = Gtk::manage (new RTImage ("circle-red-small.png")); + Gtk::Image* itempbiasL = Gtk::manage (new RTImage ("circle-blue-small.png")); + Gtk::Image* itempbiasR = Gtk::manage (new RTImage ("circle-yellow-small.png")); temp = Gtk::manage (new Adjuster (M("TP_WBALANCE_TEMPERATURE"), MINTEMP, MAXTEMP, 5, CENTERTEMP, itempL, itempR, &wbSlider2Temp, &wbTemp2Slider)); green = Gtk::manage (new Adjuster (M("TP_WBALANCE_GREEN"), MINGREEN, MAXGREEN, 0.001, 1.0, igreenL, igreenR)); @@ -349,6 +357,10 @@ WhiteBalance::WhiteBalance () : FoldableToolPanel(this, "whitebalance", M("TP_WB spotsize->signal_changed().connect( sigc::mem_fun(*this, &WhiteBalance::spotSizeChanged) ); } +WhiteBalance::~WhiteBalance() +{ + idle_register.destroy(); +} void WhiteBalance::enabledChanged() { @@ -364,7 +376,7 @@ void WhiteBalance::enabledChanged() } -void WhiteBalance::adjusterChanged (Adjuster* a, double newval) +void WhiteBalance::adjusterChanged(Adjuster* a, double newval) { int tVal = (int)temp->getValue(); double gVal = green->getValue(); @@ -395,7 +407,7 @@ void WhiteBalance::adjusterChanged (Adjuster* a, double newval) methconn.block(true); opt = setActiveMethod(wbCustom.second.GUILabel); tempBias->set_sensitive(false); - + cache_customWB (tVal, gVal); if (a != equal) { cache_customEqual(eVal); @@ -427,6 +439,10 @@ void WhiteBalance::adjusterChanged (Adjuster* a, double newval) } } +void WhiteBalance::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void WhiteBalance::optChanged () { Gtk::TreeModel::Row row = getActiveMethod(); @@ -632,7 +648,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) // 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); - + // set default values first if in ADD mode, otherwise keep the current ones if (temp->getAddMode() ) { temp->setValue (0.0); @@ -684,6 +700,7 @@ void WhiteBalance::read (const ProcParams* pp, const ParamsEdited* pedited) set_inconsistent(multiImage && !pedited->wb.enabled); } + methconn.block (false); enableListener (); } @@ -718,7 +735,7 @@ void WhiteBalance::write (ProcParams* pp, ParamsEdited* pedited) void WhiteBalance::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { - + equal->setDefault (defParams->wb.equal); tempBias->setDefault (defParams->wb.tempBias); @@ -789,6 +806,7 @@ void WhiteBalance::setWB (int vtemp, double vgreen) if (listener) { listener->panelChanged (EvWBTemp, Glib::ustring::compose("%1, %2", (int)temp->getValue(), Glib::ustring::format (std::setw(4), std::fixed, std::setprecision(3), green->getValue()))); } + } void WhiteBalance::setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd) @@ -895,12 +913,18 @@ inline Gtk::TreeRow WhiteBalance::getActiveMethod () void WhiteBalance::WBChanged(double temperature, double greenVal) { - GThreadLock lock; - disableListener(); - setEnabled(true); - temp->setValue(temperature); - green->setValue(greenVal); - temp->setDefault(temperature); - green->setDefault(greenVal); - enableListener(); + idle_register.add( + [this, temperature, greenVal]() -> bool + { + disableListener(); + setEnabled(true); + temp->setValue(temperature); + green->setValue(greenVal); + temp->setDefault(temperature); + green->setDefault(greenVal); + enableListener(); + + return false; + } + ); } diff --git a/rtgui/whitebalance.h b/rtgui/whitebalance.h index ecf65f476..2db46b7af 100644 --- a/rtgui/whitebalance.h +++ b/rtgui/whitebalance.h @@ -28,10 +28,9 @@ class SpotWBListener { - public: - virtual ~SpotWBListener () {} - virtual void spotWBRequested (int size) {} + virtual ~SpotWBListener() = default; + virtual void spotWBRequested(int size) = 0; }; class WhiteBalance : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::AutoWBListener @@ -77,6 +76,9 @@ protected: int custom_temp; double custom_green; double custom_equal; + + IdleRegister idle_register; + void cache_customWB (int temp, double green); //cache custom WB setting to allow its recall void cache_customTemp (int temp); //cache Temperature only to allow its recall void cache_customGreen (double green); //cache Green only to allow its recall @@ -92,19 +94,20 @@ protected: public: WhiteBalance (); - ~WhiteBalance () {}; + ~WhiteBalance () override; static void init (); static void cleanup (); - 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 read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; void optChanged (); void spotPressed (); void spotSizeChanged (); - void adjusterChanged (Adjuster* a, double newval); + void adjusterChanged(Adjuster* a, double newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; int getSize (); void setWBProvider (WBProvider* p) { @@ -115,11 +118,11 @@ public: wblistener = l; } void setWB (int temp, double green); - void WBChanged (double temp, double green); + void WBChanged (double temp, double green) override; void setAdjusterBehavior (bool tempadd, bool greenadd, bool equaladd, bool tempbiasadd); - void trimValues (rtengine::procparams::ProcParams* pp); - void enabledChanged(); + void trimValues (rtengine::procparams::ProcParams* pp) override; + void enabledChanged() override; }; #endif diff --git a/rtgui/windirmonitor.cc b/rtgui/windirmonitor.cc deleted file mode 100644 index 1888d9405..000000000 --- a/rtgui/windirmonitor.cc +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 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 "windirmonitor.h" -#include "options.h" - -static void CALLBACK current_directory_monitor_callback (DWORD error, DWORD nBytes, LPOVERLAPPED lpOverlapped) -{ - DWORD dwOffset = 0; - FILE_NOTIFY_INFORMATION* pInfo = NULL; - - WinDirMonitor::MonitorData* monData = (WinDirMonitor::MonitorData*)lpOverlapped; - - if (!nBytes) { - delete monData; - return; - } - - bool notify = false; - - // Analysis of the modifications. Let only parsed file extensions emit a notify, not PP3 changes - do { - // Get a pointer to the first change record... - pInfo = (FILE_NOTIFY_INFORMATION*) &monData->file_notify_buffer[dwOffset]; - - char fnameC[(MAX_PATH + 1) * 2] = {0}; - int strLen = WideCharToMultiByte(CP_UTF8, 0, pInfo->FileName, pInfo->FileNameLength / sizeof(WCHAR), fnameC, sizeof(fnameC), 0, 0); - fnameC[strLen] = 0; - Glib::ustring fname = fnameC; - - if (options.has_retained_extention(fname)) { - notify = true; - } - - // More than one change may happen at the same time. Load the next change and continue... - dwOffset += pInfo->NextEntryOffset; - } while (!notify && pInfo->NextEntryOffset != 0); - - // ReadDirectoryChangesW sometimes emits multiple events per change (one for each change type) - // To make sure it's not flooding update, this gets filtered. - DWORD curTick = GetTickCount(); - - if (notify && monData->listener && (curTick - monData->lastTimeUpdateTick) > 500) { - monData->lastTimeUpdateTick = curTick; - monData->listener->winDirChanged (); - } - - ReadDirectoryChangesW (monData->hDirectory, - monData->file_notify_buffer, - monData->buffer_allocated_bytes, - FALSE, - FILE_NOTIFY_CHANGE_FILE_NAME | - FILE_NOTIFY_CHANGE_DIR_NAME | - FILE_NOTIFY_CHANGE_LAST_WRITE, - &monData->buffer_filled_bytes, - &monData->overlapped, - current_directory_monitor_callback); -} - -WinDirMonitor::WinDirMonitor (Glib::ustring dirName, WinDirChangeListener* listener) : monData(NULL) -{ - wchar_t* wdirname = (wchar_t*)g_utf8_to_utf16 (dirName.c_str(), -1, NULL, NULL, NULL); - HANDLE hDirectory = CreateFileW (wdirname, FILE_LIST_DIRECTORY, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); - g_free (wdirname); - - if (hDirectory != INVALID_HANDLE_VALUE) { - - monData = new MonitorData (); - monData->listener = listener; - monData->buffer_allocated_bytes = 32768; - monData->file_notify_buffer = new char [monData->buffer_allocated_bytes]; - monData->hDirectory = hDirectory; - monData->lastTimeUpdateTick = GetTickCount(); - - ReadDirectoryChangesW (monData->hDirectory, - monData->file_notify_buffer, - monData->buffer_allocated_bytes, - FALSE, - FILE_NOTIFY_CHANGE_FILE_NAME | - FILE_NOTIFY_CHANGE_DIR_NAME | - FILE_NOTIFY_CHANGE_LAST_WRITE, - &monData->buffer_filled_bytes, - &monData->overlapped, - current_directory_monitor_callback); - } -} - -WinDirMonitor::~WinDirMonitor () -{ - - if (monData && monData->hDirectory != INVALID_HANDLE_VALUE) { - CloseHandle (monData->hDirectory); - } -} diff --git a/rtgui/windirmonitor.h b/rtgui/windirmonitor.h deleted file mode 100644 index b9be67a5a..000000000 --- a/rtgui/windirmonitor.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 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 . - */ -#ifndef _WINDIRMONITOR_ -#define _WINDIRMONITOR_ - -#include -#include - -class WinDirChangeListener -{ -public: - virtual ~WinDirChangeListener() = default; - - virtual void winDirChanged () {} -}; - -class WinDirMonitor : public Glib::Object -{ - -public: - struct MonitorData { - OVERLAPPED overlapped; - DWORD buffer_allocated_bytes; - char *file_notify_buffer; - DWORD buffer_filled_bytes; - HANDLE hDirectory; - WinDirChangeListener* listener; - int bigyo; - DWORD lastTimeUpdateTick; // for filtering multiple updates events - }; - -private: - MonitorData* monData; - -public: - WinDirMonitor (Glib::ustring dirName, WinDirChangeListener* listener); - ~WinDirMonitor (); -}; - -#endif - diff --git a/rtgui/xtransprocess.cc b/rtgui/xtransprocess.cc index 9e0c94ea0..e98394735 100644 --- a/rtgui/xtransprocess.cc +++ b/rtgui/xtransprocess.cc @@ -17,14 +17,23 @@ * along with RawTherapee. If not, see . */ #include "xtransprocess.h" -#include "options.h" + +#include "eventmapper.h" #include "guiutils.h" +#include "options.h" + +#include "../rtengine/procparams.h" using namespace rtengine; using namespace rtengine::procparams; XTransProcess::XTransProcess () : FoldableToolPanel(this, "xtransprocess", M("TP_RAW_LABEL"), true) { + auto m = ProcEventMapper::getInstance(); + EvDemosaicBorder = m->newEvent(DEMOSAIC, "HISTORY_MSG_RAW_BORDER"); + EvDemosaicContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_DUALDEMOSAIC_CONTRAST"); + EvDemosaicAutoContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST"); + Gtk::HBox* hb1 = Gtk::manage (new Gtk::HBox ()); hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_DMETHOD") + ": ")), Gtk::PACK_SHRINK, 4); method = Gtk::manage (new MyComboBoxText ()); @@ -63,6 +72,33 @@ XTransProcess::XTransProcess () : FoldableToolPanel(this, "xtransprocess", M("TP hb1->pack_end (*method, Gtk::PACK_EXPAND_WIDGET, 4); pack_start( *hb1, Gtk::PACK_SHRINK, 4); + dualDemosaicOptions = Gtk::manage (new Gtk::VBox ()); + + dualDemosaicContrast = Gtk::manage(new Adjuster (M("TP_RAW_DUALDEMOSAICCONTRAST"), 0, 100, 1, 20)); + dualDemosaicContrast->setAdjusterListener (this); + dualDemosaicContrast->addAutoButton(M("TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP")); + dualDemosaicContrast->setAutoValue(true); + + if (dualDemosaicContrast->delay < options.adjusterMaxDelay) { + dualDemosaicContrast->delay = options.adjusterMaxDelay; + } + + dualDemosaicContrast->show(); + dualDemosaicOptions->pack_start(*dualDemosaicContrast); + pack_start( *dualDemosaicOptions, Gtk::PACK_SHRINK, 4); + + borderbox = Gtk::manage(new Gtk::HBox()); + border = Gtk::manage(new Adjuster(M("TP_RAW_BORDER"), 0, 16, 1, 7)); + border->setAdjusterListener (this); + + if (border->delay < options.adjusterMaxDelay) { + border->delay = options.adjusterMaxDelay; + } + + border->show(); + borderbox->pack_start(*border); + pack_start(*borderbox, Gtk::PACK_SHRINK, 4); + pack_start( *Gtk::manage( new Gtk::HSeparator()), Gtk::PACK_SHRINK, 0 ); ccSteps = Gtk::manage (new Adjuster (M("TP_RAW_FALSECOLOR"), 0, 5, 1, 0 )); ccSteps->setAdjusterListener (this); @@ -77,14 +113,16 @@ XTransProcess::XTransProcess () : FoldableToolPanel(this, "xtransprocess", M("TP methodconn = method->signal_changed().connect( sigc::mem_fun(*this, &XTransProcess::methodChanged) ); } +XTransProcess::~XTransProcess () { + idle_register.destroy(); +} void XTransProcess::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) { disableListener (); methodconn.block (true); - method->set_active(std::numeric_limits::max()); - + border->setValue(pp->raw.xtranssensor.border); for (size_t i = 0; i < RAWParams::XTransSensor::getMethodStrings().size(); ++i) if( pp->raw.xtranssensor.method == RAWParams::XTransSensor::getMethodStrings()[i]) { method->set_active(i); @@ -93,15 +131,26 @@ void XTransProcess::read(const rtengine::procparams::ProcParams* pp, const Param } if(pedited ) { + border->setEditedState (pedited->raw.xtranssensor.border ? Edited : UnEdited); + dualDemosaicContrast->setAutoInconsistent (multiImage && !pedited->raw.xtranssensor.dualDemosaicAutoContrast); + dualDemosaicContrast->setEditedState ( pedited->raw.xtranssensor.dualDemosaicContrast ? Edited : UnEdited); ccSteps->setEditedState (pedited->raw.xtranssensor.ccSteps ? Edited : UnEdited); if( !pedited->raw.xtranssensor.method ) { - method->set_active(std::numeric_limits::max()); // No name + method->set_active_text(M("GENERAL_UNCHANGED")); } } - + dualDemosaicContrast->setAutoValue(pp->raw.xtranssensor.dualDemosaicAutoContrast); + dualDemosaicContrast->setValue (pp->raw.xtranssensor.dualDemosaicContrast); ccSteps->setValue (pp->raw.xtranssensor.ccSteps); + lastAutoContrast = pp->raw.xtranssensor.dualDemosaicAutoContrast; + + if (!batchMode) { + dualDemosaicOptions->set_visible(pp->raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::FOUR_PASS) + || pp->raw.xtranssensor.method == procparams::RAWParams::XTransSensor::getMethodString(procparams::RAWParams::XTransSensor::Method::TWO_PASS)); + } + methodconn.block (false); enableListener (); @@ -109,44 +158,96 @@ void XTransProcess::read(const rtengine::procparams::ProcParams* pp, const Param void XTransProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pedited) { + pp->raw.xtranssensor.dualDemosaicAutoContrast = dualDemosaicContrast->getAutoValue(); + pp->raw.xtranssensor.dualDemosaicContrast = dualDemosaicContrast->getValue(); + pp->raw.xtranssensor.border = border->getIntValue(); pp->raw.xtranssensor.ccSteps = ccSteps->getIntValue(); int currentRow = method->get_active_row_number(); - if (currentRow >= 0 && currentRow < std::numeric_limits::max()) { + if (currentRow >= 0 && method->get_active_text() != M("GENERAL_UNCHANGED")) { pp->raw.xtranssensor.method = procparams::RAWParams::XTransSensor::getMethodStrings()[currentRow]; } if (pedited) { - pedited->raw.xtranssensor.method = method->get_active_row_number() != std::numeric_limits::max(); + pedited->raw.xtranssensor.border = border->getEditedState (); + pedited->raw.xtranssensor.method = method->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->raw.xtranssensor.dualDemosaicAutoContrast = !dualDemosaicContrast->getAutoInconsistent (); + pedited->raw.xtranssensor.dualDemosaicContrast = dualDemosaicContrast->getEditedState (); pedited->raw.xtranssensor.ccSteps = ccSteps->getEditedState (); } } +void XTransProcess::setAdjusterBehavior (bool falsecoloradd, bool dualDemosaicContrastAdd) +{ + border->setAddMode(false); + dualDemosaicContrast->setAddMode(dualDemosaicContrastAdd); + ccSteps->setAddMode(falsecoloradd); +} + void XTransProcess::setBatchMode(bool batchMode) { method->append (M("GENERAL_UNCHANGED")); - method->set_active(std::numeric_limits::max()); // No name + method->set_active_text(M("GENERAL_UNCHANGED")); ToolPanel::setBatchMode (batchMode); + dualDemosaicContrast->showEditedCB (); + border->showEditedCB (); ccSteps->showEditedCB (); } void XTransProcess::setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited) { + dualDemosaicContrast->setDefault( defParams->raw.xtranssensor.dualDemosaicContrast); + border->setDefault (defParams->raw.xtranssensor.border); ccSteps->setDefault (defParams->raw.xtranssensor.ccSteps); if (pedited) { + dualDemosaicContrast->setDefaultEditedState( pedited->raw.xtranssensor.dualDemosaicContrast ? Edited : UnEdited); + border->setDefaultEditedState(pedited->raw.xtranssensor.border ? Edited : UnEdited); ccSteps->setDefaultEditedState(pedited->raw.xtranssensor.ccSteps ? Edited : UnEdited); } else { + dualDemosaicContrast->setDefaultEditedState(Irrelevant ); + border->setDefaultEditedState(Irrelevant); ccSteps->setDefaultEditedState(Irrelevant ); } } -void XTransProcess::adjusterChanged (Adjuster* a, double newval) +void XTransProcess::adjusterChanged(Adjuster* a, double newval) { if (listener) { if (a == ccSteps) { listener->panelChanged (EvDemosaicFalseColorIter, a->getTextValue() ); + } else if (a == dualDemosaicContrast) { + listener->panelChanged (EvDemosaicContrast, a->getTextValue() ); + } else if (a == border) { + listener->panelChanged (EvDemosaicBorder, a->getTextValue() ); + } + } +} + +void XTransProcess::adjusterAutoToggled(Adjuster* a, bool newval) +{ + if (multiImage) { + if (dualDemosaicContrast->getAutoInconsistent()) { + dualDemosaicContrast->setAutoInconsistent (false); + dualDemosaicContrast->setAutoValue (false); + } else if (lastAutoContrast) { + dualDemosaicContrast->setAutoInconsistent (true); + } + + lastAutoContrast = dualDemosaicContrast->getAutoValue(); + } + + if (listener) { + + if (a == dualDemosaicContrast) { + if (dualDemosaicContrast->getAutoInconsistent()) { + listener->panelChanged (EvDemosaicAutoContrast, M ("GENERAL_UNCHANGED")); + } else if (dualDemosaicContrast->getAutoValue()) { + listener->panelChanged (EvDemosaicAutoContrast, M ("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvDemosaicAutoContrast, M ("GENERAL_DISABLED")); + } } } } @@ -154,22 +255,39 @@ void XTransProcess::adjusterChanged (Adjuster* a, double newval) void XTransProcess::methodChanged () { const int curSelection = method->get_active_row_number(); - const RAWParams::XTransSensor::Method method = RAWParams::XTransSensor::Method(curSelection); - - Glib::ustring methodName; - bool ppreq = false; - - if (curSelection >= 0 && curSelection < std::numeric_limits::max()) { - methodName = RAWParams::XTransSensor::getMethodStrings()[curSelection]; - - if (method == RAWParams::XTransSensor::Method::MONO || RAWParams::XTransSensor::Method(oldSelection) == RAWParams::XTransSensor::Method::MONO) { - ppreq = true; - } - } + const RAWParams::XTransSensor::Method currentMethod = RAWParams::XTransSensor::Method(curSelection); oldSelection = curSelection; - if (listener) { - listener->panelChanged (ppreq ? EvDemosaicMethodPreProc : EvDemosaicMethod, methodName); + if (!batchMode) { + if (currentMethod == procparams::RAWParams::XTransSensor::Method::FOUR_PASS || currentMethod == procparams::RAWParams::XTransSensor::Method::TWO_PASS) { + dualDemosaicOptions->show(); + } else { + dualDemosaicOptions->hide(); + } + + } + if (listener && method->get_active_row_number() >= 0) { + listener->panelChanged ( + currentMethod == RAWParams::XTransSensor::Method::MONO || RAWParams::XTransSensor::Method(oldSelection) == RAWParams::XTransSensor::Method::MONO + ? EvDemosaicMethodPreProc + : EvDemosaicMethod, method->get_active_text()); } } + +void XTransProcess::checkBoxToggled (CheckBox* c, CheckValue newval) +{ +} + +void XTransProcess::autoContrastChanged (double autoContrast) +{ + idle_register.add( + [this, autoContrast]() -> bool + { + disableListener(); + dualDemosaicContrast->setValue(autoContrast); + enableListener(); + return false; + } + ); +} diff --git a/rtgui/xtransprocess.h b/rtgui/xtransprocess.h index 44ed2e670..e5389b566 100644 --- a/rtgui/xtransprocess.h +++ b/rtgui/xtransprocess.h @@ -21,32 +21,48 @@ #include #include "adjuster.h" +#include "checkbox.h" #include "guiutils.h" #include "toolpanel.h" -class XTransProcess : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class XTransProcess : public ToolParamBlock, public AdjusterListener, public CheckBoxListener, public FoldableToolPanel, public rtengine::AutoContrastListener { protected: MyComboBoxText* method; + Gtk::HBox* borderbox; + Adjuster* border; Adjuster* ccSteps; + Gtk::VBox *dualDemosaicOptions; + Adjuster* dualDemosaicContrast; + bool lastAutoContrast; int oldSelection; sigc::connection methodconn; + IdleRegister idle_register; + + rtengine::ProcEvent EvDemosaicBorder; + rtengine::ProcEvent EvDemosaicAutoContrast; + rtengine::ProcEvent EvDemosaicContrast; public: XTransProcess (); + ~XTransProcess () override; - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); + void read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write(rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setAdjusterBehavior(bool falsecoloradd, bool dualDemosaicContrastAdd); + void setBatchMode(bool batchMode) override; + void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; - void methodChanged (); - void adjusterChanged (Adjuster* a, double newval); + void methodChanged(); + void autoContrastChanged (double autoContrast) override; + void adjusterChanged(Adjuster* a, double newval) override; + void checkBoxToggled(CheckBox* c, CheckValue newval) override; + void adjusterAutoToggled(Adjuster* a, bool newval) override; }; #endif diff --git a/rtgui/xtransrawexposure.cc b/rtgui/xtransrawexposure.cc index 84fae9032..b58a6e72a 100644 --- a/rtgui/xtransrawexposure.cc +++ b/rtgui/xtransrawexposure.cc @@ -16,10 +16,14 @@ * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ -#include "xtransrawexposure.h" -#include "guiutils.h" #include +#include "xtransrawexposure.h" + +#include "guiutils.h" + +#include "../rtengine/procparams.h" + using namespace rtengine; using namespace rtengine::procparams; @@ -53,6 +57,10 @@ XTransRAWExposure::XTransRAWExposure () : FoldableToolPanel(this, "xtransrawexpo pack_start( *PexBlackRed, Gtk::PACK_SHRINK, 0);//black pack_start( *PexBlackGreen, Gtk::PACK_SHRINK, 0);//black pack_start( *PexBlackBlue, Gtk::PACK_SHRINK, 0);//black + + PexBlackRed->setLogScale(100, 0); + PexBlackGreen->setLogScale(100, 0); + PexBlackBlue->setLogScale(100, 0); } void XTransRAWExposure::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) @@ -86,7 +94,7 @@ void XTransRAWExposure::write( rtengine::procparams::ProcParams* pp, ParamsEdite } -void XTransRAWExposure::adjusterChanged (Adjuster* a, double newval) +void XTransRAWExposure::adjusterChanged(Adjuster* a, double newval) { if (listener) { Glib::ustring value = a->getTextValue(); @@ -101,6 +109,10 @@ void XTransRAWExposure::adjusterChanged (Adjuster* a, double newval) } } +void XTransRAWExposure::adjusterAutoToggled(Adjuster* a, bool newval) +{ +} + void XTransRAWExposure::setBatchMode(bool batchMode) { ToolPanel::setBatchMode (batchMode); diff --git a/rtgui/xtransrawexposure.h b/rtgui/xtransrawexposure.h index 4ed046a07..75bdbd0e2 100644 --- a/rtgui/xtransrawexposure.h +++ b/rtgui/xtransrawexposure.h @@ -38,13 +38,14 @@ public: XTransRAWExposure (); - void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); - void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); - void setBatchMode (bool batchMode); - void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); - void adjusterChanged (Adjuster* a, double newval); + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr) override; + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr) override; + void setBatchMode (bool batchMode) override; + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr) override; + void adjusterChanged (Adjuster* a, double newval) override; + void adjusterAutoToggled (Adjuster* a, bool newval) override; void setAdjusterBehavior (bool pexblackadd); - void trimValues (rtengine::procparams::ProcParams* pp); + void trimValues (rtengine::procparams::ProcParams* pp) override; }; #endif diff --git a/rtgui/zoompanel.cc b/rtgui/zoompanel.cc index 7e88fb1b3..ea57b7fdc 100644 --- a/rtgui/zoompanel.cc +++ b/rtgui/zoompanel.cc @@ -25,15 +25,15 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) { set_name ("EditorZoomPanel"); - Gtk::Image* imageOut = Gtk::manage (new RTImage ("gtk-zoom-out.png")); + Gtk::Image* imageOut = Gtk::manage (new RTImage ("magnifier-minus.png")); imageOut->set_padding(0, 0); - Gtk::Image* imageIn = Gtk::manage (new RTImage ("gtk-zoom-in.png")); + Gtk::Image* imageIn = Gtk::manage (new RTImage ("magnifier-plus.png")); imageIn->set_padding(0, 0); - Gtk::Image* image11 = Gtk::manage ( new RTImage ("gtk-zoom-100.png")); + Gtk::Image* image11 = Gtk::manage ( new RTImage ("magnifier-1to1.png")); image11->set_padding(0, 0); - Gtk::Image* imageFit = Gtk::manage (new RTImage ("gtk-zoom-fit.png")); + Gtk::Image* imageFit = Gtk::manage (new RTImage ("magnifier-fit.png")); imageFit->set_padding(0, 0); - Gtk::Image* imageFitCrop = Gtk::manage (new RTImage ("gtk-zoom-crop.png")); + Gtk::Image* imageFitCrop = Gtk::manage (new RTImage ("magnifier-crop.png")); imageFit->set_padding(0, 0); zoomOut = Gtk::manage (new Gtk::Button()); @@ -67,7 +67,7 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) setExpandAlignProperties(zoomLabel, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); attach_next_to (*zoomLabel, Gtk::POS_RIGHT, 1, 1); - Gtk::Image* imageCrop = Gtk::manage (new RTImage ("new-detail-window.png")); + Gtk::Image* imageCrop = Gtk::manage (new RTImage ("window-add.png")); imageCrop->set_padding(0, 0); newCrop = Gtk::manage (new Gtk::Button()); newCrop->add (*imageCrop); diff --git a/tools/RTProfileBuilderSample.cs b/tools/RTProfileBuilderSample.cs index 81b724ab2..a097e6883 100644 --- a/tools/RTProfileBuilderSample.cs +++ b/tools/RTProfileBuilderSample.cs @@ -115,7 +115,7 @@ namespace RTProfilerBuilder { } // 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 @@ namespace RTProfilerBuilder { /// 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; @@ -270,11 +270,11 @@ namespace RTProfilerBuilder { if (adFocLen[i] >= adFocLen[i + 1]) throw new Exception("The distortion correction focal length points must be ordered!"); } - /// Calculates regession value of RT distortion amount for the given focal length. + /// Calculates regression value of RT distortion amount for the given focal length. /// Input focal length. /// Distortion in RT format. public string GetDistortionAmount(double focalLength) { - // if it's out of area (which should just happing with e.g. rounding errors), return flat defaults. + // if it's out of area (which should just happen with e.g. rounding errors), return flat defaults. if (focalLength <= adFocLen[0]) return adCorrect[0].ToString("G", CultureInfo.InvariantCulture); if (focalLength >= adFocLen[adFocLen.Length - 1]) return adCorrect[adFocLen.Length - 1].ToString("G", CultureInfo.InvariantCulture); diff --git a/tools/benchmarkRT b/tools/benchmarkRT index fbe27ebc8..57d78a52b 100755 --- a/tools/benchmarkRT +++ b/tools/benchmarkRT @@ -31,7 +31,7 @@ download () { 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 @@ if [[ ${inFile} = http* ]]; then # if inFile is a url and if we haven't download 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 @@ for s in "${!sidecarFinal[@]}"; do ## 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 --git a/tools/generatePngIcons b/tools/generatePngIcons new file mode 100755 index 000000000..70ee3ee1b --- /dev/null +++ b/tools/generatePngIcons @@ -0,0 +1,146 @@ +#!/usr/bin/env bash +# By Maciej Dworak +# Version 2018-07-21 +# This script generates PNG icons from SVG files using Inkscape. +# If pngquant is installed, it will automatically use it to compress the PNGs. +# +# PNG files are written to /tmp/rt-icons-XXXX +# +# USAGE EXAMPLES +# ./tools/generatePngIcons rtdata/images/themed/svg/* +# ./tools/generatePngIcons rtdata/images/themed/svg/circle* rtdata/images/themed/svg/square-toggle-* + +# No touching below this line +# ----------------------------------------------------------------------------- + +#tmpDir="$(mktemp -d /tmp/rt-icons-XXXX)" || exit +tmpDir="/tmp/rt-icons" +rm -r "$tmpDir" +mkdir "$tmpDir" || exit 1 +outDir="$tmpDir" + +# Abort if Inkscape is not installed: +if [[ ${OSTYPE^^} = "MSYS" ]]; then + if ! command -v "/c/Program Files/Inkscape/inkscape.exe" >/dev/null; then + printf '%s\n' "Inkscape does not appear to be installed. Aborting." + exit 1 + fi +else + if ! command -v inkscape >/dev/null; then + printf '%s\n' "Inkscape does not appear to be installed. Aborting." + exit 1 + fi +fi + +# Command-line arguments: +if [[ $# -eq 0 ]]; then + printf '%s\n' "This script generates PNG icons from SVG files using Inkscape." \ + "" \ + "USAGE" \ + " Generate PNG icons from many SVG icons and output to /tmp/rt-icons-XXXX" \ + " ./generatePngIcons some-icons-*.svg" \ + "" \ + "If pngquant is installed, it will automatically use it to compress the PNGs." \ + "" + exit 0 +fi + +printf '%s\n' "Converting SVG icons to PNG." "${#} files passed as arguments." + +# This color will be replaced by each theme's color: +colRef="#2a7fff" + +# Define theme names, and for each theme the color which will replace colorRef: +declare -A themes +themes=( ["dark"]="#CCCCCC" ["light"]="#252525" ) + +# Optionally use pngquant to compress resulting PNGs: +doCompress="false" +if command -v pngquant >/dev/null; then + doCompress="true" + printf '%s\n' "pngquant found, will compress PNG files." "" +fi + +# Ask for confirmation if folders already present: +folderExists="false" +doDelete="true" +for theme in "${!themes[@]}"; do + if [[ -d "${outDir}/${theme}" ]]; then + folderExists="true" + doDelete="false" + fi +done +if [[ $folderExists = "true" ]]; then + printf '%s\n' "One or more output folders already exist in \"${outDir}\". If you proceed, they will be deleted." + read -r -p "Proceed? [y/n]: " + if [[ $REPLY =~ ^[Yy]$ ]]; then + doDelete="true" + else + printf '%s\n' "Aborting." + exit 0 + fi +fi + +# Create output folders: +for theme in "${!themes[@]}"; do + if [[ -d "${outDir}/${theme}" && $doDelete = "true" ]]; then + rm -rf "${outDir:?}/${theme}" + fi + mkdir -p "${outDir:?}/${theme}" || exit 1 +done +printf '%s\n' "Output folder: ${outDir}" "" + +# Platform-dependent SVG to PNG conversion using Inkscape +# $1 = output PNG absolute path +# $2 = input SVG absolute path +convertSvg() { + if [[ ${OSTYPE^^} = "MSYS" ]]; then + "/c/Program Files/Inkscape/inkscape.exe" \ + --without-gui \ + --export-area-page \ + --export-background-opacity="0" \ + --export-png="$1" \ + "$2" + else + inkscape \ + --without-gui \ + --export-area-page \ + --export-background-opacity="0" \ + --export-png="$1" \ + "$2" + fi + + if [[ $doCompress = "true" ]]; then + sizeBefore=$(wc -c < "$1") + pngquant \ + --quality=70-80 \ + --ext .png \ + --force \ + --skip-if-larger \ + "$1" + sizeAfter=$(wc -c < "$1") + printf 'Filesize before: %s After: %s Difference: %s\n' "$sizeBefore" "$sizeAfter" "$((sizeBefore - sizeAfter))" + fi +} + +# Iterate over each SVG, saving PNGs for each theme. +# Files passed as arguments can have absolute paths or just filenames depending on how the user calls the script, +# so svgFilename and svgAbsolute are explicitly handled. +for f in "${@}"; do + if [[ $f = *.svg || $f = *.svgz ]]; then + svgAbsolute="$(readlink -m -n "$f")" + svgFilename="$(basename "$svgAbsolute")" + printf '%s\n' "Processing: ${svgAbsolute}" + + for theme in "${!themes[@]}"; do + printf '%s\n' "Theme: ${theme}" + sed -e "s/fill:${colRef};/fill:${themes[$theme]};/" -e "s/stroke:${colRef};/stroke:${themes[$theme]};/" "$svgAbsolute" > "${outDir}/${theme}/${svgFilename}" + convertSvg "${outDir}/${theme}/${svgFilename%.svg*}.png" "${outDir}/${theme}/${svgFilename}" + rm "${outDir}/${theme}/${svgFilename}" + done + + printf '\n' + fi +done + +printf '%s\n' "Done." "" diff --git a/tools/generateRtexifUpdates b/tools/generateRtexifUpdates index cdc0dd70c..72a97862e 100755 --- a/tools/generateRtexifUpdates +++ b/tools/generateRtexifUpdates @@ -29,30 +29,58 @@ fi 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 --git a/tools/osx/macosx_bundle.sh b/tools/osx/macosx_bundle.sh index 20a140ce5..1413b5d76 100644 --- a/tools/osx/macosx_bundle.sh +++ b/tools/osx/macosx_bundle.sh @@ -125,10 +125,15 @@ find -E "${LIB}" -type f -regex '.*\.(a|la|cache)$' | while read -r; do rm "${RE msg "Copying configuration files from ${GTK_PREFIX}:" install -d "${ETC}/gtk-3.0" -cp "${GTK_PREFIX}/etc/gtk-3.0/im-multipress.conf" "${ETC}/gtk-3.0" -"${GTK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/gdk-pixbuf-2.0/*/loaders/*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" -"${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/gtk-3.0/*/immodules/*.so > "${ETC}/gtk-3.0/gtk.immodules" -#sed -i "" -e "s|${PWD}|/tmp|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" + +# Make Frameworks folder flat +mv "${LIB}"/gdk-pixbuf-2.0/2*/loaders/*.so "${LIB}" +mv "${LIB}"/gtk-3.0/3*/immodules/*.so "${LIB}" +rm -r "${LIB}"/gtk-3.0 +rm -r "${LIB}"/gdk-pixbuf-2.0 + +"${GTK_PREFIX}/bin/gdk-pixbuf-query-loaders" "${LIB}"/libpix*.so > "${ETC}/gtk-3.0/gdk-pixbuf.loaders" +"${GTK_PREFIX}/bin/gtk-query-immodules-3.0" "${LIB}"/{im*.so,libprint*.so} > "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|@executable_path/../|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/glib-2.0/schemas @@ -147,19 +152,18 @@ done ditto {"${GTK_PREFIX}","${RESOURCES}"}/share/icons/Adwaita/index.theme "${GTK_PREFIX}/bin/gtk-update-icon-cache-3.0" "${RESOURCES}/share/icons/Adwaita" -### Pending deletion: -# fontconfig files (X11 backend only) -# if otool -L "${EXECUTABLE}" | grep -sq 'libgtk-x11-2.0'; then -# msg "Installing fontconfig files (Using X11 backend. FONTCONFIG_PATH will be set by executable loader.)" -# cp -RL "${GTK_PREFIX}/etc/fonts" "${ETC}" -# fi +# Copy libjpeg-turbo into the app bundle +cp /opt/local/lib/libjpeg.62.dylib "${RESOURCES}/../Frameworks" + +# Copy libtiff into the app bundle +cp /opt/local/lib/libtiff.5.dylib "${RESOURCES}/../Frameworks" # Copy the Lensfun database into the app bundle mkdir -p "${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" +cp /opt/local/lib/liblensfun.2.dylib "${RESOURCES}/../Frameworks" # Copy libiomp5 to Frameworks cp /opt/local/lib/libomp/libiomp5.dylib "${RESOURCES}/../Frameworks" @@ -201,8 +205,11 @@ s|@arch@|${arch}|" \ "${CONTENTS}/Info.plist" plutil -convert binary1 "${CONTENTS}/Info.plist" - - +# Sign the app +CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" +codesign --deep --force -v -s "${CODESIGNID}" "${APP}" +spctl -a -vvvv "${APP}" + function CreateDmg { local srcDir="$(mktemp -dt $$)" @@ -227,7 +234,10 @@ function CreateDmg { fi msg "Creating disk image:" - hdiutil create -format UDBZ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" + hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" + + # Sign disk image + codesign --deep --force -v -s "${CODESIGNID}" "${dmg_name}.dmg" # Zip disk image for redistribution zip "${dmg_name}.zip" "${dmg_name}.dmg" AboutThisBuild.txt diff --git a/tools/source_icons/README b/tools/source_icons/README deleted file mode 100644 index 826b58b2b..000000000 --- a/tools/source_icons/README +++ /dev/null @@ -1,32 +0,0 @@ -The repository tools/source_icons contains source icons (in SVG format) and the script to generate PNG icons for both Dark and Light themes. - -tools/source_icons/scalable ---------------------------- -- Contains icons in SVG format. -- A sidecar *.file for each *.svg file. -- The sidecar *.file has the following format: - -> Fields are separated by a comma. - -> The first field defines the PNG filename to be created. - -> The second field indicates either the width (e.g. w22) or the height (e.g. h16) in pixels for the PNG file. - -> The third field is optional. It indicates the icon category (e.g. actions, devices, places). If not indicated, the icon is assumed to belong to "actions". - -tools/source_icons/script -------------------------- -- The main script which creates the icons is make_all_icon_theme.bash -- Launch: - ./make_all_icon_theme.bash /path/to/new/svg/icons/ /tmp/png -- An archive with all the icons will be created in /tmp/png - -Guidelines for icon name ------------------------- -- Use stock item names when prebuilt icons exist (e.g. gtk-open.png). See http://developer.gnome.org/gtk/2.24/gtk-Stock-Items.html -- Use "-" to separate words (e.g. panel-to-left.png) -- Avoid the use of the icon's size as a suffix in the filename (colour.png and not colour-24.png). If needed, use the suffix -large or -small (gtk-close-small.png). - -How to easily work with new icons ---------------------------------- -1- Have a dir which contains only the new SVG files -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 diff --git a/tools/source_icons/scalable/HDR-thumbnail.file b/tools/source_icons/scalable/HDR-thumbnail.file deleted file mode 100644 index 59f729498..000000000 --- a/tools/source_icons/scalable/HDR-thumbnail.file +++ /dev/null @@ -1 +0,0 @@ -HDR-thumbnail.png,w29,actions diff --git a/tools/source_icons/scalable/HDR-thumbnail.svg b/tools/source_icons/scalable/HDR-thumbnail.svg deleted file mode 100644 index ef070f380..000000000 --- a/tools/source_icons/scalable/HDR-thumbnail.svg +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/PanelEnding.file b/tools/source_icons/scalable/PanelEnding.file deleted file mode 100644 index 70f44222b..000000000 --- a/tools/source_icons/scalable/PanelEnding.file +++ /dev/null @@ -1 +0,0 @@ -PanelEnding.png,h28,actions diff --git a/tools/source_icons/scalable/PanelEnding.svg b/tools/source_icons/scalable/PanelEnding.svg deleted file mode 100644 index 18d756b8c..000000000 --- a/tools/source_icons/scalable/PanelEnding.svg +++ /dev/null @@ -1,801 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Created by potrace 1.8, written by Peter Selinger 2001-2007 - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/PixelShift-thumbnail.file b/tools/source_icons/scalable/PixelShift-thumbnail.file deleted file mode 100644 index a62809a4d..000000000 --- a/tools/source_icons/scalable/PixelShift-thumbnail.file +++ /dev/null @@ -1 +0,0 @@ -PixelShift-thumbnail.png,w18,actions diff --git a/tools/source_icons/scalable/PixelShift-thumbnail.svg b/tools/source_icons/scalable/PixelShift-thumbnail.svg deleted file mode 100644 index b606b24f8..000000000 --- a/tools/source_icons/scalable/PixelShift-thumbnail.svg +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-down-small.file b/tools/source_icons/scalable/arrow-down-small.file deleted file mode 100644 index df0b971b0..000000000 --- a/tools/source_icons/scalable/arrow-down-small.file +++ /dev/null @@ -1 +0,0 @@ -arrow-down-small.png,w16,actions diff --git a/tools/source_icons/scalable/arrow-down-small.svg b/tools/source_icons/scalable/arrow-down-small.svg deleted file mode 100644 index 7042bdabd..000000000 --- a/tools/source_icons/scalable/arrow-down-small.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-down.file b/tools/source_icons/scalable/arrow-down.file deleted file mode 100644 index 67ebd1f45..000000000 --- a/tools/source_icons/scalable/arrow-down.file +++ /dev/null @@ -1 +0,0 @@ -arrow-down.png,w22,actions diff --git a/tools/source_icons/scalable/arrow-down.svg b/tools/source_icons/scalable/arrow-down.svg deleted file mode 100644 index 7042bdabd..000000000 --- a/tools/source_icons/scalable/arrow-down.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-left-small.file b/tools/source_icons/scalable/arrow-left-small.file deleted file mode 100644 index fcf5e7094..000000000 --- a/tools/source_icons/scalable/arrow-left-small.file +++ /dev/null @@ -1 +0,0 @@ -arrow-left-small.png,w16,actions diff --git a/tools/source_icons/scalable/arrow-left-small.svg b/tools/source_icons/scalable/arrow-left-small.svg deleted file mode 100644 index c0ecb3b13..000000000 --- a/tools/source_icons/scalable/arrow-left-small.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-left.file b/tools/source_icons/scalable/arrow-left.file deleted file mode 100644 index 4ed6a9390..000000000 --- a/tools/source_icons/scalable/arrow-left.file +++ /dev/null @@ -1 +0,0 @@ -arrow-left.png,w22,actions diff --git a/tools/source_icons/scalable/arrow-left.svg b/tools/source_icons/scalable/arrow-left.svg deleted file mode 100644 index c0ecb3b13..000000000 --- a/tools/source_icons/scalable/arrow-left.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-right-small.file b/tools/source_icons/scalable/arrow-right-small.file deleted file mode 100644 index bc480df22..000000000 --- a/tools/source_icons/scalable/arrow-right-small.file +++ /dev/null @@ -1 +0,0 @@ -arrow-right-small.png,w16,actions diff --git a/tools/source_icons/scalable/arrow-right-small.svg b/tools/source_icons/scalable/arrow-right-small.svg deleted file mode 100644 index 8d1c4694c..000000000 --- a/tools/source_icons/scalable/arrow-right-small.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-right.file b/tools/source_icons/scalable/arrow-right.file deleted file mode 100644 index 7040fee0a..000000000 --- a/tools/source_icons/scalable/arrow-right.file +++ /dev/null @@ -1 +0,0 @@ -arrow-right.png,w22,actions diff --git a/tools/source_icons/scalable/arrow-right.svg b/tools/source_icons/scalable/arrow-right.svg deleted file mode 100644 index 8d1c4694c..000000000 --- a/tools/source_icons/scalable/arrow-right.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-up-small.file b/tools/source_icons/scalable/arrow-up-small.file deleted file mode 100644 index e20834553..000000000 --- a/tools/source_icons/scalable/arrow-up-small.file +++ /dev/null @@ -1 +0,0 @@ -arrow-up-small.png,w16,actions diff --git a/tools/source_icons/scalable/arrow-up-small.svg b/tools/source_icons/scalable/arrow-up-small.svg deleted file mode 100644 index cb6379f6b..000000000 --- a/tools/source_icons/scalable/arrow-up-small.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/arrow-up.file b/tools/source_icons/scalable/arrow-up.file deleted file mode 100644 index 187c9e710..000000000 --- a/tools/source_icons/scalable/arrow-up.file +++ /dev/null @@ -1 +0,0 @@ -arrow-up.png,w22,actions diff --git a/tools/source_icons/scalable/arrow-up.svg b/tools/source_icons/scalable/arrow-up.svg deleted file mode 100644 index cb6379f6b..000000000 --- a/tools/source_icons/scalable/arrow-up.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/atom.file b/tools/source_icons/scalable/atom.file deleted file mode 100644 index 8c7faa135..000000000 --- a/tools/source_icons/scalable/atom.file +++ /dev/null @@ -1 +0,0 @@ -atom.png,w22,actions diff --git a/tools/source_icons/scalable/atom.svg b/tools/source_icons/scalable/atom.svg deleted file mode 100644 index 33eb0a7e5..000000000 --- a/tools/source_icons/scalable/atom.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - Icons for the "Expert" tab in RawTherapee - - - - - - - - image/svg+xml - - Icons for the "Expert" tab in RawTherapee - - - Morgan Hardwood - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/beforeafter.file b/tools/source_icons/scalable/beforeafter.file deleted file mode 100644 index dc6d27251..000000000 --- a/tools/source_icons/scalable/beforeafter.file +++ /dev/null @@ -1 +0,0 @@ -beforeafter.png,w22,actions diff --git a/tools/source_icons/scalable/beforeafter.svg b/tools/source_icons/scalable/beforeafter.svg deleted file mode 100644 index 0e45b9d06..000000000 --- a/tools/source_icons/scalable/beforeafter.svg +++ /dev/null @@ -1,532 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/cglabel0.file b/tools/source_icons/scalable/cglabel0.file deleted file mode 100644 index a8b3d6f7e..000000000 --- a/tools/source_icons/scalable/cglabel0.file +++ /dev/null @@ -1 +0,0 @@ -cglabel0.png,h10,actions diff --git a/tools/source_icons/scalable/cglabel0.svg b/tools/source_icons/scalable/cglabel0.svg deleted file mode 100644 index cbb4ee903..000000000 --- a/tools/source_icons/scalable/cglabel0.svg +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/cglabel1.file b/tools/source_icons/scalable/cglabel1.file deleted file mode 100644 index 82cf9fad5..000000000 --- a/tools/source_icons/scalable/cglabel1.file +++ /dev/null @@ -1 +0,0 @@ -cglabel1.png,h10,actions diff --git a/tools/source_icons/scalable/cglabel1.svg b/tools/source_icons/scalable/cglabel1.svg deleted file mode 100644 index 96172577c..000000000 --- a/tools/source_icons/scalable/cglabel1.svg +++ /dev/null @@ -1,623 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/cglabel2.file b/tools/source_icons/scalable/cglabel2.file deleted file mode 100644 index c7b1dc8a3..000000000 --- a/tools/source_icons/scalable/cglabel2.file +++ /dev/null @@ -1 +0,0 @@ -cglabel2.png,h10,actions diff --git a/tools/source_icons/scalable/cglabel2.svg b/tools/source_icons/scalable/cglabel2.svg deleted file mode 100644 index eb5fc9a08..000000000 --- a/tools/source_icons/scalable/cglabel2.svg +++ /dev/null @@ -1,630 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/cglabel3.file b/tools/source_icons/scalable/cglabel3.file deleted file mode 100644 index 5c5bd5eb5..000000000 --- a/tools/source_icons/scalable/cglabel3.file +++ /dev/null @@ -1 +0,0 @@ -cglabel3.png,h10,actions diff --git a/tools/source_icons/scalable/cglabel3.svg b/tools/source_icons/scalable/cglabel3.svg deleted file mode 100644 index 5e9b6a72c..000000000 --- a/tools/source_icons/scalable/cglabel3.svg +++ /dev/null @@ -1,623 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/cglabel4.file b/tools/source_icons/scalable/cglabel4.file deleted file mode 100644 index ce7c74532..000000000 --- a/tools/source_icons/scalable/cglabel4.file +++ /dev/null @@ -1 +0,0 @@ -cglabel4.png,h10,actions diff --git a/tools/source_icons/scalable/cglabel4.svg b/tools/source_icons/scalable/cglabel4.svg deleted file mode 100644 index 8f98c5284..000000000 --- a/tools/source_icons/scalable/cglabel4.svg +++ /dev/null @@ -1,623 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/cglabel5.file b/tools/source_icons/scalable/cglabel5.file deleted file mode 100644 index f0a6a447b..000000000 --- a/tools/source_icons/scalable/cglabel5.file +++ /dev/null @@ -1 +0,0 @@ -cglabel5.png,h10,actions diff --git a/tools/source_icons/scalable/cglabel5.svg b/tools/source_icons/scalable/cglabel5.svg deleted file mode 100644 index 829d41604..000000000 --- a/tools/source_icons/scalable/cglabel5.svg +++ /dev/null @@ -1,623 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/clabel0.file b/tools/source_icons/scalable/clabel0.file deleted file mode 100644 index 05789c9b6..000000000 --- a/tools/source_icons/scalable/clabel0.file +++ /dev/null @@ -1 +0,0 @@ -clabel0.png,h10,actions diff --git a/tools/source_icons/scalable/clabel0.svg b/tools/source_icons/scalable/clabel0.svg deleted file mode 100644 index 4aef0c70c..000000000 --- a/tools/source_icons/scalable/clabel0.svg +++ /dev/null @@ -1,625 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/clabel1.file b/tools/source_icons/scalable/clabel1.file deleted file mode 100644 index ee2bd7652..000000000 --- a/tools/source_icons/scalable/clabel1.file +++ /dev/null @@ -1 +0,0 @@ -clabel1.png,h10,actions diff --git a/tools/source_icons/scalable/clabel1.svg b/tools/source_icons/scalable/clabel1.svg deleted file mode 100644 index 5b7046f05..000000000 --- a/tools/source_icons/scalable/clabel1.svg +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/clabel2.file b/tools/source_icons/scalable/clabel2.file deleted file mode 100644 index fe6f470ff..000000000 --- a/tools/source_icons/scalable/clabel2.file +++ /dev/null @@ -1 +0,0 @@ -clabel2.png,h10,actions diff --git a/tools/source_icons/scalable/clabel2.svg b/tools/source_icons/scalable/clabel2.svg deleted file mode 100644 index fa363f6a3..000000000 --- a/tools/source_icons/scalable/clabel2.svg +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/clabel3.file b/tools/source_icons/scalable/clabel3.file deleted file mode 100644 index e80189869..000000000 --- a/tools/source_icons/scalable/clabel3.file +++ /dev/null @@ -1 +0,0 @@ -clabel3.png,h10,actions diff --git a/tools/source_icons/scalable/clabel3.svg b/tools/source_icons/scalable/clabel3.svg deleted file mode 100644 index 311083bd6..000000000 --- a/tools/source_icons/scalable/clabel3.svg +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/clabel4.file b/tools/source_icons/scalable/clabel4.file deleted file mode 100644 index b15df7ca9..000000000 --- a/tools/source_icons/scalable/clabel4.file +++ /dev/null @@ -1 +0,0 @@ -clabel4.png,h10,actions diff --git a/tools/source_icons/scalable/clabel4.svg b/tools/source_icons/scalable/clabel4.svg deleted file mode 100644 index e18b8dc54..000000000 --- a/tools/source_icons/scalable/clabel4.svg +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/clabel5.file b/tools/source_icons/scalable/clabel5.file deleted file mode 100644 index 317abad4b..000000000 --- a/tools/source_icons/scalable/clabel5.file +++ /dev/null @@ -1 +0,0 @@ -clabel5.png,h10,actions diff --git a/tools/source_icons/scalable/clabel5.svg b/tools/source_icons/scalable/clabel5.svg deleted file mode 100644 index 986911fa8..000000000 --- a/tools/source_icons/scalable/clabel5.svg +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/closedhand.file b/tools/source_icons/scalable/closedhand.file deleted file mode 100644 index d1f705e03..000000000 --- a/tools/source_icons/scalable/closedhand.file +++ /dev/null @@ -1 +0,0 @@ -closedhand.png,w22,actions diff --git a/tools/source_icons/scalable/closedhand.svg b/tools/source_icons/scalable/closedhand.svg deleted file mode 100644 index e6d9727f5..000000000 --- a/tools/source_icons/scalable/closedhand.svg +++ /dev/null @@ -1,1317 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/tools/source_icons/scalable/colorPickers-hide.file b/tools/source_icons/scalable/colorPickers-hide.file deleted file mode 100644 index 728529716..000000000 --- a/tools/source_icons/scalable/colorPickers-hide.file +++ /dev/null @@ -1 +0,0 @@ -colorPickers-hide.png,w22,actions diff --git a/tools/source_icons/scalable/colorPickers-hide.svg b/tools/source_icons/scalable/colorPickers-hide.svg deleted file mode 100644 index fe0c7bf14..000000000 --- a/tools/source_icons/scalable/colorPickers-hide.svg +++ /dev/null @@ -1,4301 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/colorPickers-show.file b/tools/source_icons/scalable/colorPickers-show.file deleted file mode 100644 index 96db803fc..000000000 --- a/tools/source_icons/scalable/colorPickers-show.file +++ /dev/null @@ -1 +0,0 @@ -colorPickers-show.png,w22,actions diff --git a/tools/source_icons/scalable/colorPickers-show.svg b/tools/source_icons/scalable/colorPickers-show.svg deleted file mode 100644 index d03472020..000000000 --- a/tools/source_icons/scalable/colorPickers-show.svg +++ /dev/null @@ -1,4372 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/colour.file b/tools/source_icons/scalable/colour.file deleted file mode 100644 index ca546e7bc..000000000 --- a/tools/source_icons/scalable/colour.file +++ /dev/null @@ -1 +0,0 @@ -colour.png,w24,actions diff --git a/tools/source_icons/scalable/colour.svg b/tools/source_icons/scalable/colour.svg deleted file mode 100644 index 27b160e49..000000000 --- a/tools/source_icons/scalable/colour.svg +++ /dev/null @@ -1,855 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/crop-auto.file b/tools/source_icons/scalable/crop-auto.file deleted file mode 100644 index d642c35b1..000000000 --- a/tools/source_icons/scalable/crop-auto.file +++ /dev/null @@ -1 +0,0 @@ -crop-auto.png,h18,actions diff --git a/tools/source_icons/scalable/crop-auto.svg b/tools/source_icons/scalable/crop-auto.svg deleted file mode 100644 index 9aab86fa9..000000000 --- a/tools/source_icons/scalable/crop-auto.svg +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/crop.file b/tools/source_icons/scalable/crop.file deleted file mode 100644 index d0dbe770f..000000000 --- a/tools/source_icons/scalable/crop.file +++ /dev/null @@ -1 +0,0 @@ -crop.png,w22,actions diff --git a/tools/source_icons/scalable/crop.svg b/tools/source_icons/scalable/crop.svg deleted file mode 100644 index c25a302d0..000000000 --- a/tools/source_icons/scalable/crop.svg +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/crossCursor.svg b/tools/source_icons/scalable/crossCursor.svg deleted file mode 100644 index 3ae8ab282..000000000 --- a/tools/source_icons/scalable/crossCursor.svg +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/crossed-arrows-in.file b/tools/source_icons/scalable/crossed-arrows-in.file deleted file mode 100644 index 8405de976..000000000 --- a/tools/source_icons/scalable/crossed-arrows-in.file +++ /dev/null @@ -1 +0,0 @@ -crossed-arrows-in.png,w22,actions diff --git a/tools/source_icons/scalable/crossed-arrows-in.svg b/tools/source_icons/scalable/crossed-arrows-in.svg deleted file mode 100644 index 56c346d18..000000000 --- a/tools/source_icons/scalable/crossed-arrows-in.svg +++ /dev/null @@ -1,424 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/crossed-arrows-out.file b/tools/source_icons/scalable/crossed-arrows-out.file deleted file mode 100644 index efb263648..000000000 --- a/tools/source_icons/scalable/crossed-arrows-out.file +++ /dev/null @@ -1 +0,0 @@ -crossed-arrows-out.png,w22,actions diff --git a/tools/source_icons/scalable/crossed-arrows-out.svg b/tools/source_icons/scalable/crossed-arrows-out.svg deleted file mode 100644 index dd9269923..000000000 --- a/tools/source_icons/scalable/crossed-arrows-out.svg +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/curveType-NURBS.file b/tools/source_icons/scalable/curveType-NURBS.file deleted file mode 100644 index e283505d8..000000000 --- a/tools/source_icons/scalable/curveType-NURBS.file +++ /dev/null @@ -1 +0,0 @@ -curveType-NURBS.png,w18,actions diff --git a/tools/source_icons/scalable/curveType-NURBS.svg b/tools/source_icons/scalable/curveType-NURBS.svg deleted file mode 100644 index 3a8624355..000000000 --- a/tools/source_icons/scalable/curveType-NURBS.svg +++ /dev/null @@ -1,630 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/curveType-controlPoints.file b/tools/source_icons/scalable/curveType-controlPoints.file deleted file mode 100644 index 5a904de85..000000000 --- a/tools/source_icons/scalable/curveType-controlPoints.file +++ /dev/null @@ -1 +0,0 @@ -curveType-controlPoints.png,w18,actions diff --git a/tools/source_icons/scalable/curveType-controlPoints.svg b/tools/source_icons/scalable/curveType-controlPoints.svg deleted file mode 100644 index 6e5e1f6ec..000000000 --- a/tools/source_icons/scalable/curveType-controlPoints.svg +++ /dev/null @@ -1,773 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/curveType-flatLinear.file b/tools/source_icons/scalable/curveType-flatLinear.file deleted file mode 100644 index f4bfb52f9..000000000 --- a/tools/source_icons/scalable/curveType-flatLinear.file +++ /dev/null @@ -1 +0,0 @@ -curveType-flatLinear.png,w18,actions diff --git a/tools/source_icons/scalable/curveType-flatLinear.svg b/tools/source_icons/scalable/curveType-flatLinear.svg deleted file mode 100644 index e4923d637..000000000 --- a/tools/source_icons/scalable/curveType-flatLinear.svg +++ /dev/null @@ -1,777 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/curveType-linear.file b/tools/source_icons/scalable/curveType-linear.file deleted file mode 100644 index adceccc33..000000000 --- a/tools/source_icons/scalable/curveType-linear.file +++ /dev/null @@ -1 +0,0 @@ -curveType-linear.png,w18,actions diff --git a/tools/source_icons/scalable/curveType-linear.svg b/tools/source_icons/scalable/curveType-linear.svg deleted file mode 100644 index 8ae43977c..000000000 --- a/tools/source_icons/scalable/curveType-linear.svg +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/curveType-parametric.file b/tools/source_icons/scalable/curveType-parametric.file deleted file mode 100644 index f7cc51e7b..000000000 --- a/tools/source_icons/scalable/curveType-parametric.file +++ /dev/null @@ -1 +0,0 @@ -curveType-parametric.png,w18,actions diff --git a/tools/source_icons/scalable/curveType-parametric.svg b/tools/source_icons/scalable/curveType-parametric.svg deleted file mode 100644 index 2d11b90da..000000000 --- a/tools/source_icons/scalable/curveType-parametric.svg +++ /dev/null @@ -1,595 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/curveType-spline.file b/tools/source_icons/scalable/curveType-spline.file deleted file mode 100644 index 4c64e10c9..000000000 --- a/tools/source_icons/scalable/curveType-spline.file +++ /dev/null @@ -1 +0,0 @@ -curveType-spline.png,w18,actions diff --git a/tools/source_icons/scalable/curveType-spline.svg b/tools/source_icons/scalable/curveType-spline.svg deleted file mode 100644 index a24b7ae9c..000000000 --- a/tools/source_icons/scalable/curveType-spline.svg +++ /dev/null @@ -1,629 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/detail.file b/tools/source_icons/scalable/detail.file deleted file mode 100644 index a82843776..000000000 --- a/tools/source_icons/scalable/detail.file +++ /dev/null @@ -1 +0,0 @@ -detail.png,w24,actions diff --git a/tools/source_icons/scalable/detail.svg b/tools/source_icons/scalable/detail.svg deleted file mode 100644 index 7910c1492..000000000 --- a/tools/source_icons/scalable/detail.svg +++ /dev/null @@ -1,5185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/distorsion.file b/tools/source_icons/scalable/distorsion.file deleted file mode 100644 index 881efa97a..000000000 --- a/tools/source_icons/scalable/distorsion.file +++ /dev/null @@ -1 +0,0 @@ -distorsion.png,w22,actions diff --git a/tools/source_icons/scalable/distorsion.svg b/tools/source_icons/scalable/distorsion.svg deleted file mode 100644 index 3be8206b3..000000000 --- a/tools/source_icons/scalable/distorsion.svg +++ /dev/null @@ -1,1056 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/distortion-auto.file b/tools/source_icons/scalable/distortion-auto.file deleted file mode 100644 index 06f4a0745..000000000 --- a/tools/source_icons/scalable/distortion-auto.file +++ /dev/null @@ -1 +0,0 @@ -distortion-auto.png,h18,actions diff --git a/tools/source_icons/scalable/distortion-auto.svg b/tools/source_icons/scalable/distortion-auto.svg deleted file mode 100644 index a36ee2f34..000000000 --- a/tools/source_icons/scalable/distortion-auto.svg +++ /dev/null @@ -1,1068 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/distortion-barrel.file b/tools/source_icons/scalable/distortion-barrel.file deleted file mode 100644 index 555f27f5d..000000000 --- a/tools/source_icons/scalable/distortion-barrel.file +++ /dev/null @@ -1 +0,0 @@ -distortion-barrel.png,w22,actions diff --git a/tools/source_icons/scalable/distortion-barrel.svg b/tools/source_icons/scalable/distortion-barrel.svg deleted file mode 100644 index fe76c60c3..000000000 --- a/tools/source_icons/scalable/distortion-barrel.svg +++ /dev/null @@ -1,1150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/distortion-pincushion.file b/tools/source_icons/scalable/distortion-pincushion.file deleted file mode 100644 index 56807fba7..000000000 --- a/tools/source_icons/scalable/distortion-pincushion.file +++ /dev/null @@ -1 +0,0 @@ -distortion-pincushion.png,w22,actions diff --git a/tools/source_icons/scalable/distortion-pincushion.svg b/tools/source_icons/scalable/distortion-pincushion.svg deleted file mode 100644 index 0a5efed14..000000000 --- a/tools/source_icons/scalable/distortion-pincushion.svg +++ /dev/null @@ -1,1149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/distortion.file b/tools/source_icons/scalable/distortion.file deleted file mode 100644 index 46b17a564..000000000 --- a/tools/source_icons/scalable/distortion.file +++ /dev/null @@ -1 +0,0 @@ -distortion.png,w22,actions diff --git a/tools/source_icons/scalable/distortion.svg b/tools/source_icons/scalable/distortion.svg deleted file mode 100644 index 3be8206b3..000000000 --- a/tools/source_icons/scalable/distortion.svg +++ /dev/null @@ -1,1056 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/document-open-recent.file b/tools/source_icons/scalable/document-open-recent.file deleted file mode 100644 index 2eb27f8b5..000000000 --- a/tools/source_icons/scalable/document-open-recent.file +++ /dev/null @@ -1 +0,0 @@ -document-open-recent.png,h18,actions diff --git a/tools/source_icons/scalable/document-open-recent.svg b/tools/source_icons/scalable/document-open-recent.svg deleted file mode 100644 index 978b28c3f..000000000 --- a/tools/source_icons/scalable/document-open-recent.svg +++ /dev/null @@ -1,1643 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/drive-harddisk.file b/tools/source_icons/scalable/drive-harddisk.file deleted file mode 100644 index b50693e40..000000000 --- a/tools/source_icons/scalable/drive-harddisk.file +++ /dev/null @@ -1,4 +0,0 @@ -drive-harddisk.png,h18,devices -computer.png,h18,devices -media-flash.png,h18,devices -media-tape.png,h18,devices diff --git a/tools/source_icons/scalable/drive-harddisk.svg b/tools/source_icons/scalable/drive-harddisk.svg deleted file mode 100644 index f548c5671..000000000 --- a/tools/source_icons/scalable/drive-harddisk.svg +++ /dev/null @@ -1,2582 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/drive-optical.file b/tools/source_icons/scalable/drive-optical.file deleted file mode 100644 index 3054e2a2e..000000000 --- a/tools/source_icons/scalable/drive-optical.file +++ /dev/null @@ -1,5 +0,0 @@ -gtk-cdrom.png,h18,devices -media-optical.png,h18,devices -drive-optical.png,h18,devices -media-optical-bd.png,h18,devices -media-optical-dvd.png,h18,devices diff --git a/tools/source_icons/scalable/drive-optical.svg b/tools/source_icons/scalable/drive-optical.svg deleted file mode 100644 index b27e6d194..000000000 --- a/tools/source_icons/scalable/drive-optical.svg +++ /dev/null @@ -1,1388 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/edited.file b/tools/source_icons/scalable/edited.file deleted file mode 100644 index 95b77b754..000000000 --- a/tools/source_icons/scalable/edited.file +++ /dev/null @@ -1,2 +0,0 @@ -edited.png,w18,actions -edited-small.png,h10,actions diff --git a/tools/source_icons/scalable/edited.svg b/tools/source_icons/scalable/edited.svg deleted file mode 100644 index 0126b05d8..000000000 --- a/tools/source_icons/scalable/edited.svg +++ /dev/null @@ -1,785 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/editedg.file b/tools/source_icons/scalable/editedg.file deleted file mode 100644 index 49951f9b9..000000000 --- a/tools/source_icons/scalable/editedg.file +++ /dev/null @@ -1 +0,0 @@ -editedg-small.png,h10,actions diff --git a/tools/source_icons/scalable/editedg.svg b/tools/source_icons/scalable/editedg.svg deleted file mode 100644 index 578ecfa7e..000000000 --- a/tools/source_icons/scalable/editedg.svg +++ /dev/null @@ -1,753 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/editednot.file b/tools/source_icons/scalable/editednot.file deleted file mode 100644 index d4d663433..000000000 --- a/tools/source_icons/scalable/editednot.file +++ /dev/null @@ -1 +0,0 @@ -editednot-small.png,h10,actions diff --git a/tools/source_icons/scalable/editednot.svg b/tools/source_icons/scalable/editednot.svg deleted file mode 100644 index c286de2dc..000000000 --- a/tools/source_icons/scalable/editednot.svg +++ /dev/null @@ -1,761 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/editednotg.file b/tools/source_icons/scalable/editednotg.file deleted file mode 100644 index 4e6ac8b28..000000000 --- a/tools/source_icons/scalable/editednotg.file +++ /dev/null @@ -1 +0,0 @@ -editednotg-small.png,h10,actions diff --git a/tools/source_icons/scalable/editednotg.svg b/tools/source_icons/scalable/editednotg.svg deleted file mode 100644 index 6c51de9cf..000000000 --- a/tools/source_icons/scalable/editednotg.svg +++ /dev/null @@ -1,893 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/editmodehand.file b/tools/source_icons/scalable/editmodehand.file deleted file mode 100644 index 93df595c9..000000000 --- a/tools/source_icons/scalable/editmodehand.file +++ /dev/null @@ -1 +0,0 @@ -editmodehand.png,w22,actions diff --git a/tools/source_icons/scalable/editmodehand.svg b/tools/source_icons/scalable/editmodehand.svg deleted file mode 100644 index 9a9898e68..000000000 --- a/tools/source_icons/scalable/editmodehand.svg +++ /dev/null @@ -1,581 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/tools/source_icons/scalable/equalizer-narrow.file b/tools/source_icons/scalable/equalizer-narrow.file deleted file mode 100644 index c922b3554..000000000 --- a/tools/source_icons/scalable/equalizer-narrow.file +++ /dev/null @@ -1 +0,0 @@ -equalizer-narrow.png,w22,actions diff --git a/tools/source_icons/scalable/equalizer-narrow.svg b/tools/source_icons/scalable/equalizer-narrow.svg deleted file mode 100644 index b31128b36..000000000 --- a/tools/source_icons/scalable/equalizer-narrow.svg +++ /dev/null @@ -1,201 +0,0 @@ - - - - - Icons for the "Expert" tab in RawTherapee - - - - - - - - image/svg+xml - - Icons for the "Expert" tab in RawTherapee - - - Morgan Hardwood - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/equalizer-wide.file b/tools/source_icons/scalable/equalizer-wide.file deleted file mode 100644 index 22ee0b4b9..000000000 --- a/tools/source_icons/scalable/equalizer-wide.file +++ /dev/null @@ -1 +0,0 @@ -equalizer-wide.png,w22,actions diff --git a/tools/source_icons/scalable/equalizer-wide.svg b/tools/source_icons/scalable/equalizer-wide.svg deleted file mode 100644 index dcf184f56..000000000 --- a/tools/source_icons/scalable/equalizer-wide.svg +++ /dev/null @@ -1,256 +0,0 @@ - - - - - Icons for the "Expert" tab in RawTherapee - - - - - - - - image/svg+xml - - Icons for the "Expert" tab in RawTherapee - - - Morgan Hardwood - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/expanderClosed.file b/tools/source_icons/scalable/expanderClosed.file deleted file mode 100644 index 46bb9877d..000000000 --- a/tools/source_icons/scalable/expanderClosed.file +++ /dev/null @@ -1 +0,0 @@ -expanderClosed.png,w14,actions diff --git a/tools/source_icons/scalable/expanderClosed.svg b/tools/source_icons/scalable/expanderClosed.svg deleted file mode 100644 index b9778cca4..000000000 --- a/tools/source_icons/scalable/expanderClosed.svg +++ /dev/null @@ -1,738 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/expanderDisabled.file b/tools/source_icons/scalable/expanderDisabled.file deleted file mode 100644 index 36e6dc1e4..000000000 --- a/tools/source_icons/scalable/expanderDisabled.file +++ /dev/null @@ -1 +0,0 @@ -expanderDisabled.png,w14,actions diff --git a/tools/source_icons/scalable/expanderDisabled.svg b/tools/source_icons/scalable/expanderDisabled.svg deleted file mode 100644 index 4518548cb..000000000 --- a/tools/source_icons/scalable/expanderDisabled.svg +++ /dev/null @@ -1,634 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/expanderEnabled.file b/tools/source_icons/scalable/expanderEnabled.file deleted file mode 100644 index 0835d223a..000000000 --- a/tools/source_icons/scalable/expanderEnabled.file +++ /dev/null @@ -1 +0,0 @@ -expanderEnabled.png,w14,actions diff --git a/tools/source_icons/scalable/expanderEnabled.svg b/tools/source_icons/scalable/expanderEnabled.svg deleted file mode 100644 index 4606416c0..000000000 --- a/tools/source_icons/scalable/expanderEnabled.svg +++ /dev/null @@ -1,698 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/expanderInconsistent.file b/tools/source_icons/scalable/expanderInconsistent.file deleted file mode 100644 index 1121c311e..000000000 --- a/tools/source_icons/scalable/expanderInconsistent.file +++ /dev/null @@ -1 +0,0 @@ -expanderInconsistent.png,w14,actions diff --git a/tools/source_icons/scalable/expanderInconsistent.svg b/tools/source_icons/scalable/expanderInconsistent.svg deleted file mode 100644 index 8021f1199..000000000 --- a/tools/source_icons/scalable/expanderInconsistent.svg +++ /dev/null @@ -1,1243 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/expanderOpened.file b/tools/source_icons/scalable/expanderOpened.file deleted file mode 100644 index f6bfd1a54..000000000 --- a/tools/source_icons/scalable/expanderOpened.file +++ /dev/null @@ -1 +0,0 @@ -expanderOpened.png,w14,actions diff --git a/tools/source_icons/scalable/expanderOpened.svg b/tools/source_icons/scalable/expanderOpened.svg deleted file mode 100644 index a0092792c..000000000 --- a/tools/source_icons/scalable/expanderOpened.svg +++ /dev/null @@ -1,748 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/exposure.file b/tools/source_icons/scalable/exposure.file deleted file mode 100644 index 0d166322a..000000000 --- a/tools/source_icons/scalable/exposure.file +++ /dev/null @@ -1 +0,0 @@ -exposure.png,w24,actions diff --git a/tools/source_icons/scalable/exposure.svg b/tools/source_icons/scalable/exposure.svg deleted file mode 100644 index e1a029520..000000000 --- a/tools/source_icons/scalable/exposure.svg +++ /dev/null @@ -1,668 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/filter-original-1.file b/tools/source_icons/scalable/filter-original-1.file deleted file mode 100644 index 8f2876c7b..000000000 --- a/tools/source_icons/scalable/filter-original-1.file +++ /dev/null @@ -1 +0,0 @@ -filter-original-1.png,w22,actions diff --git a/tools/source_icons/scalable/filter-original-1.svg b/tools/source_icons/scalable/filter-original-1.svg deleted file mode 100644 index 4295c2fdb..000000000 --- a/tools/source_icons/scalable/filter-original-1.svg +++ /dev/null @@ -1,738 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/filter-original-2.file b/tools/source_icons/scalable/filter-original-2.file deleted file mode 100644 index d2e205806..000000000 --- a/tools/source_icons/scalable/filter-original-2.file +++ /dev/null @@ -1 +0,0 @@ -filter-original-2.png,w22,actions diff --git a/tools/source_icons/scalable/filter-original-2.svg b/tools/source_icons/scalable/filter-original-2.svg deleted file mode 100644 index e1c436ac0..000000000 --- a/tools/source_icons/scalable/filter-original-2.svg +++ /dev/null @@ -1,768 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/filter.file b/tools/source_icons/scalable/filter.file deleted file mode 100644 index 06d8465ab..000000000 --- a/tools/source_icons/scalable/filter.file +++ /dev/null @@ -1 +0,0 @@ -filter.png,w22,actions diff --git a/tools/source_icons/scalable/filter.svg b/tools/source_icons/scalable/filter.svg deleted file mode 100644 index c29442938..000000000 --- a/tools/source_icons/scalable/filter.svg +++ /dev/null @@ -1,1198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/filterclear.file b/tools/source_icons/scalable/filterclear.file deleted file mode 100644 index 00636c71c..000000000 --- a/tools/source_icons/scalable/filterclear.file +++ /dev/null @@ -1 +0,0 @@ -filterclear.png,w22,actions diff --git a/tools/source_icons/scalable/filterclear.svg b/tools/source_icons/scalable/filterclear.svg deleted file mode 100644 index 367c0de73..000000000 --- a/tools/source_icons/scalable/filterclear.svg +++ /dev/null @@ -1,1263 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gamut-hist.file b/tools/source_icons/scalable/gamut-hist.file deleted file mode 100644 index 5eb359187..000000000 --- a/tools/source_icons/scalable/gamut-hist.file +++ /dev/null @@ -1 +0,0 @@ -gamut-hist.png,w22,actions diff --git a/tools/source_icons/scalable/gamut-hist.svg b/tools/source_icons/scalable/gamut-hist.svg deleted file mode 100644 index cf163df83..000000000 --- a/tools/source_icons/scalable/gamut-hist.svg +++ /dev/null @@ -1,852 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - Morgan Hardwood - - - RawTherapee www.rawtherapee.com - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gamut_srgb_prophoto_xy.svg b/tools/source_icons/scalable/gamut_srgb_prophoto_xy.svg deleted file mode 100644 index 21058878e..000000000 --- a/tools/source_icons/scalable/gamut_srgb_prophoto_xy.svg +++ /dev/null @@ -1,656 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - Morgan Hardwood - - - RawTherapee www.rawtherapee.com - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/grayrated.file b/tools/source_icons/scalable/grayrated.file deleted file mode 100644 index 5b2be3e7f..000000000 --- a/tools/source_icons/scalable/grayrated.file +++ /dev/null @@ -1 +0,0 @@ -grayrated.png,h10,actions diff --git a/tools/source_icons/scalable/grayrated.svg b/tools/source_icons/scalable/grayrated.svg deleted file mode 100644 index 66eb88a7b..000000000 --- a/tools/source_icons/scalable/grayrated.svg +++ /dev/null @@ -1,645 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-add.file b/tools/source_icons/scalable/gtk-add.file deleted file mode 100644 index 24df258a3..000000000 --- a/tools/source_icons/scalable/gtk-add.file +++ /dev/null @@ -1,3 +0,0 @@ -list-add.png,w16,actions -gtk-add.png,w16,actions -list-add-small.png,w12,actions diff --git a/tools/source_icons/scalable/gtk-add.svg b/tools/source_icons/scalable/gtk-add.svg deleted file mode 100644 index 16cc1a352..000000000 --- a/tools/source_icons/scalable/gtk-add.svg +++ /dev/null @@ -1,636 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-apply.file b/tools/source_icons/scalable/gtk-apply.file deleted file mode 100644 index a319cbc75..000000000 --- a/tools/source_icons/scalable/gtk-apply.file +++ /dev/null @@ -1,2 +0,0 @@ -gtk-apply.png,w16,actions -gtk-ok.png,w16,actions diff --git a/tools/source_icons/scalable/gtk-apply.svg b/tools/source_icons/scalable/gtk-apply.svg deleted file mode 100644 index c3e79f8a1..000000000 --- a/tools/source_icons/scalable/gtk-apply.svg +++ /dev/null @@ -1,760 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-cancel.file b/tools/source_icons/scalable/gtk-cancel.file deleted file mode 100644 index 92d2ea411..000000000 --- a/tools/source_icons/scalable/gtk-cancel.file +++ /dev/null @@ -1 +0,0 @@ -gtk-cancel.png.old,h16,actions diff --git a/tools/source_icons/scalable/gtk-cancel.svg b/tools/source_icons/scalable/gtk-cancel.svg deleted file mode 100644 index 8c4529dd7..000000000 --- a/tools/source_icons/scalable/gtk-cancel.svg +++ /dev/null @@ -1,705 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-close.file b/tools/source_icons/scalable/gtk-close.file deleted file mode 100644 index bc92ba643..000000000 --- a/tools/source_icons/scalable/gtk-close.file +++ /dev/null @@ -1,3 +0,0 @@ -gtk-close.png,w16,actions -gtk-close-small.png,h13,actions -gtk-cancel.png,h16,actions diff --git a/tools/source_icons/scalable/gtk-close.svg b/tools/source_icons/scalable/gtk-close.svg deleted file mode 100644 index 0cb1d4711..000000000 --- a/tools/source_icons/scalable/gtk-close.svg +++ /dev/null @@ -1,636 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-color-picker-add.file b/tools/source_icons/scalable/gtk-color-picker-add.file deleted file mode 100644 index f51e051bd..000000000 --- a/tools/source_icons/scalable/gtk-color-picker-add.file +++ /dev/null @@ -1 +0,0 @@ -gtk-color-picker-add.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-color-picker-add.svg b/tools/source_icons/scalable/gtk-color-picker-add.svg deleted file mode 100644 index a12197ffe..000000000 --- a/tools/source_icons/scalable/gtk-color-picker-add.svg +++ /dev/null @@ -1,4839 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-color-picker.file b/tools/source_icons/scalable/gtk-color-picker.file deleted file mode 100644 index d17a0648a..000000000 --- a/tools/source_icons/scalable/gtk-color-picker.file +++ /dev/null @@ -1,2 +0,0 @@ -gtk-color-picker.png,w22,actions -gtk-color-picker-small.png,h18,actions diff --git a/tools/source_icons/scalable/gtk-color-picker.svg b/tools/source_icons/scalable/gtk-color-picker.svg deleted file mode 100644 index 5a0591bb0..000000000 --- a/tools/source_icons/scalable/gtk-color-picker.svg +++ /dev/null @@ -1,4834 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-copy.file b/tools/source_icons/scalable/gtk-copy.file deleted file mode 100644 index 6c4bec508..000000000 --- a/tools/source_icons/scalable/gtk-copy.file +++ /dev/null @@ -1,2 +0,0 @@ -edit-copy.png,w22,actions -gtk-copy.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-copy.svg b/tools/source_icons/scalable/gtk-copy.svg deleted file mode 100644 index e3dafc549..000000000 --- a/tools/source_icons/scalable/gtk-copy.svg +++ /dev/null @@ -1,727 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-delete.file b/tools/source_icons/scalable/gtk-delete.file deleted file mode 100644 index c73446d0a..000000000 --- a/tools/source_icons/scalable/gtk-delete.file +++ /dev/null @@ -1,2 +0,0 @@ -trash.png,w22,actions -trash-show-empty.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-delete.svg b/tools/source_icons/scalable/gtk-delete.svg deleted file mode 100644 index c3f85b1d9..000000000 --- a/tools/source_icons/scalable/gtk-delete.svg +++ /dev/null @@ -1,862 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-directory.file b/tools/source_icons/scalable/gtk-directory.file deleted file mode 100644 index 85e55324b..000000000 --- a/tools/source_icons/scalable/gtk-directory.file +++ /dev/null @@ -1,2 +0,0 @@ -folder.png,h18,places -gtk-directory.png,h18,places diff --git a/tools/source_icons/scalable/gtk-directory.svg b/tools/source_icons/scalable/gtk-directory.svg deleted file mode 100644 index 493ed2f3c..000000000 --- a/tools/source_icons/scalable/gtk-directory.svg +++ /dev/null @@ -1,1586 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-edit.file b/tools/source_icons/scalable/gtk-edit.file deleted file mode 100644 index 4dcec3be2..000000000 --- a/tools/source_icons/scalable/gtk-edit.file +++ /dev/null @@ -1 +0,0 @@ -gtk-edit.png,h18,actions diff --git a/tools/source_icons/scalable/gtk-edit.svg b/tools/source_icons/scalable/gtk-edit.svg deleted file mode 100644 index 2ec58e4e7..000000000 --- a/tools/source_icons/scalable/gtk-edit.svg +++ /dev/null @@ -1,681 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-execute.file b/tools/source_icons/scalable/gtk-execute.file deleted file mode 100644 index d7c02b31d..000000000 --- a/tools/source_icons/scalable/gtk-execute.file +++ /dev/null @@ -1 +0,0 @@ -processing.png,w20,actions diff --git a/tools/source_icons/scalable/gtk-execute.svg b/tools/source_icons/scalable/gtk-execute.svg deleted file mode 100644 index f54159c69..000000000 --- a/tools/source_icons/scalable/gtk-execute.svg +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-file.file b/tools/source_icons/scalable/gtk-file.file deleted file mode 100644 index a50463a1d..000000000 --- a/tools/source_icons/scalable/gtk-file.file +++ /dev/null @@ -1 +0,0 @@ -rtwindow.png,w20,actions diff --git a/tools/source_icons/scalable/gtk-file.svg b/tools/source_icons/scalable/gtk-file.svg deleted file mode 100644 index 76bc44c89..000000000 --- a/tools/source_icons/scalable/gtk-file.svg +++ /dev/null @@ -1,2735 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-find.file b/tools/source_icons/scalable/gtk-find.file deleted file mode 100644 index 2ca2b36a0..000000000 --- a/tools/source_icons/scalable/gtk-find.file +++ /dev/null @@ -1,2 +0,0 @@ -gtk-find.png,h18,actions -edit-find.png,h18,actions diff --git a/tools/source_icons/scalable/gtk-find.svg b/tools/source_icons/scalable/gtk-find.svg deleted file mode 100644 index 70fe453ea..000000000 --- a/tools/source_icons/scalable/gtk-find.svg +++ /dev/null @@ -1,580 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-fullscreen.file b/tools/source_icons/scalable/gtk-fullscreen.file deleted file mode 100644 index 320e0e84b..000000000 --- a/tools/source_icons/scalable/gtk-fullscreen.file +++ /dev/null @@ -1 +0,0 @@ -fullscreen.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-fullscreen.svg b/tools/source_icons/scalable/gtk-fullscreen.svg deleted file mode 100644 index 3b24a0741..000000000 --- a/tools/source_icons/scalable/gtk-fullscreen.svg +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-goto-first.file b/tools/source_icons/scalable/gtk-goto-first.file deleted file mode 100644 index bad72d8a0..000000000 --- a/tools/source_icons/scalable/gtk-goto-first.file +++ /dev/null @@ -1 +0,0 @@ -toleftend.png,h16,actions diff --git a/tools/source_icons/scalable/gtk-goto-first.svg b/tools/source_icons/scalable/gtk-goto-first.svg deleted file mode 100644 index 281180ba0..000000000 --- a/tools/source_icons/scalable/gtk-goto-first.svg +++ /dev/null @@ -1,605 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-goto-last.file b/tools/source_icons/scalable/gtk-goto-last.file deleted file mode 100644 index aace4f459..000000000 --- a/tools/source_icons/scalable/gtk-goto-last.file +++ /dev/null @@ -1 +0,0 @@ -torightend.png,h16,actions diff --git a/tools/source_icons/scalable/gtk-goto-last.svg b/tools/source_icons/scalable/gtk-goto-last.svg deleted file mode 100644 index 9149f5477..000000000 --- a/tools/source_icons/scalable/gtk-goto-last.svg +++ /dev/null @@ -1,605 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-leave-fullscreen.file b/tools/source_icons/scalable/gtk-leave-fullscreen.file deleted file mode 100644 index 1880eacae..000000000 --- a/tools/source_icons/scalable/gtk-leave-fullscreen.file +++ /dev/null @@ -1 +0,0 @@ -fullscreen-exit.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-leave-fullscreen.svg b/tools/source_icons/scalable/gtk-leave-fullscreen.svg deleted file mode 100644 index a28049fde..000000000 --- a/tools/source_icons/scalable/gtk-leave-fullscreen.svg +++ /dev/null @@ -1,360 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-media-play.file b/tools/source_icons/scalable/gtk-media-play.file deleted file mode 100644 index 8d32e77c6..000000000 --- a/tools/source_icons/scalable/gtk-media-play.file +++ /dev/null @@ -1 +0,0 @@ -gtk-media-play.png,w13,actions diff --git a/tools/source_icons/scalable/gtk-media-play.svg b/tools/source_icons/scalable/gtk-media-play.svg deleted file mode 100644 index 105ceaa57..000000000 --- a/tools/source_icons/scalable/gtk-media-play.svg +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-media-stop.file b/tools/source_icons/scalable/gtk-media-stop.file deleted file mode 100644 index db36b568b..000000000 --- a/tools/source_icons/scalable/gtk-media-stop.file +++ /dev/null @@ -1 +0,0 @@ -gtk-media-stop.png,w13,actions diff --git a/tools/source_icons/scalable/gtk-media-stop.svg b/tools/source_icons/scalable/gtk-media-stop.svg deleted file mode 100644 index e70bb5e60..000000000 --- a/tools/source_icons/scalable/gtk-media-stop.svg +++ /dev/null @@ -1,661 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-open.file b/tools/source_icons/scalable/gtk-open.file deleted file mode 100644 index ee4eb5b7f..000000000 --- a/tools/source_icons/scalable/gtk-open.file +++ /dev/null @@ -1,2 +0,0 @@ -gtk-open.png,h18,actions -document-open.png,h18,actions diff --git a/tools/source_icons/scalable/gtk-open.svg b/tools/source_icons/scalable/gtk-open.svg deleted file mode 100644 index 9101e96ca..000000000 --- a/tools/source_icons/scalable/gtk-open.svg +++ /dev/null @@ -1,2007 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-paste.file b/tools/source_icons/scalable/gtk-paste.file deleted file mode 100644 index 78b7b677c..000000000 --- a/tools/source_icons/scalable/gtk-paste.file +++ /dev/null @@ -1,2 +0,0 @@ -edit-paste.png,w22,actions -gtk-paste.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-paste.svg b/tools/source_icons/scalable/gtk-paste.svg deleted file mode 100644 index c1844a849..000000000 --- a/tools/source_icons/scalable/gtk-paste.svg +++ /dev/null @@ -1,1599 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-preferences.file b/tools/source_icons/scalable/gtk-preferences.file deleted file mode 100644 index aca57191b..000000000 --- a/tools/source_icons/scalable/gtk-preferences.file +++ /dev/null @@ -1 +0,0 @@ -gtk-preferences.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-preferences.svg b/tools/source_icons/scalable/gtk-preferences.svg deleted file mode 100644 index 1e45e94f3..000000000 --- a/tools/source_icons/scalable/gtk-preferences.svg +++ /dev/null @@ -1,2516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-remove-red.file b/tools/source_icons/scalable/gtk-remove-red.file deleted file mode 100644 index 0e8243c23..000000000 --- a/tools/source_icons/scalable/gtk-remove-red.file +++ /dev/null @@ -1 +0,0 @@ -list-remove-red-small.png,w12,actions diff --git a/tools/source_icons/scalable/gtk-remove-red.svg b/tools/source_icons/scalable/gtk-remove-red.svg deleted file mode 100644 index c06356bbf..000000000 --- a/tools/source_icons/scalable/gtk-remove-red.svg +++ /dev/null @@ -1,663 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-remove.file b/tools/source_icons/scalable/gtk-remove.file deleted file mode 100644 index 46f4b8ff3..000000000 --- a/tools/source_icons/scalable/gtk-remove.file +++ /dev/null @@ -1,2 +0,0 @@ -list-remove.png,w16,actions -gtk-remove.png,w16,actions diff --git a/tools/source_icons/scalable/gtk-remove.svg b/tools/source_icons/scalable/gtk-remove.svg deleted file mode 100644 index 344e2f922..000000000 --- a/tools/source_icons/scalable/gtk-remove.svg +++ /dev/null @@ -1,663 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-save.file b/tools/source_icons/scalable/gtk-save.file deleted file mode 100644 index 14e20f87d..000000000 --- a/tools/source_icons/scalable/gtk-save.file +++ /dev/null @@ -1,2 +0,0 @@ -gtk-save-large.png,w22,actions -gtk-save.png,h18,actions diff --git a/tools/source_icons/scalable/gtk-save.svg b/tools/source_icons/scalable/gtk-save.svg deleted file mode 100644 index ced16de85..000000000 --- a/tools/source_icons/scalable/gtk-save.svg +++ /dev/null @@ -1,2807 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-undo-rtl.file b/tools/source_icons/scalable/gtk-undo-rtl.file deleted file mode 100644 index 2ab2af327..000000000 --- a/tools/source_icons/scalable/gtk-undo-rtl.file +++ /dev/null @@ -1,2 +0,0 @@ -gtk-undo-rtl.png,h16,actions -gtk-undo-rtl-small.png,h11,actions diff --git a/tools/source_icons/scalable/gtk-undo-rtl.svg b/tools/source_icons/scalable/gtk-undo-rtl.svg deleted file mode 100644 index be883d98b..000000000 --- a/tools/source_icons/scalable/gtk-undo-rtl.svg +++ /dev/null @@ -1,732 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-undo.file b/tools/source_icons/scalable/gtk-undo.file deleted file mode 100644 index 527c94db9..000000000 --- a/tools/source_icons/scalable/gtk-undo.file +++ /dev/null @@ -1,2 +0,0 @@ -gtk-undo-ltr.png,h16,actions -gtk-undo-ltr-small.png,h11,actions diff --git a/tools/source_icons/scalable/gtk-undo.svg b/tools/source_icons/scalable/gtk-undo.svg deleted file mode 100644 index af5ae1a36..000000000 --- a/tools/source_icons/scalable/gtk-undo.svg +++ /dev/null @@ -1,665 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-undoall-ltr.file b/tools/source_icons/scalable/gtk-undoall-ltr.file deleted file mode 100644 index bdd6db95a..000000000 --- a/tools/source_icons/scalable/gtk-undoall-ltr.file +++ /dev/null @@ -1 +0,0 @@ -gtk-undoall-ltr.png,w16,actions diff --git a/tools/source_icons/scalable/gtk-undoall-ltr.svg b/tools/source_icons/scalable/gtk-undoall-ltr.svg deleted file mode 100644 index fef739619..000000000 --- a/tools/source_icons/scalable/gtk-undoall-ltr.svg +++ /dev/null @@ -1,1170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-undoall-rtl.file b/tools/source_icons/scalable/gtk-undoall-rtl.file deleted file mode 100644 index f42fa476e..000000000 --- a/tools/source_icons/scalable/gtk-undoall-rtl.file +++ /dev/null @@ -1 +0,0 @@ -gtk-undoall-rtl.png,w16,actions diff --git a/tools/source_icons/scalable/gtk-undoall-rtl.svg b/tools/source_icons/scalable/gtk-undoall-rtl.svg deleted file mode 100644 index 7228b7e89..000000000 --- a/tools/source_icons/scalable/gtk-undoall-rtl.svg +++ /dev/null @@ -1,1170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-100-small.file b/tools/source_icons/scalable/gtk-zoom-100-small.file deleted file mode 100644 index b78fca5ae..000000000 --- a/tools/source_icons/scalable/gtk-zoom-100-small.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-100-small.png,w16,actions diff --git a/tools/source_icons/scalable/gtk-zoom-100-small.svg b/tools/source_icons/scalable/gtk-zoom-100-small.svg deleted file mode 100644 index cce49706f..000000000 --- a/tools/source_icons/scalable/gtk-zoom-100-small.svg +++ /dev/null @@ -1,623 +0,0 @@ - - - - - gtk-zoom-100 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - gtk-zoom-100 - - http://www.rawtherapee.com/ - 2013-04-10 - - - DrSlony - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-100.file b/tools/source_icons/scalable/gtk-zoom-100.file deleted file mode 100644 index d2b450253..000000000 --- a/tools/source_icons/scalable/gtk-zoom-100.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-100.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-zoom-100.svg b/tools/source_icons/scalable/gtk-zoom-100.svg deleted file mode 100644 index cce49706f..000000000 --- a/tools/source_icons/scalable/gtk-zoom-100.svg +++ /dev/null @@ -1,623 +0,0 @@ - - - - - gtk-zoom-100 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - gtk-zoom-100 - - http://www.rawtherapee.com/ - 2013-04-10 - - - DrSlony - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-crop.file b/tools/source_icons/scalable/gtk-zoom-crop.file deleted file mode 100644 index 9d79868b9..000000000 --- a/tools/source_icons/scalable/gtk-zoom-crop.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-crop.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-zoom-crop.svg b/tools/source_icons/scalable/gtk-zoom-crop.svg deleted file mode 100644 index 7ed5d51c2..000000000 --- a/tools/source_icons/scalable/gtk-zoom-crop.svg +++ /dev/null @@ -1,512 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-fit.file b/tools/source_icons/scalable/gtk-zoom-fit.file deleted file mode 100644 index a82764c69..000000000 --- a/tools/source_icons/scalable/gtk-zoom-fit.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-fit.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-zoom-fit.svg b/tools/source_icons/scalable/gtk-zoom-fit.svg deleted file mode 100644 index 95b81e1d6..000000000 --- a/tools/source_icons/scalable/gtk-zoom-fit.svg +++ /dev/null @@ -1,509 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-in-small.file b/tools/source_icons/scalable/gtk-zoom-in-small.file deleted file mode 100644 index a15fb60de..000000000 --- a/tools/source_icons/scalable/gtk-zoom-in-small.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-in-small.png,w16,actions diff --git a/tools/source_icons/scalable/gtk-zoom-in-small.svg b/tools/source_icons/scalable/gtk-zoom-in-small.svg deleted file mode 100644 index bbc50a171..000000000 --- a/tools/source_icons/scalable/gtk-zoom-in-small.svg +++ /dev/null @@ -1,521 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-in.file b/tools/source_icons/scalable/gtk-zoom-in.file deleted file mode 100644 index 2bb454228..000000000 --- a/tools/source_icons/scalable/gtk-zoom-in.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-in.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-zoom-in.svg b/tools/source_icons/scalable/gtk-zoom-in.svg deleted file mode 100644 index bbc50a171..000000000 --- a/tools/source_icons/scalable/gtk-zoom-in.svg +++ /dev/null @@ -1,521 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-out-small.file b/tools/source_icons/scalable/gtk-zoom-out-small.file deleted file mode 100644 index 08a4ba843..000000000 --- a/tools/source_icons/scalable/gtk-zoom-out-small.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-out-small.png,w16,actions diff --git a/tools/source_icons/scalable/gtk-zoom-out-small.svg b/tools/source_icons/scalable/gtk-zoom-out-small.svg deleted file mode 100644 index 8ca1e951b..000000000 --- a/tools/source_icons/scalable/gtk-zoom-out-small.svg +++ /dev/null @@ -1,558 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/gtk-zoom-out.file b/tools/source_icons/scalable/gtk-zoom-out.file deleted file mode 100644 index 5427894ff..000000000 --- a/tools/source_icons/scalable/gtk-zoom-out.file +++ /dev/null @@ -1 +0,0 @@ -gtk-zoom-out.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-zoom-out.svg b/tools/source_icons/scalable/gtk-zoom-out.svg deleted file mode 100644 index 8ca1e951b..000000000 --- a/tools/source_icons/scalable/gtk-zoom-out.svg +++ /dev/null @@ -1,558 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histBar.file b/tools/source_icons/scalable/histBar.file deleted file mode 100644 index 3ede85b7a..000000000 --- a/tools/source_icons/scalable/histBar.file +++ /dev/null @@ -1 +0,0 @@ -histBar.png,w10,actions diff --git a/tools/source_icons/scalable/histBar.svg b/tools/source_icons/scalable/histBar.svg deleted file mode 100644 index 2bb232311..000000000 --- a/tools/source_icons/scalable/histBar.svg +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histBarg.file b/tools/source_icons/scalable/histBarg.file deleted file mode 100644 index 31c8b58f5..000000000 --- a/tools/source_icons/scalable/histBarg.file +++ /dev/null @@ -1 +0,0 @@ -histBarg.png,w10,actions diff --git a/tools/source_icons/scalable/histBarg.svg b/tools/source_icons/scalable/histBarg.svg deleted file mode 100644 index a1cec3797..000000000 --- a/tools/source_icons/scalable/histBarg.svg +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histBlue.file b/tools/source_icons/scalable/histBlue.file deleted file mode 100644 index 6efe5f403..000000000 --- a/tools/source_icons/scalable/histBlue.file +++ /dev/null @@ -1 +0,0 @@ -histBlue.png,w10,actions diff --git a/tools/source_icons/scalable/histBlue.svg b/tools/source_icons/scalable/histBlue.svg deleted file mode 100644 index 129c708e9..000000000 --- a/tools/source_icons/scalable/histBlue.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histBlueg.file b/tools/source_icons/scalable/histBlueg.file deleted file mode 100644 index 8a1a0e6ee..000000000 --- a/tools/source_icons/scalable/histBlueg.file +++ /dev/null @@ -1 +0,0 @@ -histBlueg.png,w10,actions diff --git a/tools/source_icons/scalable/histBlueg.svg b/tools/source_icons/scalable/histBlueg.svg deleted file mode 100644 index ab0b32804..000000000 --- a/tools/source_icons/scalable/histBlueg.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histFull.file b/tools/source_icons/scalable/histFull.file deleted file mode 100644 index f1577e57d..000000000 --- a/tools/source_icons/scalable/histFull.file +++ /dev/null @@ -1 +0,0 @@ -histFull.png,w10,actions diff --git a/tools/source_icons/scalable/histFull.svg b/tools/source_icons/scalable/histFull.svg deleted file mode 100644 index 46336770d..000000000 --- a/tools/source_icons/scalable/histFull.svg +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histFullg.file b/tools/source_icons/scalable/histFullg.file deleted file mode 100644 index b011c3a49..000000000 --- a/tools/source_icons/scalable/histFullg.file +++ /dev/null @@ -1 +0,0 @@ -histFullg.png,w10,actions diff --git a/tools/source_icons/scalable/histFullg.svg b/tools/source_icons/scalable/histFullg.svg deleted file mode 100644 index 37765aaff..000000000 --- a/tools/source_icons/scalable/histFullg.svg +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histGreen.file b/tools/source_icons/scalable/histGreen.file deleted file mode 100644 index a2699dfd3..000000000 --- a/tools/source_icons/scalable/histGreen.file +++ /dev/null @@ -1 +0,0 @@ -histGreen.png,w10,actions diff --git a/tools/source_icons/scalable/histGreen.svg b/tools/source_icons/scalable/histGreen.svg deleted file mode 100644 index 0c8babc4d..000000000 --- a/tools/source_icons/scalable/histGreen.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histGreeng.file b/tools/source_icons/scalable/histGreeng.file deleted file mode 100644 index 793be799d..000000000 --- a/tools/source_icons/scalable/histGreeng.file +++ /dev/null @@ -1 +0,0 @@ -histGreeng.png,w10,actions diff --git a/tools/source_icons/scalable/histGreeng.svg b/tools/source_icons/scalable/histGreeng.svg deleted file mode 100644 index c85a8d412..000000000 --- a/tools/source_icons/scalable/histGreeng.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histRaw.file b/tools/source_icons/scalable/histRaw.file deleted file mode 100644 index b0b56e108..000000000 --- a/tools/source_icons/scalable/histRaw.file +++ /dev/null @@ -1 +0,0 @@ -histRaw.png,w10,actions diff --git a/tools/source_icons/scalable/histRaw.svg b/tools/source_icons/scalable/histRaw.svg deleted file mode 100644 index 73fa612ce..000000000 --- a/tools/source_icons/scalable/histRaw.svg +++ /dev/null @@ -1,632 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histRawg.file b/tools/source_icons/scalable/histRawg.file deleted file mode 100644 index 3b526f92e..000000000 --- a/tools/source_icons/scalable/histRawg.file +++ /dev/null @@ -1 +0,0 @@ -histRawg.png,w10,actions diff --git a/tools/source_icons/scalable/histRawg.svg b/tools/source_icons/scalable/histRawg.svg deleted file mode 100644 index 69fac8f10..000000000 --- a/tools/source_icons/scalable/histRawg.svg +++ /dev/null @@ -1,615 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histRed.file b/tools/source_icons/scalable/histRed.file deleted file mode 100644 index 7517b28d3..000000000 --- a/tools/source_icons/scalable/histRed.file +++ /dev/null @@ -1 +0,0 @@ -histRed.png,w10,actions diff --git a/tools/source_icons/scalable/histRed.svg b/tools/source_icons/scalable/histRed.svg deleted file mode 100644 index fdff14a74..000000000 --- a/tools/source_icons/scalable/histRed.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histRedg.file b/tools/source_icons/scalable/histRedg.file deleted file mode 100644 index 03cc3e79a..000000000 --- a/tools/source_icons/scalable/histRedg.file +++ /dev/null @@ -1 +0,0 @@ -histRedg.png,w10,actions diff --git a/tools/source_icons/scalable/histRedg.svg b/tools/source_icons/scalable/histRedg.svg deleted file mode 100644 index c25dba5c2..000000000 --- a/tools/source_icons/scalable/histRedg.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histValue.file b/tools/source_icons/scalable/histValue.file deleted file mode 100644 index 077c9b761..000000000 --- a/tools/source_icons/scalable/histValue.file +++ /dev/null @@ -1 +0,0 @@ -histValue.png,w10,actions diff --git a/tools/source_icons/scalable/histValue.svg b/tools/source_icons/scalable/histValue.svg deleted file mode 100644 index b82f4da01..000000000 --- a/tools/source_icons/scalable/histValue.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histValueg.file b/tools/source_icons/scalable/histValueg.file deleted file mode 100644 index 37c61fe32..000000000 --- a/tools/source_icons/scalable/histValueg.file +++ /dev/null @@ -1 +0,0 @@ -histValueg.png,w10,actions diff --git a/tools/source_icons/scalable/histValueg.svg b/tools/source_icons/scalable/histValueg.svg deleted file mode 100644 index ffc0daaf8..000000000 --- a/tools/source_icons/scalable/histValueg.svg +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/histogramButtons.svg b/tools/source_icons/scalable/histogramButtons.svg deleted file mode 100644 index 231b6dd94..000000000 --- a/tools/source_icons/scalable/histogramButtons.svg +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/image-editor.file b/tools/source_icons/scalable/image-editor.file deleted file mode 100644 index c1853f678..000000000 --- a/tools/source_icons/scalable/image-editor.file +++ /dev/null @@ -1 +0,0 @@ -image-editor.png,w22,actions diff --git a/tools/source_icons/scalable/image-editor.svg b/tools/source_icons/scalable/image-editor.svg deleted file mode 100644 index 220138a9a..000000000 --- a/tools/source_icons/scalable/image-editor.svg +++ /dev/null @@ -1,2652 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/info.file b/tools/source_icons/scalable/info.file deleted file mode 100644 index ede775c5b..000000000 --- a/tools/source_icons/scalable/info.file +++ /dev/null @@ -1 +0,0 @@ -info.png,w22,actions diff --git a/tools/source_icons/scalable/info.svg b/tools/source_icons/scalable/info.svg deleted file mode 100644 index e25fca2f0..000000000 --- a/tools/source_icons/scalable/info.svg +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/intent-absolute.file b/tools/source_icons/scalable/intent-absolute.file deleted file mode 100644 index 57278bff2..000000000 --- a/tools/source_icons/scalable/intent-absolute.file +++ /dev/null @@ -1 +0,0 @@ -intent-absolute.png,w25,actions diff --git a/tools/source_icons/scalable/intent-absolute.svg b/tools/source_icons/scalable/intent-absolute.svg deleted file mode 100644 index b5092b0c5..000000000 --- a/tools/source_icons/scalable/intent-absolute.svg +++ /dev/null @@ -1,1376 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/intent-perceptual.file b/tools/source_icons/scalable/intent-perceptual.file deleted file mode 100644 index 3e7520042..000000000 --- a/tools/source_icons/scalable/intent-perceptual.file +++ /dev/null @@ -1 +0,0 @@ -intent-perceptual.png,w25,actions diff --git a/tools/source_icons/scalable/intent-perceptual.svg b/tools/source_icons/scalable/intent-perceptual.svg deleted file mode 100644 index 3c949c91e..000000000 --- a/tools/source_icons/scalable/intent-perceptual.svg +++ /dev/null @@ -1,1362 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/intent-relative.file b/tools/source_icons/scalable/intent-relative.file deleted file mode 100644 index 5191a25c3..000000000 --- a/tools/source_icons/scalable/intent-relative.file +++ /dev/null @@ -1 +0,0 @@ -intent-relative.png,w25,actions diff --git a/tools/source_icons/scalable/intent-relative.svg b/tools/source_icons/scalable/intent-relative.svg deleted file mode 100644 index 706de23d1..000000000 --- a/tools/source_icons/scalable/intent-relative.svg +++ /dev/null @@ -1,1361 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/tools/source_icons/scalable/intent-saturation.file b/tools/source_icons/scalable/intent-saturation.file deleted file mode 100644 index 9f33b978e..000000000 --- a/tools/source_icons/scalable/intent-saturation.file +++ /dev/null @@ -1 +0,0 @@ -intent-saturation.png,w25,actions diff --git a/tools/source_icons/scalable/intent-saturation.svg b/tools/source_icons/scalable/intent-saturation.svg deleted file mode 100644 index 1af08f4f2..000000000 --- a/tools/source_icons/scalable/intent-saturation.svg +++ /dev/null @@ -1,1362 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/lock-off.file b/tools/source_icons/scalable/lock-off.file deleted file mode 100644 index 38ddabc0d..000000000 --- a/tools/source_icons/scalable/lock-off.file +++ /dev/null @@ -1 +0,0 @@ -lock-off.png,h10,actions diff --git a/tools/source_icons/scalable/lock-off.svg b/tools/source_icons/scalable/lock-off.svg deleted file mode 100644 index caeeed555..000000000 --- a/tools/source_icons/scalable/lock-off.svg +++ /dev/null @@ -1,916 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/lock-on.file b/tools/source_icons/scalable/lock-on.file deleted file mode 100644 index ba7eef7a3..000000000 --- a/tools/source_icons/scalable/lock-on.file +++ /dev/null @@ -1 +0,0 @@ -lock-on.png,h10,actions diff --git a/tools/source_icons/scalable/lock-on.svg b/tools/source_icons/scalable/lock-on.svg deleted file mode 100644 index 8d841a0cd..000000000 --- a/tools/source_icons/scalable/lock-on.svg +++ /dev/null @@ -1,777 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/media-floppy.file b/tools/source_icons/scalable/media-floppy.file deleted file mode 100644 index 1ffa70b86..000000000 --- a/tools/source_icons/scalable/media-floppy.file +++ /dev/null @@ -1,2 +0,0 @@ -media-floppy.png,h18,devices -drive-removable-media.png,h18,devices diff --git a/tools/source_icons/scalable/media-floppy.svg b/tools/source_icons/scalable/media-floppy.svg deleted file mode 100644 index 9032f9041..000000000 --- a/tools/source_icons/scalable/media-floppy.svg +++ /dev/null @@ -1,661 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/media-usb.file b/tools/source_icons/scalable/media-usb.file deleted file mode 100644 index 3012badee..000000000 --- a/tools/source_icons/scalable/media-usb.file +++ /dev/null @@ -1 +0,0 @@ -media-usb.png,h18,actions diff --git a/tools/source_icons/scalable/media-usb.svg b/tools/source_icons/scalable/media-usb.svg deleted file mode 100644 index e9b36285c..000000000 --- a/tools/source_icons/scalable/media-usb.svg +++ /dev/null @@ -1,2590 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/meta.file b/tools/source_icons/scalable/meta.file deleted file mode 100644 index 8e432502e..000000000 --- a/tools/source_icons/scalable/meta.file +++ /dev/null @@ -1 +0,0 @@ -meta.png,w24,actions diff --git a/tools/source_icons/scalable/meta.svg b/tools/source_icons/scalable/meta.svg deleted file mode 100644 index a4ac324dc..000000000 --- a/tools/source_icons/scalable/meta.svg +++ /dev/null @@ -1,657 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - META - - - - - - - diff --git a/tools/source_icons/scalable/move-1D-h.svg b/tools/source_icons/scalable/move-1D-h.svg deleted file mode 100644 index 64514eed1..000000000 --- a/tools/source_icons/scalable/move-1D-h.svg +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/move-1D-v.svg b/tools/source_icons/scalable/move-1D-v.svg deleted file mode 100644 index 24b49a7de..000000000 --- a/tools/source_icons/scalable/move-1D-v.svg +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/move-2D.svg b/tools/source_icons/scalable/move-2D.svg deleted file mode 100644 index bb0eece8f..000000000 --- a/tools/source_icons/scalable/move-2D.svg +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/nav-next.file b/tools/source_icons/scalable/nav-next.file deleted file mode 100644 index fc7568def..000000000 --- a/tools/source_icons/scalable/nav-next.file +++ /dev/null @@ -1 +0,0 @@ -nav-next.png,w19,actions diff --git a/tools/source_icons/scalable/nav-next.svg b/tools/source_icons/scalable/nav-next.svg deleted file mode 100644 index 123f334d9..000000000 --- a/tools/source_icons/scalable/nav-next.svg +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/nav-prev.file b/tools/source_icons/scalable/nav-prev.file deleted file mode 100644 index ea876f7fb..000000000 --- a/tools/source_icons/scalable/nav-prev.file +++ /dev/null @@ -1 +0,0 @@ -nav-prev.png,w19,actions diff --git a/tools/source_icons/scalable/nav-prev.svg b/tools/source_icons/scalable/nav-prev.svg deleted file mode 100644 index 4112c31fb..000000000 --- a/tools/source_icons/scalable/nav-prev.svg +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/nav-sync.file b/tools/source_icons/scalable/nav-sync.file deleted file mode 100644 index 92c643323..000000000 --- a/tools/source_icons/scalable/nav-sync.file +++ /dev/null @@ -1 +0,0 @@ -nav-sync.png,w14,actions diff --git a/tools/source_icons/scalable/nav-sync.svg b/tools/source_icons/scalable/nav-sync.svg deleted file mode 100644 index 420e2c335..000000000 --- a/tools/source_icons/scalable/nav-sync.svg +++ /dev/null @@ -1,833 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/new-detail-window.file b/tools/source_icons/scalable/new-detail-window.file deleted file mode 100644 index d4ee2bf2c..000000000 --- a/tools/source_icons/scalable/new-detail-window.file +++ /dev/null @@ -1 +0,0 @@ -new-detail-window.png,w22,actions diff --git a/tools/source_icons/scalable/new-detail-window.svg b/tools/source_icons/scalable/new-detail-window.svg deleted file mode 100644 index 5241e38d9..000000000 --- a/tools/source_icons/scalable/new-detail-window.svg +++ /dev/null @@ -1,500 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/openhand.file b/tools/source_icons/scalable/openhand.file deleted file mode 100644 index 2a05645a0..000000000 --- a/tools/source_icons/scalable/openhand.file +++ /dev/null @@ -1 +0,0 @@ -openhand.png,w22,actions diff --git a/tools/source_icons/scalable/openhand.svg b/tools/source_icons/scalable/openhand.svg deleted file mode 100644 index 9fd47c0df..000000000 --- a/tools/source_icons/scalable/openhand.svg +++ /dev/null @@ -1,760 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/tools/source_icons/scalable/panel-to-bottom.file b/tools/source_icons/scalable/panel-to-bottom.file deleted file mode 100644 index 2474ef833..000000000 --- a/tools/source_icons/scalable/panel-to-bottom.file +++ /dev/null @@ -1 +0,0 @@ -panel-to-bottom.png,w22,actions diff --git a/tools/source_icons/scalable/panel-to-bottom.svg b/tools/source_icons/scalable/panel-to-bottom.svg deleted file mode 100644 index 03d4ba020..000000000 --- a/tools/source_icons/scalable/panel-to-bottom.svg +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/panel-to-left.file b/tools/source_icons/scalable/panel-to-left.file deleted file mode 100644 index f730a3c74..000000000 --- a/tools/source_icons/scalable/panel-to-left.file +++ /dev/null @@ -1 +0,0 @@ -panel-to-left.png,h22,actions diff --git a/tools/source_icons/scalable/panel-to-left.svg b/tools/source_icons/scalable/panel-to-left.svg deleted file mode 100644 index 3483477b3..000000000 --- a/tools/source_icons/scalable/panel-to-left.svg +++ /dev/null @@ -1,794 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/panel-to-right.file b/tools/source_icons/scalable/panel-to-right.file deleted file mode 100644 index 9ae79460a..000000000 --- a/tools/source_icons/scalable/panel-to-right.file +++ /dev/null @@ -1 +0,0 @@ -panel-to-right.png,h22,actions diff --git a/tools/source_icons/scalable/panel-to-right.svg b/tools/source_icons/scalable/panel-to-right.svg deleted file mode 100644 index 5a999fc47..000000000 --- a/tools/source_icons/scalable/panel-to-right.svg +++ /dev/null @@ -1,812 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/panel-to-top.file b/tools/source_icons/scalable/panel-to-top.file deleted file mode 100644 index b9eee13ad..000000000 --- a/tools/source_icons/scalable/panel-to-top.file +++ /dev/null @@ -1 +0,0 @@ -panel-to-top.png,w22,actions diff --git a/tools/source_icons/scalable/panel-to-top.svg b/tools/source_icons/scalable/panel-to-top.svg deleted file mode 100644 index 12e513aa0..000000000 --- a/tools/source_icons/scalable/panel-to-top.svg +++ /dev/null @@ -1,784 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/perspective-h1.file b/tools/source_icons/scalable/perspective-h1.file deleted file mode 100644 index f6f27cad6..000000000 --- a/tools/source_icons/scalable/perspective-h1.file +++ /dev/null @@ -1 +0,0 @@ -perspective-h1.png,w22,actions diff --git a/tools/source_icons/scalable/perspective-h1.svg b/tools/source_icons/scalable/perspective-h1.svg deleted file mode 100644 index 5a5a9e33e..000000000 --- a/tools/source_icons/scalable/perspective-h1.svg +++ /dev/null @@ -1,1133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/perspective-h2.file b/tools/source_icons/scalable/perspective-h2.file deleted file mode 100644 index 60cc690af..000000000 --- a/tools/source_icons/scalable/perspective-h2.file +++ /dev/null @@ -1 +0,0 @@ -perspective-h2.png,w22,actions diff --git a/tools/source_icons/scalable/perspective-h2.svg b/tools/source_icons/scalable/perspective-h2.svg deleted file mode 100644 index a36956151..000000000 --- a/tools/source_icons/scalable/perspective-h2.svg +++ /dev/null @@ -1,1133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/perspective-v1.file b/tools/source_icons/scalable/perspective-v1.file deleted file mode 100644 index cbc05fec6..000000000 --- a/tools/source_icons/scalable/perspective-v1.file +++ /dev/null @@ -1 +0,0 @@ -perspective-v1.png,w22,actions diff --git a/tools/source_icons/scalable/perspective-v1.svg b/tools/source_icons/scalable/perspective-v1.svg deleted file mode 100644 index 712447c2a..000000000 --- a/tools/source_icons/scalable/perspective-v1.svg +++ /dev/null @@ -1,1138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/perspective-v2.file b/tools/source_icons/scalable/perspective-v2.file deleted file mode 100644 index c4ade9f63..000000000 --- a/tools/source_icons/scalable/perspective-v2.file +++ /dev/null @@ -1 +0,0 @@ -perspective-v2.png,w22,actions diff --git a/tools/source_icons/scalable/perspective-v2.svg b/tools/source_icons/scalable/perspective-v2.svg deleted file mode 100644 index 8842e9c41..000000000 --- a/tools/source_icons/scalable/perspective-v2.svg +++ /dev/null @@ -1,1140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/popuparrow.file b/tools/source_icons/scalable/popuparrow.file deleted file mode 100644 index 1a3ca3ffc..000000000 --- a/tools/source_icons/scalable/popuparrow.file +++ /dev/null @@ -1 +0,0 @@ -popuparrow.png,h6,actions diff --git a/tools/source_icons/scalable/popuparrow.svg b/tools/source_icons/scalable/popuparrow.svg deleted file mode 100644 index 3328dbfb4..000000000 --- a/tools/source_icons/scalable/popuparrow.svg +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeB-off.file b/tools/source_icons/scalable/previewmodeB-off.file deleted file mode 100644 index 78d96d991..000000000 --- a/tools/source_icons/scalable/previewmodeB-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeB-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeB-off.svg b/tools/source_icons/scalable/previewmodeB-off.svg deleted file mode 100644 index 2566c37cf..000000000 --- a/tools/source_icons/scalable/previewmodeB-off.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeB-on.file b/tools/source_icons/scalable/previewmodeB-on.file deleted file mode 100644 index 045f8a31b..000000000 --- a/tools/source_icons/scalable/previewmodeB-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeB-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeB-on.svg b/tools/source_icons/scalable/previewmodeB-on.svg deleted file mode 100644 index cc3faa733..000000000 --- a/tools/source_icons/scalable/previewmodeB-on.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeBC0-off.file b/tools/source_icons/scalable/previewmodeBC0-off.file deleted file mode 100644 index baf7ab70a..000000000 --- a/tools/source_icons/scalable/previewmodeBC0-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC0-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC0-off.svg b/tools/source_icons/scalable/previewmodeBC0-off.svg deleted file mode 100644 index 7c29636e9..000000000 --- a/tools/source_icons/scalable/previewmodeBC0-off.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - T - - diff --git a/tools/source_icons/scalable/previewmodeBC0-on.file b/tools/source_icons/scalable/previewmodeBC0-on.file deleted file mode 100644 index 033a88501..000000000 --- a/tools/source_icons/scalable/previewmodeBC0-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC0-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC0-on.svg b/tools/source_icons/scalable/previewmodeBC0-on.svg deleted file mode 100644 index 7613279ec..000000000 --- a/tools/source_icons/scalable/previewmodeBC0-on.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - T - - diff --git a/tools/source_icons/scalable/previewmodeBC1-off.file b/tools/source_icons/scalable/previewmodeBC1-off.file deleted file mode 100644 index db5e6f2e2..000000000 --- a/tools/source_icons/scalable/previewmodeBC1-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC1-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC1-off.svg b/tools/source_icons/scalable/previewmodeBC1-off.svg deleted file mode 100644 index 1e7d3e669..000000000 --- a/tools/source_icons/scalable/previewmodeBC1-off.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeBC1-on.file b/tools/source_icons/scalable/previewmodeBC1-on.file deleted file mode 100644 index 1de2f604d..000000000 --- a/tools/source_icons/scalable/previewmodeBC1-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC1-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC1-on.svg b/tools/source_icons/scalable/previewmodeBC1-on.svg deleted file mode 100644 index b4b21cd85..000000000 --- a/tools/source_icons/scalable/previewmodeBC1-on.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeBC2-off.file b/tools/source_icons/scalable/previewmodeBC2-off.file deleted file mode 100644 index 6073f7aac..000000000 --- a/tools/source_icons/scalable/previewmodeBC2-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC2-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC2-off.svg b/tools/source_icons/scalable/previewmodeBC2-off.svg deleted file mode 100644 index e9f4e10f2..000000000 --- a/tools/source_icons/scalable/previewmodeBC2-off.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeBC2-on.file b/tools/source_icons/scalable/previewmodeBC2-on.file deleted file mode 100644 index 18229b31d..000000000 --- a/tools/source_icons/scalable/previewmodeBC2-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC2-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC2-on.svg b/tools/source_icons/scalable/previewmodeBC2-on.svg deleted file mode 100644 index 582b69fd8..000000000 --- a/tools/source_icons/scalable/previewmodeBC2-on.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeBC3-off.file b/tools/source_icons/scalable/previewmodeBC3-off.file deleted file mode 100644 index 1538e97f1..000000000 --- a/tools/source_icons/scalable/previewmodeBC3-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC3-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC3-off.svg b/tools/source_icons/scalable/previewmodeBC3-off.svg deleted file mode 100644 index f8adf9626..000000000 --- a/tools/source_icons/scalable/previewmodeBC3-off.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeBC3-on.file b/tools/source_icons/scalable/previewmodeBC3-on.file deleted file mode 100644 index 6dad52343..000000000 --- a/tools/source_icons/scalable/previewmodeBC3-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeBC3-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeBC3-on.svg b/tools/source_icons/scalable/previewmodeBC3-on.svg deleted file mode 100644 index 8e92c0b35..000000000 --- a/tools/source_icons/scalable/previewmodeBC3-on.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeF-focusScreen-off.file b/tools/source_icons/scalable/previewmodeF-focusScreen-off.file deleted file mode 100644 index f019c1bfb..000000000 --- a/tools/source_icons/scalable/previewmodeF-focusScreen-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeF-focusScreen-off.png,w22,actions diff --git a/tools/source_icons/scalable/previewmodeF-focusScreen-off.svg b/tools/source_icons/scalable/previewmodeF-focusScreen-off.svg deleted file mode 100644 index 814bc9e93..000000000 --- a/tools/source_icons/scalable/previewmodeF-focusScreen-off.svg +++ /dev/null @@ -1,630 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeF-focusScreen-on.file b/tools/source_icons/scalable/previewmodeF-focusScreen-on.file deleted file mode 100644 index 07dc7c137..000000000 --- a/tools/source_icons/scalable/previewmodeF-focusScreen-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeF-focusScreen-on.png,w22,actions diff --git a/tools/source_icons/scalable/previewmodeF-focusScreen-on.svg b/tools/source_icons/scalable/previewmodeF-focusScreen-on.svg deleted file mode 100644 index 63b0e4ec8..000000000 --- a/tools/source_icons/scalable/previewmodeF-focusScreen-on.svg +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeF-off.file b/tools/source_icons/scalable/previewmodeF-off.file deleted file mode 100644 index 420ff2d30..000000000 --- a/tools/source_icons/scalable/previewmodeF-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeF-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeF-off.svg b/tools/source_icons/scalable/previewmodeF-off.svg deleted file mode 100644 index dd4f099b9..000000000 --- a/tools/source_icons/scalable/previewmodeF-off.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - F - - diff --git a/tools/source_icons/scalable/previewmodeF-on.file b/tools/source_icons/scalable/previewmodeF-on.file deleted file mode 100644 index 64d9940b3..000000000 --- a/tools/source_icons/scalable/previewmodeF-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeF-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeF-on.svg b/tools/source_icons/scalable/previewmodeF-on.svg deleted file mode 100644 index 0b5ca90c5..000000000 --- a/tools/source_icons/scalable/previewmodeF-on.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - F - - diff --git a/tools/source_icons/scalable/previewmodeG-off.file b/tools/source_icons/scalable/previewmodeG-off.file deleted file mode 100644 index be2f098d4..000000000 --- a/tools/source_icons/scalable/previewmodeG-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeG-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeG-off.svg b/tools/source_icons/scalable/previewmodeG-off.svg deleted file mode 100644 index 29f08ebec..000000000 --- a/tools/source_icons/scalable/previewmodeG-off.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeG-on.file b/tools/source_icons/scalable/previewmodeG-on.file deleted file mode 100644 index d6c82f803..000000000 --- a/tools/source_icons/scalable/previewmodeG-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeG-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeG-on.svg b/tools/source_icons/scalable/previewmodeG-on.svg deleted file mode 100644 index 4e5e19b56..000000000 --- a/tools/source_icons/scalable/previewmodeG-on.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeL-off.file b/tools/source_icons/scalable/previewmodeL-off.file deleted file mode 100644 index 7a743f2a3..000000000 --- a/tools/source_icons/scalable/previewmodeL-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeL-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeL-off.svg b/tools/source_icons/scalable/previewmodeL-off.svg deleted file mode 100644 index ea9300e7a..000000000 --- a/tools/source_icons/scalable/previewmodeL-off.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - L - - diff --git a/tools/source_icons/scalable/previewmodeL-on.file b/tools/source_icons/scalable/previewmodeL-on.file deleted file mode 100644 index e7b99191f..000000000 --- a/tools/source_icons/scalable/previewmodeL-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeL-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeL-on.svg b/tools/source_icons/scalable/previewmodeL-on.svg deleted file mode 100644 index 41cd85c07..000000000 --- a/tools/source_icons/scalable/previewmodeL-on.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - L - - diff --git a/tools/source_icons/scalable/previewmodeR-off.file b/tools/source_icons/scalable/previewmodeR-off.file deleted file mode 100644 index a18cb0f3d..000000000 --- a/tools/source_icons/scalable/previewmodeR-off.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeR-off.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeR-off.svg b/tools/source_icons/scalable/previewmodeR-off.svg deleted file mode 100644 index 2bb60f3b6..000000000 --- a/tools/source_icons/scalable/previewmodeR-off.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/previewmodeR-on.file b/tools/source_icons/scalable/previewmodeR-on.file deleted file mode 100644 index 5901958fb..000000000 --- a/tools/source_icons/scalable/previewmodeR-on.file +++ /dev/null @@ -1 +0,0 @@ -previewmodeR-on.png,w8,actions diff --git a/tools/source_icons/scalable/previewmodeR-on.svg b/tools/source_icons/scalable/previewmodeR-on.svg deleted file mode 100644 index 0648c48b2..000000000 --- a/tools/source_icons/scalable/previewmodeR-on.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/processing-pause.file b/tools/source_icons/scalable/processing-pause.file deleted file mode 100644 index bf82fdf73..000000000 --- a/tools/source_icons/scalable/processing-pause.file +++ /dev/null @@ -1 +0,0 @@ -processing-pause.png,w20,actions diff --git a/tools/source_icons/scalable/processing-pause.svg b/tools/source_icons/scalable/processing-pause.svg deleted file mode 100644 index caeb85d0c..000000000 --- a/tools/source_icons/scalable/processing-pause.svg +++ /dev/null @@ -1,463 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/processing-play.file b/tools/source_icons/scalable/processing-play.file deleted file mode 100644 index e8904e6d8..000000000 --- a/tools/source_icons/scalable/processing-play.file +++ /dev/null @@ -1 +0,0 @@ -processing-play.png,w20,actions diff --git a/tools/source_icons/scalable/processing-play.svg b/tools/source_icons/scalable/processing-play.svg deleted file mode 100644 index cbe2e2cd8..000000000 --- a/tools/source_icons/scalable/processing-play.svg +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/processing-thumbnail.file b/tools/source_icons/scalable/processing-thumbnail.file deleted file mode 100644 index 659697271..000000000 --- a/tools/source_icons/scalable/processing-thumbnail.file +++ /dev/null @@ -1 +0,0 @@ -processing-thumbnail.png,w18,actions diff --git a/tools/source_icons/scalable/processing-thumbnail.svg b/tools/source_icons/scalable/processing-thumbnail.svg deleted file mode 100644 index 8865df7e6..000000000 --- a/tools/source_icons/scalable/processing-thumbnail.svg +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/profile-filled.file b/tools/source_icons/scalable/profile-filled.file deleted file mode 100644 index ce6a2f593..000000000 --- a/tools/source_icons/scalable/profile-filled.file +++ /dev/null @@ -1 +0,0 @@ -profile-filled.png,w22,actions diff --git a/tools/source_icons/scalable/profile-filled.svg b/tools/source_icons/scalable/profile-filled.svg deleted file mode 100644 index fadc80267..000000000 --- a/tools/source_icons/scalable/profile-filled.svg +++ /dev/null @@ -1,746 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/profile-partial.file b/tools/source_icons/scalable/profile-partial.file deleted file mode 100644 index d5e11fcf0..000000000 --- a/tools/source_icons/scalable/profile-partial.file +++ /dev/null @@ -1 +0,0 @@ -profile-partial.png,w22,actions diff --git a/tools/source_icons/scalable/profile-partial.svg b/tools/source_icons/scalable/profile-partial.svg deleted file mode 100644 index d379fc471..000000000 --- a/tools/source_icons/scalable/profile-partial.svg +++ /dev/null @@ -1,732 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rated.file b/tools/source_icons/scalable/rated.file deleted file mode 100644 index 60b4b9533..000000000 --- a/tools/source_icons/scalable/rated.file +++ /dev/null @@ -1 +0,0 @@ -rated.png,h10,actions diff --git a/tools/source_icons/scalable/rated.svg b/tools/source_icons/scalable/rated.svg deleted file mode 100644 index 19af9b20a..000000000 --- a/tools/source_icons/scalable/rated.svg +++ /dev/null @@ -1,715 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/ratednot.file b/tools/source_icons/scalable/ratednot.file deleted file mode 100644 index bdf5b1eb7..000000000 --- a/tools/source_icons/scalable/ratednot.file +++ /dev/null @@ -1 +0,0 @@ -ratednot.png,h10,actions diff --git a/tools/source_icons/scalable/ratednot.svg b/tools/source_icons/scalable/ratednot.svg deleted file mode 100644 index 9c4d76156..000000000 --- a/tools/source_icons/scalable/ratednot.svg +++ /dev/null @@ -1,823 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/ratednotg.file b/tools/source_icons/scalable/ratednotg.file deleted file mode 100644 index dc700605b..000000000 --- a/tools/source_icons/scalable/ratednotg.file +++ /dev/null @@ -1 +0,0 @@ -ratednotg.png,h10,actions diff --git a/tools/source_icons/scalable/ratednotg.svg b/tools/source_icons/scalable/ratednotg.svg deleted file mode 100644 index 8400f97bc..000000000 --- a/tools/source_icons/scalable/ratednotg.svg +++ /dev/null @@ -1,647 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/raw.file b/tools/source_icons/scalable/raw.file deleted file mode 100644 index e7f88a039..000000000 --- a/tools/source_icons/scalable/raw.file +++ /dev/null @@ -1 +0,0 @@ -raw.png,w24,actions diff --git a/tools/source_icons/scalable/raw.svg b/tools/source_icons/scalable/raw.svg deleted file mode 100644 index 4073fbebc..000000000 --- a/tools/source_icons/scalable/raw.svg +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/refresh-red.file b/tools/source_icons/scalable/refresh-red.file deleted file mode 100644 index eb462aafe..000000000 --- a/tools/source_icons/scalable/refresh-red.file +++ /dev/null @@ -1 +0,0 @@ -refresh-red.png,h13,actions diff --git a/tools/source_icons/scalable/refresh-red.svg b/tools/source_icons/scalable/refresh-red.svg deleted file mode 100644 index d6bdb4b4d..000000000 --- a/tools/source_icons/scalable/refresh-red.svg +++ /dev/null @@ -1,1256 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/refresh-white.file b/tools/source_icons/scalable/refresh-white.file deleted file mode 100644 index 6195fa3fa..000000000 --- a/tools/source_icons/scalable/refresh-white.file +++ /dev/null @@ -1 +0,0 @@ -refresh-white.png,h13,actions diff --git a/tools/source_icons/scalable/refresh-white.svg b/tools/source_icons/scalable/refresh-white.svg deleted file mode 100644 index 1b1f45b14..000000000 --- a/tools/source_icons/scalable/refresh-white.svg +++ /dev/null @@ -1,1256 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-left-1.file b/tools/source_icons/scalable/rotate-left-1.file deleted file mode 100644 index 01069fb5b..000000000 --- a/tools/source_icons/scalable/rotate-left-1.file +++ /dev/null @@ -1 +0,0 @@ -rotate-left-1.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-left-1.svg b/tools/source_icons/scalable/rotate-left-1.svg deleted file mode 100644 index 19b6420ae..000000000 --- a/tools/source_icons/scalable/rotate-left-1.svg +++ /dev/null @@ -1,1519 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-left-2.file b/tools/source_icons/scalable/rotate-left-2.file deleted file mode 100644 index 7ddcc8294..000000000 --- a/tools/source_icons/scalable/rotate-left-2.file +++ /dev/null @@ -1 +0,0 @@ -rotate-left-2.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-left-2.svg b/tools/source_icons/scalable/rotate-left-2.svg deleted file mode 100644 index 598912692..000000000 --- a/tools/source_icons/scalable/rotate-left-2.svg +++ /dev/null @@ -1,1519 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-left-3.file b/tools/source_icons/scalable/rotate-left-3.file deleted file mode 100644 index ff5463291..000000000 --- a/tools/source_icons/scalable/rotate-left-3.file +++ /dev/null @@ -1 +0,0 @@ -rotate-left-3.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-left-3.svg b/tools/source_icons/scalable/rotate-left-3.svg deleted file mode 100644 index e398a61e4..000000000 --- a/tools/source_icons/scalable/rotate-left-3.svg +++ /dev/null @@ -1,1519 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-left.file b/tools/source_icons/scalable/rotate-left.file deleted file mode 100644 index 69b2f2e74..000000000 --- a/tools/source_icons/scalable/rotate-left.file +++ /dev/null @@ -1 +0,0 @@ -rotate-left.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-left.svg b/tools/source_icons/scalable/rotate-left.svg deleted file mode 100644 index b0617a931..000000000 --- a/tools/source_icons/scalable/rotate-left.svg +++ /dev/null @@ -1,1144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-move.svg b/tools/source_icons/scalable/rotate-move.svg deleted file mode 100644 index 362803b65..000000000 --- a/tools/source_icons/scalable/rotate-move.svg +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-right-1.file b/tools/source_icons/scalable/rotate-right-1.file deleted file mode 100644 index bddb3b975..000000000 --- a/tools/source_icons/scalable/rotate-right-1.file +++ /dev/null @@ -1 +0,0 @@ -rotate-right-1.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-right-1.svg b/tools/source_icons/scalable/rotate-right-1.svg deleted file mode 100644 index e485389ee..000000000 --- a/tools/source_icons/scalable/rotate-right-1.svg +++ /dev/null @@ -1,1519 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-right-2.file b/tools/source_icons/scalable/rotate-right-2.file deleted file mode 100644 index e5e421457..000000000 --- a/tools/source_icons/scalable/rotate-right-2.file +++ /dev/null @@ -1 +0,0 @@ -rotate-right-2.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-right-2.svg b/tools/source_icons/scalable/rotate-right-2.svg deleted file mode 100644 index 476c8d814..000000000 --- a/tools/source_icons/scalable/rotate-right-2.svg +++ /dev/null @@ -1,1438 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-right-3.file b/tools/source_icons/scalable/rotate-right-3.file deleted file mode 100644 index 64c38a7e9..000000000 --- a/tools/source_icons/scalable/rotate-right-3.file +++ /dev/null @@ -1 +0,0 @@ -rotate-right-3.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-right-3.svg b/tools/source_icons/scalable/rotate-right-3.svg deleted file mode 100644 index 7bef3af43..000000000 --- a/tools/source_icons/scalable/rotate-right-3.svg +++ /dev/null @@ -1,1438 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/rotate-right.file b/tools/source_icons/scalable/rotate-right.file deleted file mode 100644 index 123a579c0..000000000 --- a/tools/source_icons/scalable/rotate-right.file +++ /dev/null @@ -1 +0,0 @@ -rotate-right.png,w22,actions diff --git a/tools/source_icons/scalable/rotate-right.svg b/tools/source_icons/scalable/rotate-right.svg deleted file mode 100644 index c5702309f..000000000 --- a/tools/source_icons/scalable/rotate-right.svg +++ /dev/null @@ -1,1123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/softProof.file b/tools/source_icons/scalable/softProof.file deleted file mode 100644 index e275113ec..000000000 --- a/tools/source_icons/scalable/softProof.file +++ /dev/null @@ -1 +0,0 @@ -softProof.png,w22,actions diff --git a/tools/source_icons/scalable/softProof.svg b/tools/source_icons/scalable/softProof.svg deleted file mode 100644 index d09f316a2..000000000 --- a/tools/source_icons/scalable/softProof.svg +++ /dev/null @@ -1,1389 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/spGamutCheck.file b/tools/source_icons/scalable/spGamutCheck.file deleted file mode 100644 index f8b0d6338..000000000 --- a/tools/source_icons/scalable/spGamutCheck.file +++ /dev/null @@ -1 +0,0 @@ -spGamutCheck.png,w22,actions diff --git a/tools/source_icons/scalable/spGamutCheck.svg b/tools/source_icons/scalable/spGamutCheck.svg deleted file mode 100644 index 9748e3916..000000000 --- a/tools/source_icons/scalable/spGamutCheck.svg +++ /dev/null @@ -1,1344 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - ! - diff --git a/tools/source_icons/scalable/stock-flip-horizontal.file b/tools/source_icons/scalable/stock-flip-horizontal.file deleted file mode 100644 index a95ee3be7..000000000 --- a/tools/source_icons/scalable/stock-flip-horizontal.file +++ /dev/null @@ -1 +0,0 @@ -stock-flip-horizontal.png,w22,actions diff --git a/tools/source_icons/scalable/stock-flip-horizontal.svg b/tools/source_icons/scalable/stock-flip-horizontal.svg deleted file mode 100644 index 0dc568256..000000000 --- a/tools/source_icons/scalable/stock-flip-horizontal.svg +++ /dev/null @@ -1,1443 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/stock-flip-vertical.file b/tools/source_icons/scalable/stock-flip-vertical.file deleted file mode 100644 index 303ccb427..000000000 --- a/tools/source_icons/scalable/stock-flip-vertical.file +++ /dev/null @@ -1 +0,0 @@ -stock-flip-vertical.png,w22,actions diff --git a/tools/source_icons/scalable/stock-flip-vertical.svg b/tools/source_icons/scalable/stock-flip-vertical.svg deleted file mode 100644 index 42bcdd8b6..000000000 --- a/tools/source_icons/scalable/stock-flip-vertical.svg +++ /dev/null @@ -1,1305 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/stock-rotate-270.file b/tools/source_icons/scalable/stock-rotate-270.file deleted file mode 100644 index e7b884876..000000000 --- a/tools/source_icons/scalable/stock-rotate-270.file +++ /dev/null @@ -1 +0,0 @@ -stock-rotate-270.png,w22,actions diff --git a/tools/source_icons/scalable/stock-rotate-270.svg b/tools/source_icons/scalable/stock-rotate-270.svg deleted file mode 100644 index 473a2d28a..000000000 --- a/tools/source_icons/scalable/stock-rotate-270.svg +++ /dev/null @@ -1,823 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/stock-rotate-90.file b/tools/source_icons/scalable/stock-rotate-90.file deleted file mode 100644 index 26aa135e8..000000000 --- a/tools/source_icons/scalable/stock-rotate-90.file +++ /dev/null @@ -1 +0,0 @@ -stock-rotate-90.png,w22,actions diff --git a/tools/source_icons/scalable/stock-rotate-90.svg b/tools/source_icons/scalable/stock-rotate-90.svg deleted file mode 100644 index 15570f7a3..000000000 --- a/tools/source_icons/scalable/stock-rotate-90.svg +++ /dev/null @@ -1,869 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/straighten.file b/tools/source_icons/scalable/straighten.file deleted file mode 100644 index 7e9790c65..000000000 --- a/tools/source_icons/scalable/straighten.file +++ /dev/null @@ -1,2 +0,0 @@ -straighten.png,w22,actions -straighten-small.png,h18,actions diff --git a/tools/source_icons/scalable/straighten.svg b/tools/source_icons/scalable/straighten.svg deleted file mode 100644 index 53701dc8c..000000000 --- a/tools/source_icons/scalable/straighten.svg +++ /dev/null @@ -1,1258 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/transform.file b/tools/source_icons/scalable/transform.file deleted file mode 100644 index c9239c7f6..000000000 --- a/tools/source_icons/scalable/transform.file +++ /dev/null @@ -1 +0,0 @@ -transform.png,w24,actions diff --git a/tools/source_icons/scalable/transform.svg b/tools/source_icons/scalable/transform.svg deleted file mode 100644 index 4d7c50c8b..000000000 --- a/tools/source_icons/scalable/transform.svg +++ /dev/null @@ -1,1354 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/trash-hide-deleted.file b/tools/source_icons/scalable/trash-hide-deleted.file deleted file mode 100644 index 660b4fffa..000000000 --- a/tools/source_icons/scalable/trash-hide-deleted.file +++ /dev/null @@ -1 +0,0 @@ -trash-hide-deleted.png,w22,actions diff --git a/tools/source_icons/scalable/trash-hide-deleted.svg b/tools/source_icons/scalable/trash-hide-deleted.svg deleted file mode 100644 index 8272d1c77..000000000 --- a/tools/source_icons/scalable/trash-hide-deleted.svg +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/trash-show-full.file b/tools/source_icons/scalable/trash-show-full.file deleted file mode 100644 index 48fbc21c1..000000000 --- a/tools/source_icons/scalable/trash-show-full.file +++ /dev/null @@ -1 +0,0 @@ -trash-show-full.png,w22,actions diff --git a/tools/source_icons/scalable/trash-show-full.svg b/tools/source_icons/scalable/trash-show-full.svg deleted file mode 100644 index 62a0414bd..000000000 --- a/tools/source_icons/scalable/trash-show-full.svg +++ /dev/null @@ -1,1622 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/trash-thumbnail.file b/tools/source_icons/scalable/trash-thumbnail.file deleted file mode 100644 index 753cf836b..000000000 --- a/tools/source_icons/scalable/trash-thumbnail.file +++ /dev/null @@ -1 +0,0 @@ -trash-thumbnail.png,w18,actions diff --git a/tools/source_icons/scalable/trash-thumbnail.svg b/tools/source_icons/scalable/trash-thumbnail.svg deleted file mode 100644 index 11c515022..000000000 --- a/tools/source_icons/scalable/trash-thumbnail.svg +++ /dev/null @@ -1,862 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/unchanged.file b/tools/source_icons/scalable/unchanged.file deleted file mode 100644 index bfeb052cd..000000000 --- a/tools/source_icons/scalable/unchanged.file +++ /dev/null @@ -1,2 +0,0 @@ -unchanged-22.png,w22,actions -unchanged-18.png,w18,actions diff --git a/tools/source_icons/scalable/unchanged.svg b/tools/source_icons/scalable/unchanged.svg deleted file mode 100644 index f0178a78a..000000000 --- a/tools/source_icons/scalable/unchanged.svg +++ /dev/null @@ -1,1357 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - diff --git a/tools/source_icons/scalable/undelete-rtl.file b/tools/source_icons/scalable/undelete-rtl.file deleted file mode 100644 index 2fd8e06ad..000000000 --- a/tools/source_icons/scalable/undelete-rtl.file +++ /dev/null @@ -1 +0,0 @@ -undelete-rtl.png,w22,actions diff --git a/tools/source_icons/scalable/undelete-rtl.svg b/tools/source_icons/scalable/undelete-rtl.svg deleted file mode 100644 index 74ea4560c..000000000 --- a/tools/source_icons/scalable/undelete-rtl.svg +++ /dev/null @@ -1,1829 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/undelete-thumbnail-rtl.file b/tools/source_icons/scalable/undelete-thumbnail-rtl.file deleted file mode 100644 index a4a344684..000000000 --- a/tools/source_icons/scalable/undelete-thumbnail-rtl.file +++ /dev/null @@ -1 +0,0 @@ -undelete-thumbnail-rtl.png,w18,actions diff --git a/tools/source_icons/scalable/undelete-thumbnail-rtl.svg b/tools/source_icons/scalable/undelete-thumbnail-rtl.svg deleted file mode 100644 index 2f5a0ba1c..000000000 --- a/tools/source_icons/scalable/undelete-thumbnail-rtl.svg +++ /dev/null @@ -1,1829 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/undelete-thumbnail.file b/tools/source_icons/scalable/undelete-thumbnail.file deleted file mode 100644 index a8cabf8f7..000000000 --- a/tools/source_icons/scalable/undelete-thumbnail.file +++ /dev/null @@ -1 +0,0 @@ -undelete-thumbnail.png,w18,actions diff --git a/tools/source_icons/scalable/undelete-thumbnail.svg b/tools/source_icons/scalable/undelete-thumbnail.svg deleted file mode 100644 index b88fd56f5..000000000 --- a/tools/source_icons/scalable/undelete-thumbnail.svg +++ /dev/null @@ -1,1921 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/undelete.file b/tools/source_icons/scalable/undelete.file deleted file mode 100644 index d9bb900eb..000000000 --- a/tools/source_icons/scalable/undelete.file +++ /dev/null @@ -1 +0,0 @@ -undelete.png,w22,actions diff --git a/tools/source_icons/scalable/undelete.svg b/tools/source_icons/scalable/undelete.svg deleted file mode 100644 index 29eca9d8b..000000000 --- a/tools/source_icons/scalable/undelete.svg +++ /dev/null @@ -1,1965 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/user-desktop.file b/tools/source_icons/scalable/user-desktop.file deleted file mode 100644 index f3dff9653..000000000 --- a/tools/source_icons/scalable/user-desktop.file +++ /dev/null @@ -1 +0,0 @@ -user-desktop.png,h18,places diff --git a/tools/source_icons/scalable/user-desktop.svg b/tools/source_icons/scalable/user-desktop.svg deleted file mode 100644 index b0b6a98dc..000000000 --- a/tools/source_icons/scalable/user-desktop.svg +++ /dev/null @@ -1,996 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/user-home.file b/tools/source_icons/scalable/user-home.file deleted file mode 100644 index d48b964f1..000000000 --- a/tools/source_icons/scalable/user-home.file +++ /dev/null @@ -1 +0,0 @@ -user-home.png,h18,places diff --git a/tools/source_icons/scalable/user-home.svg b/tools/source_icons/scalable/user-home.svg deleted file mode 100644 index 011b8ecff..000000000 --- a/tools/source_icons/scalable/user-home.svg +++ /dev/null @@ -1,1591 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/warnhl.file b/tools/source_icons/scalable/warnhl.file deleted file mode 100644 index 4ea34e6f8..000000000 --- a/tools/source_icons/scalable/warnhl.file +++ /dev/null @@ -1 +0,0 @@ -warnhl.png,w22,actions diff --git a/tools/source_icons/scalable/warnhl.svg b/tools/source_icons/scalable/warnhl.svg deleted file mode 100644 index c0e7f9046..000000000 --- a/tools/source_icons/scalable/warnhl.svg +++ /dev/null @@ -1,657 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/warnsh.file b/tools/source_icons/scalable/warnsh.file deleted file mode 100644 index 2d2640c79..000000000 --- a/tools/source_icons/scalable/warnsh.file +++ /dev/null @@ -1 +0,0 @@ -warnsh.png,w22,actions diff --git a/tools/source_icons/scalable/warnsh.svg b/tools/source_icons/scalable/warnsh.svg deleted file mode 100644 index 7fb944327..000000000 --- a/tools/source_icons/scalable/warnsh.svg +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wavelet.file b/tools/source_icons/scalable/wavelet.file deleted file mode 100644 index 1edeedbae..000000000 --- a/tools/source_icons/scalable/wavelet.file +++ /dev/null @@ -1 +0,0 @@ -wavelet.png,w22,actions diff --git a/tools/source_icons/scalable/wavelet.svg b/tools/source_icons/scalable/wavelet.svg deleted file mode 100644 index 0e410b511..000000000 --- a/tools/source_icons/scalable/wavelet.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-auto.file b/tools/source_icons/scalable/wb-auto.file deleted file mode 100644 index 4fef61d4b..000000000 --- a/tools/source_icons/scalable/wb-auto.file +++ /dev/null @@ -1 +0,0 @@ -wb-auto.png,w22,actions diff --git a/tools/source_icons/scalable/wb-auto.svg b/tools/source_icons/scalable/wb-auto.svg deleted file mode 100644 index 59b8799a2..000000000 --- a/tools/source_icons/scalable/wb-auto.svg +++ /dev/null @@ -1,638 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-camera.file b/tools/source_icons/scalable/wb-camera.file deleted file mode 100644 index 63d394942..000000000 --- a/tools/source_icons/scalable/wb-camera.file +++ /dev/null @@ -1 +0,0 @@ -wb-camera.png,w22,actions diff --git a/tools/source_icons/scalable/wb-camera.svg b/tools/source_icons/scalable/wb-camera.svg deleted file mode 100644 index 119b4a9a6..000000000 --- a/tools/source_icons/scalable/wb-camera.svg +++ /dev/null @@ -1,650 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-cloudy.file b/tools/source_icons/scalable/wb-cloudy.file deleted file mode 100644 index 30319caf0..000000000 --- a/tools/source_icons/scalable/wb-cloudy.file +++ /dev/null @@ -1 +0,0 @@ -wb-cloudy.png,w22,actions diff --git a/tools/source_icons/scalable/wb-cloudy.svg b/tools/source_icons/scalable/wb-cloudy.svg deleted file mode 100644 index 1929d5c93..000000000 --- a/tools/source_icons/scalable/wb-cloudy.svg +++ /dev/null @@ -1,640 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-custom.file b/tools/source_icons/scalable/wb-custom.file deleted file mode 100644 index debc0f4b8..000000000 --- a/tools/source_icons/scalable/wb-custom.file +++ /dev/null @@ -1 +0,0 @@ -wb-custom.png,w22,actions diff --git a/tools/source_icons/scalable/wb-custom.svg b/tools/source_icons/scalable/wb-custom.svg deleted file mode 100644 index c0334549f..000000000 --- a/tools/source_icons/scalable/wb-custom.svg +++ /dev/null @@ -1,655 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-flash.file b/tools/source_icons/scalable/wb-flash.file deleted file mode 100644 index c5872302d..000000000 --- a/tools/source_icons/scalable/wb-flash.file +++ /dev/null @@ -1 +0,0 @@ -wb-flash.png,w22,actions diff --git a/tools/source_icons/scalable/wb-flash.svg b/tools/source_icons/scalable/wb-flash.svg deleted file mode 100644 index b2ee41891..000000000 --- a/tools/source_icons/scalable/wb-flash.svg +++ /dev/null @@ -1,639 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-fluorescent.file b/tools/source_icons/scalable/wb-fluorescent.file deleted file mode 100644 index 7b8d464d4..000000000 --- a/tools/source_icons/scalable/wb-fluorescent.file +++ /dev/null @@ -1 +0,0 @@ -wb-fluorescent.png,w22,actions diff --git a/tools/source_icons/scalable/wb-fluorescent.svg b/tools/source_icons/scalable/wb-fluorescent.svg deleted file mode 100644 index 439fe43be..000000000 --- a/tools/source_icons/scalable/wb-fluorescent.svg +++ /dev/null @@ -1,697 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-lamp.file b/tools/source_icons/scalable/wb-lamp.file deleted file mode 100644 index 4862cafb4..000000000 --- a/tools/source_icons/scalable/wb-lamp.file +++ /dev/null @@ -1 +0,0 @@ -wb-lamp.png,w22,actions diff --git a/tools/source_icons/scalable/wb-lamp.svg b/tools/source_icons/scalable/wb-lamp.svg deleted file mode 100644 index bf1e45350..000000000 --- a/tools/source_icons/scalable/wb-lamp.svg +++ /dev/null @@ -1,1330 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-led.file b/tools/source_icons/scalable/wb-led.file deleted file mode 100644 index 5083da16d..000000000 --- a/tools/source_icons/scalable/wb-led.file +++ /dev/null @@ -1 +0,0 @@ -wb-led.png,w22,actions diff --git a/tools/source_icons/scalable/wb-led.svg b/tools/source_icons/scalable/wb-led.svg deleted file mode 100644 index a6048bf01..000000000 --- a/tools/source_icons/scalable/wb-led.svg +++ /dev/null @@ -1,737 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-shade.file b/tools/source_icons/scalable/wb-shade.file deleted file mode 100644 index 9068faeed..000000000 --- a/tools/source_icons/scalable/wb-shade.file +++ /dev/null @@ -1 +0,0 @@ -wb-shade.png,w22,actions diff --git a/tools/source_icons/scalable/wb-shade.svg b/tools/source_icons/scalable/wb-shade.svg deleted file mode 100644 index 871321180..000000000 --- a/tools/source_icons/scalable/wb-shade.svg +++ /dev/null @@ -1,694 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-sun.file b/tools/source_icons/scalable/wb-sun.file deleted file mode 100644 index e2906963c..000000000 --- a/tools/source_icons/scalable/wb-sun.file +++ /dev/null @@ -1 +0,0 @@ -wb-sun.png,w22,actions diff --git a/tools/source_icons/scalable/wb-sun.svg b/tools/source_icons/scalable/wb-sun.svg deleted file mode 100644 index 222177600..000000000 --- a/tools/source_icons/scalable/wb-sun.svg +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-tungsten.file b/tools/source_icons/scalable/wb-tungsten.file deleted file mode 100644 index dc1989f4c..000000000 --- a/tools/source_icons/scalable/wb-tungsten.file +++ /dev/null @@ -1 +0,0 @@ -wb-tungsten.png,w22,actions diff --git a/tools/source_icons/scalable/wb-tungsten.svg b/tools/source_icons/scalable/wb-tungsten.svg deleted file mode 100644 index 5d172c203..000000000 --- a/tools/source_icons/scalable/wb-tungsten.svg +++ /dev/null @@ -1,697 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/scalable/wb-water.file b/tools/source_icons/scalable/wb-water.file deleted file mode 100644 index 14ce25494..000000000 --- a/tools/source_icons/scalable/wb-water.file +++ /dev/null @@ -1 +0,0 @@ -wb-water.png,w22,actions diff --git a/tools/source_icons/scalable/wb-water.svg b/tools/source_icons/scalable/wb-water.svg deleted file mode 100644 index d3e2ecde7..000000000 --- a/tools/source_icons/scalable/wb-water.svg +++ /dev/null @@ -1,642 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/tools/source_icons/scalable/zoom-100-identifier.file b/tools/source_icons/scalable/zoom-100-identifier.file deleted file mode 100644 index b88690fb1..000000000 --- a/tools/source_icons/scalable/zoom-100-identifier.file +++ /dev/null @@ -1 +0,0 @@ -zoom-100-identifier.png,w12,actions diff --git a/tools/source_icons/scalable/zoom-100-identifier.svg b/tools/source_icons/scalable/zoom-100-identifier.svg deleted file mode 100644 index a45346558..000000000 --- a/tools/source_icons/scalable/zoom-100-identifier.svg +++ /dev/null @@ -1,653 +0,0 @@ - - - - - gtk-zoom-100 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - gtk-zoom-100 - - http://www.rawtherapee.com/ - 2013-04-10 - - - DrSlony - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/source_icons/script/change_colour.bash b/tools/source_icons/script/change_colour.bash deleted file mode 100755 index a3e63d22f..000000000 --- a/tools/source_icons/script/change_colour.bash +++ /dev/null @@ -1,52 +0,0 @@ -#! /bin/bash - -### arg1 : this script takes as input a directory which -### contains the svg files for the icon set. -### arg2: it creates in the output directory the svg files -### for the desired colour -### arg3: the colour name (in hexadecimal) to be used for the icon -### arg4: the colour name (in hexadecimal) to be used for the gradient - -DIR_IN=$1 -DIR_OUT=$2 -COLOUR_BG=$3 - -OPACITY=0.85 - - -if [ $# -lt 3 ] -then - echo "Usage: $(basename $0) {input svg directory} {output svg directory} {colour name (hexadecimal)}" - exit 0 -fi - -if [ $# -eq 4 ] -then - COLOUR_GRADIENT=$4 -else - COLOUR_GRADIENT="#ffffff" -fi - -### ORIGINAL = #2a7fff -### PURPLE = #843382 -### GRAY 60% = #666666 -### DARK THEME = #D2D2D2 -### LIGHT THEME = #252525 - - -ORIGINAL="#2a7fff" ### it is the default colour which has been used to develop the gold standard icon set -for SVG in $(ls $DIR_IN/*.svg) -do -# sed -e "s/$ORIGINAL/$COLOUR_BG/g" $SVG > $DIR_OUT/$(basename $SVG) - - sed -e "s/style=\"opacity:0.69.*;fill:$ORIGINAL/style=\"opacity:$OPACITY;fill:$COLOUR_BG/g" -e "s/style=\"opacity:0.7*;fill:$ORIGINAL/style=\"opacity:$OPACITY;fill:$COLOUR_BG/g" -e "s/$ORIGINAL/$COLOUR_BG/g" -e "s/style=\"stop-color:\#ffffff;/style=\"stop-color:$COLOUR_GRADIENT;/g" $SVG > $DIR_OUT/$(basename $SVG) - - - FILE_NAME=${SVG%.svg} - FILE=$FILE_NAME.file - cp $FILE $DIR_OUT - -done - - -#cp $DIR_IN/index.theme $DIR_OUT diff --git a/tools/source_icons/script/make_all_icon_theme.bash b/tools/source_icons/script/make_all_icon_theme.bash deleted file mode 100755 index 4047bf7a9..000000000 --- a/tools/source_icons/script/make_all_icon_theme.bash +++ /dev/null @@ -1,78 +0,0 @@ -#! /bin/bash - -### arg1 : this script takes as input a directory which -### contains the svg files for the gold standard icon set. -### arg2: it creates in the output directory the png files - -### make_all_icon_theme.bash tools/icons_source/scalable /tmp/png - -DIR_IN=$1 -DIR_OUT=$2 - - -if [ $# -lt 2 ] -then - echo "Usage: $(basename $0) {input svg directory} {output directory}" - exit 0 -fi - - -if [ ! -d $DIR_OUT ] -then - mkdir $DIR_OUT -else - rm -r $DIR_OUT/* -fi - -if [ ! -d $DIR_OUT/Dark ] -then - mkdir $DIR_OUT/Dark -fi - -if [ ! -d $DIR_OUT/Light ] -then - mkdir $DIR_OUT/Light -fi - - -rm -r $DIR_OUT/Dark/* -rm -r $DIR_OUT/Light/* - -### make all icon with generic option -./make_icon_theme.bash $DIR_IN $DIR_OUT/Dark "#BBBBBB" "#FFFFFF" -./make_icon_theme.bash $DIR_IN $DIR_OUT/Light "#252525" "#7D7D7D" - -### make custom icon with specific option -if [ ! -d $DIR_OUT/Light/tmp ] -then - mkdir $DIR_OUT/Light/tmp -fi - -if [ ! -d $DIR_OUT/Dark/tmp ] -then - mkdir $DIR_OUT/Dark/tmp -fi - -cp $DIR_IN/closedhand.* $DIR_OUT/Dark/tmp -cp $DIR_IN/closedhand.* $DIR_OUT/Light/tmp - -./make_icon_theme.bash $DIR_OUT/Dark/tmp $DIR_OUT/Dark "#BBBBBB" "#000000" -./make_icon_theme.bash $DIR_OUT/Light/tmp $DIR_OUT/Light "#252525" "#FFFFFF" - -DIR_TMP=/tmp/icons - -if [ ! -d $DIR_TMP ] -then - mkdir $DIR_TMP -fi - -cp -r $DIR_OUT/* $DIR_TMP -mv $DIR_TMP/Dark/*.png $DIR_TMP/Dark/actions -mv $DIR_TMP/Light/*.png $DIR_TMP/Light/actions -/bin/rm -r $DIR_TMP/Dark/*.file $DIR_TMP/Dark/tmp -/bin/rm -r $DIR_TMP/Light/*.file $DIR_TMP/Light/tmp - -cd /tmp -tar cvf iconsets.tar icons -bzip2 iconsets.tar -mv iconsets.tar.bz2 $DIR_OUT diff --git a/tools/source_icons/script/make_icon_theme.bash b/tools/source_icons/script/make_icon_theme.bash deleted file mode 100755 index f20f53af9..000000000 --- a/tools/source_icons/script/make_icon_theme.bash +++ /dev/null @@ -1,39 +0,0 @@ -#! /bin/bash - -### arg1 : this script takes as input a directory which -### contains the svg files for the gold standard icon set. -### arg2: it creates in the output directory the png files -### for the desired size -### arg3: the colour name (in hexadecimal) to be used - - -### Light Theme -### ./make_icon_theme.bash ../svg/ /tmp/png/ "#252525" "#7D7D7D" - -### Dark Theme -### ./make_icon_theme.bash ../svg/ /tmp/png/ "#D2D2D2" "#FFFFFF" - - -DIR_IN=$1 -DIR_OUT=$2 -COLOUR_BG=$3 -COLOUR_GRADIENT=$4 - -if [ $# -lt 3 ] -then - echo "Usage: $(basename $0) {input svg directory} {output directory} {background colour name (hexadecimal)} {option: gradient colour name (hexadecimal)}" - exit 0 -fi - - -if [ $# -eq 4 ] -then -./change_colour.bash $DIR_IN $DIR_OUT $COLOUR_BG $COLOUR_GRADIENT -else -./change_colour.bash $DIR_IN $DIR_OUT $COLOUR_BG -fi -./svg2png.bash $DIR_OUT $DIR_OUT $WIDTH -rm $DIR_OUT/*.svg - - - diff --git a/tools/source_icons/script/svg2png.bash b/tools/source_icons/script/svg2png.bash deleted file mode 100755 index 27642a52c..000000000 --- a/tools/source_icons/script/svg2png.bash +++ /dev/null @@ -1,64 +0,0 @@ -#! /bin/bash - -### arg1 : this script takes as input a directory which -### contains the svg files for the gold standard icon set. -### arg2: it creates in the output directory the png files -### for the desired size - - -DIR_IN=$1 -DIR_OUT=$2 - -DIR_TMP=/tmp - -if [ $# -ne 2 ] -then - echo "Usage: $(basename $0) {input svg directory} {output directory} {width (in pixel)}" - exit 0 -fi - -if [ ! -d $DIR_OUT/actions ] -then - mkdir $DIR_OUT/actions -fi - -if [ ! -d $DIR_OUT/devices ] -then - mkdir $DIR_OUT/devices -fi - -if [ ! -d $DIR_OUT/places ] -then - mkdir $DIR_OUT/places -fi - - - -for SVG in $(ls $DIR_IN/*.svg) -do - echo $SVG - - FILE=$(basename $SVG) - FILE_NAME=${FILE%.svg} - FILE=$FILE_NAME.file - - if [ -f $DIR_TMP/$FILE_NAME.bash ] - then - rm $DIR_TMP/$FILE_NAME.bash - fi - - echo "#! /bin/bash" > $DIR_TMP/$FILE_NAME.bash - if [[ $OSTYPE == msys || $OSTYPE == MSYS ]]; then - awk -v s="$SVG" -v d="$DIR_OUT" -F, '{print "\"/c/Program Files/Inkscape/inkscape.exe\" " s " --export-png=" d "/" $1 " -" $2}' $DIR_IN/$FILE >> $DIR_TMP/$FILE_NAME.bash - else - awk -v s="$SVG" -v d="$DIR_OUT" -F, '{print "inkscape " s " --export-png=" d "/" $1 " -" $2}' $DIR_IN/$FILE >> $DIR_TMP/$FILE_NAME.bash - fi - - awk -v s="$SVG" -v d="$DIR_OUT" -F, '{print "mv " d "/" $1 " " d "/" $3}' $DIR_IN/$FILE >> $DIR_TMP/$FILE_NAME.bash - - chmod +x $DIR_TMP/$FILE_NAME.bash - $DIR_TMP/$FILE_NAME.bash - - rm $DIR_TMP/$FILE_NAME.bash - -done diff --git a/tools/win/InnoSetup/WindowsInnoSetup.iss.in b/tools/win/InnoSetup/WindowsInnoSetup.iss.in index 55305d5f0..b9b3aa8ec 100644 --- a/tools/win/InnoSetup/WindowsInnoSetup.iss.in +++ b/tools/win/InnoSetup/WindowsInnoSetup.iss.in @@ -24,6 +24,7 @@ #define MyAppPublisher "rawtherapee.com" #define MyAppURL "http://www.rawtherapee.com/" #define MyAppExeName "rawtherapee.exe" +#define MyAppCliExeName "rawtherapee-cli.exe" #define MyBuildBasePath "${CMAKE_INSTALL_PREFIX}" #define MySourceBasePath "${PROJECT_SOURCE_DIR}" #define MyBitDepth "${BUILD_BIT_DEPTH}" @@ -38,7 +39,7 @@ AppId={#MyAppName}{#MyAppVersion} AppName={#MyAppName} AppVersion={#MyAppVersion} -VersionInfoVersion={#MyAppVersionNumeric} +;VersionInfoVersion={#MyAppVersionNumeric} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} @@ -49,7 +50,7 @@ AllowNoIcons=yes LicenseFile={#MyBuildBasePath}\LICENSE.txt OutputDir={#MyBuildBasePath}\..\ OutputBaseFilename={#MyAppName}_{#MyAppVersion}_{#MySystemName}_{#MyBitDepth} -SetupIconFile={#MySourceBasePath}\rtdata\icons\RT.ico +SetupIconFile={#MySourceBasePath}\rtdata\images\non-themed\rawtherapee.ico WizardImageFile={#MySourceBasePath}\tools\win\InnoSetup\installerStrip.bmp WizardImageBackColor=$2A2A2A Compression=lzma @@ -85,10 +86,14 @@ Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" [Tasks] +Name: "userinstall"; Description: "Only me (Single User Install)"; GroupDescription: "Install RawTherapee for:"; Flags: exclusive unchecked +Name: "commoninstall"; Description: "Anyone who uses this computer (Multi-User Install)"; GroupDescription: "Install RawTherapee for:"; Flags: exclusive; Check: IsElevatedUser Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked ;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 +105,7 @@ Source: "{#MyBuildBasePath}\images\*"; DestDir: "{app}\images\"; Flags: ignoreve 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 +117,39 @@ Source: "{#MyBuildBasePath}\options"; DestDir: "{app}"; Flags: ignoreversion 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: "{commondesktop}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon +Name: "{group}\{cm:UninstallProgram,{#MyAppName} {#MyAppVersion}}"; Filename: "{uninstallexe}" +Name: "{commondesktop}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon and commoninstall +Name: "{userdesktop}\{#MyAppName} {#MyAppVersion}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon and userinstall 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 and userinstall +Root: HKCU; Subkey: "SOFTWARE\Classes\Directory\shell\Browse with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -w ""%1"""; Flags: uninsdeletekey; Tasks: regBrowseFolder and userinstall +Root: HKCU; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee"; ValueType: string; ValueData: "Open with RawTherapee"; Flags: uninsdeletekey; Tasks: regOpenFile and userinstall +Root: HKCU; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -R ""%1"""; Flags: uninsdeletekey; Tasks: regOpenFile and userinstall +Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{#MyAppExeName}"; ValueType: string; ValueData: "{app}\{#MyAppExeName}"; Flags: uninsdeletekey; Tasks: userinstall +Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{#MyAppCliExeName}"; ValueType: string; ValueData: "{app}\{#MyAppCliExeName}"; Flags: uninsdeletekey; Tasks: userinstall + +Root: HKLM; Subkey: "SOFTWARE\Classes\Directory\shell\Browse with RawTherapee"; ValueType: string; ValueData: "Browse with RawTherapee"; Flags: uninsdeletekey; Tasks: regBrowseFolder and commoninstall +Root: HKLM; Subkey: "SOFTWARE\Classes\Directory\shell\Browse with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -w ""%1"""; Flags: uninsdeletekey; Tasks: regBrowseFolder and commoninstall +Root: HKLM; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee"; ValueType: string; ValueData: "Open with RawTherapee"; Flags: uninsdeletekey; Tasks: regOpenFile and commoninstall +Root: HKLM; Subkey: "SOFTWARE\Classes\*\shell\Open with RawTherapee\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} -R ""%1"""; Flags: uninsdeletekey; Tasks: regOpenFile and commoninstall +Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{#MyAppExeName}"; ValueType: string; ValueData: "{app}\{#MyAppExeName}"; Flags: uninsdeletekey; Tasks: commoninstall +Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{#MyAppCliExeName}"; ValueType: string; ValueData: "{app}\{#MyAppCliExeName}"; Flags: uninsdeletekey; Tasks: commoninstall + +[Code] +function IsElevatedUser(): Boolean; +begin +Result := IsAdminLoggedOn or IsPowerUserLoggedOn; +end; + \ No newline at end of file diff --git a/tools/win/readme.txt b/tools/win/readme.txt index b20bf104a..d0633e348 100644 --- a/tools/win/readme.txt +++ b/tools/win/readme.txt @@ -8,7 +8,7 @@ As requested in issue 1904 ( http://code.google.com/p/rawtherapee/issues/detail? 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 diff --git a/win.cmake b/win.cmake index 3b330ebe0..9c292b2df 100644 --- a/win.cmake +++ b/win.cmake @@ -24,7 +24,7 @@ set(PROC_TARGET_NUMBER 0 CACHE STRING "Target Processor") # If you want to force the target processor name when PROC_TARGET_NUMBER = 0 or 2, # uncomment the next line and replace labelWithoutQuotes by its value -#set (PROC_LABEL labelWithoutQuotes CACHE STRING "Target Processor label") +#set(PROC_LABEL labelWithoutQuotes CACHE STRING "Target Processor label") # Important: MinGW-w64 user may need to specify the -m32 or -m64 flag in CMAKE_CXX_FLAGS, # CMAKE_C_FLAGS and CMAKE_EXE_LINKER_FLAGS to select between 32/64bit build